您好,登錄后才能下訂單哦!
其實這個章節的一些知識點在轉賬交易那一章節均有所涉及,所以,查詢余額這個功能相對而言比較簡單,只要熟悉了UTXO模型,加上對交易流程的了解之后,對查詢余額基本上已經有了思路。
func (cli *CLI) GetBalance(address string) {
bc := GetBlockChainObject()
if bc == nil {
fmt.Println("沒有BlockChain,無法查詢。。")
os.Exit(1)
}
defer bc.DB.Close()
utxoSet :=&UTXOSet{bc}
total:=utxoSet.GetBalance(address)
fmt.Printf("%s,余額是:%d\n", address, total)
}
GetBalance
func (utxoSet *UTXOSet) GetBalance(address string) int64 {
utxos := utxoSet.FindUnspentUTXOsByAddress(address)
var total int64
for _, utxo := range utxos {
total += utxo.Output.Value
}
return total
}
FindUnspentUTXOsByAddress
func (utxoSet *UTXOSet) FindUnspentUTXOsByAddress(address string) []*UTXO {
var utxos []*UTXO
err := utxoSet.BlockChian.DB.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte(utxosettable))
if b != nil {
/*
獲取表中的所有的數據
key,value
key:TxID
value:TxOuputs
*/
c := b.Cursor()
for k, v := c.First(); k != nil; k, v = c.Next() {
txOutputs := DeserializeTxOutputs(v)
for _, utxo := range txOutputs.UTXOs { //txid, index,output
if utxo.Output.UnlockWithAddress(address) {
utxos = append(utxos, utxo)
}
}
}
}
return nil
})
if err != nil {
log.Panic(err)
}
return utxos
}
$ ./mybtc getaddresslists
返回結果
錢包地址列表為:
1DHPNHKfk9uUdog2f2xBvx9dq4NxpF5Q4Q
1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq
$ ./mybtc getbalance -address 1DHPNHKfk9uUdog2f2xBvx9dq4NxpF5Q4Q
返回結果
1DHPNHKfk9uUdog2f2xBvx9dq4NxpF5Q4Q,余額是:12
分析
1.創建創世區塊,該地址獲得10元
2.第一筆轉賬,給地址1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq轉賬2元, 剩余8元,得到10元獎勵,余額為18元
3.第二筆轉賬,給地址1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq轉賬3元, 剩余15元,得到10元獎勵,余額為25元
4.第三筆轉賬,給地址1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq轉賬23元,剩余2元,得到10元獎勵,余額為12元
10元獎勵是代碼中設定每個區塊的CoinBase交易給轉賬用戶的,實際比特幣場景是給礦工的,這里是測試場景,請大家勿要混淆。
./mybtc getbalance -address 1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq
返回結果
1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq,余額是:28
分析
2 + 3 + 23 = 28元
到此,我們查詢余額的功能基本完畢。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。