您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何編譯部署測(cè)試TNS代幣”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“如何編譯部署測(cè)試TNS代幣”文章能幫助大家解決問(wèn)題。
此時(shí)我們有一個(gè)包含一些Solidity代碼的文件。但為了使以太坊虛擬機(jī)能夠理解它,我們需要將其轉(zhuǎn)化為機(jī)器代碼。另外,為了從Web應(yīng)用程序與它進(jìn)行通信,我們需要一個(gè)ABI(應(yīng)用程序二進(jìn)制接口),它是對(duì)某個(gè)智能合約中存在的函數(shù)的通用可讀描述——無(wú)論是代幣還是更復(fù)雜的東西。我們可以使用Truffle的編譯器立即為EVM和ABI創(chuàng)建機(jī)器代碼。
在項(xiàng)目文件夾中,運(yùn)行:
truffle compile
此命令將查看contracts
子文件夾內(nèi)部,將它們?nèi)烤幾g并將其編譯后的版本放入build
子文件夾中。請(qǐng)注意,如果你使用了上一部分的替代開(kāi)發(fā)流程,那么我們的TNSToken合約繼承功能的所有父合約也將在其自己的文件中逐個(gè)編譯。
隨意檢查生成的JSON文件的內(nèi)容。我們的TNSToken應(yīng)該有超過(guò)10000行的JSON代碼。
現(xiàn)在讓我們看看是否可以將它部署到我們的仿真模擬器Ganache區(qū)塊鏈中。如果Ganache尚未在終端的選項(xiàng)卡中或操作系統(tǒng)的應(yīng)用程序中運(yùn)行,請(qǐng)運(yùn)行以下命令:
ganache-cli
或運(yùn)行應(yīng)用程序以獲得這樣的屏幕:
然后,回到我們剛剛編譯合約的文件夾中,我們必須添加一個(gè)migration遷移。創(chuàng)建文件migrations/2_deploy_tnstoken.js
。如果你不熟悉Truffle生態(tài)系統(tǒng)中的遷移,請(qǐng)參閱本指南。
我們將以下內(nèi)容放入該文件中:
var Migrations = artifacts.require("./Migrations.sol"); var TNSToken = artifacts.require("./TNSToken.sol"); module.exports = function(deployer, network, accounts) { deployer.deploy(TNSToken, {from: accounts[0]}); };
首先,通過(guò)請(qǐng)求Migrations.sol
進(jìn)行完整的導(dǎo)入。每次遷移都需要這樣做。接下來(lái),部署代幣意味著我們需要導(dǎo)入其Solidity代碼,我們通過(guò)TNSToken.sol
(我們?cè)谇耙徊糠种芯帉?xiě)的代碼)來(lái)完成此操作。最后,只是遷移function(deployer, network, accounts) {and the last}
之間改變的部分。
在這種情況下,我們告訴部署者部署TNSToken并傳入from
參數(shù)以設(shè)置初始代幣持有者。這里使用的地址是由Ganache生成的隨機(jī)地址,但是通過(guò)使用自動(dòng)發(fā)送給部署者的accounts
數(shù)組,我們確??梢栽L問(wèn)運(yùn)行節(jié)點(diǎn)中存在的帳戶列表(無(wú)論是實(shí)時(shí)Geth節(jié)點(diǎn)還是Ganache)。在我的特定示例中,account[0]
地址為0xdFb659D556d926dd3585d0f18d4F8eD7939E8061
,在上面的屏幕截圖中也很明顯。
我們也不要忘記在truffle.js
配置開(kāi)發(fā)環(huán)境:
module.exports = { networks: { development: { host: "127.0.0.1", port: 7545, network_id: "*" } } };
注意:照顧端口和IP; 你的可能會(huì)有所不同!
最后,在項(xiàng)目文件夾中,運(yùn)行truffle migrate
。你應(yīng)該看到這樣的東西:
注意TNStoken旁邊的以太坊地址:0x3134bcded93e810e1025ee814e87eff252cff422
。這是我們的代幣部署的地方。現(xiàn)在讓我們看看它的實(shí)際效果。
在這種情況下,不需要自動(dòng)測(cè)試。代幣合約是高度標(biāo)準(zhǔn)化和戰(zhàn)斗測(cè)試。如果我們使用的某些功能超出了傳統(tǒng)代幣的范圍,那么自動(dòng)化測(cè)試就會(huì)派上用場(chǎng)。但是,通過(guò)將它發(fā)送到地址和從地址發(fā)送來(lái)測(cè)試它已經(jīng)足夠了。
打開(kāi)像MyEtherWallet這樣的錢包UI,在右上角的菜單中選擇一個(gè)自定義網(wǎng)絡(luò)。在對(duì)話框中,輸入你的私有區(qū)塊鏈給你的信息——Ganache或?qū)嶋H的PoA區(qū)塊鏈,根據(jù)本教程系列的第1部分,你可以運(yùn)行的任何一個(gè)。在我的例子中,地址為127.0.0.1
,端口為7545
。
打開(kāi)你在部署腳本中設(shè)置為from
值的錢包。如果你正在使用Ganache,你會(huì)看到它的私鑰打印在Ganache UI的屏幕上或終端的ganache輸出中。
最后,需要告知MEW該代幣存在。我們通過(guò)添加自定義代幣來(lái)完成此操作。
添加代幣后,你會(huì)立即注意到該帳戶現(xiàn)在有1億的余額,并且能夠在貨幣下拉選擇菜單中發(fā)送它們。我們?cè)囍鴮⒁恍┌l(fā)送到另一個(gè)地址。
繼續(xù)發(fā)送,然后再將原始帳戶恢復(fù)到1億。我們剛剛確保代幣的基本功能按預(yù)期工作。
如果不將其部署在實(shí)時(shí)網(wǎng)絡(luò)上,這將不是真正的代幣測(cè)試。但是,我們不要使用主網(wǎng)絡(luò),而是像Rinkeby這樣的測(cè)試網(wǎng)。
在truffle.js
,讓我們添加一個(gè)新的網(wǎng)絡(luò)rinkeby
,這樣我們的文件看起來(lái)像這樣:
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", }, } };
哎呀!這都是什么?
讓我們逐行梳理它。
前幾行導(dǎo)入一些節(jié)點(diǎn)模塊,因此我們可以使用下面的函數(shù)。如果你得到任何一個(gè)缺少的模塊消息,只需運(yùn)行npm install web3-wallet-provider truffle-wallet-provider web3 dotenv --save
應(yīng)該可以解決問(wèn)題。
接下來(lái),我們從根目錄中的.env
文件中加載我們正在運(yùn)行合約錢包的私鑰(所以錢包將獲得1億個(gè)代幣;我們不能在這里使用from
值)項(xiàng)目文件夾。如果它不存在,請(qǐng)創(chuàng)建它。該文件還有一個(gè)Infura.io
訪問(wèn)密鑰,這是一個(gè)托管以太坊節(jié)點(diǎn)并允許應(yīng)用程序連接到它們的網(wǎng)站,因此開(kāi)發(fā)人員無(wú)需在其計(jì)算機(jī)上運(yùn)行完整的以太坊節(jié)點(diǎn)。
.env
文件默認(rèn)是隱藏的,可以在.gitignore
忽略,這樣就不會(huì)有私鑰泄漏的危險(xiǎn)——這是一個(gè)非常重要的預(yù)防措施!這是文件包含的內(nèi)容:
PRIVKEY="YOUR_PRIVATE_KEY"; INFURAKEY="YOUR_INFURA_ACCESS_KEY";
你可以在此處注冊(cè)獲取Infura密鑰。如果你只是安裝Metamask,將其切換到Rinkeby,然后轉(zhuǎn)到導(dǎo)出私鑰,則可以輕松獲取私鑰。但是,任何方法都可行,所以選擇你喜歡的任何方法。你也可以使用Ganache的私鑰。一個(gè)私鑰可以在所有以太坊網(wǎng)絡(luò)上解鎖相同的錢包——testnet
,rinkeby
,mainnet
,你可以命名它。
回到我們的配置文件。我們有一個(gè)新的network
入口:rinkeby。這是我們將要部署的以太坊測(cè)試網(wǎng)的名稱,提供商內(nèi)部的代碼基本上是千篇一律的復(fù)制粘貼,告訴Truffle“抓住我的私鑰,對(duì)其進(jìn)行十六進(jìn)制編碼,使其成為一個(gè)未鎖定的錢包,然后再通過(guò)它來(lái)和Infura交互“。
最后,我們定義了我們希望在執(zhí)行此合約時(shí)要花費(fèi)的gas限制(460萬(wàn)就夠了,如果需要可以更改),gas需要多少(50 Gwei實(shí)際上相當(dāng)昂貴,但我們正在玩的以太網(wǎng)是模擬的,所以沒(méi)關(guān)系),并且將網(wǎng)絡(luò)ID設(shè)置為4,因?yàn)檫@是Rinkeby testnet的標(biāo)簽。
還有一件事我們需要做。我們之前寫(xiě)的遷移文件是針對(duì)起始地址,但Rinkeby的地址不同。這是否意味著我們需要根據(jù)網(wǎng)絡(luò)更改部署腳本?當(dāng)然不是!讓我們將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); } };
正如你所看到的,部署腳本是簡(jiǎn)單的JavaScript,并且為部署者提供的第二個(gè)參數(shù)始終是網(wǎng)絡(luò)的名稱——我們可以使用它來(lái)區(qū)分它們。
如果我們現(xiàn)在嘗試使用truffle migrate --network rinkeby
運(yùn)行遷移,如果我們使用的地址是新的,它將失敗:
這是因?yàn)樵摰刂吩诓渴鸷霞s時(shí)無(wú)需花費(fèi)以太。但這很容易解決。只需前往Rinkeby Faucet免費(fèi)獲取一些。
現(xiàn)在重新運(yùn)行遷移,代幣合約將在Rinkeby網(wǎng)絡(luò)上實(shí)時(shí)部署。它可以像上面的Ganache用例一樣進(jìn)行測(cè)試。一切都應(yīng)該完全一樣,只有現(xiàn)在你也可以和你的朋友和同事一起測(cè)試。很有進(jìn)展!
對(duì)于額外的信任點(diǎn),建議你在Etherscan上驗(yàn)證代幣并為其注冊(cè)ENS域。
驗(yàn)證意味著將代幣的源代碼提交給Etherscan,以便將其與網(wǎng)絡(luò)上部署的內(nèi)容進(jìn)行比較,從而將其驗(yàn)證為無(wú)后門。這是在代幣地址的“代碼”選項(xiàng)卡上完成的。由于我們的代幣使用了一些第三方代碼,并且無(wú)法輕松將這些代碼拉入驗(yàn)證屏幕的代碼窗口,因此我們需要修改合約。為此,我們將使用一個(gè)名為truffle-flattener
的工具:
npm install --global truffle-flattener
該工具將所有依賴項(xiàng)和代幣的源代碼復(fù)制到一個(gè)文件中。我們可以像這樣運(yùn)行它:
truffle-flattener contracts/TNSToken.sol >> ./contracts/TNSTokenFlat.sol
現(xiàn)在,contracts
文件夾中應(yīng)該存在一個(gè)新文件,幾乎與我們的源代碼相同,但粘貼了依賴代碼(例如,SafeMath.sol
將粘貼在文件的頂部)。
將該新文件的內(nèi)容粘貼到Verify
屏幕的代碼窗口中,將編譯器設(shè)置為通過(guò)運(yùn)行truffle version
獲得的truffle版本,并將Optimization
設(shè)置為No
。單擊“驗(yàn)證并發(fā)布”,一旦該過(guò)程完成,你的代幣的地址屏幕將顯示新選項(xiàng)卡:“讀取合約”和“寫(xiě)入合約”,“ 代碼”選項(xiàng)卡將具有綠色復(fù)選標(biāo)記,表示代碼已經(jīng)過(guò)驗(yàn)證。這為社區(qū)提供了額外的信任點(diǎn)。
ENS是以太坊名稱系統(tǒng)。它用于為以太坊提供人類可讀的名稱,因此你不必記住0xmumbojumbo
字符串,而是可以記住像bitfalls.eth
這樣的。然后,你甚至可以注冊(cè)像token.bitfalls.eth
這樣的子域名。注冊(cè)ENS域的過(guò)程并不簡(jiǎn)單,需要時(shí)間,因此如果你愿意這樣做,我建議你閱讀本指南并按照此處的說(shuō)明進(jìn)行操作。
關(guān)于“如何編譯部署測(cè)試TNS代幣”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。