1 区块链 简单地说,区块链其实就像是一个不可篡改的分布式数据库,该分布式数据库记录了一系列交易或事件。区块链运行在至少1个以上的节点上,每个节点都有自己的一个分布式数据库,也就是分布式账本。正常情况下,每个节点的分布式数据库里的数据都是一样的。区块链由不断生成的区块链接而成。一个区块包含区块头(Block Header)和区块数据(Block Data),区块数据又称为区块体(Block Body)。每个区块包含了一批交易的数据、时间戳和前一个区块的哈希值。哈希值是一种唯一标识,它保证了每个区块的完整性,一旦数据发生改变,哈希值也会立刻发生变化,因此保障了数据的安全性。而要改变一个区块,就要改变它之后所有的区块,这种特性使得区块链非常安全。此外,区块链是分布式的,因此没有单一的控制中心(除非区块链只运行在1个节点上),使得数据变得更加透明、可追溯和公开。总的来说,区块链是一种用于记录交易和事件数据的技术,它的特点是去中心化、不可篡改、透明、安全,并且可以实现智能合约等功能。 1.1 区块头 对于比特币来说,区块头(Block Header)包含以下几个字段: 版本号(Version):这是表示区块链协议的版本号。 前一个区块的哈希值(Previous Block Hash):这是前一个区块的哈希值,将前一个区块与当前区块链接起来,形成区块链。 默克尔根(Merkle Root):这是由所有交易数据构建的默克尔树的根哈希值,确保区块中的交易数据的完整性。 时间戳(Timestamp):这是区块的创建时间,以UNIX时间戳的形式表示。 难度目标(Difficulty Target):这是一个用于控制区块链的挖矿难度的参数,在计算哈希值时起到限制条件的作用。 随机数(Nonce):这是一个用于满足挖矿难度要求的随机数,矿工需要不断尝试不同的随机数来寻找满足要求的哈希值。 1.2 区块体 区块数据可以包含0笔、1笔或多笔交易,这些交易包括矿工的挖矿交易和其他转账交易。每笔交易信息都可以通过哈希函数,例如MD5、SHA-256,得到一个唯一对应的哈希值,也就是这笔交易的哈希值。对于比特币来说,使用SHA-256哈希函数。需要注意的是,每笔交易的信息,改变了哪怕1 bit的内容,交易的哈希值也就会被改变。哈希函数,简单地说,就是对于任意长度的输入,通过散列算法变换,都能得到一个成固定长度的输出,该输出就是散列值。 例如,如果使用MD5算法: 对于输入:”123456″,它的MD5的输出就是:”E10ADC3949BA59ABBE56E057F20F883E”,即:MD5(“123456″)=”E10ADC3949BA59ABBE56E057F20F883E” 对于输入:”哈希函数,简单地说,就是对于任意长度的输入,通过散列算法变换,都能得到一个成固定长度的输出,该输出就是散列值。”,它的MD5的输出就是:”1AC00B1CA622EF532564A51C29DA5D0D”, 即:MD5(“哈希函数,简单地说,就是对于任意长度的输入,通过散列算法变换,都能得到一个成固定长度的输出,该输出就是散列值。”)=”1AC00B1CA622EF532564A51C29DA5D0D” 关于哈希函数和交易id是如何来的,详细可以参考我的这篇文章: https://zhuanlan.zhihu.com/p/267649248 默克尔根的计算过程: 假设,区块数据里包含有5笔交易A、B、C、D、E。这5笔交易通过哈希函数得到的交易哈希分别是H1、H2、H3、H4、H5,然后把这5个交易哈希再两两组合,再一次进行哈希运算。即把H1和H2组合起来进行哈希运算,得到H12;把H3和H4组合起来进行哈希运算,得到H34,H5不变。这时候,得到新的交易哈希集合:H12、H34、H5。然后再进行新一轮的组合哈希运算,得到新的交易哈希集合:H1234、H5。最后,进行最后一轮的组合哈希运算,得到新的交易哈希根值:H12345。整个过程形成了Merkle树(Merkle Tree),这棵树的根节点就是交易哈希根值:H12345,也就是默克尔根(Merkle Root),它是由所有交易数据构建的默克尔树的根哈希值。默克尔树是一种二叉树结构,用于对多个交易进行散列和汇总,确保区块中的交易数据的完整性。 1.3 区块的哈希值的计算过程 以下是涉及到计算比特币区块哈希值的一些关键步骤和数据: 区块头(Block Header):比特币的每个区块都有一个区块头,它是一个包含多个字段的数据结构。区块头中包含了一些重要的信息,包括版本号、前一个区块的哈希值、默克尔根、时间戳和难度目标等。 Merkle树(Merkle Tree):在区块头中有一个字段叫做默克尔根(Merkle Root),它是由所有交易数据构建的默克尔树的根哈希值。默克尔树是一种二叉树结构,用于对多个交易进行散列和汇总,确保区块中的交易数据的完整性。 工作量证明(Proof-of-Work):比特币的区块链使用工作量证明机制来保护区块的安全性。为了计算区块哈希值,需要找到一个特殊的值,称为Nonce(随机数),使得通过对区块头的所有字段进行哈希运算后,得到的哈希值满足难度目标。这个过程是一个不断尝试的过程,需要大量的计算和能量消耗。 哈希函数(Hash Function):比特币使用SHA-256(Secure Hash Algorithm 256-bit)算法作为其哈希函数。SHA-256是一种加密哈希函数,它将输入数据转换为一个固定长度的哈希值,通常是256位。 根据上述数据和步骤,计算比特币区块的哈希值的过程如下: 将区块头的各个字段进行拼接,得到一个长的二进制数据。 使用SHA-256哈希函数对拼接后的二进制数据进行哈希运算,得到一个256位的哈希值。 如果得到的哈希值不符合难度目标,即不满足比特币网络中设定的困难程度,就需要不断尝试不同的Nonce值,再次进行哈希运算,直到找到满足要求的哈希值为止。 最终找到满足要求的哈希值后,将这个哈希值添加到区块头中的哈希字段,形成最终的区块头。 比特币的区块哈希值计算是一个耗时且困难的过程,需要大量的计算资源和能量。也就是说,比特币矿工挖矿的过程,就是不断地调整Nonce值进行哈希函数运算,使其计算出来的区块的哈希值满足难度目标,这样就获得了出块权产生该区块,从而获得区块奖励。更具体来说,就是比特币矿工计算出来的哈希值,等于或低于比特币网络设定的256位目标数字的有效哈希值的难度时,矿工就可以成功找到并解锁新区块。因此,该目标值越低,挖掘难度就越高,而且该目标值是动态调整的。比特币大约每10分钟产生一个区块,每挖出2016个块调整一次比特币挖矿难度调整。正常情况下,比特币每挖出2016个块,也就是需要每14天左右,所以,矿工也称14天为一个难度期。比特币挖矿难度调整是根据之前一个难度周期比特币挖矿难度调整的比特币全网算力来调整,所以难度和全网算力是相关的,时间上有一定的滞后。当矿工在一个难度期内发现区块挖掘时长低于10分钟这个目标平均值时,比特币网络将会增加难度;反之,就会降低难度。这样的做法,保证矿工挖掘新区块的时间尽可能地接近10分钟的平均值。 […]
