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 跟以太坊是有很大区别的:
- Conflux 交易增加了几个字段:storageLimit, epochHeight
- 交易的 RLP 编码方式不同
- 交易签名后的 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 计划对以太坊原始交易做兼容,但地址不兼容仍是一个大的问题,具体计划还未确定。