以太坊構建DApps系列教程(三):編譯部署測試TNS代幣

weixin_34208283發表於2018-12-24

在本系列關於使用以太坊構建DApps教程的第2部分,我們編寫了TNS代幣的程式碼。但我們尚未編譯,部署,測試或驗證它。讓我們在這一部分做這些工作,以便我們為下一步做好準備。

編譯

此時我們有一個包含一些Solidity程式碼的檔案。但為了使以太坊虛擬機器能夠理解它,我們需要將其轉化為機器程式碼。另外,為了從Web應用程式與它進行通訊,我們需要一個ABI(應用程式二進位制介面),它是對某個智慧合約中存在的函式的通用可讀描述——無論是代幣還是更復雜的東西。我們可以使用Truffle的編譯器立即為EVM和ABI建立機器程式碼。

在專案資料夾中,執行:

truffle compile 

此命令將檢視contracts子資料夾內部,將它們全部編譯並將其編譯後的版本放入build子資料夾中。請注意,如果你使用了上一部分的替代開發流程,那麼我們的TNSToken合約繼承功能的所有父合約也將在其自己的檔案中逐個編譯。

11831773-ba6a562767853df7.png
Compile contracts

隨意檢查生成的JSON檔案的內容。我們的TNSToken應該有超過10000行的JSON程式碼。

部署到Ganache

現在讓我們看看是否可以將它部署到我們的模擬模擬器Ganache區塊鏈中。如果Ganache尚未在終端的選項卡中或作業系統的應用程式中執行,請執行以下命令:

ganache-cli 

或執行應用程式以獲得這樣的螢幕:

11831773-ee015c417024c149.png
Ganache UI

然後,回到我們剛剛編譯合約的資料夾中,我們必須新增一個migration遷移。建立檔案migrations/2_deploy_tnstoken.js。如果你不熟悉Truffle生態系統中的遷移,請參閱本指南

我們將以下內容放入該檔案中:

var Migrations = artifacts.require("./Migrations.sol");
var TNSToken = artifacts.require("./TNSToken.sol");

module.exports = function(deployer, network, accounts) {
  deployer.deploy(TNSToken, {from: accounts[0]});
};

首先,通過請求Migrations.sol進行完整的匯入。每次遷移都需要這樣做。接下來,部署代幣意味著我們需要匯入其Solidity程式碼,我們通過TNSToken.sol(我們在前一部分中編寫的程式碼)來完成此操作。最後,只是遷移function(deployer, network, accounts) {and the last}之間改變的部分。

在這種情況下,我們告訴部署者部署TNSToken並傳入from引數以設定初始代幣持有者。這裡使用的地址是由Ganache生成的隨機地址,但是通過使用自動傳送給部署者的accounts陣列,我們確保可以訪問執行節點中存在的帳戶列表(無論是實時Geth節點還是Ganache)。在我的特定示例中,account[0]地址為0xdFb659D556d926dd3585d0f18d4F8eD7939E8061,在上面的螢幕截圖中也很明顯。

我們也不要忘記在truffle.js配置開發環境:

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*"
    }
  }
};

注意:照顧埠和IP; 你的可能會有所不同!

最後,在專案資料夾中,執行truffle migrate。你應該看到這樣的東西:

11831773-6f3a1718d229b761.png
成功遷移

注意TNStoken旁邊的以太坊地址:0x3134bcded93e810e1025ee814e87eff252cff422。這是我們的代幣部署的地方。現在讓我們看看它的實際效果。

測試代幣

在這種情況下,不需要自動測試。代幣合約是高度標準化和戰鬥測試。如果我們使用的某些功能超出了傳統代幣的範圍,那麼自動化測試就會派上用場。但是,通過將它傳送到地址和從地址傳送來測試它已經足夠了。

開啟像MyEtherWallet這樣的錢包UI,在右上角的選單中選擇一個自定義網路。在對話方塊中,輸入你的私有區塊鏈給你的資訊——Ganache或實際的PoA區塊鏈,根據本教程系列的第1部分,你可以執行的任何一個。在我的例子中,地址為127.0.0.1,埠為7545

11831773-5d7da04b1b3d7aec.png
image

在MEW中配置網路

開啟你在部署指令碼中設定為from值的錢包。如果你正在使用Ganache,你會看到它的私鑰列印在Ganache UI的螢幕上或終端的ganache輸出中。

11831773-bc0173c4c8948f23.png
可以在Ganache UI中訪問私鑰

最後,需要告知MEW該代幣存在。我們通過新增自定義代幣來完成此操作。

11831773-f7be8ca517da8e9b.png
image

在MEW中新增自定義代幣

新增代幣後,你會立即注意到該帳戶現在有1億的餘額,並且能夠在貨幣下拉選擇選單中傳送它們。我們試著將一些傳送到另一個地址。

11831773-6d86616142131abd.png
傳送一些代幣
11831773-5560ea218400aea5.png
交易正在準備中
11831773-17708dbe840e75ce.png
已收到代幣

繼續傳送,然後再將原始帳戶恢復到1億。我們剛剛確保代幣的基本功能按預期工作。

部署到實時網路

如果不將其部署在實時網路上,這將不是真正的代幣測試。但是,我們不要使用主網路,而是像Rinkeby這樣的測試網。

truffle.js,讓我們新增一個新的網路rinkeby,這樣我們的檔案看起來像這樣:

require('dotenv').config();
const WalletProvider = require("truffle-wallet-provider");
const Wallet = require('ethereumjs-wallet');
const Web3 = require("web3");
const w3 = new Web3();

const PRIVKEY = process.env["PRIVKEY"];
const INFURAKEY = process.env["INFURAKEY"];

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*"
    },
    rinkeby: {
      provider: function() {
        return new WalletProvider(
          Wallet.fromPrivateKey(
            Buffer.from(PRIVKEY, "hex")), "https://rinkeby.infura.io/"+INFURAKEY

        );
      },
      gas: 4600000,
      gasPrice: w3.utils.toWei("50", "gwei"),
      network_id: "3",
    },
  }
};

哎呀!這都是什麼?

讓我們逐行梳理它。

前幾行匯入一些節點模組,因此我們可以使用下面的函式。如果你得到任何一個缺少的模組訊息,只需執行npm install web3-wallet-provider truffle-wallet-provider web3 dotenv --save應該可以解決問題。

接下來,我們從根目錄中的.env檔案中載入我們正在執行合約錢包的私鑰(所以錢包將獲得1億個代幣;我們不能在這裡使用from值)專案資料夾。如果它不存在,請建立它。該檔案還有一個Infura.io訪問金鑰,這是一個託管以太坊節點並允許應用程式連線到它們的網站,因此開發人員無需在其計算機上執行完整的以太坊節點。

.env檔案預設是隱藏的,可以在.gitignore忽略,這樣就不會有私鑰洩漏的危險——這是一個非常重要的預防措施!這是檔案包含的內容:

PRIVKEY="YOUR_PRIVATE_KEY";
INFURAKEY="YOUR_INFURA_ACCESS_KEY";

你可以在此處註冊獲取Infura金鑰。如果你只是安裝Metamask,將其切換到Rinkeby,然後轉到匯出私鑰,則可以輕鬆獲取私鑰。但是,任何方法都可行,所以選擇你喜歡的任何方法。你也可以使用Ganache的私鑰。一個私鑰可以在所有以太坊網路上解鎖相同的錢包——testnetrinkebymainnet,你可以命名它。

回到我們的配置檔案。我們有一個新的network入口:rinkeby。這是我們將要部署的以太坊測試網的名稱,提供商內部的程式碼基本上是千篇一律的複製貼上,告訴Truffle“抓住我的私鑰,對其進行十六進位制編碼,使其成為一個未鎖定的錢包,然後再通過它來和Infura互動“。

最後,我們定義了我們希望在執行此合約時要花費的gas限制(460萬就夠了,如果需要可以更改),gas需要多少(50 Gwei實際上相當昂貴,但我們正在玩的乙太網是模擬的,所以沒關係),並且將網路ID設定為4,因為這是Rinkeby testnet的標籤。

還有一件事我們需要做。我們之前寫的遷移檔案是針對起始地址,但Rinkeby的地址不同。這是否意味著我們需要根據網路更改部署指令碼?當然不是!讓我們將2_deploy_tnstoken.js檔案更改為如下所示:

var Migrations = artifacts.require("./Migrations.sol");
var TNSToken = artifacts.require("./TNSToken.sol");

module.exports = function(deployer, network, accounts) {
  if (network == "development") {
    deployer.deploy(TNSToken, {from: accounts[0});
  } else {
    deployer.deploy(TNSToken);
  }
};

正如你所看到的,部署指令碼是簡單的JavaScript,並且為部署者提供的第二個引數始終是網路的名稱——我們可以使用它來區分它們。

如果我們現在嘗試使用truffle migrate --network rinkeby執行遷移,如果我們使用的地址是新的,它將失敗:

11831773-40f26ff5cc9ee6c8.png
失敗的遷移

這是因為該地址在部署合約時無需花費以太。但這很容易解決。只需前往Rinkeby Faucet免費獲取一些。

11831773-268ead09cfcfa446.png
獲取Rinkeby測試以太

現在重新執行遷移,代幣合約將在Rinkeby網路上實時部署。它可以像上面的Ganache用例一樣進行測試。一切都應該完全一樣,只有現在你也可以和你的朋友和同事一起測試。很有進展!

獎勵:驗證和ENS

對於額外的信任點,建議你在Etherscan上驗證代幣併為其註冊ENS域。

驗證

驗證意味著將代幣的原始碼提交給Etherscan,以便將其與網路上部署的內容進行比較,從而將其驗證為無後門。這是在代幣地址的“程式碼”選項卡上完成的。由於我們的代幣使用了一些第三方程式碼,並且無法輕鬆將這些程式碼拉入驗證螢幕的程式碼視窗,因此我們需要修改合約。為此,我們將使用一個名為truffle-flattener的工具:

npm install --global truffle-flattener 

該工具將所有依賴項和代幣的原始碼複製到一個檔案中。我們可以像這樣執行它:

truffle-flattener contracts/TNSToken.sol >> ./contracts/TNSTokenFlat.sol 

現在,contracts資料夾中應該存在一個新檔案,幾乎與我們的原始碼相同,但貼上了依賴程式碼(例如,SafeMath.sol將貼上在檔案的頂部)。

將該新檔案的內容貼上到Verify螢幕的程式碼視窗中,將編譯器設定為通過執行truffle version獲得的truffle版本,並將Optimization設定為No。單擊“驗證併發布”,一旦該過程完成,你的代幣的地址螢幕將顯示新選項卡:“讀取合約”和“寫入合約”,“ 程式碼”選項卡將具有綠色複選標記,表示程式碼已經過驗證。這為社群提供了額外的信任點。

11831773-34b67a27b93b5509.png
代幣現在標記為受信任

ENS

ENS是以太坊名稱系統。它用於為以太坊提供人類可讀的名稱,因此你不必記住0xmumbojumbo字串,而是可以記住像bitfalls.eth這樣的。然後,你甚至可以註冊像token.bitfalls.eth這樣的子域名。註冊ENS域的過程並不簡單,需要時間,因此如果你願意這樣做,我建議你閱讀本指南並按照此處的說明進行操作。

結論

在這一部分中,我們進行了編譯和部署自定義代幣。此代幣與所有交易所相容,可用作常規ERC20代幣。

======================================================================

分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:

  • java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
  • 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
  • EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • tendermint區塊鏈開發詳解,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。

匯智網原創翻譯,轉載請標明出處。這裡是原文以太坊構建DApps系列教程(三):編譯部署測試TNS代幣

相關文章