区块链的触发器--交易

1. 什么是交易

交易是由外部系统账户区块链系统发起的经过签名的消息

外部账户:拥有私钥的账户,控制合约的访问(比如发起交易);私钥用于对交易进行签名
合约账户:智能合约部署后的地址;没有私钥

#

2. 交易的作用

  • 触发区块链状态改变(管理资产,价值转移)
  • 触发 EVM 上的合约执行;

交易的生命周期:

构建交易
私钥签名
网络传输到多个节点
通过共识机制打包到区块
执行交易(节点执行交易相关智能合约代码,修改区块链状态,存储新区块状态)
交易确认
生成交易回执(receipt),和交易一起保存在区块中(结果码,日志,消耗的 gas 量)

transaction-lifetime

”只读”交易用于读取链上数据,节点收到请求后会根据请求的参数访问状态信息并返回,并不会将请求加入共识流程,也不会导致修改链上的数据。

3. 交易的结构

交易的本质是一串打包在一起的二进制数据。

下表是某公链的交易结构:

字段 描述
nonce 由始发EOA(外部所有账户)发出的序列号,
用于防止消息重播(交易的重放攻击)。
gas price 发起人愿意支付的gas价格(以wei为单位)。
gas limit 发起人愿意支付的最大gas量。
to 目标区块链中账户地址。
value 发送到目标地址的资产数量。
data 附在交易中的变长二进制数据。
v,r,s 始发EOA的ECDSA签名的三个组成部分。

备注:

EOA 表示外部账户;
交易消息的结构使用递归长度前缀(RLP)编码方案;
交易结构并不包含 EOA 的地址的 “from” 字段,EOA 的公钥通过 ECDSA 签名的 v,r,s 计算得出;
不同的联盟链对数据结构有相应的扩充;比如:FISCO-BCOS 交易的数据结构和编码协议

3.1. RLP 编码方案

RLP(Recursive Length Prefix),递归长度前缀编码:

  • 主要用于数据的网络传输和持久化存储;
  • 不包含任何字段的标识符或者标签;
  • 使用长度偏移量来表示每个字段的长度;

参考文档:

4. 交易的随机数(nonce)

nonce 是一个数值,等于这个地址发出的交易数量,当这个地址与合约关联时,是这个地址所创建的合约数量。

特点:

  • 发起方地址的一个属性,只在发送地址的上下文中才有意义;
  • 没有作为账户状态的一部分,显示的保存在区块链上,而是通过计算发送方地址已经确认的交易数量而动态计算;

作用:

  • 创建顺序交易,去中心化系统中,保证节点按照一定的顺序(nonce 的值大小)先后处理交易;
  • 交易重复保护,防止原始交易被”复制“后重复发起;

4.1. nonce 间隔

区块链网络是根据 nonce 数值的顺序处理交易,如果发出了一个 nonce = 0 的交易,接下来发起一个 nonce = 2 的交易(缺少了 nonce = 1 的交易),那么第二个交易不会被确认,会一直存在待确认交易内存池中,区块链网络会一直等待 nonce = 1 的交易出现。所有节点都认为 nonce = 1 的交易因为网络延迟问题还没有传输过来,而 nonce = 2 的交易先到。

4.2. nonce 确认

由于区块链网络处理交易是根据 nonce 的数值顺序来处理,所以,一旦中间某个交易没有被“确认”(成功处理),那么之后所有的交易都会被“卡”住,会一直等待没有被确认的交易。

交易可以在 nonce 序列中产生无意的“间隙”,比如因为它无效或 gas 不足。为了让交易能够被继续处理,你必须使用缺失的 nonce 值创建一笔有效的交易。一旦这笔确实的交易被确认后,后续的交易都会被广播,逐渐变得有效;而且无法“撤回”任何交易。

4.3. nonce 重复

如果发出两个相同的 nonce 的交易,但是接受地址,或者交易金额不同,那么只有其中的一笔交易会被确认,另一个会被拒绝。最先到达区块链网络中确认节点的那个交易会被确认(随机)

5. 交易 gas(了解 BSN 最终的计费方案?)

gas 是区块链网络中的计量单位,表示在区块链上执行具体的操作所消耗的计算量和存储资源。

特点:

  • 独立的虚拟货币

目的:

  • 控制交易对资源的使用,防止虚拟机内恶意代码死循环;
  • 避免拒绝服务攻击;
  • 防止交易的过度消耗;
  • 使用 gas 来表示对资源的消耗,不牵扯到具体的虚拟币,可以让物理资源不受虚拟币价格的波动而受到影响。

gasPrice:

  • gasPrice 从字面上来看,表示 gas 的价格,表示在发起交易时,发起方愿意为每单位 gas 支付多少的 代币数量。因此,gas 的单位为:wei/gas;
  • gasPrice 最低可接受的值是 0;
  • gasPrice 越高,交易被确认的速度越快;

gasLimit:

  • gasLimit 表示发起方为了完成交易所愿意支付的最大 gas 数量;

gasUsed:

  • gasUsed 是交易中消耗的总共的 gas;
  • 交易的总费用 = gasUsed * gasPrice <= gasLimit;

6. 交易的接收方(to)

to 是一个 20 字节的区块链账户地址,有两种:

  • 外部账户地址:资产转移;
  • 合约地址:调用合约方法;

提示:

  • 区块链不会验证接收方的地址正确性。

7. 交易中的 value 和 data

交易数据包的核心是两个字段:value 和 data。

交易中 value 和 data 的情况:

  • 同时包括 value 和 data:
  • 只有 value:支付操作;
  • 只有 data:合约调用;
  • 既没有 value 也没有 data:没有意义,浪费 gas;

8. 特殊交易-合约创建

合约创建交易的目的地址是一个特殊地址–零地址(0x0),data 字段中包含经过编译的合约字节码,目的是把合约注册到区块链网络上。同事,如果 value 字段中包括了代币,表示为合约设置起始余额。

9. 交易签名

交易签名的流程:

  • 创建一个包含九个字段的交易数据结构:nonce,gasPrice,startGas,to,value,data,v,r,s;
  • 生成交易的RLP编码的序列化消息;
  • 计算此序列化消息的Keccak256哈希;
  • 计算ECDSA签名,用发起EOA的私钥签名散列;
  • 在交易中插入ECDSA签名计算出的 r 和 s 值;

提示:

  • v 表示链标识符 chainId。
  • “简单重放攻击保护”的 EIP-155 标准。通过在交易结构中加入一个 v 变量(chainId,不同的网络 chainId 有不同的值,比如 区块链网络 A 是 1, 区块链网络 B 是 61 等等)来实现。确保在一个区块链网络(如区块链网络 A)上创建的交易在其它的区块链(如区块链网络 B 或者 区块链 测试网)上是不合法的。所以,在一个网络广播的交易,不能被重放到另一个网络,这就是所谓的重放攻击保护。

10. 离线签名

离线签名是指将交易的签名和交易的广播分开处理,将交易的签名放在一个不连外网的环境中。等交易签名后,再将签名后的交易放入到联网的网络中进行广播。

目的:

  • 保护私钥的安全;

11. 总结

区块链的本质就是一个不可篡改的分布式账本,而账本是由一个个区块组成,每个区块通过引入前一个区块的 hash 值,形成一个链状结构的数据。每一个区块,包含了区块头和区块体,区块体由一笔笔交易和相关的回执信息组成。所以,交易作为区块链数据存储的最基本的单位,在区块链中扮演重重要的角色。

同时,交易也是区块链网络系统进行每项活动的起点,是区块链网络中的“输入”窗口,可以触发虚拟机执行合约,价值转换等操作,用于修改区块链的状态。

Just for my love !!