以太坊構建DApps系列教程(三):編譯部署測試TNS代幣
在本系列關於使用以太坊構建DApps教程的第2部分,我們編寫了TNS代幣的程式碼。但我們尚未編譯,部署,測試或驗證它。讓我們在這一部分做這些工作,以便我們為下一步做好準備。
編譯
此時我們有一個包含一些Solidity程式碼的檔案。但為了使以太坊虛擬機器能夠理解它,我們需要將其轉化為機器程式碼。另外,為了從Web應用程式與它進行通訊,我們需要一個ABI(應用程式二進位制介面),它是對某個智慧合約中存在的函式的通用可讀描述——無論是代幣還是更復雜的東西。我們可以使用Truffle的編譯器立即為EVM和ABI建立機器程式碼。
在專案資料夾中,執行:
truffle compile
此命令將檢視contracts
子資料夾內部,將它們全部編譯並將其編譯後的版本放入build
子資料夾中。請注意,如果你使用了上一部分的替代開發流程,那麼我們的TNSToken合約繼承功能的所有父合約也將在其自己的檔案中逐個編譯。
隨意檢查生成的JSON檔案的內容。我們的TNSToken應該有超過10000行的JSON程式碼。
部署到Ganache
現在讓我們看看是否可以將它部署到我們的模擬模擬器Ganache區塊鏈中。如果Ganache尚未在終端的選項卡中或作業系統的應用程式中執行,請執行以下命令:
ganache-cli
或執行應用程式以獲得這樣的螢幕:
然後,回到我們剛剛編譯合約的資料夾中,我們必須新增一個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
。你應該看到這樣的東西:
注意TNStoken旁邊的以太坊地址:0x3134bcded93e810e1025ee814e87eff252cff422
。這是我們的代幣部署的地方。現在讓我們看看它的實際效果。
測試代幣
在這種情況下,不需要自動測試。代幣合約是高度標準化和戰鬥測試。如果我們使用的某些功能超出了傳統代幣的範圍,那麼自動化測試就會派上用場。但是,通過將它傳送到地址和從地址傳送來測試它已經足夠了。
開啟像MyEtherWallet這樣的錢包UI,在右上角的選單中選擇一個自定義網路。在對話方塊中,輸入你的私有區塊鏈給你的資訊——Ganache或實際的PoA區塊鏈,根據本教程系列的第1部分,你可以執行的任何一個。在我的例子中,地址為127.0.0.1
,埠為7545
。
在MEW中配置網路
開啟你在部署指令碼中設定為from
值的錢包。如果你正在使用Ganache,你會看到它的私鑰列印在Ganache UI的螢幕上或終端的ganache輸出中。
最後,需要告知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的私鑰。一個私鑰可以在所有以太坊網路上解鎖相同的錢包——testnet
,rinkeby
,mainnet
,你可以命名它。
回到我們的配置檔案。我們有一個新的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網路上實時部署。它可以像上面的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代幣
相關文章
- 在以太坊發行代幣Token系列教程(1)
- 以太坊構建DApps系列教程(一):應用程式規則和區塊鏈設定APP區塊鏈
- 以太坊錢包開發系列4 - 傳送Token(代幣)
- 前端彙總系列:npm依賴(構建編譯)前端NPM編譯
- [譯] 前端程式構建系列教程簡介(開篇)前端
- 使用Remix編譯和部署以太坊智慧合約REM編譯
- 反編譯系列教程(上)編譯
- 反編譯系列教程(中)編譯
- Go編譯原理系列5(抽象語法樹構建)Go編譯原理抽象語法樹
- webpack的編譯&構建Web編譯
- 以太坊代幣空投合約實現
- [譯] 為你的 iOS App 構建分離測試iOSAPP
- 以太坊教程:搭建環境、編寫編譯一個智慧合約編譯
- Flutter Engine 編譯構建-05Flutter編譯
- Golang 編寫測試教程Golang
- Go 高效能系列教程之三:編譯器優化Go編譯優化
- 自動化測試系列(三)|UI測試UI
- WebAssembly 系列(三)編譯器如何生成彙編Web編譯
- 用Golang實現以太坊代幣轉賬Golang
- [譯] 優化 WEBPACK 以更快地構建 REACT優化WebReact
- Android Apk反編譯系列教程(一)如何反編譯APKAndroidAPK編譯
- Pytorch系列:(三)模型構建PyTorch模型
- [譯] 如何區分支付型代幣,實用型代幣,證券化代幣?
- 交叉編譯工具鏈構建原理編譯
- 「譯」Java集合框架系列教程三:Collection介面Java框架
- [譯]構建現代Web應用的安全指南Web
- java編譯環境的構建(轉)Java編譯
- 基於以太坊構建私有區塊鏈網路教程指南區塊鏈
- 使用lmbench測試linux效能-編譯Linux編譯
- [iOS單元測試系列]單元測試編碼規範iOS
- 前端測試套件構建實踐前端套件
- 《軟體測試基本功》系列教程
- webpack4 系列教程(二): 編譯 ES6Web編譯
- Android Apk反編譯系列教程(三)Android Studio除錯smali程式碼AndroidAPK編譯除錯
- go 交叉編譯,部署Go編譯
- [譯] 什麼是以太坊?以太坊初學者手把手教程
- objc系列譯文(2.5):測試併發程式OBJ
- maven編譯時如何忽略單元測試Maven編譯