2.区块链原理
2.1区块链基础架构
- 如果使用Bitcoin-Qt客户端,数据区块的信息就储存在电脑里面。每次打开客户端,数据区块都会跟整个P2P网络分布式数据库同步,根据操作系统的不同,数据区块目录blocks一般存放路径为:
Windows: %APPDATA%\Bitcoin\
Linux:~/.bitcoin/
Mac OS: ~/Library/ApplicationSupport/Bitcoin/ - 打开blocks文件夹,可以看到很多名为blkXXX.dat的文件,这些文件中就保存了传说中的数据区块记录。
blkXXX.dat文件在终端下可以用hexdump打开。
以有代表性的比特币和以太坊基础架构为例:
- 虚线为以太坊与比特币的不同之处
数字货币的区块链系统包含: 底层的交易数据->每个区块按时间顺序链接狭义的分布式账本->各个节点分别保存一份重要的共识机制->通过P2P协议进行通信完整可靠的分布式网络、网络之上的分布式应用。
代表性创新点:不可篡改的区块链数据结构、分布式网络的共识机制、工作量证明机制、灵活的智能合约等
2.1.1区块结构
在区块链系统中,底层数据并不是存储在区块链中的数据,这些原始数据需要进一步加工才能被写入区块内。底层数据最根本的是交易记录,其他的数据只是为了对消息记录进行封装。区块是由一个包含元数据的区块头和紧跟其后的构成区块主体的一长串交易组成。区块头是80字节,而平均每个交易至少是250字节,而且平均每个区块至少包含超过500个交易。因此,一个包含所有交易的完整区块比区块头的1000倍还要大。
区块结构如下表所示:
2.1.2区块头
区块头由三组区块元数据组成。首先是一组引用父区块哈希值的数据,这组元数据用于将该区块与区块链中前一区块相连接。第二组元数据,即难度、时间戳和nonce,与挖矿竞争相关。第三组元数据是merkle 树根(一种用来有效地总结区块中所有交易的数据结构)。
区块头结构如下表所示:
时间戳被用来加盖在区块头中,确定区块的写入时间,同时也使区块链具有时序的性质,时间戳可以作为区块数据的存在性证明,有助于形成不可篡改不可伪造的分布式账本。更为重要的是,时间戳为未来给予区块链技术的互联网和大数据增加了时间维度,使通过区块数据和时间戳来重现历史成为可能。
2.1.3交易记录结构
数据区块的交易记录中,详细记载了比特币的交易记录和相关细节。其中在比特币收支详情里面,记录了收支的比特币地址和merkle节点值等情况,因此收支详情是交易记录中最重要的部分。
交易记录结构如下表所示:
2.1.4比特币收支交易结构
在数据块中,比特币支出和接收交易是写在一起的,整个收支记录包括很多笔记录。每一笔记录都有自己的索引编号以供查询。每一笔记录中包括了生成时间、引用交易的哈希值、交易记录索引编号、比特币支出地址、支出地址数量等细节。每一笔收支交易记录都有一个Merkle节点值,这个hash节点值是整个Merkle树的一部分,决定了每一个地址都不能重复交易和被伪造。
比特币收支交易结构如下表所示:
2.2 SHA256算法
- 安全散列算法SHA(Secure Hash Algorithm)是美国国家安全局(NSA)设计,美国国家标准与技术研究院(NIST)发布的一系列密码散列函数,包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等变体。主要适用于数字签名标准(DigitalSignature Standard DSS)里面定义的数字签名算法(DigitalSignature Algorithm DSA)。
- 区块链不会直接保存明文的原始交易记录,只是将原始交易记录经过散列运算,得到一定长度的散列值。比特币使用双SHA256 散列函数,将任意长度的原始交易记录经过 2 次 SHA256 散列运算,得到一串 256 bit 的散列值,便于存储和查找。
- 散列函数具有单向性、定时性、定长性和随机性的优点。单项性指由散列值无法反推得到原来的输入数据(理论上可以,实际几乎不可能),定时性指不同长度的数据计算散列值所需要的时间基本一样,定长性指输出的散列值都是相同长度,随机性指 2 个相似的输入却有截然不同的输出。同时,SHA256 函数也是比特币所使用的算力证明,矿工们寻找一个随机数,使新区块头的双 SHA256 散列值小于或等于一个目标散列值,并且加入难度值,使这个数学问题的解决时间平均为 10 min,也就是平均每 10min 产生一个新的区块。
2.3 Merkle Tree
为了解决存储代价问题,将会采用Merkle Tree,一种数据一致性同步算法
Merkle 树是区块链技术的重要组成部分,将已经运算为散列值的交易信息按照二叉树形结构组织起来,保存在区块的块体之中。
- Merkle 树的生成过程:将区块数据分组进行散列函数运算,将新的散列值放回,再重新拿出 2 个数据进行运算,一直递归下去,直到剩下唯一的“Merkle 根”
比特币采用经典的二叉 Merkle 树,而以太坊采用了改进的 Merkle Patricia 树
在比特币的Merkle 树中两次使用到了SHA256 算法,因此其加密哈希算法也被称为double-SHA256。 N个数据元素经过加密后插入Merkle 树时,至多计算2*log2(N)次就能检查出任意某数据元素是否在该树中,该数据结构非常高效,只要形成一条从特定交易到树根的认证路径或者Merkle 路径即可
Merkle Tree大致结构如下图所示: