如何使用Truffle部署智能合約
本文轉(zhuǎn)載自微信公眾號(hào)「區(qū)塊鏈研究實(shí)驗(yàn)室」,作者鏈三豐。轉(zhuǎn)載本文請(qǐng)聯(lián)系區(qū)塊鏈研究實(shí)驗(yàn)室公眾號(hào)。
Truffle是一個(gè)開(kāi)發(fā)環(huán)境(提供用于編譯,部署,測(cè)試和構(gòu)建的命令行工具),框架(提供各種程序包以使其易于編寫測(cè)試,部署代碼,構(gòu)建客戶端等)和資產(chǎn)管道(發(fā)布軟件包并使用其他人發(fā)布的軟件包來(lái)構(gòu)建基于以太坊的DApp。
使用Truffle,您可以獲得:
- 內(nèi)置的智能合約編譯,鏈接,部署和二進(jìn)制管理。
- 與Mocha和Chai進(jìn)行自動(dòng)化合同測(cè)試。
- 可配置的構(gòu)建管道,支持自定義構(gòu)建過(guò)程。
- 可編寫腳本的部署和遷移框架。
- 網(wǎng)絡(luò)管理,用于部署到許多公共和專用網(wǎng)絡(luò)。
- 用于直接合同通信的交互式控制臺(tái)。
- 在開(kāi)發(fā)過(guò)程中立即重建資產(chǎn)。
- 外部腳本運(yùn)行程序,在Truffle環(huán)境中執(zhí)行腳本。
要使用大多數(shù)Truffle命令,您需要在現(xiàn)有的Truffle項(xiàng)目上運(yùn)行它們。因此,第一步是創(chuàng)建一個(gè)Truffle項(xiàng)目,讓我們從安裝Truffle開(kāi)始:
- $ npm install -g truffle
確保已安裝:
- $ truffle
- Truffle v3.2.1 - a development framework for Ethereum
- Usage: truffle [options]
- Commands:
- init Initialize new Ethereum project with example contracts and tests
- ...
然后創(chuàng)建項(xiàng)目:
- $ mkdir storage_smart_contract_example
- $ cd storage_smart_contract_example
- $ truffle init
在這里,您可以運(yùn)行Truffle編譯,Truffle遷移和Truffle測(cè)試來(lái)編譯您的合同,將這些合同部署到網(wǎng)絡(luò)中,并運(yùn)行其關(guān)聯(lián)的單元測(cè)試。
Truffle與本地開(kāi)發(fā)區(qū)塊鏈服務(wù)器捆綁在一起,當(dāng)您調(diào)用上述命令時(shí),該服務(wù)器會(huì)自動(dòng)啟動(dòng)。如果您想配置更高級(jí)的開(kāi)發(fā)環(huán)境,我們建議您通過(guò)在命令行上運(yùn)行npm install -g ganache-cli來(lái)單獨(dú)安裝區(qū)塊鏈服務(wù)器。
ganache-cli:Truffle的區(qū)塊鏈服務(wù)器的命令行版本。
ganache:服務(wù)器的GUI,顯示您的交易歷史記錄和鏈狀態(tài)。
Truffle項(xiàng)目的結(jié)構(gòu)
您創(chuàng)建的Truffle文件夾如下所示:
1.合同
- ConvertLib.sol
- MetaCoin.sol
- Migrations.so
2.遷移
- 1_initial_migration.js
- 2_deploy_contracts.js
3.測(cè)試
- TestMetacoin.sol
- metacoin.js
4. truffle-config.js
5. truffle.js
現(xiàn)在進(jìn)一步編寫代碼,您將看到Truffle為我們創(chuàng)建了文件結(jié)構(gòu)。轉(zhuǎn)到合同文件夾并創(chuàng)建Storage.sol文件,然后在其中寫入智能合同的代碼。
- pragma solidity ^0.4.8;
- contract Storage {
- uint256 storedData;
- function set(uint256 data) {
- storedData = data;
- }
- function get() constant returns (uint256) {
- return storedData;
- }
- }
現(xiàn)在轉(zhuǎn)到migrations / 2_deploy_contracts.js并將其修改為如下所示:
- var Storage = artifacts.require("./Storage.sol");
- module.exports = function(deployer) {
- deployer.deploy(Storage);
- };
現(xiàn)在我們已經(jīng)有了基本的設(shè)置,我們需要將其部署到區(qū)塊鏈上,讓我們使用testrpc可以很好地完成測(cè)試開(kāi)發(fā)目的,在一個(gè)單獨(dú)的選項(xiàng)卡上,鍵入以下命令:
- $ npm install -g ethereumjs-testrpc
- $ testrpc
- EthereumJS TestRPC v3.0.3
- Available Accounts
- ==================
- …
然后返回運(yùn)行Truffle項(xiàng)目的選項(xiàng)卡:
- $ truffle compile
- $ truffle migrate
這樣我們就完成了合同的部署,讓我們檢查一下我們是否能夠調(diào)用合同功能。
- $ truffle console
- truffle(development)>
- Storage.deployed().then(instance => instance.get.call()).then(result => storeData = result)
- { [String: '0'] s: 1, e: 0, c: [ 0 ] }
- truffle(development)> storeData.toString()
- '0'
現(xiàn)在讓我們看看是否可以將storeData設(shè)置為值99。
- truffle(development)>
- Storage.deployed().then(instance => instance.set.sendTransaction(99)).then(result => newStorageData = result) '0xc5e2f9c9da4cf9f563c8e59073d5b6ca9458f112a6dcfc14aaea7c16a99422d4'
- truffle(development)> Storage.deployed().then(instance => instance.get.call()).then(result => storeData = result)
- { [String: '99'] s: 1, e: 1, c: [ 99 ] }
- truffle(development)> storeData.toString() '99'
目前為止,我們已經(jīng)成功的部署和測(cè)試了Truffle項(xiàng)目合同,如有任何疑問(wèn)請(qǐng)?jiān)诹粞詤^(qū)進(jìn)行留言。