溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

從0到1簡易區(qū)塊鏈開發(fā)手冊(cè)V0.5-實(shí)現(xiàn)余額查詢

發(fā)布時(shí)間:2020-06-18 18:33:08 來源:網(wǎng)絡(luò) 閱讀:36161 作者:暗黑魔君 欄目:編程語言

七. 查詢余額

其實(shí)這個(gè)章節(jié)的一些知識(shí)點(diǎn)在轉(zhuǎn)賬交易那一章節(jié)均有所涉及,所以,查詢余額這個(gè)功能相對(duì)而言比較簡單,只要熟悉了UTXO模型,加上對(duì)交易流程的了解之后,對(duì)查詢余額基本上已經(jīng)有了思路。

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)
}
  • 獲取區(qū)塊鏈對(duì)象
  • 獲取utxoSet對(duì)象
  • 通過utxoSet的GetBalance方法獲得對(duì)應(yīng)的余額

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的數(shù)組對(duì)象utxos
  • 通過對(duì)utxos進(jìn)行遍歷得到utxo對(duì)象
  • 將utxo對(duì)象的Output的Value屬性值進(jìn)行累加得到余額

3.通過地址獲取未花費(fèi)utxo數(shù)組

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 {
            /*
            獲取表中的所有的數(shù)據(jù)
            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.代碼測(cè)試

4.1 獲取所有地址
$ ./mybtc  getaddresslists

返回結(jié)果

錢包地址列表為:
        1DHPNHKfk9uUdog2f2xBvx9dq4NxpF5Q4Q
        1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq
4.2 查詢余額
$ ./mybtc getbalance -address 1DHPNHKfk9uUdog2f2xBvx9dq4NxpF5Q4Q

返回結(jié)果

1DHPNHKfk9uUdog2f2xBvx9dq4NxpF5Q4Q,余額是:12

分析

1.創(chuàng)建創(chuàng)世區(qū)塊,該地址獲得10元
2.第一筆轉(zhuǎn)賬,給地址1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq轉(zhuǎn)賬2元, 剩余8元,得到10元獎(jiǎng)勵(lì),余額為18元
3.第二筆轉(zhuǎn)賬,給地址1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq轉(zhuǎn)賬3元, 剩余15元,得到10元獎(jiǎng)勵(lì),余額為25元
4.第三筆轉(zhuǎn)賬,給地址1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq轉(zhuǎn)賬23元,剩余2元,得到10元獎(jiǎng)勵(lì),余額為12元

10元獎(jiǎng)勵(lì)是代碼中設(shè)定每個(gè)區(qū)塊的CoinBase交易給轉(zhuǎn)賬用戶的,實(shí)際比特幣場(chǎng)景是給礦工的,這里是測(cè)試場(chǎng)景,請(qǐng)大家勿要混淆。

./mybtc getbalance -address 1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq

返回結(jié)果

1HtJve4MwW4LVko3yjkj3UUvzXsuGHb1Yq,余額是:28

分析

2 + 3 + 23 = 28元

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI