其實這個章節的一些知識點在轉帳交易那一章節均有所涉及,因此,查詢餘額這個功能相對而言比較簡單,只要熟悉了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) }
GetBalanceapp
func (utxoSet *UTXOSet) GetBalance(address string) int64 { utxos := utxoSet.FindUnspentUTXOsByAddress(address) var total int64 for _, utxo := range utxos { total += utxo.Output.Value } return total }
FindUnspentUTXOsByAddresside
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交易給轉帳用戶的,實際比特幣場景是給礦工的,這裏是測試場景,請你們勿要混淆。code
./mybtc getbalance -address 1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq
返回結果對象
1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq,餘額是:28
分析ssl
2 + 3 + 23 = 28元
到此,咱們查詢餘額的功能基本完畢。get