智能合约编写高级篇(二)区块哈希介绍
本文档从区块哈希基本概念出发,详细介绍了中移链的区块哈希交易接口和应用方向。适用于 EOS 区块链智能合约高级开发人员,熟悉如何获取当前发生交易所在的区块号和区块哈希前缀,并通过 Tapos 机制验证交易的有效性。
01
概述
(一)哈希算法
哈希算法是可以将任意长度的二进制数据映射为固定长度二进制数据(哈希值)的一种算法。在这个过程中,哈希函数将输入数据通过一系列的复杂运算变换成固定长度的输出,这个值等同于存放数据的地址,这个地址里面再将输入的数据进行存储,所以哈希函数可以将互联网上的数据以固定长度字符串的形式来保存。同时,哈希函数可以用于密码学、数据完整性验证、信息指纹等领域,常见的哈希算法有 MD5、SHA-1、SHA-256 等。
(二)区块哈希
区块哈希是通过哈希算法对区块中的所有数据进行计算得出的固定长度的字符串。具体来说,区块哈希是指在区块链技术中,对于每一个新生产的区块,会给这个区块计算一个固定长度的哈希值,这个哈希值包含了这个区块中所有的数据,包括交易记录、上一个区块的哈希值、时间戳等,并且只要这些数据有任何一点改变,那么这个区块的哈希值就会发生变化,所以它在保证网络安全性、防止篡改和验证数据完整性方面起着非常重要的作用。
(三)区块哈希的特点
区块哈希的存在保证了区块链的数据安全性,任何篡改数据的行为都会被立即发现,同时它也具备以下特点:
唯一性:每个区块哈希值都是唯一的,即使是区块链上有极其微小的一点数据改变,也会导致哈希值的变化。这保证了数据的不可变性和唯一标识性。
不可逆性:区块哈希函数是一个单向函数,可以将任意长度的数据转换为固定长度的哈希值。对于哈希值无法进行反向计算推导恢复原始数据,这保证了数据的安全性。
不可篡改性:如果输入数据发生了任何改变,计算得到的哈希值都会发生变化。
02
环境依赖
eosio_2.1.0-1
eosio.cdt v1.8.x
03
区块哈希接口
与区块哈希相关的交易接口分别有 tapos_block_num()和 tapos_block_prefix(),它们用于生成区块哈希及验证交易执行的前提条件,这有助于确保交易的有效性和安全性,并提供区块链的相关信息以支持智能合约的开发。
(一)tapos_block_num()
它是一个用于获取当前交易所引用的区块号的函数,它返回一个无符号整数值,代表当前执行交易的区块高度。块高度表示当前执行的块在整个区块链上的位置,可以用于构建块摘要和验证交易。在交易处理过程中,每个块都有一个唯一的块高度。
源码描述
调用方式
(二)tapos_block_prefix()
它是一个用于获取当前交易所在区块哈希前缀的函数,它返回一个无符号整数值,代表当前执行交易的区块哈希前缀。区块哈希前缀是区块哈希的一部分,用于构建 block summary。它通常作为一个随机数,用于增加区块哈希的难度,以保持加密的安全性。
源码描述
调用方式
(三)什么是 TaPos 机制?
TaPos 是“交易作为权益证明”(Transaction-as-Proof-of-Stake)的缩写。TaPos 是在 EOS 的交易处理过程中引入的一个概念,它是一种用于实现去中心化共识的机制,目的是确保交易执行的前提条件和验证交易的有效性。在去中心化的区块链网络中,由于网络可能存在延迟和分叉,交易的确认和执行顺序可能会有所不同,所以引入 TaPos 机制来防止在不包含引用区块的分叉上重放交易,从而增加了安全性和可靠性。下面我们来看一下 EOS 白皮书是如何对 TaPos 进行描述的。
(四)如何通过 TaPos 验证交易
通过 TaPoS 机制,EOS 网络可以确保交易的顺序性并防止在不同块之间重放交易,所以每个交易都必须包含正确的 TaPoS 字段,即交易作为股权证明的一部分,在交易签名过程中,这些字段会与其他的交易信息一起打包进入交易,以便验证它们的有效性。为了让链更稳固,也让用户交易更安全,当链中每发生一笔交易时,都会验证两个字段,分别是 ref_block_num 和 ref_block_prefix,以下是 eosio.cdt 中对它们的声明。
以下代码是在交易初始化时候验证 ref_block_num 和 ref_block_prefix 两个字段。
(五)测试用例
编写智能合约测试用例,通过调用上文中介绍的 tapos_block_num()和 tapos_block_prefix()两个函数来获取验证交易有效性的两个字段 ref_block_num 和 ref_block_prefix。
返回结果如下:
以下是对应区块结构 transaction 中的 ref_block_num 和 ref_block_prefix。
需要注意,ref_block_num 表示的是交易所引用的区块的区块号码,而 ref_block_prefix 是这个区块的哈希前缀。在交易签名过程中,这些字段会与其他的交易信息一起打包进入交易中,以便验证这个交易是否合法。而在 cleos get transaction 命令所显示的交易信息中,另一个名为 block_num 的字段则表示最终执行该交易的区块的区块号码,此字段与交易提交时所引用的区块号码 ref_block_num 是不同的。因为在提交交易时,可能会发生交易被延迟,所以最终执行该交易的区块可能与该交易所引用的区块不同。
END
评论