http://www.tnmanning.com

通过利用POA Bridge举办主链与侧链之间的资产转移

简述

POA Bridge是在两个以太坊链之间转移资产代币(原生和ERC20 / ERC677令牌)的解决方案。

资产代币通常有两个作用:

· 代币可以作为长期投资进行交易、交换或保存的用途。
· 可以在Dapp上进行使用代币(投票,抵押等)

这两种用途都需要不同的网络属性来实现最佳体验,货币使用可能需要强大的网络安全性和活跃性,以及访问大型资产网络以促进交易,而应用程序使用需要更快、更便宜的交易以获得更好的用户体验。

侧链和桥接器作为第2层可扩展性解决方案的一部分,并尝试解决可扩展性和UX问题,因为以太坊主网通常被认为太慢(15 tx / sec)而且gas费用过于昂贵不能为(游戏或社交应用程序)提供良好的用户体验。在这种情况下,一般流程如下:

· 用户在主链上购买代币
· 用户通过桥将他的代币转移到侧链(提示:代币锁定在主链上,在侧链上重新铸造)
· 用户以快速有效的方式使用代币。也许从其他用户那里赚取或送出一些代币
· 用户决定撤回侧链中的代币并通过桥接器将其传输回主链(在主链上解锁并在侧链上烧掉的代币)

· 用户在主链上出售他的代币

通过利用POA Bridge举办主链与侧链之间的资产转移

在本教程中,我们将学习如何在两个网络上部署代币(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网桥。

通过利用POA Bridge举办主链与侧链之间的资产转移

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。