以太坊快速迁移教程[Bounty #191]

PlatON已经完全兼容了以太坊,意味着以太坊上面的智能合约可以通过platon-truffle直接部署于PlatON,以太坊上运行的合约字节码也可以直接运行于PlatON。为了让以太坊用户更方便、高效和低成本地迁移到PlatON,我们选择直接使用以太坊的开发工具进行迁移。

PlatON网络信息

**官网:**PlatON

**开发者文档:**Overview | PlatON

**代币:**LAT

主网信息

公用RPC:https://openapi.platon.network/rpc

chain id: 100

区块浏览器:https://scan.platon.network/

开发网地址信息

公用RPC:http://35.247.155.162:6789

chain id: 210309

区块浏览器:https://devnetscan.platon.network/

水龙头:PlatON

准备工作

创建PlatON账户

由于以太坊和PlatON使用的相同加密算法,因此我们可以直接使用以太坊的账户。

如果需要创建新的账户,我们也有很多的方法,比如使用metamask,也可以使用PlatON官方钱包ATON进行创建,后者支持PlatON、PlatON Dev、Alaya网络。ATON钱包下载地址https://www.platon.network/wallet。

需要注意的是PlatON使用的地址格式是bech32编码的,我们可以在浏览器https://scan.platon.network/将其与hex地址进行互转。

获取代币

PlatON Dev网络可以通过水龙头获取,水龙头地址https://faucet.platon.network/faucet/。

主网代币可通过交易所购买、他人转账,或者参加活动获得。

我们这里以Truffle和Remix两种开发工具为例进行说明,其他工具虽然使用方法不一样,但是思路是一致的。

迁移

有工程信息

这套迁移方案适用于所有的以太坊项目,包括以太坊兼容项目,前提是你有这个项目的完整工程信息。需要说明的一点是,本教程的迁移指的是智能合约部分,而不包括链下部分,不同项目的链下部分是不一样的,需要分别处理。

这个方案非常简单,总结之后就是如下三步:

1.修改部署网络

将原本部署用的以太坊网络信息改为PlatON网络

2.修改部署账户

将原本部署使用的以太坊账户替换为在准备工作中申请的PlatON账户,如果你用的是相同的密钥,可以忽略这一步骤

3.部署

按照原来以太坊部署方法部署

接下来,我们分别使用Truffle和Remix说明以下迁移流程

Truffle

Truffle是为使用EVM的区块链提供的世界级开发环境、测试框架和资产管道,旨在让开发者的生活更轻松。

网站:https://trufflesuite.com/

修改部署网络

在truffle-config.js中添加如下配置信息

platonDev: {
    provider: () => new HDWalletProvider(mnemonic, ‘http://35.247.155.162:6789’),
    network_id: "*",    // Any network (default: none)
},
platon: {
    provider: () => new HDWalletProvider(mnemonic, ’https://openapi.platon.network/rpc‘),
    network_id: "*",    // Any network (default: none)
},

修改部署账户

mnemonic对应的私钥修改为我们在准备工作中准备的有token的账户

部署

truffle migrate --network platon

如果是开发网的话,则将命令改为

truffle migrate --network platonDev

Remix

Remix IDE是一个开源的网页和桌面应用,它促进了快速的开发周期,并且具有丰富的插件和直观的GUI。Remix用于合约开发的整个过程,也作为学习和教授以太坊的游乐场。

网站:https://remix.ethereum.org

修改部署网络

在metamask中添加PlatON网络,网络信息见前文PlatON网络信息,详细教程见此

修改部署账户

Remix链接的账户改为我们在准备工作中准备的有token的账户

部署

在Deploy & run transactions页面的ENVIRONMENT选择Injected Web3,连接PlatON钱包账户,然后按之前的方式部署。

就这些,你没有看错,迁移过程到此已经结束。如果你拥有完整的工程信息,那么你将项目迁移到PlatON将会非常地简单,仅仅需要这几步即可。

无工程信息

如果你没有项目工程信息,比如你想要移植别人的项目,而你没有项目工程信息,只有在etherscan查到的合约代码,可以使用这个方案。重新开发合约也可以使用这个方案。

Truffle

安装truffle

npm install -g truffle

安装完成可以在console输入truffle --help查看命令

创建truffle工程

创建一个工作目录,比如

mkdir myworkspace

初始化truffle工程

truffle init
npm init

设置网络

在truffle-config.js中添加PlatON网络配置。

配置如下所示

platonDev: {
    provider: () => new HDWalletProvider(mnemonic, ‘http://35.247.155.162:6789’),
    network_id: "*",    // Any network (default: none)
},
platon: {
    provider: () => new HDWalletProvider(mnemonic, ’https://openapi.platon.network/rpc‘),
    network_id: "*",    // Any network (default: none)
},

HDWalletProvider是Truffle提供的一个包,通过如下方式引入

const HDWalletProvider = require('@truffle/hdwallet-provider');

为了使用这个包,你必须首先安装在工作目录中

npm install @truffle/hdwallet-provider

mnemonic可以直接使用私钥,为了安全我们将私钥文件放在本地,获取方式如下

const fs = require('fs');
const mnemonic = fs.readFileSync(".secret").toString().trim();

migrate

在migrations目录中新建一个部署文件,格式可以参考1_initial_migration.js,目的是将合约部署到对应网络

const Migrations = artifacts.require("Migrations");

module.exports = function (deployer) {
 	deployer.deploy(Migrations);
};

然后输入以下命令进行部署

truffle migrate --network platon

示例

我们以Chainlink合约代码的迁移为例,对有工程信息的项目迁移进行说明,使用工具为Truffle,环境安装过程见前文所述,你会发现合约迁移真的是非常简单。

下载代码

git clone https://github.com/smartcontractkit/truffle-starter-kit.git

安装

npm install

配置网络

truffle-config.js文件中添加

platonDev: {
    provider: () => new HDWalletProvider(mnemonic, ‘http://35.247.155.162:6789’),
    network_id: "*",    // Any network (default: none)
},
platon: {
    provider: () => new HDWalletProvider(mnemonic, ’https://openapi.platon.network/rpc‘),
    network_id: "*",    // Any network (default: none)
},

创建密钥文件

echo <PRIVATE_KEY> >> .env

<PRIVATE_KEY>是你的私钥

部署

部署时会出现一个错误,原因是openzeppelin库的版本太高了,我们使用较低版本就可以了,执行以下代码

npm install @openzeppelin/contracts@3.3.0

执行部署命令

truffle migrate --network platonDev

以下是部分打印信息

2_mycontract_migration.js
=========================

Replacing 'LinkToken'
---------------------

   > transaction hash:    0xbcfc948455e0ef210540230b4cd807d21f83847c95da2f8542ec892738b26648
   > Blocks: 2            Seconds: 4
   > contract address:    0xE49d98103e90F801C34D06879aF03da7F55f6c8C
   > block number:        14478621
   > block timestamp:     1646578668241
   > account:             0x30ad2981E83615001fe698b6fBa1bbCb52C19Dfa
   > balance:             292.628332679
   > gas used:            764685 (0xbab0d)
   > gas price:           50 gwei
   > value sent:          0 ETH
   > total cost:          0.03823425 ETH


   Replacing 'Oracle'
   ------------------

   > transaction hash:    0xeaf84486dd5e26ab3317977a1025addbab0932e4e53b4dd772fb28cd52bfb098
   > Blocks: 5            Seconds: 4
   > contract address:    0x3b4Ec74590Cb011Cdc643d3A24C3d6a2bE98935A
   > block number:        14478626
   > block timestamp:     1646578673759
   > account:             0x30ad2981E83615001fe698b6fBa1bbCb52C19Dfa
   > balance:             292.554940129
   > gas used:            1467851 (0x1665cb)
   > gas price:           50 gwei
   > value sent:          0 ETH
   > total cost:          0.07339255 ETH


   Deploying 'MyContract'
   ----------------------

   > transaction hash:    0x354f28b3a200729bc0842093b6107a9320fa2d24a016737ae18721ccfae4064c
   > Blocks: 3            Seconds: 4
   > contract address:    0x8b0036b85C39a6bFB5768718bEF958415bBCd9B5
   > block number:        14478629
   > block timestamp:     1646578677071
   > account:             0x30ad2981E83615001fe698b6fBa1bbCb52C19Dfa
   > balance:             292.470083729
   > gas used:            1697128 (0x19e568)
   > gas price:           50 gwei
   > value sent:          0 ETH
   > total cost:          0.0848564 ETH

   > Saving migration to chain.
   >
   > Saving artifacts
   > -------------------------------------
   >
   > Total cost:           0.1964832 ETH

在区块浏览器可以查到已经部署的合约信息,说明我们的迁移已经成功了。

当然,chainlink是一个包含很多功能的项目,这一部分代码并不能涵盖所有的迁移工作,仅仅是作为合约迁移的一个示例。

对于无工程信息的项目迁移,这种情况应该不是很多,有需要的可以查看官方的Uniswap迁移

3 个赞