溫馨提示×

溫馨提示×

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

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

從0到1簡易區(qū)塊鏈開發(fā)手冊V0.6-實現(xiàn)打印區(qū)塊

發(fā)布時間:2020-10-09 19:05:17 來源:網(wǎng)絡(luò) 閱讀:23378 作者:暗黑魔君 欄目:編程語言

八. 打印區(qū)塊

以上的轉(zhuǎn)賬交易中,我們共計創(chuàng)建了四個區(qū)塊,其中一個區(qū)塊為創(chuàng)世區(qū)塊,另外三個區(qū)塊都是對我們的交易進行打包后產(chǎn)生的新區(qū)塊,本文將介紹如何將區(qū)塊信息打印出來。

1.命令行代碼

func (cli *CLI) PrintChains() {
    //cli.BlockChain.PrintChains()
    bc := GetBlockChainObject() //bc{Tip,DB}
    if bc == nil {
        fmt.Println("沒有BlockChain,無法打印任何數(shù)據(jù)。。")
        os.Exit(1)
    }
    defer bc.DB.Close()
    bc.PrintChains()
}
  • 獲取區(qū)塊鏈對象
  • 調(diào)用PrintChains方法

2.創(chuàng)建迭代器

在上文中,我們將所有生成的區(qū)塊均存儲至BoltDB中,我們需要通過操作數(shù)據(jù)對區(qū)塊進行獲取,此處,我們創(chuàng)建一個迭代器用于對數(shù)據(jù)庫進行遍歷查詢。

2.1 迭代器結(jié)構(gòu)體
type BlockChainIterator struct {
    DB          *bolt.DB
    CurrentHash []byte
}

迭代器屬性有兩個,DB對象以及當(dāng)前Hash

func (bc *BlockChain) Iterator() *BlockChainIterator {
    return &BlockChainIterator{bc.DB, bc.Tip}
}

通過Iterator方法獲取一個BlockChainIterator的對象

2.2 結(jié)構(gòu)體方法
func (bcIterator *BlockChainIterator) Next() *Block {
    block := new(Block)
    err := bcIterator.DB.View(func(tx *bolt.Tx) error {
        b := tx.Bucket([]byte(BlockBucketName))
        if b != nil {
            //根據(jù)current獲取對應(yīng)的區(qū)塊的數(shù)據(jù)
            blockBytes := b.Get(bcIterator.CurrentHash)
            //反序列化后得到block對象
            block = DeserializeBlock(blockBytes)
            //更新currenthash
            bcIterator.CurrentHash = block.PrevBlockHash
        }
        return nil

    })
    if err != nil {
        log.Panic(err)
    }
    return block
}

我們定義一個結(jié)構(gòu)體方法Next用于對區(qū)塊鏈進行遍歷操作

  • 根據(jù)bcIterator,操作DB對象,讀取數(shù)據(jù)庫
  • 打開存儲區(qū)塊的Bucket表名
  • 根據(jù)current獲取對應(yīng)的區(qū)塊的數(shù)據(jù)
  • 對獲取到的數(shù)據(jù)進行反序列化得到block對象
  • 更新bcIterator的CurrentHash屬性為上一個區(qū)塊,方便進行對上一個區(qū)塊(因為對區(qū)塊鏈的遍歷是從后往前知直至創(chuàng)世區(qū)塊的)的獲取操作.

3.創(chuàng)建打印區(qū)塊函數(shù)

func (bc *BlockChain) PrintChains() {
    /*
    .bc.DB.View(),
        根據(jù)hash,獲取block的數(shù)據(jù)
        反序列化
        打印輸出
     */

    //獲取迭代器
    it := bc.Iterator()
    for {
        //step1:根據(jù)currenthash獲取對應(yīng)的區(qū)塊
        block := it.Next()
        fmt.Printf("第%d個區(qū)塊的信息:\n", block.Height+1)
        fmt.Printf("\t高度:%d\n", block.Height)
        fmt.Printf("\t上一個區(qū)塊Hash:%x\n", block.PrevBlockHash)
        fmt.Printf("\t自己的Hash:%x\n", block.Hash)
        //fmt.Printf("\t數(shù)據(jù):%s\n", block.Data)
        fmt.Println("\t交易信息:")
        for _, tx := range block.Txs {
            fmt.Printf("\t\t交易ID:%x\n", tx.TxID) //[]byte
            fmt.Println("\t\tVins:")
            for _, in := range tx.Vins { //每一個TxInput:Txid,vout,解鎖腳本
                fmt.Printf("\t\t\tTxID:%x\n", in.TxID)
                fmt.Printf("\t\t\tVout:%d\n", in.Vout)
                fmt.Printf("\t\t\tsign:%v\n", in.Signature)
                fmt.Printf("\t\t\tPublicKey:%v\n", in.PublicKey)
            }
            fmt.Println("\t\tVouts:")
            for _, out := range tx.Vouts { //每個以txOutput:value,鎖定腳本
                fmt.Printf("\t\t\tValue:%d\n", out.Value)
                fmt.Printf("\t\t\tPubKeyHash:%v\n", out.PubKeyHash)
            }
        }

        fmt.Printf("\t隨機數(shù):%d\n", block.Nonce)
        //fmt.Printf("\t時間:%d\n", block.TimeStamp)
        fmt.Printf("\t時間:%s\n", time.Unix(block.TimeStamp, 0).Format("2006-01-02 15:04:05")) // 時間戳-->time-->Format("")

        //step2:判斷block的prevBlcokhash為0,表示該block是創(chuàng)世取塊,將結(jié)束循環(huán)
        hashInt := new(big.Int)
        hashInt.SetBytes(block.PrevBlockHash)
        if big.NewInt(0).Cmp(hashInt) == 0 {
            /*
            x.Cmp(y)
                -1 x < y
                0 x = y
                1 x > y
             */
            break
        }

    }
}
  • 獲取迭代器對象
  • 通過for循環(huán)對迭代器對象的Next方法獲取到的區(qū)塊進行遍歷
    • 高度
    • 上一個區(qū)塊的哈希
    • 區(qū)塊自己的哈希
    • 交易數(shù)組Txs
    • 隨機數(shù)
    • 時間戳
  • 對交易數(shù)組Txs進行遍歷
    • 獲取交易輸入數(shù)組
    • 獲取交易輸出數(shù)組
  • 對交易輸入數(shù)組進行遍歷
  • 對交易輸出數(shù)組進行遍歷
  • 判斷區(qū)塊的上一個區(qū)塊哈希是否為0 (bigInt的Cmp方法進行對比),結(jié)束循環(huán)

4.代碼測試

4.1 命令行測試
$ ./mybtc printchain

返回結(jié)果

第4個區(qū)塊的信息:
        高度:3
        上一個區(qū)塊Hash:0000c728b52f7a988060ef97252582bb55a076fbd3724bf6c54ca3d28e8a48c1
        自己的Hash:000029e6e3277d493ad0e70f4e9b0bb4fff718ccddcb4613fcc89fa3c2ab89a1
        交易信息:
                交易ID:635c6c2f6953c5216ac3848e2bf4ca29cb366da4b7f9f6d7465fb0437a25ae7b
                Vins:
                        TxID:268d659bc26b71f9c2c55e8105d63d7e3530d10bcce3078616083473c9815015
                        Vout:0
                        sign:[85 157 86 124 207 101 13 172 227 166 145 49 177 229 142 158 89 23 182 80 124 19 202 98 221 132 94 20 127 92 28 116 37 101 222 98 194 235 49 225 137 224 178 22 139 224 44 233 252 8 79 180 86 76 134 224 98 41 31 24 68 3 222 226]
                        PublicKey:[66 142 153 19 22 156 166 189 181 22 189 55 146 33 114 142 83 182 186 21 123 4 65 4 37 102 107 204 42 175 161 23 22 72 233 146 175 105 179 65 173 128 40 5 150 252 196 116 246 22 109 178 26 63 146 87 203 4 196 201 99 61 94 206]
                        TxID:5228a9c85bb44b2b5f33517c73322901cae2e27544e90a4e0f6f6da92377ff3a
                        Vout:1
                        sign:[122 108 188 57 39 164 121 50 33 92 96 116 217 251 120 187 221 148 177 33 157 155 195 116 75 109 197 49 151 154 135 175 253 64 60 168 22 117 164 150 31 53 156 6 150 162 212 55 138 98 209 86 11 119 149 190 54 82 5 212 29 220 57 194]
                        PublicKey:[66 142 153 19 22 156 166 189 181 22 189 55 146 33 114 142 83 182 186 21 123 4 65 4 37 102 107 204 42 175 161 23 22 72 233 146 175 105 179 65 173 128 40 5 150 252 196 116 246 22 109 178 26 63 146 87 203 4 196 201 99 61 94 206]
                        TxID:815c7c3969c256a053e99d44f8e1353ff7eaa99748efa7c94b2f066d9415a847
                        Vout:1
                        sign:[111 172 102 14 142 119 85 153 6 77 239 71 107 217 109 204 96 167 61 202 77 178 149 83 9 221 80 201 198 54 195 166 75 246 106 131 250 89 69 28 0 174 236 129 123 249 146 38 190 211 59 107 202 75 134 5 0 131 111 99 183 138 131 214]
                        PublicKey:[66 142 153 19 22 156 166 189 181 22 189 55 146 33 114 142 83 182 186 21 123 4 65 4 37 102 107 204 42 175 161 23 22 72 233 146 175 105 179 65 173 128 40 5 150 252 196 116 246 22 109 178 26 63 146 87 203 4 196 201 99 61 94 206]
                Vouts:
                        Value:23
                        PubKeyHash:[185 54 48 129 7 167 52 127 211 86 64 241 25 244 56 134 188 202 162 55]
                        Value:2
                        PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]
                交易ID:af5b0f1b76c3ec72cfd86c0c3d356c0d8fc6799955bd1e97597b693e0df2ff0b
                Vins:
                        TxID:
                        Vout:-1
                        sign:[]
                        PublicKey:[]
                Vouts:
                        Value:10
                        PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]
        隨機數(shù):30579
        時間:2018-08-22 16:13:26
第3個區(qū)塊的信息:
        高度:2
        上一個區(qū)塊Hash:000002abf5db3196927ebd2160fa3903010d38e5eefc9f61fe18d3860e115986
        自己的Hash:0000c728b52f7a988060ef97252582bb55a076fbd3724bf6c54ca3d28e8a48c1
        交易信息:
                交易ID:5228a9c85bb44b2b5f33517c73322901cae2e27544e90a4e0f6f6da92377ff3a
                Vins:
                        TxID:4578ddd18b4cc57c2e6ef91679232bdf75f85d1100a41f49ab546293657642e9
                        Vout:0
                        sign:[145 176 153 168 48 184 239 181 110 195 176 77 86 239 96 184 93 217 185 191 192 48 131 0 187 237 129 59 181 145 133 150 88 61 109 59 186 248 11 30 138 238 124 232 62 96 147 208 180 211 120 35 114 6 79 2 221 100 214 215 121 39 41 197]
                        PublicKey:[66 142 153 19 22 156 166 189 181 22 189 55 146 33 114 142 83 182 186 21 123 4 65 4 37 102 107 204 42 175 161 23 22 72 233 146 175 105 179 65 173 128 40 5 150 252 196 116 246 22 109 178 26 63 146 87 203 4 196 201 99 61 94 206]
                Vouts:
                        Value:3
                        PubKeyHash:[185 54 48 129 7 167 52 127 211 86 64 241 25 244 56 134 188 202 162 55]
                        Value:7
                        PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]
                交易ID:268d659bc26b71f9c2c55e8105d63d7e3530d10bcce3078616083473c9815015
                Vins:
                        TxID:
                        Vout:-1
                        sign:[]
                        PublicKey:[]
                Vouts:
                        Value:10
                        PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]
        隨機數(shù):60270
        時間:2018-08-22 16:03:10
第2個區(qū)塊的信息:
        高度:1
        上一個區(qū)塊Hash:00005c7b4246aa88bd1f9664c665d6424d1522f569d981691ac2b5b5d15dd8d9
        自己的Hash:000002abf5db3196927ebd2160fa3903010d38e5eefc9f61fe18d3860e115986
        交易信息:
                交易ID:815c7c3969c256a053e99d44f8e1353ff7eaa99748efa7c94b2f066d9415a847
                Vins:
                        TxID:31cb0a3fcf70ccf7cd2d5ec5564d266b022acd4aca28f0eee8b465a21863315f
                        Vout:0
                        sign:[76 117 6 102 34 72 16 65 232 180 248 176 20 134 206 63 75 128 51 217 41 238 50 173 165 178 36 54 57 92 11 4 134 121 96 210 16 18 129 160 109 183 213 110 195 54 101 48 198 89 12 76 174 216 80 198 232 32 77 253 55 157 87 229]
                        PublicKey:[66 142 153 19 22 156 166 189 181 22 189 55 146 33 114 142 83 182 186 21 123 4 65 4 37 102 107 204 42 175 161 23 22 72 233 146 175 105 179 65 173 128 40 5 150 252 196 116 246 22 109 178 26 63 146 87 203 4 196 201 99 61 94 206]
                Vouts:
                        Value:2
                        PubKeyHash:[185 54 48 129 7 167 52 127 211 86 64 241 25 244 56 134 188 202 162 55]
                        Value:8
                        PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]
                交易ID:4578ddd18b4cc57c2e6ef91679232bdf75f85d1100a41f49ab546293657642e9
                Vins:
                        TxID:
                        Vout:-1
                        sign:[]
                        PublicKey:[]
                Vouts:
                        Value:10
                        PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]
        隨機數(shù):25508
        時間:2018-08-22 15:45:06
第1個區(qū)塊的信息:
        高度:0
        上一個區(qū)塊Hash:0000000000000000000000000000000000000000000000000000000000000000
        自己的Hash:00005c7b4246aa88bd1f9664c665d6424d1522f569d981691ac2b5b5d15dd8d9
        交易信息:
                交易ID:31cb0a3fcf70ccf7cd2d5ec5564d266b022acd4aca28f0eee8b465a21863315f
                Vins:
                        TxID:
                        Vout:-1
                        sign:[]
                        PublicKey:[]
                Vouts:
                        Value:10
                        PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]
        隨機數(shù):32325
        時間:2018-08-20 22:11:28
4.2 區(qū)塊關(guān)聯(lián)圖

從0到1簡易區(qū)塊鏈開發(fā)手冊V0.6-實現(xiàn)打印區(qū)塊

上圖整合了區(qū)塊的相關(guān)屬性以及關(guān)聯(lián)信息,希望能幫助大家,功能實現(xiàn)模塊暫時告一段落,后期我不定期更新一些比特幣原理中其他比較重要的知識點跟大家一起學(xué)習(xí),謝謝大家。

向AI問一下細節(jié)

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

AI