跳至主要内容

[blockchain] 以太坊區塊鏈開發工具 — 使用Truffle將智能合約部署至Rinkeby並驗證

說明

今天這篇是要來教如何利用 Truffle 部署智能合約到 Rinkeby 測試網路,並直接使用指令來驗證智能合約。

在開始之前先新增一個資料夾,而如果還沒安裝 Truffle 的話,先執行以下指令,我們還要另外安裝一個智能合約驗證套件truffle-plugin-verify和錢包套件truffle-hdwallet-provider

npm install -g truffle truffle-plugin-verify
npm install --save truffle-hdwallet-provider

Infura End Point

在正式部署智能合約之前,我們需要藉由 Infura 提供的服務來幫助連線到以太坊節點,Infura 是一個 BaaS(區塊鏈即服務)。

所以先到 Infura 官方註冊一個帳號,註冊成功後登入然後到後台頁面,點選右上角的CREATE NEW PROJECT

Image

PROJECT 的部分選擇 Ethereum,PROJECT NAME 則是填寫自己的專案名稱,填寫完後按下CREATE

Image

建立成功後,會看到以下頁面,而我們需要的只有 ENDPOINTS 的部分,在 ENDPOINTS 之欄位選擇 RINKEBY,然後將第一個網址先保存下來,等下會在 Truffle 的設定檔貼上這個網址。

Image

Etherscan API Key

而如果要直接使用指令驗證智能合約的話,我們還需要去申請 Etherscan 的 API,到 Etherscan 申請帳號並登入到後台,之後點擊OTHERSAPI Keys,並在My API Keys的右邊點擊Add按鈕,申請一個新的 API KEY。

Image

Truffle Deploy Verify

現在我們可以在 Rinkeby 部署和驗證智能合約了。

在一開始創建的資料夾底下執行以下指令:

truffle init

執行完後,資料夾底下應該會有這些檔案:

Image

打開truffle-config.js,並將以下的程式碼貼上,同時將以下欄位補齊:

  • mnemonic:錢包私鑰,注意不要用到正式網路的私鑰,也不要將私鑰上傳到 Github 或其他公開的網路空間,作者之前不小心將測試網的帳號私鑰上傳到 Github,結果測試用的以太幣都被盜光了。
  • infuraEndPoint:貼上剛剛在 Infura 申請的 Rinkeby EndPoint。
  • etherscanAPIKey:貼上剛剛在 Etherscan 申請的 API Key。
var HDWalletProvider = require("truffle-hdwallet-provider");
var mnemonic = "錢包某位使用者的私鑰";
var infuraEndPoint = "剛剛申請的 Rinkeby Infura EndPoints";
var etherscanAPIKey = "剛剛申請的 Etherscan API Key";
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*",
},
rinkeby: {
provider: function () {
return new HDWalletProvider(mnemonic, infuraEndPoint);
},
network_id: 4,
gas: 4500000,
gasPrice: 10000000000,
},
},
plugins: ["truffle-plugin-verify"],
api_keys: {
etherscan: etherscanAPIKey,
},
compilers: {
solc: {
version: "^0.4.26",
},
},
};

以上欄位都填寫完成後,就可以來部署智能合約了,執行以下指令,將合約部署到 Rinkeby:

truffle migrate --network rinkeby

成功後會出現以下畫面,我們就可以利用 contract address 去找到我們剛部署的合約了

Image

但在合約的 Contract 頁面可以看到,該份合約是還沒有被驗證過的,以往我們要驗證的時候都需要選擇 Solidity 使用的版本並貼上程式碼,但現在我們可以靠一行指令來幫我們自動驗證智能合約。

Image

回到我們的專案底下,執行以下指令來驗證智能合約:

npx truffle run verify 智能合約名稱 --network rinkeby

在"智能合約名稱"的地方要填寫我們剛剛部署的合約名稱,Truffle 預設的智能合約名稱為 Migrations。

npx truffle run verify Migrations --network rinkeby

成功後看到以下畫面:

Image

接著回到我們剛剛部署的智能合約頁面,重新整理後會發現合約已經成功被驗證了。

Image