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

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

編譯

此時咱們有一個包含一些Solidity代碼的文件。但爲了使以太坊虛擬機可以理解它,咱們須要將其轉化爲機器代碼。另外,爲了從Web應用程序與它進行通訊,咱們須要一個ABI(應用程序二進制接口),它是對某個智能合約中存在的函數的通用可讀描述——不管是代幣仍是更復雜的東西。咱們可使用Truffle的編譯器當即爲EVM和ABI建立機器代碼。java

在項目文件夾中,運行:node

truffle compile

此命令將查看contracts子文件夾內部,將它們所有編譯並將其編譯後的版本放入build子文件夾中。請注意,若是你使用了上一部分的替代開發流程,那麼咱們的TNSToken合約繼承功能的全部父合約也將在其本身的文件中逐個編譯。python

Compile contracts

隨意檢查生成的JSON文件的內容。咱們的TNSToken應該有超過10000行的JSON代碼。android

部署到Ganache

如今讓咱們看看是否能夠將它部署到咱們的仿真模擬器Ganache區塊鏈中。若是Ganache還沒有在終端的選項卡中或操做系統的應用程序中運行,請運行如下命令:git

ganache-cli

或運行應用程序以得到這樣的屏幕:程序員

Ganache UI

而後,回到咱們剛剛編譯合約的文件夾中,咱們必須添加一個migration遷移。建立文件migrations/2_deploy_tnstoken.js。若是你不熟悉Truffle生態系統中的遷移,請參閱本指南web

咱們將如下內容放入該文件中:mongodb

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}之間改變的部分。npm

在這種狀況下,咱們告訴部署者部署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。你應該看到這樣的東西:

成功遷移

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

測試代幣

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

打開像MyEtherWallet這樣的錢包UI,在右上角的菜單中選擇一個自定義網絡。在對話框中,輸入你的私有區塊鏈給你的信息——Ganache或實際的PoA區塊鏈,根據本教程系列的第1部分,你能夠運行的任何一個。在個人例子中,地址爲127.0.0.1,端口爲7545

在MEW中配置網絡

打開你在部署腳本中設置爲from值的錢包。若是你正在使用Ganache,你會看到它的私鑰打印在Ganache UI的屏幕上或終端的ganache輸出中。

能夠在Ganache UI中訪問私鑰

最後,須要告知MEW該代幣存在。咱們經過添加自定義代幣來完成此操做。

在MEW中添加自定義代幣

添加代幣後,你會當即注意到該賬戶如今有1億的餘額,而且可以在貨幣下拉選擇菜單中發送它們。咱們試着將一些發送到另外一個地址。

發送一些代幣

交易正在準備中

已收到代幣

繼續發送,而後再將原始賬戶恢復到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運行遷移,若是咱們使用的地址是新的,它將失敗:

失敗的遷移

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

獲取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。單擊「驗證併發布」,一旦該過程完成,你的代幣的地址屏幕將顯示新選項卡:「讀取合約」和「寫入合約」,「 代碼」選項卡將具備綠色複選標記,表示代碼已通過驗證。這爲社區提供了額外的信任點。

代幣如今標記爲受信任

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代幣

相關文章
相關標籤/搜索