1. 程式人生 > >從0到1簡易區塊鏈開發手冊V0.5-實現余額查詢

從0到1簡易區塊鏈開發手冊V0.5-實現余額查詢

def nba getaddr 查詢 key dex ani puts +=

七. 查詢余額

其實這個章節的一些知識點在轉賬交易那一章節均有所涉及,所以,查詢余額這個功能相對而言比較簡單,只要熟悉了UTXO模型,加上對交易流程的了解之後,對查詢余額基本上已經有了思路。

1.命令行代碼


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)
}
  • 獲取區塊鏈對象
  • 獲取utxoSet對象
  • 通過utxoSet的GetBalance方法獲得對應的余額

2. 查詢余額代碼

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獲得utxo的數組對象utxos
  • 通過對utxos進行遍歷得到utxo對象
  • 將utxo對象的Output的Value屬性值進行累加得到余額

3.通過地址獲取未花費utxo數組

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
}

4.代碼測試

4.1 獲取所有地址

$ ./mybtc  getaddresslists

返回結果

錢包地址列表為:
        1DHPNHKfk9uUdog2f2xBvx9dq4NxpF5Q4Q
        1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq

4.2 查詢余額

$ ./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元

到此,我們查詢余額的功能基本完畢。

從0到1簡易區塊鏈開發手冊V0.5-實現余額查詢