CIP-90 一个完全兼容 EVM 的空间

完全兼容 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

3 Likes

变成侧链了?

每个 Native Space 的账户在 EVM Space 都有一个映射的账户。映射账户的地址是初始账户 keccak 哈希值的最后 160 位。假设以 keccak 哈希函数安全为前提,映射的地址将永远不会与以太坊工具生成的地址发生冲突。

用回原来最早的树图地址不就得了吗?为什么还要搞得这么麻烦?两个空间之间的这种调用,在今后有没有可能会出现被攻击和漏洞的风险?
其次所述的后项兼容为什么说是一种规范突破?能再具体描述吗?
第三,所谓规范突破的意义,是不是多此一举呢?

很有意思,会密切关注这个的演变。 (翻译)

折腾来折腾去。。凉成啥样了。。所有的币都在向着零一侧前进。。看看大于2毛的还有几个

能说说之前这些变更产生的实际状况吗?此次的变更尝试,是不是也会同样隐藏问题而发生不可预知障碍?

支持,只有这样才能打通C链元宇宙和其他链上元宇宙的互通

支持,这个提案太棒了,真的有必要兼容以太坊,这样以太坊生态入驻才基本没有成本,生态才能大爆发。
我的看法:
1.新旧空间的账户可以通过内置合约交互,完全可以创建新的账户,把旧账户的资产转到新账户,这个很方便,喜欢放哪就放哪。
2.新空间完全兼容以太坊,地址也是一样的,相当于以太坊的私钥和地址完全一样,这样管理账户资产也很方便。
3.这个提案是我这么久听到的最好的消息了,PoS也算一个好消息。
4.真的期待这个提案,我觉得团队肯定有这个能力实现这个提案,安全性我感觉没什么,不是共识协议的改变。
5.团队加油啊,套了太久了,看到你们一直在做事,就放心了,加油!!!千万不要放弃,不忘初心。

还是战斗民族小伙牛皮

方案是不错
问题是现在才执行到CIP40
后面还有好多提案等着做呢
团队开发者又少
等做到这个CIP90估计要等到明年了@Chenxing.LI

:666:

Conflux 会把所有私钥地址的最高位置为 0x1,这个设定导致与 Metamask 及各种 EVM 钱包几乎不可能兼容。CIP-72 解决不了这个问题。CIP-80 能解决,但那个解决方案过于复杂,用户认知成本过高,很容易出现丢资产的问题,被否决了。

CIP-90 在用户认知上,就是一个侧链。只不过技术上还是同一条链。

地址最高位改成 0x1 使得 Conflux 虽然 95% 兼容以太坊,但应用移植成本依然很高。至于 cfx: 地址格式,是在地址规则已经不兼容以太坊的前提下,为减少资产丢失做的努力。

今天回过头来看,这确实是一个失误。但是,当时谁也没想到以太坊生态之后会那么强势,那个时候 ETH 还不到 200 美元。

另外,规范突破是指这个更新需要硬分叉升级的。目前CIP分4种

  1. 向前兼容:完全的兼容,全节点什么都不用做。
  2. RPC 突破:使用了向前不兼容的用户接口,各种生态项目在使用新接口时需要更新代码。
  3. 数据库突破:使用了向前不兼容的数据格式,全节点升级时需要清空数据。
  4. 规范突破:修改了区块格式、交易执行方式等内容,需要全部全节点通过硬分叉,约定一个时间分隔点,同时开始支持新的修改,以免出现分叉。

CIP-43 大概开发了半年,测了半年,因为加一条 PoS 链实在是个大工程。共识、交易池、交易执行、两个链交互、改确认规则、检查点快照等等,都需要时间。

绝大多数 CIP 就是一两天的工作量,都是一些小的改动,百十行代码。之所以没有上主网,是在等 CIP-43. 总不能天天硬分叉吧.

CIP-90 的改动也不大,说开了一条侧链是为了便于降低用户认知成本,其实是在交易执行层面做了一些修改。核心代码三天就改完了,之后在做接口兼容和生态测试。

1 Like

提案是不错,但用户使用必须丝滑无感,如果使用麻烦那这个提案就没有意义,另外,这个提案只是打通了和以太坊生态的桥梁,关键你自身也得过硬,目前的C链发展状态,人家凭什么来C链?你们团队不能说把技术丢出来就当甩手掌柜了,这对一个项目是不负责任的做法!项目发展,技术是基础,运营才是关键!

感谢李博士回答解疑,期望Conflux更好。

同样的问题对公链的未来诸多,相信在不久远的时间里不同公链间的跨转,资产与应用的交互比今天单链生态更强势,甚至于更多由此而发生的技术突破。在这些方面,树图是不是一直能走在更高瞻地且技术同样设计尽量小失误呢?当然这很难,不过真切地希望越来越好。
很多的公链也不断在升级不管是兼容还是分叉升级,但的确受之于技术的能力不同也不断的产生更多甚至更坏的情况。同样在规范突破之后,会不会同样的也有担心事发生?
最后点个赞,不管公链的参与价值获得如何,毕竟真正技术的稳定与领先是保证价值的基础。

都兼容以太正常,更多是把此当标的,甚至全舍弃自己技术创新。
当下顺应发展丰富不同应用,但这方向真是好事么?
不一定是为实体经济服务,而为实际资本服务
长远看,不见得。
如人要活着,但持刀锋行事,利在,刃伤人