八. 打印区块

以上的转账交易中,我们共计创建了四个区块,其中一个区块为创世区块,另外三个区块都是对我们的交易进行打包后产生的新区块,本文将介绍如何将区块信息打印出来。

1.命令行代码

func (cli *CLI) PrintChains() {//cli.BlockChain.PrintChains()bc := GetBlockChainObject() //bc{Tip,DB}if bc == nil {fmt.Println("没有BlockChain,无法打印任何数据。。")os.Exit(1)}defer bc.DB.Close()bc.PrintChains()
}
  • 获取区块链对象
  • 调用PrintChains方法

2.创建迭代器

在上文中,我们将所有生成的区块均存储至BoltDB中,我们需要通过操作数据对区块进行获取,此处,我们创建一个迭代器用于对数据库进行遍历查询。

2.1 迭代器结构体

type BlockChainIterator struct {DB          *bolt.DBCurrentHash []byte
}

迭代器属性有两个,DB对象以及当前Hash

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

通过Iterator方法获取一个BlockChainIterator的对象

2.2 结构体方法

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 {//根据current获取对应的区块的数据blockBytes := b.Get(bcIterator.CurrentHash)//反序列化后得到block对象block = DeserializeBlock(blockBytes)//更新currenthashbcIterator.CurrentHash = block.PrevBlockHash}return nil})if err != nil {log.Panic(err)}return block
}

我们定义一个结构体方法Next用于对区块链进行遍历操作

  • 根据bcIterator,操作DB对象,读取数据库
  • 打开存储区块的Bucket表名
  • 根据current获取对应的区块的数据
  • 对获取到的数据进行反序列化得到block对象
  • 更新bcIterator的CurrentHash属性为上一个区块,方便进行对上一个区块(因为对区块链的遍历是从后往前知直至创世区块的)的获取操作.

3.创建打印区块函数

func (bc *BlockChain) PrintChains() {/*.bc.DB.View(),根据hash,获取block的数据反序列化打印输出*///获取迭代器it := bc.Iterator()for {//step1:根据currenthash获取对应的区块block := it.Next()fmt.Printf("第%d个区块的信息:\n", block.Height+1)fmt.Printf("\t高度:%d\n", block.Height)fmt.Printf("\t上一个区块Hash:%x\n", block.PrevBlockHash)fmt.Printf("\t自己的Hash:%x\n", block.Hash)//fmt.Printf("\t数据:%s\n", block.Data)fmt.Println("\t交易信息:")for _, tx := range block.Txs {fmt.Printf("\t\t交易ID:%x\n", tx.TxID) //[]bytefmt.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随机数:%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是创世取块,将结束循环hashInt := new(big.Int)hashInt.SetBytes(block.PrevBlockHash)if big.NewInt(0).Cmp(hashInt) == 0 {/*x.Cmp(y)-1 x < y0 x = y1 x > y*/break}}
}
  • 获取迭代器对象
  • 通过for循环对迭代器对象的Next方法获取到的区块进行遍历
    • 高度
    • 上一个区块的哈希
    • 区块自己的哈希
    • 交易数组Txs
    • 随机数
    • 时间戳
  • 对交易数组Txs进行遍历
    • 获取交易输入数组
    • 获取交易输出数组
  • 对交易输入数组进行遍历
  • 对交易输出数组进行遍历
  • 判断区块的上一个区块哈希是否为0 (bigInt的Cmp方法进行对比),结束循环

4.代码测试

4.1 命令行测试

$ ./mybtc printchain

返回结果

第4个区块的信息:高度:3上一个区块Hash:0000c728b52f7a988060ef97252582bb55a076fbd3724bf6c54ca3d28e8a48c1自己的Hash:000029e6e3277d493ad0e70f4e9b0bb4fff718ccddcb4613fcc89fa3c2ab89a1交易信息:交易ID:635c6c2f6953c5216ac3848e2bf4ca29cb366da4b7f9f6d7465fb0437a25ae7bVins:TxID:268d659bc26b71f9c2c55e8105d63d7e3530d10bcce3078616083473c9815015Vout:0sign:[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:5228a9c85bb44b2b5f33517c73322901cae2e27544e90a4e0f6f6da92377ff3aVout:1sign:[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:815c7c3969c256a053e99d44f8e1353ff7eaa99748efa7c94b2f066d9415a847Vout:1sign:[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:23PubKeyHash:[185 54 48 129 7 167 52 127 211 86 64 241 25 244 56 134 188 202 162 55]Value:2PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]交易ID:af5b0f1b76c3ec72cfd86c0c3d356c0d8fc6799955bd1e97597b693e0df2ff0bVins:TxID:Vout:-1sign:[]PublicKey:[]Vouts:Value:10PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]随机数:30579时间:2018-08-22 16:13:26
第3个区块的信息:高度:2上一个区块Hash:000002abf5db3196927ebd2160fa3903010d38e5eefc9f61fe18d3860e115986自己的Hash:0000c728b52f7a988060ef97252582bb55a076fbd3724bf6c54ca3d28e8a48c1交易信息:交易ID:5228a9c85bb44b2b5f33517c73322901cae2e27544e90a4e0f6f6da92377ff3aVins:TxID:4578ddd18b4cc57c2e6ef91679232bdf75f85d1100a41f49ab546293657642e9Vout:0sign:[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:3PubKeyHash:[185 54 48 129 7 167 52 127 211 86 64 241 25 244 56 134 188 202 162 55]Value:7PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]交易ID:268d659bc26b71f9c2c55e8105d63d7e3530d10bcce3078616083473c9815015Vins:TxID:Vout:-1sign:[]PublicKey:[]Vouts:Value:10PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]随机数:60270时间:2018-08-22 16:03:10
第2个区块的信息:高度:1上一个区块Hash:00005c7b4246aa88bd1f9664c665d6424d1522f569d981691ac2b5b5d15dd8d9自己的Hash:000002abf5db3196927ebd2160fa3903010d38e5eefc9f61fe18d3860e115986交易信息:交易ID:815c7c3969c256a053e99d44f8e1353ff7eaa99748efa7c94b2f066d9415a847Vins:TxID:31cb0a3fcf70ccf7cd2d5ec5564d266b022acd4aca28f0eee8b465a21863315fVout:0sign:[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:2PubKeyHash:[185 54 48 129 7 167 52 127 211 86 64 241 25 244 56 134 188 202 162 55]Value:8PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]交易ID:4578ddd18b4cc57c2e6ef91679232bdf75f85d1100a41f49ab546293657642e9Vins:TxID:Vout:-1sign:[]PublicKey:[]Vouts:Value:10PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]随机数:25508时间:2018-08-22 15:45:06
第1个区块的信息:高度:0上一个区块Hash:0000000000000000000000000000000000000000000000000000000000000000自己的Hash:00005c7b4246aa88bd1f9664c665d6424d1522f569d981691ac2b5b5d15dd8d9交易信息:交易ID:31cb0a3fcf70ccf7cd2d5ec5564d266b022acd4aca28f0eee8b465a21863315fVins:TxID:Vout:-1sign:[]PublicKey:[]Vouts:Value:10PubKeyHash:[134 186 213 244 81 129 0 161 13 161 102 238 69 121 251 18 154 152 44 233]随机数:32325时间:2018-08-20 22:11:28

4.2 区块关联图

上图整合了区块的相关属性以及关联信息,希望能帮助大家,功能实现模块暂时告一段落,后期我不定期更新一些比特币原理中其他比较重要的知识点跟大家一起学习,谢谢大家。

从0到1简易区块链开发手册V0.6-实现打印区块相关推荐

  1. 从0到1简易区块链开发手册V0.3-数据持久化与创世区块

    Author: brucefeng Email: brucefeng@brucefeng.com 编程语言:Golang 1.BoltDB简介 Bolt是一个纯粹Key/Value模型的程序.该项目的 ...

  2. 从0到1简易区块链开发手册V0.5-实现余额查询

    七. 查询余额 其实这个章节的一些知识点在转账交易那一章节均有所涉及,所以,查询余额这个功能相对而言比较简单,只要熟悉了UTXO模型,加上对交易流程的了解之后,对查询余额基本上已经有了思路. 1.命令 ...

  3. python区块链开发_10个开源的Python区块链项目

    Python不是主流的区块链底层平台开发语言,但是在DApp开发.区块链仿真与数据分析.智能合约安全分析等领域,Python依然是不错的选择.本文介绍了10个最流行的Python区块链项并提供了相应的 ...

  4. 区块链开发中使用的最流行的编程语言

    我们目前正处于一个新兴的区块链开发行业中.区块链技术处于初期阶段,然而这种颠覆性技术已经成功地风靡全球,并且最近经历了一场与众不同的繁荣.由于许多资金充足的项目现在急于建立区块链网络并在其上部署分散的 ...

  5. 区块链开发如何选择底层平台和开发语言?

    2019独角兽企业重金招聘Python工程师标准>>> 大多数人并不需要自己重新创建一套区块链,而是基于现有的区块链底层平台去开发自己的应用,对于类似加密算法. P2P技术.共识算法 ...

  6. 区块链开发语言python_区块链开发中使用的最流行的编程语言

    我们目前正处于一个新兴的区块链开发行业中.区块链技术处于初期阶段,然而这种颠覆性技术已经成功地风靡全球,并且最近经历了一场与众不同的繁荣.由于许多资金充足的项目现在急于建立区块链网络并在其上部署分散的 ...

  7. 区块链开发最流行的编程语言有哪些?

    我们目前正处于一个新兴的区块链开发行业中.区块链技术处于初期阶段,然而这种颠覆性技术已经成功地风靡全球,并且最近经历了一场与众不同的繁荣.由于许多资金充足的项目现在急于建立区块链网络并在其上部署分散的 ...

  8. 区块链开发编程语言整合

    在前年,区块链技术的发展得到前所未有的热门,很多区块链开发公司就此成立,本来高新技术人才就是处于供不应求的状态,随着区块链技术的发展,区块链开发人才也慢慢的变成一种珍宝,很多区块链开发者为了能够在区块 ...

  9. 技术沙龙|学习路径+案例分享,3小时快速入门区块链开发(西安)

    2019独角兽企业重金招聘Python工程师标准>>> 2018年3月开始,HiBlock区块链社区在全国多个城市发起区块链技术沙龙活动,目前已陆续在北京.杭州等地开展,4月22日我 ...

最新文章

  1. ICLR 2020被爆半数审稿人无相关领域经验,同行评审制度在垮塌?
  2. hdu4829 带权并查集(题目不错)
  3. 安装mysql 1045_mysql安装出现error Nr.1045
  4. 分布式事务seate-server的docker镜像的制作与部署
  5. 事业单位职称工资计算机,终于!事业单位绩效工资、职称变了!关系上千万人收入!...
  6. 医疗器械监管系统总结
  7. nessuss中文使用手册
  8. 互联网企业架构初期选择--初期技术选型
  9. .Net Core Nopi 工具的使用
  10. 新思维计算机软件中心,新思维 通信建设工程预算编制软件
  11. 微信号码检测工具为什么不能免费使用?(2017)
  12. 教你快速设计正交试验及试验数据分析
  13. Spring源码解析之AOP篇(一)----代理模式详解
  14. 阿尔山自驾游(2010年8月中旬,北京出发)
  15. IDC中国政府行业IT市场2013年10大预测:新型城镇化和第三平台技术推进政府信息化建设
  16. 百度冰桶算法说明,如何避免冰桶算法呢?
  17. 安卓miracast花屏_手机投屏电视频繁断开的解决办法
  18. win配置前端开发环境
  19. 自动柜员机是不是微型计算机,微型计算机基础知识.pptx
  20. 求最长不下降序列:逆推法

热门文章

  1. 关于libusb-win32开发的经验
  2. 物联网核心安全系列——物联网安全需求
  3. 在VB6中保存单色(1Bit)位图(VB6代码)
  4. VB获取快捷方式原文件路径
  5. 世界经济论坛正式成立AI委员会,李开复任联席主席,Bengio李飞飞在列
  6. 中科院发布了目标追踪数据集,1万多条视频,150万个边界框 | 快来下载
  7. 问答Goodfellow:没有样例能不能训练机器学习算法?
  8. react新特性实例详解(memo、lazy、suspense、hooks)
  9. 企业级应用的前端思考。
  10. 赞一个 kindle电子书有最新的计算机图书可买了【Docker技术入门与实战】