如何使用POA Bridge在两个以太坊链之间转移资产代币

简述
poa bridge是在两个以太坊链之间转移资产代币(原生和erc20 / erc677令牌)的解决方案。
资产代币通常有两个作用:
· 代币可以作为长期投资进行交易、交换或保存的用途。
· 可以在dapp上进行使用代币(投票,抵押等)
这两种用途都需要不同的网络属性来实现最佳体验,货币使用可能需要强大的网络安全性和活跃性,以及访问大型资产网络以促进交易,而应用程序使用需要更快、更便宜的交易以获得更好的用户体验。
侧链和桥接器作为第2层可扩展性解决方案的一部分,并尝试解决可扩展性和ux问题,因为以太坊主网通常被认为太慢(15 tx / sec)而且gas费用过于昂贵不能为(游戏或社交应用程序)提供良好的用户体验。在这种情况下,一般流程如下:
· 用户在主链上购买代币
· 用户通过桥将他的代币转移到侧链(提示:代币锁定在主链上,在侧链上重新铸造)
· 用户以快速有效的方式使用代币。也许从其他用户那里赚取或送出一些代币
· 用户决定撤回侧链中的代币并通过桥接器将其传输回主链(在主链上解锁并在侧链上烧掉的代币)
· 用户在主链上出售他的代币
在本教程中,我们将学习如何在两个网络上部署代币(rinkeby网络作为主链,poa sokol作为侧链),部署并使用桥接器(erc20 《》 erc20)让用户资产从一个网络转移到另一个网络。
在开始之前,您需要在计算机上安装以下程序:
1. git
2. nodejs/npm
3. yarn
4. docker and docker-compose
5. metamask
6. truffle
$ npm install -g truffle
$ truffle version
truffle v5.0.20 (core: 5.0.20)
solidity v0.5.0 (solc-js)
node v8.15.1
web3.js v1.0.0-beta.37
步骤1:在主链(rinkeby网络)上部署名为bridge token brt的erc20令牌
1、让我们首先为我们的erc20 brt创建一个项目文件夹并初始化一个truffle项目。
$ mkdir token
$ cd token
$ truffle init
2、然后我们将安装open-zeppelin solidity库,其中经过充分测试和审计的可重用智能合约。
$ npm init -y
$ npm install openzeppelin-solidity --save-exact
3、创建一个包含的合同文件。/contacts/bridgetoken.sol
// bridgetoken.sol
pragma solidity ^0.5.8;
import “openzeppelin-solidity/contracts/token/erc20/erc20mintable.sol”;
contract bridgetoken is erc20mintable {
string public constant name = “bridge token”;
string public constant symbol = “brt”;
uint8 public constant decimals = 18;
}
要确保您的智能合约编译,您可以执行命令truffle compile。
4、在rinkeby网络上部署智能合约
注意:确保用于部署合同的帐户由rinkeby ethers资助。
我们的智能合约编译完成,我们就需要部署它。为此,我们首先需要完成脚本迁移,创建一个文件。/migrations/2_deploy_contract.js
// 2_deploy_contract.js
const bridgetoken = artifacts.require(“。/bridgetoken.sol”);
module.exports = function(deployer, network, accounts) {
// deploy the smart contract
deployer.deploy(bridgetoken, {from: accounts[0]}).then(function(instance) {
// mint 100 tokens
return instance.mint(accounts[0], web3.utils.tobn(“100000000000000000000”), {from: accounts[0]});
});
};
脚本迁移后并部署合约,另外还创建了100个brt代币并将其分发到部署者帐户。
下一步包括配置到rinkeby网络的连接,以便部署智能合约。
安装以下依赖项(dotenv用于管理环境变量,而truffle-hdwallet-provider用于从来自助记符的帐户签署事务)
$ npm install --save dotenv truffle-hdwallet-provider
创建一个文件。/.env来存储一些私人信息,我们不想在任何地方共享(gitignore这个文件)
· infura是以太坊的公共门户。如果您还没有帐户,我建议您创建一个帐户,并在此文件中跳过您的api密钥(项目id)。
· 助记符是12个单词组成的短语,象征着一把私钥。 你可以在metamask中找到它。
// .env
infura_api_key=044443611111111e19e03433333309923
mnemonic=twelve words you can find in metamask/settings/reveal seed words
最后,让我们配置与rinkeby网络的连接。编辑文件。/truffle.js
// truffle.js
require(‘dotenv’).config();
const hdwalletprovider = require(“truffle-hdwallet-provider”);
module.exports = {
networks: {
development: {
host: “localhost”,
port: 8545,
network_id: “*”
},
rinkeby: {
provider: new hdwalletprovider(process.env.mnemonic, “https://rinkeby.infura.io/v3/” + process.env.infura_api_key),
network_id: 4,
gas: 4500000
}
}
};
要在rinkeby网络上部署智能合约,请运行命令(这可能需要一段时间):
$ truffle migrate --network rinkeby
compiling your contracts.。.
===========================
》 compiling 。/contracts/bridgetoken.sol
》 compiling 。/contracts/migrations.sol
》 compiling openzeppelin-solidity/contracts/access/roles.sol
》 compiling openzeppelin-solidity/contracts/access/roles/minterrole.sol
》 compiling openzeppelin-solidity/contracts/math/safemath.sol
》 compiling openzeppelin-solidity/contracts/token/erc20/erc20.sol
》 compiling openzeppelin-solidity/contracts/token/erc20/erc20mintable.sol
》 compiling openzeppelin-solidity/contracts/token/erc20/ierc20.sol
》 artifacts written to /home/gjeanmart/workspace/tutorials/bridge_token/build/contracts
》 compiled successfully using:
- solc: 0.5.8+commit.23d335f2.emscripten.clang
migrations dry-run (simulation)
===============================
》 network name: ‘rinkeby-fork’
》 network id: 4
》 block gas limit: 0x7244c0
1_initial_migration.js
======================
deploying ‘migrations’
----------------------
》 block number: 4502550
》 block timestamp: 1559667907
》 account: 0xf0f15cedc719b5a55470877b0710d5c7816916b1
》 balance: 33.578282390129999997
》 gas used: 246393
》 gas price: 2 gwei
》 value sent: 0 eth
》 total cost: 0.000492786 eth
-------------------------------------
》 total cost: 0.000492786 eth
2_deploy_contract.js
====================
deploying ‘bridgetoken’
-----------------------
》 block number: 4502552
》 block timestamp: 1559667919
》 account: 0xe9b0e206c8ca079bca49f0120abfd02760093612
》 balance: 99.996785462
》 gas used: 1607269
》 gas price: 2 gwei
》 value sent: 0 eth
》 total cost: 0.003214538 eth
-------------------------------------
》 total cost: 0.003214538 eth
summary
=======
》 total deployments: 2
》 final cost: 0.003707324 eth
starting migrations.。.
======================
》 network name: ‘rinkeby’
》 network id: 4
》 block gas limit: 0x724802
1_initial_migration.js
======================
deploying ‘migrations’
----------------------
》 transaction hash: 0x44dbbf18d316adb29143d1b3341c1e28b297d144411ee98cb23017270f77b9ed
》 blocks: 1 seconds: 9
》 contract address: 0xac96dc3ac9bab86c7d89a5868096394cb708a6a0
》 block number: 4502551
》 block timestamp: 1559667943
》 account: 0xf0f15cedc719b5a55470877b0710d5c7816916b1
》 balance: 33.573547316129999997
》 gas used: 261393
》 gas price: 20 gwei
》 value sent: 0 eth
》 total cost: 0.00522786 eth
》 saving migration to chain.
》 saving artifacts
-------------------------------------
》 total cost: 0.00522786 eth
2_deploy_contract.js
====================
deploying ‘bridgetoken’
-----------------------
》 transaction hash: 0x80dc122178131cbd040e90b667cc1d11a47d21abf8ebf17c80232b1c4c5f33df
》 blocks: 2 seconds: 21
》 contract address: 0x40a6a864133985e1146ddfeb48c7391cd07596f5
》 block number: 4502554
》 block timestamp: 1559667988
》 account: 0xf0f15cedc719b5a55470877b0710d5c7816916b1
》 balance: 33.540261476129999997
》 gas used: 1622269
》 gas price: 20 gwei
》 value sent: 0 eth
》 total cost: 0.03244538 eth
》 saving migration to chain.
》 saving artifacts
-------------------------------------
》 total cost: 0.03244538 eth
summary
=======
》 total deployments: 2
》 final cost: 0.03767324 eth
因此,我们可以将我们的智能合约bridgetoken标识为已部署在地址0x40a6a864133985e1146ddfeb48c7391cd07596f5(请参阅block explorer)
步骤2:初始化monorepo令牌桥
在第二步中,我们将初始化github mono-repository,以便按以下步骤安装每个组件。
1、复制repo
$ cd 。./
$ git clone --recursive https://github.com/poanetwork/tokenbridge
$ cd 。/tokenbridge/
2、安装依赖项
$ yarn install && yarn install:deploy
步骤3:配置和部署网桥合约
在第三步中,我们将部署必要的合约以启用erc20到erc20网桥。
1、转到合约文件夹
$ cd 。/contracts/
2、编译智能合约
$ npm run compile
在。/deploy/.env中创建配置文件
注1:要更改以下属性
《private_key》负责部署,管理合同和验证转移的帐户
《account_admin》负责部署,管理合同和验证转移的帐户。
《erc20_token_address》上面部署的erc20令牌的地址。
注2:出于本教程的原因,我们决定尽可能简化配置(一个帐户管理和验证)
注3:确保账户account_admin由rinkeby ethers和poa sokol ethers资助。
注4:未配置区块奖励(奖励令牌)。
bridge_mode=erc_to_erc
#bridge_mode=native_to_erc
# if home network does not support byzantium fork, should use contracts compiled for spuriousdragon
#home_evm_version=spuriousdragon
# if foreign network does not support byzantium fork, should use contracts compiled for spuriousdragon
#foreign_evm_version=spuriousdragon
deployment_account_private_key=《private_key》
deployment_gas_limit_extra=0.2
home_deployment_gas_price=10000000000
foreign_deployment_gas_price=10000000000
get_receipt_interval_in_milliseconds=3000
bridgeable_token_name=“bridge token”
bridgeable_token_symbol=brt
bridgeable_token_decimals=18
home_rpc_url=https://sokol.poa.network
home_bridge_owner=《account_admin》
home_validators_owner=《account_admin》
home_upgradeable_admin=《account_admin》
home_daily_limit=30000000000000000000000000
home_max_amount_per_tx=1500000000000000000000000
home_min_amount_per_tx=500000000000000000
home_required_block_confirmations=1
home_gas_price=1000000000
block_reward_address=0x0000000000000000000000000000000000000000
foreign_rpc_url=https://rinkeby.infura.io
foreign_bridge_owner=《account_admin》
foreign_validators_owner=《account_admin》
foreign_upgradeable_admin=《account_admin》
foreign_daily_limit=15000000000000000000000000
foreign_max_amount_per_tx=750000000000000000000000
foreign_min_amount_per_tx=500000000000000000
foreign_required_block_confirmations=8
foreign_gas_price=10000000000
#for bridge erc_to_erc and erc_to_native mode
erc20_token_address=《erc20_token_address》
# only for for erc_to_erc mode
erc20_extended_by_erc677=false
required_number_of_validators=1
#if several validators are used, list them separated by space without quotes
#e.g. validators=0x 0x 0x
validators=《account_admin》
#set to one_direction or both_directions if fee will be charged on home side, set to false otherwise
home_rewardable=false
# valid only for rewards on erc_to_native mode. supported values are bridge_validators_reward and posdao_reward
home_fee_manager_type=
#set to one_direction or both_directions if fee will be charged on foreign side, set to false otherwise
foreign_rewardable=false
#if home_rewardable or foreign_rewardable set to true, list validators accounts were rewards should be transferred separated by space without quotes
#e.g. validators_reward_accounts=0x 0x 0x
validators_reward_accounts=0x
# fee to be taken for every transaction directed from the home network to the foreign network
# e.g. 0.1% fee
home_transactions_fee=0.001
# fee to be taken for every transaction directed from the foreign network to the home network
foreign_transactions_fee=0.001
#for bridge native_to_erc, erc_to_erc mode
deploy_rewardable_token=false
dpos_staking_address=0x0000000000000000000000000000000000000000
4、部署bridge配置
$ 。/deploy.sh
(。..)
deployment has been completed.
[ home ] homebridge: 0xc4e7ca947521f331969e41cc7c99ada22f2c7f9c at block 9044640
[ home ] erc677 bridgeable token: 0xea3acd04ddaf1f1a5ae1b9f5f690123aa4e19b36
[ foreign ] foreignbridge: 0xeb2dbc5ab9380a3517aca9d8ca0c39873e569a93 at block 4503560
[ foreign ] erc20 token: 0x40a6a864133985e1146ddfeb48c7391cd07596f5
contracts deployment have been saved to `bridgedeploymentresults.json`
{
“homebridge”: {
“address”: “0xc4e7ca947521f331969e41cc7c99ada22f2c7f9c”,
“deployedblocknumber”: 9044640,
“erc677”: {
“address”: “0xea3acd04ddaf1f1a5ae1b9f5f690123aa4e19b36”
}
},
“foreignbridge”: {
“address”: “0xeb2dbc5ab9380a3517aca9d8ca0c39873e569a93”,
“deployedblocknumber”: 4503560
}
}
步骤4:配置和部署网桥oracle
1、转到“oracle文件夹”
$ cd 。./oracle
2、在。/.env中创建配置文件
注意1:打开保存的json文件bridgedeploymentresults.json以获取本地和外部桥接合约地址和部署区块编号。
{
“homebridge”: {
“address”: “0xc4e7ca947521f331969e41cc7c99ada22f2c7f9c”,
“deployedblocknumber”: 9044640,
“erc677”: {
“address”: “0xea3acd04ddaf1f1a5ae1b9f5f690123aa4e19b36”
}
},
“foreignbridge”: {
“address”: “0xeb2dbc5ab9380a3517aca9d8ca0c39873e569a93”,
“deployedblocknumber”: 4503560
}
}
注2:要更改以下属性
《private_key》负责部署,管理合同和验证转移的帐户
《account_admin》负责部署,管理合同和验证转移的帐户
《erc20_token_address》上面部署的erc20令牌的地址。
注3:出于本教程的原因,我们决定尽可能简化配置(一个帐户管理和验证)
注意4:确保帐户account_admin由rinkeby ethers和poa sokol ethers资助。
bridge_mode=erc_to_erc
home_polling_interval=5000
foreign_polling_interval=1000
allow_http=yes
home_rpc_url=https://sokol.poa.network
foreign_rpc_url=https://rinkeby.infura.io
home_bridge_address=《bridgedeploymentresults.json / homebridge / address》
foreign_bridge_address=《bridgedeploymentresults.json / foreignbridge / address》
erc20_token_address=《erc20_token_address》
validator_address=《account_admin》
validator_address_private_key=《private_key》
home_gas_price_oracle_url=https://gasprice.poa.network/
home_gas_price_speed_type=standard
home_gas_price_fallback=1000000000
home_gas_price_update_interval=600000
foreign_gas_price_oracle_url=https://gasprice.poa.network/
foreign_gas_price_speed_type=standard
foreign_gas_price_fallback=1000000000
foreign_gas_price_update_interval=600000
queue_url=amqp://rabbit
redis_url=redis://redis:6379
redis_lock_ttl=1000
home_start_block=《bridgedeploymentresults.json / homebridge / deployedblocknumber》
foreign_start_block=《bridgedeploymentresults.json / foreignbridge / deployedblocknumber》
log_level=info
max_processing_time=20000
3、构建并运行bridge oracle(使用docker和docker compose)
这个docker包由reddit数据库、rabbit mq代理和nodejs workers组成。
$ docker-compose up --build
使用标志-d在后台运行bridge oracle(守护进程)
步骤5:配置和部署桥ui
最后一步是部署用户界面以在侧链和主链之间传输daibi 。
1、定位到文件夹ui
$ cd 。./ui
2、在。/.env中创建配置文件
注意1:打开保存的json文件bridgedeploymentresults.json以获取本地和外部桥接合约地址和部署区块编号。
{
“homebridge”: {
“address”: “0xc4e7ca947521f331969e41cc7c99ada22f2c7f9c”,
“deployedblocknumber”: 9044640,
“erc677”: {
“address”: “0xea3acd04ddaf1f1a5ae1b9f5f690123aa4e19b36”
}
},
“foreignbridge”: {
“address”: “0xeb2dbc5ab9380a3517aca9d8ca0c39873e569a93”,
“deployedblocknumber”: 4503560
}
}
react_app_home_bridge_address=《bridgedeploymentresults.json / homebridge / address》
react_app_foreign_bridge_address=《bridgedeploymentresults.json / foreignbridge / address》
react_app_home_http_parity_url=https://sokol.poa.network
react_app_foreign_http_parity_url=https://rinkeby.infura.io/mew
3、运行网桥ui
$ npm start
打开您的internet浏览器,使用用于部署brt代币的帐户解锁rinkeby网络上的metamask,然后转到http:// localhost:3000 /
如果您在rinkeby网络上,您应该看到您在主链(rinkeby)上拥有100个brt代币,在侧链(poa sokol)上拥有0个br代币。
您现在可以在主链和侧链之间传输brt代币:

PoE系统对敏感电源电路实施电涌瞬态事故保护设计(电路原理图)
双电源供电原理_双电源供电规范要求
电动自行车蓄电池标准要求
智能交通解决方案为现有和新的交通基础设施项目提供重要的推动力
手机应用程序APP还存在哪些安全问题
如何使用POA Bridge在两个以太坊链之间转移资产代币
VOC环保检测设备是什么,有哪些作用
华为第一家软件学院落地太原 台积电第一季度净利润49亿美元
VS009 HDMI视频采集卡芯片方案
石墨烯充电宝5C条件下快速充电 仅需15分钟
电阻箱的分类
新能源电动汽车OBC车载充电机全面介绍
KUKA电柜27V控制电源故障产生的原因及解决办法
光电开关的主要特点有哪些
解析锂电池的激活
联讯仪器WAT半导体参数测试系统简介
clock gate时序分析概念介绍
基于inline技术和profibus-dp现场总线设计卷烟厂集中工艺风力系统
两年前发布的DC-DC转换器,至今它的“小巧”无人能敌
汉威科技全系列VOC气体检测产品,护航绿色低碳安全发展