如何快速迁移以太坊 Dapp 到 Conflux 网络

Conflux 的账本结构跟共识算法跟以太坊有很大差别,有一些自己特有的概念比如 Epoch,Storage,Checkpoint。因此 Conflux 目前提供的RPC 无法跟以太坊兼容。并且由于 Conflux 将地址按类型进行了区分(地址转换为 hex 形式: 普通地址首位是 0x1, 合约地址为 0x8),导致没法直接使用 MetaMask 与 Conflux 网络进行交互,以太坊的各语言 SDK 也无法直接使用。

但还是有办法降低以太坊Dapp 迁移至 Conflux 网络的成本,只是会比较hack。

地址的转换

MetaMask 通过助记词生成的地址,大多不能直接用作 Conflux 地址,但如果直接将首位替换为 0x1,则该地址可以直接用作 Conflux 地址。因此要求在 Dapp 中明确显示 Conflux 地址,直接将MetaMask返回的地址首位替换为 0x1,最好显示 base32 格式的地址。

交易签名

Conflux 的 rawTransaction 跟以太坊是有很大区别的:

  1. Conflux 交易增加了几个字段:storageLimit, epochHeight
  2. 交易的 RLP 编码方式不同
  3. 交易签名后的 V 值,Conflux 不做特殊处理。

因此Metamask 签名的交易无法直接发送到Conflux 网络,但是Metamask 提供了直接对任意字符串进行签名的接口 eth_sign 。所以其实可以手动构造一笔 conflux 原始交易并生成hash,调用metamask 的eth_sign 方法获取交易签名,从而可以构造一笔 conflux 的原始交易。

RPC 方法 bridge

目前有一个js-package web3-provider-proxy 可以将转账和合约交互用到的核心方法,从 conflux bridge 成以太坊,具体支持的方法,参看项目 readme 介绍。

移植

将一个使用web3.js 或ethers.js 开发的以太坊 Dapp 移植到 Conflux 有两种形式

方法1

手动使用provider-proxy 构造一个能够兼容以太坊的provider,但 RPC 服务可以直接使用 conflux 服务。
将此provider 设置给 web3.js

交易的发送会复杂一些:手动构造 conflux 交易并生成hash, 调用 eth_sign 方法获取签名,最后手动组装出 conflux 原始交易, 最后调用 web3.js 的 sendRawTransaction 方法发送交易。

方法2

使用 web3-provider-proxy 开发一个 RPC 服务,能将conflux 的RPC bridge 成以太坊 RPC ;配置Metamask 使用此 RPC 服务。

js-conflux-sdk 提供了一个方法 wrapEthereum 可以对 MetaMask 的provider 进行封装,当调用以太坊的 eth_sendTransaction 的时候回改为手动构造一笔 conflux 交易,并调用 eth_sign 签名,最后调用 eth_sendRawTransaction 发送出去。

目前此两种方法已经做了基础开发,如果有兴趣尝试可直接联系或留言。

目前 Conflux 计划对以太坊原始交易做兼容,但地址不兼容仍是一个大的问题,具体计划还未确定。

2 Likes

Cool~

:666:

你好,我有个我问题希望得到帮助。
我不小心把ETH转到了conflux 钱包地址,通过论坛方法用私钥导入到metamask 发现conflux 的钱包地址是0x1C 而metamask 的地址是0x2C,请问,有什么方法找回我的ETH吗?

如果开头不一样的话,钱是拿不到了。请将钱包升级成最新版,cip37 之后的cfx钱包地址和以太坊的地址会有显著的差别

大神,目前我在迁移用web3.js的app,想请教一些个问题可否留个联系方式

我在技术群里 Pana