正在加载图片...
1364 工程科学学报,第41卷,第11期 其所有子节点值的哈希值,而叶子节点存储了该 叶子节点.如图4展示了一个简单的基于区块链 区块内的所有交易的哈希值,一个交易对应一个 的默克尔树的数据结构 ho=H(hoollho) h=Hho肠,) hoo=H(to) ho=H(t1) ho=H(t2) h=H(ts) 图4默克尔树 Fig.4 Merkle tree 图4中,t0,t1,t2,t3表示交易,“‖”表示连接运算 式存储在vin0中,#vin用来表示输人交易的个数, 符,H(x)用于表示双SHA256函数,即 输出(x_vout)字段中的输出交易按照数组的形式 H(x)=SHA256(SHA256(x)) (1) 存储在vout0中,vout用来表示输出交易的个数. 哈希值h被称为树的哈希根或默克尔根 交易又分为两种,一种是Coinbase交易,这种 to,1,2,t3四笔交易对应默克尔树的叶子节点,使用 交易只有输出段没有输入段.另一种是常规交易, 哈希函数H()对每笔交易进行计算,分别得到哈希 它可以有多个输人和多个输出.比特币常规交易 值hoo=H(to、hol=Ht)、h1o=Ht2)和hI=H(t3), 中的每个输出都是下一笔交易的输入来源,每一 由于默克尔树中非叶子节点的值为其所有子节点 笔交易的输入也能追溯到上一个交易的输出,所 的值串联形成的字符串的哈希值,所以通过对每 以每一笔交易都可以进行向前溯源,从而找到每 个哈希值进行两两合并哈希,分别形成哈希值o和 笔交易的所有历史记录 h1,最后ho与h1进行两两合并哈希,得到本区块所对 交易脚本语言是为保障比特币中的交易安全 应的默克尔树的根h,存储在该区块的区块头中 而提出,它是一种基于栈的脚本语言(scripting 另外默克尔树的一个显著特点是可以具有很好的 language),具有简单、紧凑、容易理解等特点,并 溯源性2o 且其是非图灵完备的,不支持循环结构 综上所述,与传统分布式数据库相比较,上述 当一笔比特币交易被验证时,每一个输入 区块链的存储方式提供了对交易数据一致性检验 (vin)中包含交易序列号(txid)和解锁脚本(scriptSig), 和完整性验证功能的支持.区块链中每个保存完 其中解锁脚本与输入引用的输出(vout)中的锁定 整数据的节点记录了从创世区块到当前区块的所 脚本(scriptPubKey)同时执行,从而验证(Verify)这 有交易数据,哈希链表能验证各节点中的数据是 笔交易是否有效,如图6所示.解锁脚本是一个 一致的,任何改变都会以密码验证方式被发现.其 “解决”或满足被锁定脚本在一个输出上设定的花 次,默克尔树保证了交易记录不会被恶意篡改 费条件的脚本,它将允许输出被消费.锁定脚本是 3区块链交易 一个放置在输出上面的花费条件,它指定了今后 花费这笔输出必须要满足的条件.每一个比特币 区块链技术的核心基础是对交易(transaction) 验证节点会通过同时执行锁定和解锁脚本来验证 的支持,通过区块链交易可实现数字资产的创建、 一笔交易,如果解锁脚本满足锁定脚本条件,则输 转移、变更、终止等过程.本小节以比特币为例对 入有效.所有输入都是独立验证的,作为交易总体 其交易结构和交易脚本进行研究 验证的一部分 在比特币系统中一个完整的交易由以下的元 经常使用的5类脚本分别是: 素构成的:交易版本(n Version),输入(xvin),输出 (1)Pay-to-Public-Key-Hash(P2PKH) (x_vout)和锁定时间(nLockTime),由图5所示.其 a)scriptPubKey: OP DUP OP HASH160 中输入(仪vin)字段中的输入交易按照数组的形 <pubkeyHash>OP EQUALVERIFY OP CHECKSIG其所有子节点值的哈希值,而叶子节点存储了该 区块内的所有交易的哈希值,一个交易对应一个 叶子节点. 如图 4 展示了一个简单的基于区块链 的默克尔树的数据结构. t0,t1,t2,t3 H (x) 图 4 中, 表示交易,“||”表示连接运算 符, 用于表示双 SHA256 函数,即 H (x) = SHA256(SHA256(x)) (1) h t0,t1,t2,t3 H (x) h00 = H(t0) h01 = H(t1) h10 = H(t2) h11 = H(t3) h0 h1 h0 h1 h 哈 希 值 被 称 为 树 的 哈 希 根 或 默 克 尔 根 . 四笔交易对应默克尔树的叶子节点,使用 哈希函数 对每笔交易进行计算,分别得到哈希 值 、 、 和 , 由于默克尔树中非叶子节点的值为其所有子节点 的值串联形成的字符串的哈希值,所以通过对每 个哈希值进行两两合并哈希,分别形成哈希值 和 ,最后 与 进行两两合并哈希,得到本区块所对 应的默克尔树的根 ,存储在该区块的区块头中. 另外默克尔树的一个显著特点是可以具有很好的 溯源性[20] . 综上所述,与传统分布式数据库相比较,上述 区块链的存储方式提供了对交易数据一致性检验 和完整性验证功能的支持. 区块链中每个保存完 整数据的节点记录了从创世区块到当前区块的所 有交易数据,哈希链表能验证各节点中的数据是 一致的,任何改变都会以密码验证方式被发现. 其 次,默克尔树保证了交易记录不会被恶意篡改. 3    区块链交易 区块链技术的核心基础是对交易(transaction) 的支持,通过区块链交易可实现数字资产的创建、 转移、变更、终止等过程. 本小节以比特币为例对 其交易结构和交易脚本进行研究. 在比特币系统中一个完整的交易由以下的元 素构成的:交易版本 (nVersion),输入 (tx_vin),输出 (tx_vout) 和锁定时间 (nLockTime),由图 5 所示. 其 中输入 (tx_vin) 字段中的输入交易按照数组的形 式存储在 vin[] 中,#vin 用来表示输入交易的个数, 输出 (tx_vout) 字段中的输出交易按照数组的形式 存储在 vout[] 中,#vout 用来表示输出交易的个数. 交易又分为两种,一种是 Coinbase 交易,这种 交易只有输出段没有输入段. 另一种是常规交易, 它可以有多个输入和多个输出. 比特币常规交易 中的每个输出都是下一笔交易的输入来源,每一 笔交易的输入也能追溯到上一个交易的输出,所 以每一笔交易都可以进行向前溯源,从而找到每 笔交易的所有历史记录. 交易脚本语言是为保障比特币中的交易安全 而提出 ,它是一种基于栈的脚本语言 ( scripting language),具有简单、紧凑、容易理解等特点,并 且其是非图灵完备的,不支持循环结构. 当一笔比特币交易被验证时 ,每一个输入 (vin)中包含交易序列号(txid)和解锁脚本(scriptSig), 其中解锁脚本与输入引用的输出(vout)中的锁定 脚本(scriptPubKey)同时执行,从而验证(Verify)这 笔交易是否有效,如图 6 所示. 解锁脚本是一个 “解决”或满足被锁定脚本在一个输出上设定的花 费条件的脚本,它将允许输出被消费. 锁定脚本是 一个放置在输出上面的花费条件,它指定了今后 花费这笔输出必须要满足的条件. 每一个比特币 验证节点会通过同时执行锁定和解锁脚本来验证 一笔交易,如果解锁脚本满足锁定脚本条件,则输 入有效. 所有输入都是独立验证的,作为交易总体 验证的一部分. 经常使用的 5 类脚本分别是: (1)Pay-to-Public-Key-Hash (P2PKH) a) scriptPubKey:  OP_DUP  OP_HASH160 < pubkeyHash > OP_EQUALVERIFY OP_CHECKSIG h= H(h0 ||h1 ) h0= H(h00||h01) h00= H(t0 ) h01= H(t1 ) h11= H(t3 h ) 10= H(t2 ) h1= H(h10||h11) t0 t1 t2 t3 图 4    默克尔树 Fig.4    Merkle tree · 1364 · 工程科学学报,第 41 卷,第 11 期
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有