主页 > imtoken钱包不能安装 > 科普:比特币的区块与区块链

科普:比特币的区块与区块链

imtoken钱包不能安装 2023-02-06 07:46:49

科普:比特币的区块和区块链

对区块头数据做SHA256得到S1的值

00844eeb8713eb62bc33df34ca0cfa7af2ee152a6b16788fd3f2fea69861f3c8

对 S1 做 SHA256 得到 S2 的值

06e533fd1ada86391f3f6c343204b0d278d4aaec1c0b20aa27ba030000000000

按字节翻转 S2 得到区块哈希

000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506

nBits和nNonce字段的含义将在下一篇文章中介绍。

默克尔树

Merkle树是一种二叉树,用于汇总一个区块中的所有交易,代码见merkle.cpp。 Merkle树会生成整个交易集的数字指纹,形式为

科普:比特币的区块和区块链

交易将被放置在 Merkle 树底部的叶节点上。 如图所示,如果交易数量为奇数比特币属于区块链吗,则复制最后一笔交易来补齐。 其中:

科普:比特币的区块和区块链

无论区块中有多少笔交易,都采用Merkle树结构进行归纳,树顶端的Merkle Root的值会放在区块头的hashMerkleRoot字段中。

Merkle 树将区块头与区块中的交易相关联。 如果区块中的交易发生变化,默克尔树根的值就会发生变化,从而改变区块头,改变整个区块的哈希标识。

使用 Merkle 树的另一个好处是它提供了一种有效的方法来验证区块中是否存在交易。 对于下面的 Merkle 树,

科普:比特币的区块和区块链

为了证明交易 K 在区块中,可以使用

科普:比特币的区块和区块链

这四个哈希值构成了一条“Merkle路径”,只需要128个字节,任何人都可以通过这条路径来验证该区块是否包含交易K。

币库

一个区块最多只能有一笔Coinbase交易(通常是区块中的第一笔交易),它没有输入,输出是“无中生有”,即会发行新的比特币。

随着区块的产生,新的比特币会不断被“创造”出来。

比特币协议规定:

生成 210,000 个区块大约需要四年时间。

关于比特币的总量,你可以写一个程序来计算。

 package main import "fmt" func main() { totalBitcoin := 0 halfCount := 0 // 减半的次数 for coinbase := 5000000000; coinbase >= 1; coinbase /= 2 { fmt.Println(coinbase) totalBitcoin += coinbase * 210000 //  210000 个区块 Coinbase 减半 halfCount += 1 } fmt.Println("------------------") fmt.Println(halfCount) fmt.Println(totalBitcoin) } // 输出 // 5000000000 // 2500000000 // 1250000000 // 625000000 // 312500000 // 156250000 // 78125000 // 39062500 // 19531250 // 9765625 // 4882812 // 2441406 // 1220703 // 610351 // 305175 // 152587 // 76293 // 38146 // 19073 // 9536 // 4768 // 2384 // 1192 // 596 // 298 // 149 // 74 // 37 // 18 // 9 // 4 // 2 // 1 // ------------------ // 33 // 2099999997690000 

需要注意的一点是,由于Coinbase交易不需要输入,你可以在解锁脚本中填写任意值(2~100字节),这个值称为Coinbase数据。

根据BIP-34的要求,Coinbase数据需要从这笔Coinbase交易所在的区块高度开始。

交易d0ec21e1d73d06be76c2b5b1e5ec486085bda8264229046c11b95f66f2eded83的Coinbase数据为

 03ec59062f48616f4254432f53756e204368756e2059753a205a6875616e67205975616e2c2077696c6c20796f75206d61727279206d653f2f06fcc9cacc19c5f278560300 

开头的0x03表示块高数据后面有3个字节,值为0x0659ec(小端模式),即416236。

区块链

注意区块头中hashPrevBlock字段的神奇作用。 每个区块都会将其前一个区块的哈希值写入自己的区块头中。 区块的哈希值是区块头的哈希值。

科普:比特币的区块和区块链

如果链上某个区块的数据发生变化(比如区块中的交易被替换),那么这个区块的哈希也会发生变化(默克尔树的根发生了变化),同时发生变化下一个区块的哈希值。 区块头数据和区块哈希带来一系列连锁反应。

也就是说,从这个改变的块开始,所有后续的块都必须重新计算。

这是比特币区块链的一个非常重要的特性。

一段时间内产生的交易通过验证后比特币属于区块链吗,将被打包(组织)成块并“通知”给全网。 网络中的节点根据规则选择接受(跟随)这个区块(将这个区块放入总账)。 ),或拒绝(丢弃)该块。