​Aurora 发布 2.8.0 版本引擎

NEAR Protocol2022-12-02 13:03

​


Aurora Labs 高兴地向大家宣布我们已发布 2.8.0 版本的 EVM,新版本包括安全增强、二进制可复现性、模糊测试中的一些发现以及对跨合约调用的一些改进。


安全响应增强


我们一直在寻找增强对 Aurora EVM 的响应能力的方式。为此,我们向 EVM 合约添加了两个新的管理函数以控制 EVM 哪些部分需要暂停。我们利用函数 pause_precompiles 和 resume_precompiles 为 Aurora EVM 添加了暂停具体预编译的功能。


可复现性


部署的黄金标准是能在未来任何时刻精确复现某合约的构建。可复现性合约对于信任和透明度来说是非常重要的,因为它们可以确保我们如实地部署了经过验证的合约。


进行中的审计


我们正在进行一项审计工作,这包括两项模糊测试,它们分别由 Sigma Prime 和 BlockSec 负责。每当 Go-Ethereum 遵从性问题出现的时候,我们会修复与其相关的小问题。我们在 BN256 中发现了一个不合适的逻辑回归和模指数运算预编译,目前相关问题已被修复。


跨合约调用状态


跨合约调用在 2.7.0 版本的测试网中被引入,现在需要为主网做好准备。目前我们正在对其进行内部审计以确保其可以被安全使用。


下文列举了部分已完成的重点工作,更多细节可访问以下网址:


https://github.com/aurora-is-near/aurora-engine/pull/636


添加项


暂停 / 恢复预编译


我们需要针对暂停 Aurora EVM 中的某一功能有更精细的控制。尤其,我们需要能够快速暂停某一功能,并让 ETH 或 ERC-20 代币能够从该引擎中被取出。我们通过为该引擎引入 pause_precompiles 和 resume_precompiles 这两个新的函数实现了这一点,这两个函数允许合约所有者激活 / 关闭新功能。


可复现的构建


虽然目前无法在没有具体的容器环境下实现对构建的复现,但是我们可以利用 Docker 和一张图像来实现可复现的构建。现在我们可以通过运行 cargomake--profile<profile>build-docker 命令来实现可复现构建。该命令之后可以被运行,以确保引擎精细到元数据的程度上。


修复


1.EVM 调用栈太小 (#638, aurora-is-near/sputnikvm#16)


EVM 调用栈在 Rust 上太小,需要 1024 深度的限制。不幸的是,我们发现我们已经达到了这一界限。


2.BN256 预编译有一个回归(#637)


BN256 有一个来自之前版本的回归,(0,0) 点造成一个还原并且没有成功执行,因为它们不存在于该曲线上。


3.根据预估 gas 费进行模指数运算(c7e9b8e6)


在执行能够发生在预编译时之前,我们必须在执行代码本身之前估算一下 gas 费。不幸的是,对某些指数为零的输入来说,估算的 gas 费被严重低估为 200gwei。目前我们已对相关运算进行了更新以修复这一问题:


修复前:

gas = mul_complexity * iteration_count / 3


修复后:

gas = mul_complexity * max(iteration_count, 1/ 3)


本次修复后,输入 0x000000000000090000000000000000 将不再出现之前的 200 gwei 的 gas 值,而是 18,446,744,073,709,551,615 gwei 这一正确的估算值。上述问题容易导致一些交易达到最大的 gas 值而且是零成本的,从而被一些对手利用,抽干中继的 NEAR 余额,本次修复则使上述风险解除。此外,本次修复并未影响到 Aurora 的中继 RPC,不过可能会影响其他中继的 RPC。


对跨合约调用进行的若干改进


1.允许跨合约调用执行任何可能的 NEAR 调用(#610)


我们定义了一种被称为 NearPromise 的数据架构,该架构可以模拟 NEAR 上的全部可能的 promise action,包括全部的批量操作以及全部的 promise 组合器。其数据类型是递归的,因为 NEAR 允许链式回调,"And"组合器可以连接任何 promise。


添加这一定义的目的是允许跨合约调用功能的用户在有 NEAR 账户的情况下可以在 NEAR 上做任何交易。需要注意的是这一更改和当下的跨合约调用功能是后向兼容的,因为该 PR 添加了一个新的变量至 PromiseArgs,这是在 CrossContractCallArgs 中使用的类型。


2.如果部署是成功的,只更新存储中的路由合约版本。(#616)


在跨合约调用流中,我们在引擎存储中存储了各个被部署的子账户的当前版本。当路由合约需要被更新或者子账户还未存在时,我们必须部署新版本并更新存储中的 entry。在部署后,存储更新以回调的方式完成。在本次修复中,我们添加了在更新存储中的版本之前查看部署是否是成功的逻辑。


3.确保跨合约调用路由附带足够的 gas 费以顺利执行(#622)


在开展原生的通证连接器工作的过程中,我们无法随心所欲地使用跨合约调用机制执行带回调的 promise,原因就是在涉及 promise 时,跨合约调用预编译需要添加更多的 NEAR 通证作为 gas 给路由以执行函数。需要的 gas 数量随着回调的数量线性增长。我们修复了这一问题,跨合约调用预编译现在会使带回调的 promise 所需要的 gas 的数量线性增长。

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

来源链接

相关Wiki

相关标签