Leap v3.1版本区块链软件将数月的研究和开发浓缩为一次网络升级,其中包含了大量实用的功能和修复。

之前发布的蓝皮书概述了其中的一些功能。API+蓝皮书推荐了一些改进措施,以减少交易损失,提高交易生命周期的可预测性。

之前的文章探讨了主观计费系统如何导致交易丢失,并概述了针对常见交易生命周期问题(如交易丢失)的现有修复方法。 Leap v3.1版本引入了新工具来解决这些问题和其他用户体验障碍。

Leap v3.1版本引入了以下新的交易生命周期工具:

其他不以交易生命周期为重点的Leap升级包括:
Leap v3.1删除了: 
  • 历史插件,该插件在1.2版本中已被弃用 
  • MongoDB插件
  • 旧的构建脚本
  • Reversible区块数据库
  • 支持macOS和其他Linux发行版。Mandel v3.1版本只正式支持Ubuntu 18.04、20.04和22.04
  • 弃用了abi_bin_to_json和abi_json_to_bin的转换API

与EOSIO 1.8一样,Leap v3.1版本需要协调协议的激活。节点必须更新二进制文件并改变配置设置,运行EOSIO 2.1的节点必须在区块生产者激活新的协议功能之前,采取一些其他的升级步骤。运营商需要在2022年9月21日的计划升级日期前,完成这些步骤。任何没有激活Leap v3.1版本的节点,都无法在9月21日之后与网络的其他部分保持同步。

您可以在我们的升级指南中,找到有关升级步骤的更多详细信息。

新的Leap v3.1 版本功能

交易失败追踪和新交易端点

(详情细节)

Leap v3.1版本引入了一个新的交易端点,当交易失败时,它包括一个详细的失败报告,并嵌入了交易异常。这个详细的报告就是交易失败追踪。不要把这个报告误认为是成功的交易追踪。您可能需要验证收据及其他字段,以确保交易成功。

在Leap v3.1发布之前,交易失败会导致交易失败追踪,但没有失败的详细信息。Leap v3.1的交易失败追踪指明了交易中失败发生的位置,并确定了是哪个操作导致了失败。新的 Leap v3.1交易端点默认启用此功能。

交易重试

(详情细节)

交易重试功能允许API 节点重新提交丢失的交易,直到它们被写入区块或过期。

存在一个背景知识,当用户连接到API 节点并向网络发送交易时,并不能保证该交易会成功进入区块。

存在许多问题,如主观计费或地理延迟,可以阻止交易在网络上传播到活跃的区块生产者。解决这些问题的方法之一是允许API 节点跟踪交易并纳入区块链,并重试区块生产者未在区块中发布的交易。

交易重试功能创建了一个传入交易池,并将交易暂时保留在池中。在被纳入一个区块后,该交易在池中保持一定数量的区块或直到该区块达到不可逆转状态。

节点运营商单独设置交易池参数和定义缺失交易的标准。 如果该工具根据这些标准检测到丢失的交易,它会重新将交易提交到网络。

交易终结状态

(详情细节)

交易终结状态功能允许节点分享给定交易的最终状态。它还会返回当前链状态的快照。

开发人员在其智能合约中实现的最常见功能之一是检查交易的最终状态。 使用当前工具,每个开发人员都必须构建自定义解决方案。 构建和重建交易最终状态的需求增加了开发时间,并增加了智能合约的利用的错误率。 允许节点直接提供交易的确定性信息具有很大的价值。

交易终结状态功能允许节点共享当前链状态的快照。启用该功能的节点可以存储交易状态并打开一个新的端点来查询该状态。如果交易没有出现在链上,它返回的状态是 「UNKNOWN」。

交易资源成本估算

(详情细节)

交易资源成本估算功能允许节点打开一个只读端点,该端点返回资源成本的估算值。

在 Antelope 链中,活跃的区块生产者在执行时确定交易的成本。 区块生产者通过测量用于执行交易的非签名部分的CPU时间来确定CPU成本。区块生产者CPU性能的差异,使得在发送交易之前很难确定实际的资源成本。

交易资源成本估算功能可帮助用户和应用程序更准确地估算交易的资源成本。 资源成本估算功能会创建一个 API 端点,来接收未签名的交易。启用该功能的节点会根据API节点处理交易所需的时间,返回对交易资源成本的估计。

主观计费改进

(详情细节)

Leap v3.1版本的主观计费改进包括对两个现有工具的更改。 第一个更改允许节点从默认的 24 小时调整主观计费衰减时间。 第二个更改允许调整区块生产者使用的三击规则(three-strikes rule)中的三击(three-strikes rule)参数。

因为 Antelope 链仅在区块生产者向区块链发布交易时才向账户收费,因此失败的交易实际上是免费的,有时会导致滥用。 三击规则(three-strikes rule)和主观计费工具减少了节点上的失败交易负载,但也带来了用户体验障碍。 Leap 引入了可调节的主观计费和三击(three-strikes rule)参数来减轻用户体验障碍。

账户最大失败次数:

在主观计费之前,EOSIO 2.0.9 对区块生产者节点实施了三击规则(three-strikes rule)。 当账户在一个区块中发送了三个失败的交易时,三击(three-strikes rule)功能会放弃该账户的其余排队交易,从而减少失败交易的负担。

以前硬编码的3次限制现在可以配置为任意数量的失败次数。

此外,已使用disable-subjective-account-billing 选项列入白名单的账户,将不再受到最大交易失败限制。

主观账户衰减:

节点通过使用主观计费来跟踪账户的每个节点的失败交易 CPU 预算,来防止过多的失败交易。 该协议在称为主观账户衰减的时期内将此预算返回给账户。 以前硬编码的 24 小时衰减时间现在变成可配置的。

对于当前的 24 小时时间窗口,对于 6 小时内未推送交易的账户,节点应用 6/24 或 ¼ 的乘法运算,只提供该账户原本可用资源的25%。

当时间窗口调整为 6 小时时,节点应用 6/6 ,即乘以 1 的乘法运算,这为同一账户提供了 100% 的可用资源。

当窗口设置为一小时时,测试发现一小时窗口可以有效地缓解失败的交易垃圾邮件,而不会出现用户体验问题。

其他功能:

其他新功能包括与加密相关的改进、新协议选项、修剪功能和日志记录改进。 一些功能优化了与 EVM 相关的注意事项,其余则为网络参与者要求使用来提高其工作流程效率的功能。

CRYPTO_PRIMITIVES 是一项引入七个新主机函数的功能。 主机函数比智能合约更快,因为它们是在本机代码中实现的,而不是在抽象的智能合约层中实现的。 这些函数可以更有效地计算许多基于 Solidity 和 EVM 的合约库中使用的加密函数。 新功能包括:

  • 一种更有效地执行模块指数化计算的算法( c=modm(bx)),这是哈希算法的一个有用公式。
  • alt_bn128 椭圆曲线上的三个函数:
    • 点数加法
    • 标量乘法
    • 双线性函数

这些函数被广泛用于零知识证明(如zkSNARKs)和其他保护隐私的数据验证方法。

  • 两个新的哈希函数:
    • sha3
    • blake2_f
  • 升级了libsecp256k库,将k1密钥恢复能力提高了33%

Leap v3.1版本添加了 nodeos 节点选项来修剪块日志和状态历史插件。 当节点修剪这些文件时,它会从本地节点存储中删除旧数据来提高性能。

它还引入了在特定区块终止的选项,这对链状态快照很有用。

此外,它还包括用户对交易日志的定义字段,该协议称为GELF。该协议允许交易日志使用通用的语法进行共享,运营商可以很容易地与其他交易日志解决方案集成。

GET_BLOCK_NUM是一个协议功能,它引入了一个主机函数,允许智能合约直接获取当前区块编号。

Mandel v3.0 版本的更新

(详情细节)

Mandel v3.0 版本包括 EOSIO v2.1 版本中的几个功能,以及新功能和对测试、日志和格式的各种更改。 这些功能主要是为了使 Mandel 功能与 EOSIO v2.1 版本中的功能保持同步,同时省略那些网络不需要的EOSIO v2.1功能。Mandel v3.0版本中增加的协议功能在Leap v3.1版本中仍然支持,包括:

  • GET_CODE_HASH
  • ACTION_RETURN_VALUE(从EOSIO 2.1中移植)
  • CONFIGURABLE_WASM_LIMITS2
  • BLOCKCHAIN_PARAMETERS(从EOSIO 2.1中移植)

安装

Leap v3.1版本对核心软件的安装过程进行了更改。 与之前发布的更新相比,它还存在一些兼容性差异。

新的构建过程使用由 CMake 驱动的构建过程,而不是自定义 shell 脚本。 如果没有这些构建脚本,从源代码构建需要安装必要的依赖项。 readme文件中列出了这些依赖项和推荐的构建过程。

Leap v3.1版本主要是为Ubuntu 20.04和22.04构建的,并支持Ubuntu 18.04,同时其他发行版、编译器和平台也可以使用。

由之前的版本进行升级

使用快照升级节点:

  1. 首先,从兼容的早期节点版本生成状态快照,比如 EOSIO v2.0 版本的节点版本。
  2. 删除节点的状态文件。
  3. 如果节点使用 EOSIO v2.1 版本,运营商还必须删除 SHiP 和区块日志。 运行 EOSIO v2.0 版本的节点不需要执行此步骤。
  4. 使用快照启动节点。
  5. 像之前一样启动和停止节点。

有关面对更复杂情况的更多详细信息或建议,请参阅我们发布的升级指南或联系 EOS Support来获得帮助。

兼容性

(详情细节)

一般来说,Leap v3.1版本与EOSIO v2.0版本的网络、快照、区块日志和状态历史插件(SHiP)日志兼容,但与EOSIO v2.1版本不兼容。

Leap v3.1版本与早期软件版本的状态文件不兼容

Leap v3.1版本弃用和删除的内容

(详情细节)

Leap v3.1版本弃用了 ABI 转换 API ,并删除了几个弃用的功能。

ABI 转换 API 已弃用。

abi_bin_to_jsonabi_json_to_bin 转换 API ,可将序列化数据与反序列化数据互相转换。 从Leap v3.1版本开始,它们都已被弃用。

并删除了几个功能:

  • 老构建脚本

Leap v3.1版本删除了安装节点、cleos、keosd及其依赖项的构建脚本。新的CMAKE脚本只安装节点、cleos和keosd,操作者必须先安装依赖项。

  • 历史插件

EOSIO v1.0 版本包含一个历史插件,但 EOSIO v1.2 在 2018 年 8 月 14 日弃用了这个历史插件,以支持更高性能的解决方案。 它将在Leap v3.1版本中删除,使用 --plugin eosio::history_plugin 的节点应迁移到 --plugin eosio::trace_api_plugin--plugin eosio::state_history_plugin

  • MongoDB插件

EOSIO v1.8 版本弃用了 MongoDB 插件,该插件允许节点将区块链数据存档到 MongoDB 数据库中。 Leap v3.1版本完全删除了这个插件。 节点操作者可以使用 state_history_plugin 等历史工具来替代。

  • Reversible 区块数据库

Leap v3.1版本删除了Reversible区块数据库,并将Reversible区块存储在 fork 数据库中。 操作者应从 config.ini 文件和所有脚本中删除Reversible区块数据库的现有配置设置。

取消了对 Ubuntu 16.04、Centos 和 MacOS 的支持

Leap v3.1版本取消了对MacOS、Ubuntu v16.04和CentOS Linux发行版的支持,以优化开发者资源。现在支持的平台是Ubuntu 18.04(有限支持)、20.04和22.04。对于使用这些不支持的操作系统的用户,DUNE提供了与任意Docker兼容的操作系统的兼容性。

总结

Leap v3.1版本包括强大的工具和选项,用于改善EOS和其他基于EOSIO的区块链的功能和用户体验。作为协议升级,随着2022年9月21日预期激活日期的临近,它需要节点运营商之间协调一致。在此日期之后,区块生产者将更新其软件,钱包和应用程序可以开始集成Leap v3.1版本的功能。随着这一网络升级的完成,EOS网络将迈出自主网络开发的第一步,使EOS这一区块链业务中的最佳技术更加出色。

详细发布说明

新的交易端点

新的chain_api_plugin端点功能包含了 transaction_retry 以及其他用于未来功能的参数。该端点是:

/v1/chain/send_transaction2 (send_transaction_params)

它类似于 send_transaction 端点,但具有其他选项。它有返回失败跟踪的选项和重试交易的选项。它具有与 send_transaction 相同的格式,但有新的配置参数(请参见A-1)。

交易重试

交易重试功能带有用于节点的新配置参数和cleos接口的新命令行选项。

配置参数用于调整节点的行为,可以在 config.ini 配置文件中使用,也可以直接在节点中使用。配置文件的配置项格式应为““option = value”,而命令行项格式可为“--option=value”或“--option value”。节点操作者可以在config.ini文件中或在启动节点实例时使用新的交易重试参数,包括:

transaction-retry-max-storage-size-gb

此选项设置了交易重试功能所允许的最大存储空间分配(单位:GiB)。将此数字设置为 0 以上会启用此功能。 禁用该功能的节点将拒绝对其请求交易。

transaction-retry-interval-sec (默认值为20)

此选项设置节点在未检测到区块中的交易时,应重新向P2P网络发送交易的频率(单位:秒)。

transaction-retry-max-expiration-sec (默认值为90)

此选项为重试池中的交易,设置允许的最长交易过期时间。如果交易的过期时间超过这个值,交易重试工具将不会把交易加入池中。

p2p-dedup-cache-expire-time-sec (默认值为10)

此选项设置重复数据删除缓存。 调整这个数字可以调整跟踪一个交易的最长时间(单位:秒),同时从交易池中删除它的重复部分。

 用户通过 cleos 与区块链交互的新命令行选项包括:

--use-old-send-rpc (T/F)

此选项强制 cleos 使用旧的交易格式,使用 send_transaction 而不是 send_transaction2 及其新功能。 它对于测试和调试旧 API 非常有效。

-t, --return-failure-trace (T/F)

此选项向用户返回失败的交易信息。 它改进了调试,允许用户查看哪个特定操作失败了。

--retry-irreversible (T/F)

此选项允许交易签名者请求节点重试交易,直到它处于不可逆转的区块中或交易过期为止。 这是一个blocking call。如果节点没有启用该功能,它将返回一个错误。

--retry-num-blocks (T/F)

此选项允许交易签名者要求节点重试一个交易,直到该交易在规定数量的已生产区块中被看到,或者直到交易过期。这是一个blocking call。如果节点没有启用该功能,它将返回一个错误。

交易终结状态

交易终结状态功能返回交易状态以响应请求。 该工具将节点传播的交易存储在交易池中,直到交易过期或完成指定数量的区块。

它包括以下参数:

transaction-finality-status-max-storage-size-gb 

此选项设置交易终结状态池的存储大小(单位: GiB )。 当池大小达到此限制时,节点将放弃旧的交易。 将其设置为高于零会启用此功能。 禁用该功能的节点将拒绝向其请求交易。

transaction-finality-status-success-duration-sec

此选项定义了在一个成功的交易达到终结状态后,将被保留在交易终结状态池中的时间长度(单位:秒)。

transaction-finality-status-failure-duration-sec

T此选项定义了在一个失败的交易达到其到期时间后,将被保留在交易终结状态池中的时间长度(单位:秒)。

Cleos的新命令行选项

get transaction-status <id>

此选项允许节点在给定交易 ID 的情况下,返回当前的区块链状态和交易ID的信息,包括其最终状态(如果有的话)。如果没有找到该交易,它将返回 「UNKNOWN」。

新的 chain_api_plugin 端点

/v1/chain/get_transaction_status (get_transaction_status_params )

此端点接收交易ID ,并返回交易最终状态和有关交易的其他信息(如果有的话)。 有关语法,请参见A-2

交易资源成本估算

交易资源成本估算功能接收测试交易,并返回其估算的资源成本,而不需要将交易应用到链上。

此功能复制了Greymass一直在有效使用的解决方案,以估算其“Greymas Fuel”资源提供商的资源成本,这是防止意外资源超支故障的非常有用的工具。

它包括一个新的配置选项和一个新的API端点。

cleos 的新命令行选项

--read-only

此选项指定交易是「read-only」,不打算包含在区块链中。 当用户在启用此选项的情况下发送交易时,连接的节点将执行交易并恢复所有状态更改。

新的 chain_api_plugin 端点

compute_transaction

该节点端点接受并执行read-only交易,然后返回该交易的计算资源成本。它使用与旧的send_transaction参数相同的交易参数。

主观计费改进

节点的新配置参数

subjective-account-max-failures (默认值为3)

此配置参数控制三击规则(three-strikes rule)中使用的参数。 激活后,当账户在一个区块中发送了三个失败的交易后,节点将放弃该账户的所有排队交易。 操作者可以使用 subjective-account-max-failures 参数将最大失败次数由三次更改为其他次数。

subjective-account-decay-time-minutes (默认值为24小时)

此选项调整主观计费衰减时间,即将全部 CPU 时间返回到主观计费账户所需的时间。现有的主观计费余额使用时间为24小时的主观计费衰减窗口。

此衰减时间的精确机制涉及测量来自账户的资源消耗的指数移动平均值,以确定其剩余资源预算。 该协议将此剩余资源预算乘以自账户上次推送交易以来的主观衰减时间窗口的比例。

该公式(请参见 A-3)在数据丢失时使用账户资源使用情况的 EMA 和线性推断法,并将当前累积的平均值相乘:

测试发现,一小时(7200 个区块)可以在有效的速率限制和最小的 UX 影响之间取得平衡。

新的terminat-at-block选项

通过这个节点命令行选项,操作者可以配置节点,一旦它收到或复制了一个指定的区块号,就退出。在指定的区块退出,可以在无人看管的情况下进展到所需的状态,并支持预先确定的快照的轻松自动化。terminat-at-block选项在节点命令行中引入了一个可用的新参数。

节点的新配置参数:

--terminate-at-block <block#>(默认值为 0,表示禁用)

如果区块号设置为大于零,此选项将在达到提供的块号后终止节点实例。 此选项仅适用于命令行。

从合约中获取当前区块号

Leap v3.1 版本引入了一个新的协议特性 GET_BLOCK_NUM,它使主机函数 get_block_num 在链激活时可供智能合约访问。get_block_num主机函数返回当前区块的区块号,或区块高度。

区块日志和 state_history_plugin (SHiP) 日志修剪

提供了两个新选项,block-log-retain-blocksstate-history-log-retain-blocks。 这些选项将节点配置为定期将这些日志修剪为最新配置的区块。 修剪允许节点操作者在不停止节点的情况下,随着时间的推移减少节点使用的磁盘空间。

block-log-retain-blocks 选项还为 eosio-blocklog 增加了 --vacuum 选项,它可以将修剪过的日志转换为未修剪的格式。未修剪的格式扩展了文件中在修剪过程中被折叠的稀疏区域,但并不恢复修剪过的数据。当节点操作者删除 block-log-retain-blocksstate-history-log-retain-blocks 选项时,会自动执行真空操作。

加密原语

Leap v3.1 版本引入了一个名为 CRYPTO_PRIMITIVES 的新协议功能,它使合约在激活时可以访问七个新的主机函数。 这些函数都与加密计算相关,并降低了执行 EVM 预编译合约的 CPU 成本。

利用这些新的主机函数可以显著减少计算的执行时间,因为主机函数是在本机代码中实现的,没有智能合约的开销费用。 此功能启用以前超出交易期限的加密功能,并确保以较低的 CPU 成本访问其他功能。

  • 模块化指数计算的形式是 c=bx mod(m)。它将整数 b 乘以 x 次方,将结果除以整数,然后返回余数。 使用算术方法计算会变得越来越困难,因为当使用大的数字进行强加密时,bx会变得非常巨大。

例如,1024 位数字 51076 的 17 次方产生一个 1,304 位数字,算术方法必须除以该数字才能找到其余数。 对于大的数字结果来说,此过程很慢。 CRYPTO_PRIMITIVES 引入了一种算法,可以有效地对任何大小的数字进行这种模块化指数计算。

  • alt_ bn128是一条椭圆曲线,是一个一般形式为y2=x3+ax+b的多项式公式。CRYPTO_PRIMITIVES 在此曲线上引入了三个主机函数:
    • 点加法(alt_bn128_add)
    • 标量乘法 (alt_bn128_mul)
    • 双线性函数(alt_bn128_pair)

这些函数被广泛用于零知识证明(如zkSNARKs)和其他保护隐私的数据验证方法。

  • 该功能还引入了两个新的哈希函数,sha3blake2_f。 
    • sha3是SHA2哈希算法的扩展,可更安全地抵御称为长度扩展攻击的特定类型的攻击,其中攻击者使用消息m1及其长度为m1 x m2的哈希函数解码另一条消息m2。sha3对这些攻击的抵抗力更强,sha3算法可以直接取代SHA2算法。
    • blake2_f是一个哈希函数,它提供了比sha3更快的哈希速度,将相对不安全的MD5算法的速度与sha3算法更高的安全级别结合起来。
  • libsecp256k库是用于计算EOSIO公钥-私钥对的椭圆曲线的集合。Leap 3.1 版本包括对该库最新版本的更新,该版本将公钥恢复性能提高了33%。

Antelope 协议历来支持通过一个名为 recover_key 的主机函数为secp256k1和secp256r1椭圆曲线恢复ECDSA公钥。

新的k1_recover主机函数对recover_key进行了改进。当给定无效的签名时,它返回特定的失败条件,而不仅仅是一般的交易中止失败。

此外,它以非压缩格式返回记录的公钥,消减了椭圆曲线的数学步骤,减少了合约的大小和函数的CPU执行时间。

请注意,它只支持K1椭圆曲线,不支持R1椭圆曲线。

使用GELF日志协议支持用户定义的字段

GELF appender 现在支持 GELF logging.json 配置文件中的任意用户定义字段和值,但有以下限制:用户定义的字段名称必须以下划线开头,名称只能包含字母、数字、下划线、破折号、 和点。

除了格式检查之外,还有一个由规范保留或由节点使用的保留字段名称列表(参见 A-4)。

对字段名称长度、随附值或用户定义字段的数量没有强制限制。 但是,默认情况下,服务器将数据流限制为 128 个片段,每个片段 512 字节,因此服务器可能会根据其设置丢弃超过 65536 字节的消息。

GELF 协议强制执行类似的实际最大值,即 256 个 512 字节的片段,总计 131072 字节。

Graylog服务器在选择器和界面中显示用户定义的字段时,会自动省略前面的下划线。

Mandel v3.0版本的功能

Mandel v3.0版本包括EOSIO v2.1版本的几个功能,这些功能被移植到Mandel v3.0版本中。其中包括在操作跟踪中返回值的能力,WASM运行时间的可配置限制,以及其他可配置的区块链参数。Mandel v3.0版本的功能包括:

  • GET_CODE_HASH

允许合约检查账户是否有合约、合约的哈希值以及代码更改的次数。

  • ACTION_RETURN_VALUE

允许操作返回操作跟踪中的值。

  • CONFIGURABLE_WASM_LIMITS2

允许操作者增加对WASM文件的限制。

  • BLOCKCHAIN_PARAMETERS

允许配置区块链参数,如 ACTION_RETURN_VALUE 所支持的最大返回值。

  • onblock logging

帮助诊断系统合约故障。

有关这些功能的更多信息,请参见 Mandel v3.0.0 版本的发布页面

3.0 还实现了一个名为“合约支付”的功能的有限版本,允许智能合约为资源付费。 这个有限的版本使用了一个变通方案,允许使用“公共嵌入私钥”方法,而不会立即出现拒绝服务的攻击向量。
这个版本的 “合约支付 “功能不是作为协议本身的一部分来实现的,而是通过在EOS系统合约中增加一个新的功能。它是最新系统合约版本的一部分,允许开发人员选择性地限制权限更改
这种方法仍然容易受到主观计费的其他滥用影响。 需要做更多的工作才能找到合适的合约支付解决方案。

其他发布说明

新的构建过程

由 CMake 驱动的新构建过程,取代了之前推荐用于构建软件的 shell 脚本。 那些希望从源代码构建的人现在需要安装必要的依赖项。 依赖项列表和推荐的构建过程位于 README.md 文件中。 readme文件还包括有效运行测试的说明。

Ubuntu 18.04、20.04 和 22.04 是唯一受支持的构建平台。 其他发行版、编译器和平台也可以工作。 您的体验可能会有所不同。

兼容性

DUNE
快照兼容性

节点运营商可以使用快照更快地将节点与区块链的其余部分进行同步。

Leap v3.1 版本引入的最新快照版本 v6 ,仅与 nodeos v3.1 兼容。 旧的 v4 快照与 Leap v3.1 版本、EOSIO v2.0 版本和 EOSIO v2.1 版本兼容。

V5 快照来自不受支持的 EOSIO v2.1 版本,除非禁用 EOSIO v2.1 版本功能,否则无法与 Leap v3.1 版本一起使用。

网络兼容性

网络兼容性是指节点通过节点之间的 p2p 连接接受区块和交易,并响应区块请求的能力。

该版本兼容运行EOSIO v2.0.x版本的网络及运行EOSIO v2.1版本的网络,只要该网络没有启用EOSIO v2.1版本的特定功能。

State_history_plugin 兼容性

Leap v3.1 版本兼容 EOSIO v2.0 版本产生的区块日志和状态历史插件 (SHiP) 日志,但不兼容 EOSIO v2.1 版本。

Leap v3.1 版本的新功能要求更改状态历史ABI。Leap v3.1 nodeos实例中状态历史的使用者必须准备好处理以下更改。

将发送一个新的 action_trace_v1chain_config_v1,而不是之前的 _v0 版本。 客户必须准备好接收 v0v1 版本,因为在升级到 Leap v3.1 版本之前,他们将继续从状态历史日志中的条目中接收 v0 版本。

状态文件兼容性

此版本与早期版本生成的状态文件不兼容。 请使用从早期版本的节点生成的兼容快照文件来重建当前状态文件。

由之前的版本进行升级

从节点生成状态快照。 您不能使用来自 EOSIO v2.1 版本的快照,但来自 Mandel v3.0 或 Leap v3.1 版本的快照,以及更早的快照版本都可以使用。 

删除升级节点所使用的状态文件。如果节点一直在使用EOSIO 2.1,操作者还必须删除SHiP和区块日志。如果节点从EOSIO v2.0版本升级,可以保留SHiP和区块日志。

用快照启动节点。之后,节点可像往常一样启动和停止。

弃用和删除

Leap v3.1 版本删除了一些已弃用的功能。 其中包括 history_pluginmongoDB_plugin,两者都可以使用 state_history_plugintrace_history_plugin 作为替代。 Leap v3.1 版本还删除了 WABT,转而使用性能更高的 EOS VM。 它还放弃了对 Mac 的支持,尽管 Mac 和 Windows 用户仍然可以使用 DUNE 来虚拟 Leap 区块链环境。

新的更新弃用了 cleos WAST 输出,以后的更新将删除它。

ABI 转换 API 已弃用

API /v1/chain/abi_bin_to_json/v1/chain/abi_json_to_bin 在此版本中已被弃用,并将在未来版本中完全禁用或删除。 这是由于盲目信任这些 API 带来的安全风险,恶意行为者可以利用这些 API 在转换期间切换参数。

删除了构建脚本

如前所述,Leap v3.1 版本从 EOSIO 中删除了构建脚本。 有关构建说明,请参阅 eosnetworkfoundation/mandel Github 存储库中的 README.md文件。

删除了history_plugin

作为EOSIO v1.2.0版本的一部分,history_plugin在2018年被弃用,Leap v3.1 版本完全删除了它。state_history_plugin 和 Hyperion 等 RAM 效率更高的解决方案已经取代了 history_plugin。

这意味着使用选项 --plugin eosio::history_plugin 初始化的节点应该转而使用选项 --plugin eosio::trace_api_plugin--plugin eosio::state_history_plugin

删除了mongo_db_plugin

作为EOSIO v1.8.0版本的一部分,mongo_db_plugin 已被弃用,Mandel v3.1版本完全删除了它。

删除了Reversible区块数据库

在节点操作期间,chainbase数据库不再用于存储活动的reversible区块集。关闭时,reversible区块仍存储在fork数据库中。

注意:节点操作者应该从config.ini文件和任何脚本中删除 reversible 区块 Chainbase 数据库的所有现有配置,包括:

  • reversible-blocks-db-size-mb
  • reversible-blocks-db-guard-size-mb
  • fix-reversible-blocks
  • import-reversible-blocks 
  • export-reversible-blocks

取消了对 Ubuntu 16.04、Centos 和 MacOS 的支持

(支持 Ubuntu 18.04、20.04、22.04)(开发人员应使用 DUNE 用于 Windows、Mac 和任何支持 Docker 的 Linux 发行版)

UbunUbuntu 16.04、Centos 和 macOS

如前所述,唯一受官方支持的平台是Ubuntu 18.04、20.04和22.04。Leap 已从二进制软件包支持和代码级更改中删除了所有其他版本,包括 Ubuntu 16.04、Centos 和 macOS。

在非Ubuntu机器上运行Leap v3.1 版本的开发者应该考虑使用DUNE,它支持Windows 10和11,macOS,以及任何支持Docker的Linux发行版。

弃用提案

弃用区块生产者的 r1 曲线和多键控制

由于缺乏使用,未来的版本可能会弃用区块生产者使用R1曲线来签署区块。

EOSIO 最初允许区块生产者注册多个具有多个权重的密钥,就像多个加权密钥可以控制账户一样。 它还允许区块生产者使用 k1 或 r1 曲线注册密钥。 这些是椭圆曲线加密学中使用的不同曲线。

官方文档指定 r1 曲线使用“可验证的随机”曲线。 比特币粉丝普遍推测,比特币的创造者中本聪不相信这条「可验证的随机」曲线没有潜在的后门。 由于这种不信任和 secp256k1 曲线的效率,比特币使用了 k1 曲线。

EOS 上的区块生产者不使用 r1 曲线上的密钥或多密钥区块生产。 该寻求反馈的开放 Github 问题建议放弃对 r1 椭圆曲线上的密钥的支持,并放弃多密钥生产者权限。

用通用的HSM支持替换YubiHSM支持

EOSIO v1.7版附带了一个工具,允许用户使用YubiKey硬件认证设备在EOSIO工具keosd上轻松创建密钥。该提案指出了该工具附带的不必要的依赖性和软件集成障碍,并提出了一种与任何通用硬件认证设备兼容的替代工具,其中包括YubiKey。

这种替代方案需要一种新的工具,以便于将双用户通用工具顺利集成到单用户keosd环境中。

附录

A-1 新的 send_transaction2 端点结构:

该端点具有以下结构:

struct send_transaction2_params {

    bool return_failure_trace = true; ///< Embed transaction exceptions into the returned transaction trace

    bool retry_trx = false; ///< request transaction retry on validated transaction

    std::optional<uint16_t> retry_trx_num_blocks{}; ///< if retry_trx, report trace at specified blocks from executed or lib if not specified

    fc::variant transaction; ///< same format as send_transaction
};

A-2 交易终结状态端点的语法

该端点的语法如下:

struct get_transaction_status_params {
      string id; //transaction id to status
 };
 struct get_transaction_status_results {
    string state;
    std::optional<uint32_t> block_number;
    std::optional<chain::block_id_type> block_id;
    std::optional<fc::time_point> block_timestamp;
    std::optional<fc::time_point> expiration;
    uint32_t head_number;
    chain::block_id_type head_id;
    fc::time_point head_timestamp;
    uint32_t irreversible_number;
    chain::block_id_type irreversible_id;
    fc::time_point irreversible_timestamp;
    chain::block_id_type last_tracked_block_id;
};

A-3 资源成本计算

该计算使用账户链利用率的指数移动平均值,在给定有限数据时使用线性外推法。它将当前累积的平均数乘以(窗口中的区块数-上次更新后的区块数)/(窗口中的区块数)。

EMA 是针对窗口中的每个周期计算的,如此:

EMA = 指数移动平均值

kk = 加权乘数,k = 2N + 1 其中 N = 时间窗口中的周期数

pc=本期收盘价

EMAp = 上一期的 EMA,第一期的 EMA = 时间窗口的 SMA

公式为:

EMA从第一个周期开始,一次计算一个周期。第一个周期的均线与SMA(简单移动平均值)相同,后者使用以下典型平均公式:

其中 n 是窗口中的周期数,A 是每个周期的值。

A-4 GELF 保留字段:

保留字段名称列表为:

_id
_timestamp_ns
_log_id
_line
_file
_method_name
_thread_name
_task_name

A-5 附加工具

除了 Leap 3.1,AntelopeIO GitHub 团队还发布了另外两个相关工具:

此外,EOS网络基金会还发布了EOS系统合约v3.1。

合约开发工具包 (CDT)

合约开发工具包 (CDT) 是一套工具,智能合约开发人员可以使用它来将他们的合约翻译成 Mandel 的原生代码库 WebAssembly。 CDT 3.0.0 版对该工具进行了几处更改。

开发人员需要注意的是,这个版本将工具包的名称从 “eosio.cdt” 改为 “cdt”。开发者需要修改他们的CMake文件,将 “eosio.cdt”的每个instance替换为 “cdt”,以适应这一变化。

重命名的变化包括:

二进制文件的名称变化,使它们的前缀是 “cdt “而不是 “eosio”,即从eosio-cpp变成cdt-cpp等。
CMake 项目使用 find_package(cdt) 而不是 find_package(eosio.cdt)。
所有库的路径和命名空间保持不变,但在未来的版本中可能会被分配给已弃用的功能。

加密扩展

Leap v3.1版本增加了对GET_BLOCK_NUM协议功能的支持,该功能添加了一个主机函数以获取当前块号,以及CRYPTO_PRIMITIVES协议功能,该功能增加了一组新的加密原语主机函数。 为了让智能合约开发人员能够利用这些函数,CDT v3.0 版本已将这些添加到开发人员的「C」API 中,其中一些添加到「C++」API 中。

C API现在具有以下函数:

void sha3( const char*, uint32_t, char*, uint32_t , int32_t)
int32_t blake2_f(uint32_t, const char*, uint32_t, const char*, uint32_t, const char*, uint32_t, const char*, uint32_t, int32_t, char* , uint32_t)
int32_t k1_recover( const char*, uint32_t, const char*, uint32_t, char*, uint32_t)
int32_t alt_bn128_add( const char*, uint32_t, const char*, uint32_t, char*, uint32_t)
int32_t alt_bn128_mul( const char*, uint32_t, const char*, uint32_t, char*, uint32_t)
int32_t alt_bn128_pair( const char*, uint32_t)
int32_t mod_exp( const char*, uint32_t, const char*, uint32_t, const char*, uint32_t, char*, uint32_t)
uint32_t get_block_num( void )

C++ API 现在具有以下函数:

block_num_t current_block_number() - (in system.hpp)
eosio::checksum256 sha3(const char*, uint32_t) - (in crypto.hpp)
eosio::checksum256 keccak(const char*, uint32_t) - (in crypto.hpp)
void assert_sha3(const char*, uint32_t, eosio::checksum256&) - (in crypto.hpp)
void assert_keccak(const char*, uint32_t, eosio::checksum256&) - (in crypto.hpp)

CDT v3.0版本仅为SHA3哈希函数和获取当前块号的函数添加了C++包装器。其他主机函数及其相关数据类型的C++包装器将在稍后的CDT版本中添加。

Stack Canary

Stack Canary 是一个全新的 CDT 功能,当堆栈被放置在合约保留的内存部分的末端时,它可以防止堆栈溢出。 「Stack」是内存中随着进一步嵌套函数的调用而增长的部分。

当使用标志 -fno-stack-first 来允许较大的堆栈大小时,智能合约开发人员会面临意外结果或严重错误。通常情况下,CDT将堆栈放在一组可定位内存的开头。这有防止内存溢出的好处,因为堆栈溢出会溢出到合约数据中,并触发内存访问违规,导致程序终止,而不是造成意外的行为或严重的bug。但是,WASM 仅限于处理来自 WASM 内存的前 64kb 页的静态数据。这就限制了堆栈的大小为64KiB减去合约数据的大小,因为合约必须在前64KiB的内存中。

CDT 给了合约一个选择,将堆栈放在可定位内存的末端。这使得整个64KiB的首页向静态数据开放,允许更大的堆栈。然而,但是,这导致产生了堆栈溢出覆盖范围外内存的可能性。

为了缓解这种情况,CDT v3.0 版本添加了 -stack-canary 选项。 这为智能合约增加了一些保护,因此如果合约超出堆栈,它将使合约失败,而不可能让合约以意外结果结束。

为了解决这个问题,CDT 3.0.0引入了「Stack Canary」,它可以检测到堆栈溢出的情况并终止进程。这可以防止堆栈覆盖其范围之外的内存,提供与将堆栈保持在内存开头相同的好处,同时仍然允许更多的初始内存(全局变量和字符串)和更大的堆栈大小。

如果失败了,它将产生一个 8000000000000000002 的明确代码。

Bug修复

由于构建问题,CDT v3.0 版本删除了使用 ccache 和 sccache 编译 CDT 的功能。

用于节点执行的 Docker 实用程序 (DUNE)

DUNE 是一个设计用于在 macOS、Windows 10 和 11 ,以及 Mandel v3.1 版本不直接支持的其他操作系统上运行的环境。 DUNE 需要 Docker 和 Python3,但实施起来很简单,readme文件中包含每个操作系统的说明。 它提供与节点、cleos、cdt 和其他 Mandel v3.1 组件相同的命令。它还提供了涉及所有这些组件的其他抽象化命令。重要的是,它允许任何拥有Docker功能机器的开发者在EOS网络上开发和测试。

系统合约升级

EOS 系统智能合约 v3.1 版本更新了核心合约,并引入了一个新的系统合约,即启动合约。

启动合约有助于启动新的区块链。

因为要部署核心合约,系统需要访问使用某些协议函数激活的主机功能。除 PREACTIVATE_FEATURE 外 ,所有主机功能在使用核心合约激活其函数之前均不可用。这就产生了一个激活悖论,阻碍了核心合约的部署。

启动合约规避了这个问题。启动合约不依赖于除 PREACTIVATE_FEATURE 之外的任何协议功能,PREACTIVATE_FEATURE 可以由区块生产者激活,而无需使用智能合约。preactivate_feature 主机功能通过激活 PREACTIVATE_FEATURE 可用于特权合约,它允许特权启动合约激活部署核心合约所需的每个协议功能。 当需要在新链上部署核心合约时,初始步骤包括通过区块生产者激活 PREACTIVATE_FEATURE 协议功能,部署启动合约,然后使用启动合约激活核心合约所需的所有其他协议功能。

核心合约的升级需要激活CONFIGURABLE_WASM_LIMITS2和BLOCKCHAIN_PARAMETERS功能。一旦这些功能被激活,新的核心合约就可以被部署到链上。新的核心合约现在允许:

限制权限更改

核心合约中的一项新操作 limitauthchg ,允许账户选择性的限制权限更改。 使用它,账户可以对 updateauth、deleteauth、linkauth 和 unlinkauth 操作施加额外的限制。

limitauthchg 动作可以使用 allow_perms 或 disallow_perms 定义允许或不允许的权限。节点可以调用 limitauthchg的 allow_perms 或 disallow_perms 来选择加入该功能,但一个特定的调用不能同时包含 allow_perms 和 disallow_perms。如果定义了 allow_perms,那么就允许定义的权限执行更新、删除、链接和取消链接的授权操作。如果定义了 disallow_perms,那么定义的权限就不允许执行这些操作。

账户可以通过使用非空的 allow_perms 或 disallow_perms 调用 limitauthchg 操作来选择使用此功能。 他们可以通过使用空的 allow_perms 和 disallow_perms 调用 limitauthchg 操作来再次选择退出。

此功能有助于减轻拒绝服务攻击。具体而言,它可以防止涉及现有资源管理解决方案的攻击,该解决方案使用公开可用的私钥为应用程序的用户管理资源。

可配置的WASM限制

核心合约包括 CONFIGURABLE_WASM_LIMITS2 协议功能,以及调整 WASM 限制的操作 wasmcfg 。 wasmcfg 的有效值为 high、low 和 default, low 和 default 本质上是等同的。 将 wasmcfg 设置为 high,可以将可变全局变量使用的最大字节数增加 8 倍,表元素的最大数量增加 8 倍,最大可初始化内存范围增加 16 倍。 开发人员需要注意,如果在初始化合约时将此功能设置为 high,如果他们将该功能重置为 low 或 default,则可能会导致合约超出新的 WASM 限制并停止运行。

追踪最新的区块信息

引入了一个新的表,blockinfo,它包括表的版本号和最近10个区块的区块高度和时间戳。 get_latest_block_batch_info 函数返回给定批次的10个区块的开始区块和结束区块的高度和时间戳。如果这批次数据中的一个区块丢失,它将返回 「数据不足」。区块的缺失可能是由于提前删除了第一个块,或者是由于 onblock 操作的失败造成的间隙。如果批次起始高度大于最新区块高度,也会出现此错误。

其他更改

Memo备注字段现在可以在 setcode 和 setabi 操作中使用。 这允许合约开发人员直接在区块链上指定合约版本和发行说明。

setparams 操作有更多可用参数,包括 max_action_return_value_size,它用于 ACTION_RETURN_VALUE 协议功能。

新的系统合约包括修复REX中的一个四舍五入的错误,该错误使账户无法出售REX。它还包含一个补丁,其中包含冻结 B1 代币归属计划的系统合约变更。

有关这些功能的更多信息,请参见系统合约发布说明,网址为https://github.com/eosnetworkfoundation/eos-system-contracts/releases/tag/v3.1.0-rc1

关于EOS网络

EOS网络是区块链3.0时代的典范之作,由EOS VM提供支持。EOS VM是一个低延迟、高性能和可扩展的WebAssembly引擎,能够近乎无感的实现确定性交易执行。EOS网络专为Web 3设计,致力于实现最佳的Web 3用户和开发人员体验。EOS是EOSIO协议的旗舰区块链和金融中心,并通过EOS网络基金会(ENF)作为多链协作和发展公共基础产品的工具,进一步完善基础设施,驱动EOS快速发展。

EOS网络基金会

EOS网络基金会是一个非营利性的组织,旨在倾听社区声音、传达社区意愿并扶持社区优质项目发展,成为EOS社区的信息共享桥梁,并为EOS生态提供资金、技术、运营、未来规划、生态构建等关键基础设施支持,进一步发挥EOS作为世界速度最快的治理型区块链的全部潜力。