透過使用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代幣:

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;