Page 234 - 《软件学报》2025年第7期
P. 234

张孝 等: 区块链测试基准综述                                                                 3155


                 分布式账本. 从计算机科学的角度, 区块链实质是一个特殊的分布式数据库, 采用共识协议来保证各个节点上数据
                 的一致性, 能够容忍少量恶意节点, 并支持运行用户定义的程序                   (智能合约).
                    本节将介绍区块链的背景知识, 包括核心数据结构、事务处理过程、共识协议和智能合约, 最后将介绍区块
                 链所面临的安全威胁.

                 2.1.1    区块链数据结构
                    本节将对区块链的基础数据结构进行概述, 包括交易、区块以及状态数据库. 交易沿用了比特币系统的提法,
                 本质上是对状态数据库进行的一系列操作. 交易以区块为单位批量处理, 每个区块一旦在网络中达成共识, 所有的
                 节点便会执行该区块内的所有交易, 并更新本地状态数据库. 这一过程确保了整个网络中的状态保持同步和一致.
                    交易是一个带有数字签名的字符串, 表示了区块链中一个事务, 描述了对状态数据库的一个或一组操作, 如资
                 金转移、记录资产状态等. 数据库中用户提交               SQL  语句来执行操作, 而在区块链系统中, 用户则是通过调用智能
                 合约来实现相应的功能. 区块链一个交易的内容通常是对智能合约的部署和调用.
                    图  1  展示了比特币的区块结构. 区块由区块头和区块体组成, 区块头包含了区块链版本号、前一个区块的哈
                 希值、区块中所有交易数据的           Merkle 根哈希、时间戳等信息. 不同的区块链可能有不同的字段, 例如比特币的区
                 块头还包含随机数       (Nonce) 和难度目标    (Bit), 以太坊和  Hyperledger Fabric  的区块头还存储了状态数据库的
                 Merkle 根  (State root). 区块的哈希值是通过对区块头进行哈希运算得到的, 可作为区块的唯一标识符. 每个区块保
                 存前一个区块的哈希值, 以便于快速验证区块内容.


                      区块头                        区块头                         区块头
                       PreHash  TimeStamp BlockSize  PreHash  TimeStamp BlockSize  PreHash  TimeStamp BlockSize
                         Merkle root  Nonce         Merkle root  Nonce          Merkle root  Nonce
                                                 区块体
                                                     Hash 12    Hash 34

                                                  Hash 1  Hash 2  Hash 3  Hash 4

                                                   Tx 1  Tx 2  Tx 3  Tx 4
                                                    图 1 比特币区块结构

                    区块体是由多个交易组成, 根据这些交易的内容计算哈希值, 并根据它们在区块中的顺序进行串接运算, 即可
                 得到在区块头中保存的         Merkle 根哈希. 如图  1  所示, 对区块体中所有交易信息, 按预设的           Hash  算法计算各交易
                 的  Hash  值, 然后相邻的两个   Hash  值进行字符串拼接, 再进行哈希运算, 生成一个新的              Hash  值. 不断重复此过程,
                 最终形成一个根节点, 即       Merkle 根哈希. 为了克服传统      Merkle 树存储空间消耗和查询性能低下的缺点, 以太坊引
                 入改进后的    Merkle Patricia 树  (MPT), 融合了  Merkle 树和前缀树的优点. 以太坊中的交易树、收据树和状态树都
                 采用  MPT  结构. Hyperledger Fabric 为了减少添加数据的代价, 结合     Merkle 树和  Hash  桶两种数据结构的优点, 设
                 计了  Merkle Bucket 树. Hyperledger Fabric 中的交易树和状态树都采用   Merkle Bucket 的结构. 这些改进的   Merkle
                 树及其变体在区块链中起到保证数据完整性和验证数据有效性的重要作用, 并提高了存储效率和查询性能.
                    区块链状态数据库保存了区块链所支撑的应用程序中各变量的当前状态, 比如加密数字货币系统中各账户的
                 余额、拍卖程序中各用户的出价、物流溯源中各个货物的当前位置等. 比特币采用未使用的交易输出                                    (unspent
                 tansaction output, UTXO) 模型来记录状态, 这与比特币的交易结构密切相关. 每执行一个交易, 就将消耗一个或多
                 个  UTXO, 也会产生一个或多个新的        UTXO. 通过遍历    UTXO  集合, 可以计算出每个账户的余额. 以太坊采用账户
                 模型来存储状态数据, 每个账户包括了余额、合约代码、存储数据等信息. 以太坊中所有的账户                               (Key) 以及它们
                 的状态   (Value) 构成了一棵  MPT, 树根  (状态  Merkle 根) 存储在区块头部. MPT     中包括叶子节点、分支节点和扩
                 展节点这   3  种, 扩展节点包含了共同的       Key  前缀, 分支节点是一个长度       17  的  List, 前  16  个元素是  16  进制字符, 最
   229   230   231   232   233   234   235   236   237   238   239