官方文档翻译《The Libra Blockchain》之执行交易(一)

译自:官方文档翻译《The Libra Blockchain》之执行交易,第三小节。本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行许可。

执行交易

Libra 协议中,修改区块链状态的唯一方法是执行交易。本节将介绍执行一个交易所必须的条件,定义了交易的结构如何,解释了 Move 虚拟机如何执行一次交易的,还介绍了 Move 语言的关键概念。

Libra 协议的最初版本中,Move 的功能尚未完全开放给用户使用,只是其中的一部分而已。虽然我们说用 Move 来定义系统核心的概念,例如 Libra 货币等,但是用户还不能自定义自己的资源类型,不能自定义模块(module)。当前 Move 及其工具尚未成熟,所以要等到核心系统有足够把握的时候,才会向用户呈现,这也避免了过早地面对那些可伸缩性的问题,例如打造一个通用意义的智能合约,就必须在交易执行和数据存储之间协调。在第十节中,我们将集中谈谈 Move 语言的规划,将来会提供哪些完整的功能。

执行条件

已知初始状态。 所有验证器必须同意初始的系统账本状态,或者创世块(Genesis,译注:区域链的第一个区块在技术上被称为“创世块”)的账本状态。区块链上的核心组件,包括哪些呢?就是账户业务逻辑、交易验证、验证器选区和 Libra 货币。这些都是用 Move 语言的模块(Module)所编写,创世块也不例外,必须有这些模块定义好,也就是说,创世块依赖这些组件来处理交易(必须得至少有一个账户可以为第一笔交易支付费用;另外还得要一组验证器,负责仲裁这笔交易(第一笔)是否合法,合法了就签名认证通过)。

为简化系统的设计,系统的初始状态是一个空的状态。第一笔交易会创建创世块,我们定义这交易为 T0。这笔交易不是一般的交易而是特殊的,它的模块也是特殊的。对于以 T0开头的账本历史,客户端和验证器只能通过配置的方式读取,它由加密哈希标识。账本历史不会通过共识协议添加这些特殊的交易,而是通过配置才行。

可确定性。 交易执行必须是确定性的和密封的。只需要提供了交易信息和当前账本信息,完全可以预测执行交易过程中有什么结果输出。交易过程中没有外部交互(例如打印到控制台或与网络通讯)。即使每个验证器独立执行交易,但是由于确定性和密封执行,使得多个验证器可以就由相同的交易序列产生的状态达成一致。这也意味着区块链的交易历史可以从创世块开始重新执行,以生成当前的账本状态(参见第2.3节)。

关于计费。 为了支付运算的消耗,Libra 协议提出交易费的概念,以 Libra 币本身来计价。这参照了以太坊的气化模型(Gas Model),也是较多人所接收的模式。为满足 Libra 生态系统的需求,我们选择有足够运力的验证器进行运算(参见第八节)。在一些高负载的运行期间(例如 Ddos 攻击时候),我们希望减少交易的需求,于是提出了交易费的概念(译注:这相当于增加成本的做法);在正常运行期间,有足够的运力的话则费用较低。此方法不同于现有的一些区块链,那些区块链的目标是以较低运力的验证器选择性地处理交易而不是吞吐量。在该系统中,在高需求期间交易费用会激增——这增加了验证者的收入来源,但一方面也增加了用户的成本。

费用的多少取决于两个因素:气化价格(Gas Price)和气化成本(Gas Cost)。Libra 中每笔交易都事先标价了提交者愿意支付的单价,此单价便是气化价格。交易执行必然会占用计算资源,Gas Cost 就是反映该成本的多少。价高者的交易,验证器优先执行;而且当系统繁忙时,可能会放弃价格较低的交易。这目的就是减少了高负载下交易的需求。

此外,交易还包括最大气化量,即提交者愿意支付最大的气化量。在执行期间,VM 会跟踪使用的气化量的数量。如果在执行完成之前达到了最大气化量限制,VM 就会立即停止。即使已经发生修改的那些部分都不会提交给状态。但是交易仍会显示在交易历史记录中,发送者帐户依然要支付所用的气化值。

正如我们在本节中讨论的那样,区块链核心逻辑的许多部分都是使用 Move 定义的,包括气化值的扣除。为了避免死循环,VM 在执行这些组件时候禁止气化值计费。这些核心组件必须在创世块状态下定义,并必须以防御性方式编写,以防止恶意交易触发高费用的运算消耗。执行该逻辑的成本可以包含在交易的基本费用中。

资产语义化。 如同我们在2.1小节说的,账本直接编码对应现实世界的数字资产。交易的过程中必须保证不能资产被无限复制的情况发生,所谓资产,Libra 货币就是一种,也要保证不能丢失,或者未经认证就执行了交易。Libra 协议使用 Move 虚拟机来实现交易,这一过程中,自定义资产都是安全的,都保证符合以上安全性的要求。

交易结构

一个交易是包含以下字段的签名消息。

  • 发送者地址:交易发送者的账户地址。VM 读取序列号、认证 key 和该账户下存储的余额(读取 LibraAccount.T)。
  • 发送者的公钥:公钥、私钥对应一起完成交易的签名。公钥之 hash 值必须与发送者 LibraAccount.T 保存的认证 key 一致才行。
  • 程序:要执行的交易脚本,以 Move 字节码形式保存;可选地还可以有脚本的输入列表,或者要发布的 Move 模块字节码列表。
  • 气化值(Gas Price):为执行该次交易,发送者愿意付出的报酬,用气化值单位衡量,也是 Libra 币。
  • 最大气化值:在这次交易中允许消耗气化值的最大值,在停止交易之前。
  • 序列号:无符号的整型数字,必须与发送者 LibraAccount.T 的序列号一致。执行此事务后序列号加1。由于只能为给定的序列号提交一次交易,因此无法重放交易。
发布了293 篇原创文章 · 获赞 260 · 访问量 232万+

猜你喜欢

转载自blog.csdn.net/zhangxin09/article/details/95730652
今日推荐