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的区块链提供的世界级开发环境、测试框架和资产管道,旨在让开发者的生活更轻松。
修改部署网络
在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用于合约开发的整个过程,也作为学习和教授以太坊的游乐场。
修改部署网络
在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迁移
。