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

七. 查詢餘額

其實這個章節的一些知識點在轉帳交易那一章節均有所涉及,因此,查詢餘額這個功能相對而言比較簡單,只要熟悉了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. 查詢餘額代碼

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

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

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
}

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交易給轉帳用戶的,實際比特幣場景是給礦工的,這裏是測試場景,請你們勿要混淆。code

./mybtc getbalance -address 1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq

返回結果對象

1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq,餘額是:28

分析ssl

2 + 3 + 23 = 28元

到此,咱們查詢餘額的功能基本完畢。get

相關文章
相關標籤/搜索