Skip to main content

将以太坊合约迁移至Conflux

概述

本文简单归纳了开发者将合约迁移至Conflux需要注意的事项。除本文外,读者还可以阅读以下文档了解相关细节

地址

迁移应用时首先需要注意的是地址。Conflux中地址有两种编码方式:

  1. 0x开头的十六进制地址。如0x0888000000000000000000000000000000000000
  2. cfx:cfxtest:开头的Base32地址。如cfx:aaejuaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2mhjju8k

其中Base32地址编码后的信息包含了十六进制地址信息与该地址所在的网络信息,如cfx:...代表该地址为主网地址,cfxtest:代表该地址为测试网地址。这两种编码格式的地址使用场景如下:

  1. 十六进制地址:仅在.sol合约中出现。
  2. Base32地址:除了.sol文件的基本所有场合。

本文章主要讨论迁移合约的注意事项,因此主要关注于十六进制地址。但需要注意的是,以太坊与Conflux计算十六进制地址的方式并不相同,这也是迁移应用时需要注意的。大体而言

  1. 同样的私钥对应的EOA账户的十六进制地址很可能不同;
  2. 同样的方式部署合约,合约账户的十六进制地址很可能不相同。

如果开发者不想了解地址计算的细节区别,请按照如下规则检查合约文件中的地址:

替换合约文件(.sol)中硬编码的地址

由于以太坊与Conflux计算十六进制地址的方式并不相同(包括EOA地址),硬编码的地址一般不可用,同时还可能引起合约执行失败。如果合约中硬编码的地址为EOA地址,则需要使用Conflux提供的工具获得对应的EOA地址,并进行替换。例如python中可以用以下的方法获得以太坊EOA地址对应的Conflux地址:

from cfx_address.utils import eth_eoa_address_to_cfx_hex
eth_address = "0xcfffde169afbd51f081d2e82acca0f19cadcbbe1"
print(eth_eoa_address_to_cfx_hex(eth_address))

硬编码的合约地址则需要替换为Conflux上部署的合约地址。特别需要注意的是,部分合约模版中也会包含硬编码的地址,如ERC777合约模版中可能硬编码了ERC1820合约的地址。

Conflux 中 1820 合约的地址为 0x88887eD889e776bCBe2f0f9932EcFaBcDfCd1820

在替换后,可以在ConfluxScan上查询对应地址是否合法。

检查合约中是否使用了计算合约地址的合约模版

一些以太坊合约会在合约内通过参数计算合约地址,如oz的Create2合约与Clone合约。如果项目中使用了这些合约,可能会造成运行结果不符预期或运行出错。conflux-contract 仓库中提供了对应合约的conflux适配版,开发者可以视需要使用。

opcode(NUMBERBLOCKHASH)

Conflux 中,部分 Opcode 的实现与以太坊中存在区别。

NUMBER

Conflux 中,NUMBER opcode 返回的为 epoch number,而非block number。

BLOCKHASH

合约中如果使用了BLOCKHASHopcode,则需要注意兼容性问题。以太坊中BLOCKHASHopcode参数支持(BLOCK-1BLOCK-256),Conflux中,BLOCKHASH 仅支持参数 NUMBER-1

EIP-712 签名

部分合约中可能采用了 EIP-712: Typed structured data hashing and signing 的签名方案。在 Conflux 中,我们提倡(不要求)采用 CIP-23进行签名。CIP-23 与 EIP-712 的主要区别在于:

  • 签名字符串时,前缀由\x19Ethereum Signed Message:\n改为\x19Conflux Signed Message:\n
  • 签名 typed structured data 时,将 EIP712domain 替换为 CIP23domain
  • CIP23domain 字段中,chainId 为必选字段。