參考: https://yq.aliyun.com/articles/212944#2
目標(biāo)
1. 了解智能合約
2. 簡(jiǎn)單環(huán)境搭建
3. 能夠利用solidity編寫Hello World合約
4. 合約部署
5. 與合約互動(dòng)
開發(fā)前的準(zhǔn)備
truffle:最活躍的智能合約開發(fā)框架奸例。
就像一般網(wǎng)站或App開發(fā)一樣,在提供公開服務(wù)之前向楼,開發(fā)者會(huì)在自己用于寫程序的電腦(又稱作本機(jī))或透過測(cè)試網(wǎng)絡(luò)來測(cè)試程序執(zhí)行的效果查吊,測(cè)試完成后谐区,才會(huì)部署到公開的網(wǎng)絡(luò)上提供服務(wù)。
開發(fā)區(qū)塊鏈智能合約(程序)的過程也是如此菩貌。特別是公開鏈上所有寫入或讀取計(jì)算結(jié)果的操作都需要真金白銀(虛擬代幣)卢佣,而且根據(jù)網(wǎng)絡(luò)狀況,每個(gè)公開鏈上的操作都需要要一小段反應(yīng)時(shí)間(15秒~數(shù)分鐘)箭阶,這些等待頗浪費(fèi)寶貴的開發(fā)時(shí)間?虚茶。
因此在開發(fā)的過程中,我們將使用testrpc工具在電腦上模擬智能合約所需的以太坊內(nèi)存塊鏈測(cè)試環(huán)境仇参。
testrpc中也包含了Javascript版本的Ethereum虛擬機(jī)(Ethereum Virtual Machine)嘹叫,因此可以完整地執(zhí)行智能合約。
安裝所需工具
首先開發(fā)機(jī)上必須裝好Node.js诈乒,再使用以下命令安裝所需的工具:
$ npm install -g ethereumjs-testrpc truffle
啟動(dòng)Testrpc
安裝好后隨時(shí)可以使用testrpc命令來啟動(dòng)以太坊測(cè)試環(huán)境罩扇。
testrpc啟動(dòng)后自動(dòng)建立了10個(gè)帳號(hào)(Accounts),與每個(gè)帳號(hào)對(duì)應(yīng)的私鑰(Private Key)怕磨。每個(gè)帳號(hào)中都有100個(gè)測(cè)試用的以太幣(Ether)喂饥。
建立項(xiàng)目
開啟另一個(gè)終端窗口,輸入以下命令以建立項(xiàng)目:
richard@Rich:~/eth/SmartContractDemo$ ls
HelloWorld
richard@Rich:~/eth/SmartContractDemo$ cd HelloWorld/
richard@Rich:~/eth/SmartContractDemo/HelloWorld$ truffle init (第一條命令)
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!
Commands:
? Compile:? ? ? ? truffle compile
? Migrate:? ? ? ? truffle migrate
? Test contracts: truffle test
richard@Rich:~/eth/SmartContractDemo/HelloWorld$ ls
contracts? migrations? test? truffle-config.js? truffle.js
richard@Rich:~/eth/SmartContractDemo/HelloWorld$
目錄結(jié)構(gòu)
/contracts:存放智能合約原始代碼的地方肠鲫,可以看到里面已經(jīng)有三個(gè)sol文件员帮,我們開發(fā)的HelloWorld.sol文件就存放在這里。
/migrations:這是Truffle用來部署智能合約的功能导饲,待會(huì)兒我們會(huì)修改2_deploy_contracts.js來部署HelloWorld.sol捞高。
/test: 測(cè)試智能合約的代碼放在這里,支持js與sol測(cè)試渣锦。
truffle.js:Truffle的設(shè)置文檔硝岗。
編譯
現(xiàn)在執(zhí)行truffle compile(第二條命令)命令,我們可以將HelloWorld.sol原始碼編譯成Ethereum bytecode
部署
truffle框架中提供了方便部署合約的腳本袋毙。打開migrations/2_deploy_contracts.js文件(腳本使用Javascript編寫)型檀,將內(nèi)容修改如下:
varHelloWorld = artifacts.require("HelloWorld");
module.exports =function(deployer){?
??? deployer.deploy(HelloWorld);
};
用artifacts.require語句來取得準(zhǔn)備部署的合約。使用deployer.deploy語句將合約部署到區(qū)塊鏈上听盖。
這邊HelloWorld是contract的名稱而不是文件名胀溺。
因此可以用此語法讀入任一.sol文件中的任一合約。
現(xiàn)在執(zhí)行truffle migrate(第三條命令)命令:
小插曲:
在使用truffle migrate進(jìn)行智能合約test環(huán)境發(fā)布時(shí)如果未配置正確會(huì)出現(xiàn)以下異常:
導(dǎo)致上面異常的原因?yàn)槭且驗(yàn)閠ruffle.js里面未配置鏈接合約發(fā)布的環(huán)境地址媳溺,找到對(duì)應(yīng)的truffle.js文件,修改代碼為類似如下配置即可解決問題:
修改后碍讯,繼續(xù)運(yùn)行
合約已經(jīng)部署到testrpc中悬蔽。切換到testrpc窗口,可以看到testrpc有反應(yīng)了捉兴。
與合約互動(dòng)
truffle提供命令行工具蝎困,執(zhí)行truffle console命令后录语,可用Javascript來和部署的合約互動(dòng)。
HelloWorld.deployed().then(instance => contract = instance)
truffle console中預(yù)載了truffle-contract函數(shù)庫(kù)禾乘,以方便操作部署到區(qū)塊鏈上的合約澎埠。
這邊使用HelloWorld.deployed().then語句來取得HelloWorld合約的Instance(實(shí)例),并存到contract變量中始藕,以方便后續(xù)的調(diào)用
contract.sayHello.call()
truffle-contract提供使用call()來讀取只讀(read only)的數(shù)據(jù)蒲稳,這樣就不需提供gas。因此如果遇到的操作需要向區(qū)塊鏈寫入數(shù)據(jù)伍派,我們就不能用call語句了江耀。
如此一來,我們已寫好并部署完成了第一個(gè)智能合約诉植,也驗(yàn)證了合約確實(shí)可以運(yùn)作祥国。