完全兼容 EVM 的空间
简述
引入一个完全兼容 EVM 的新空间。
摘要
本 CIP 旨在引入一个完全与 EVM 兼容的新空间。这个新的空间被称为 EVM Space ,而当前的空间被称为 Native Space。EVM Space 遵循与 EVM 相同的规则,并支持 eth rpc,如 eth_getBalance。因此来自以太坊生态的工具可直接用于 Conflux。
两个空间的账户是分开的。一个 Native Space 的账户只能与 Native Space 的其他账户以初始的 Conflux 交易类型进行互动。一个 EVM Space 的账户只能与 EVM Space 的其他账户以以太坊上 EIP-155 的交易类型进行互动。资产和数据将通过一个新部署的内部合约进行跨空间交互。与跨链操作不同,跨空间操作是具有原子性及 Layer-1 安全性的。
初衷
Conflux 具有一个类似于EVM的虚拟机。然而,Conflux 虚拟机和以太坊虚拟机之间仍有一些区别。Conflux 的交易格式以及从公钥生成地址的规则均与以太坊不同。这阻碍了 EVM 兼容的 dApps 向 Conflux 移植。之前的 CIP-72 和 CIP-80 试图解决这些障碍,但它们会影响当前已部署的应用。因此本 CIP 引入了一个新的空间来构建一个完全兼容 EVM 的空间,而不改变现有的账户和交易。
规格
地址
在用户层,Native Space 仍然使用 base32 格式的地址,如 cfx:aa… ,EVM Space 使用十六进制校验地址,如 0xaAD8… 。在系统层,Native Space 和 EVM Space 都是 160 位的格式。同样的地址可能出现在两个空间,但他们是两个不同的账户,两者的余额和 nonce 将被分别计算。
Storage Key
Conflux 使用 Delta MPT 作为账本状态的底层认证数据结构。Delta MPT 为虚拟机提供了一个键-值接口。
在计算 EVM Space 中账户的 Storage Key 时,我们计算 Native Space 中具有相同地址账户的 Storage Key,并在位置 20 插入字节 0x81(索引从 0 开始)。
在计算 EVM Space 中账户的 delta 集 Storage Key(详见3.2.2节)时,我们计算 Native Space 中具有相同地址账户的 Storage Key,并在位置 32 插入 0x81 字节(索引从 0 开始)。
虚拟机
- 支持以太坊上从地址 0x00…01 到地址 0x00…08 的预编译合约。
- NUMBER 操作码将返回 epoch 编号。
- BLOCKHASH 操作码只能接受 NUMBER 操作码返回值减 1 作为输入。(此处与以太坊不同,以太坊能接受返回值减 1 至减 256 中的任意整数作为输入)。
- SSTORE 操作码和 SUICIDE 操作码无燃料费用退款。
- 涉及存储占用的操作,如 SSTORE,所消耗的燃料费用不同。
跨空间操作
映射账户
每个 Native Space 的账户在 EVM Space 都有一个映射的账户。映射账户的地址是初始账户 keccak 哈希值的最后 160 位。假设以 keccak 哈希函数安全为前提,映射的地址将永远不会与以太坊工具生成的地址发生冲突。Native Space 账户可以从映射的账户中提取余额。
内部合约
一个名为 CrossSpace 的新内部合约将被部署在地址 0x08880000000000000000000000000006,并具有以下接口。Native Space 的用户/合约可以与 EVM Space 的账户互动,并在同一交互中处理返回值。所以跨空间的操作可以是原子性的。
在进行跨空间合约调用时,只有 1/10 的可用燃料能够传递至 EVM Space。此举是为了限制跨空间调用中的燃料使用。
pragma solidity >=0.5.0;
interface CrossSpace {
event Call(bytes20 indexed sender, bytes20 indexed receiver, uint256 value, uint256 nonce, bytes data);
event Create(bytes20 indexed sender, bytes20 indexed contract_address, uint256 value, uint256 nonce, bytes init);
event Withdraw(bytes20 indexed sender, address indexed receiver, uint256 value);
function createEVM(bytes calldata init) external payable returns (bytes20);
function create2EVM(bytes calldata init, bytes32 salt) external payable returns (bytes20);
function transferEVM(bytes20 to) external payable returns (bytes memory output);
function callEVM(bytes20 to, bytes calldata data) external payable returns (bytes memory output);
function staticCallEVM(bytes20 to, bytes calldata data) external view returns (bytes memory output);
function withdrawFromMapped(uint256 value) external;
function mappedBalance(address addr) external view returns (uint256);
function mappedNonce(address addr) external view returns (uint256);
}
区块燃料限制
只有区块高度为 5 的倍数的区块才能打包以太坊类型的交易。这些交易的总燃料限额不能超过区块燃料限额的一半。
理论依据
关于 Storage Key
在当前的网络实现中,经编码处理后 Storage Key 的第 21 个字节为合法的 ASCII 字符。因此,将第 21 字节的最高位设置为 1 能够达到将新的 Storage Key 与现有密钥区分开来的目的。
内部合约接口
内部合约使用类型 bytes20
来表示 EVM Space 地址。一个 EVM Space 内的地址对于 Conflux 空间可能是无效并被 RPC 接口所拒绝的。
后向兼容
本 CIP 是规范的突破。
测试案例
待定。
实施
待定。
安全方面的考虑
待定。
版权
通过 CC0 放弃了版权和相关权利。
更多详细内容可查看:https://github.com/Conflux-Chain/CIPs/blob/master/CIPs/cip-90.md