Neon 中的预编译合约:ERC-20 Wrapper 的案例研究

Duke
Jun 14, 2022

--

Neon EVM 核心程序基于Sputnik VM,这是用Rust编写的以太坊虚拟机的实现。Sputnik VM 包含一个嵌入第三方 Rust 代码的功能,该代码可以从以太坊合约中调用。这种嵌入代码被称为“预编译合约”。

预编译合约的第三方代码可以编译并与 Sputnik VM 代码链接到一个通用二进制文件中。

案例研究:Neon 的 ERC-20 Wrapper

Neon Labs 团队已经开发并嵌入了许多预编译合约到 Neon EVM 核心程序中。Neon EVM 中的这些预编译合约之一是 ERC-20 Wrapper。以下是对 ERC-20 Wrapper 的深入探讨,它的用途以及它是如何工作的。

ERC-20 Wrapper 由两部分组成:

ERC-20 Wrapper Solidity 合约

ERC-20 Wrapper 的 Solidity 合约代码包括带有标准函数和事件的IERC-20 接口,Neon 代码用自己的函数扩展了这个接口,只实现了构造函数和回退函数。

当函数标识符与智能合约中的任何可用函数不匹配时,将触发后备函数。由于合约没有其他功能,任何 ERC-20 包装器方法的调用都会落入/默认返回到此功能。

在fallback函数中,调用数据准备好,在预编译合约的硬编码地址调用Solidity方法“delegatecall”。在这里,“delegatecall”方法使用给定的函数标识符和参数调用预编译的合约函数。

合约使用常量地址“NeonERC20”。这是预编译合约的硬编码地址,可以从中调用它。

预编译的 Rust 代码

目前所有 Neon EVM 预编译合约都位于一个模块中。该模块包含所有这些合约的常量地址,包括“SYSTEM_ACCOUNT_ERC20_WRAPPER”,即 ERC-20 Wrapper 的地址。

当调用预编译的合约函数时,函数调用属于“call_precompile”函数。如果给定的合约地址与 SYSTEM_ACCOUNT_ERC20_WRAPPER 常量匹配,则调用“erc20_wrapper”函数。“erc20_wrapper”是用于 ERC-20 Wrapper 接口的所有调用的函数。

在“erc20_wrapper”函数内部,参数被解析。在以太坊中,函数标识符的长度为 4 个字节,由 keccak256 从函数签名中计算出来,其中包括函数的名称和参数。

此函数中描述了所有 ERC-20 接口方法,其标识符硬编码为常量。通过“match”操作符选择被调用的方法后,执行该方法的代码并返回结果。

结论

Neon EVM 的 ERC-20 Wrapper 是 Neon EVM 中常用的预编译合约的一个很好的例子。它包括一个 Solidity 合约和嵌入在该合约中的 Rust 预编译代码。

正如我们所见,这种类型的软件架构允许 Neon 有效地将第三方软件和功能集成到其链上操作中。请继续关注 Neon 预编译合约的未来案例研究!更多即将到来。

--

--