以下內容全是都是建立在MacOS X平臺上,在正式開始此之前,希望你對BlockChain的內容有所瞭解,對truffle,contract,Solidity,web3.js等概念有所認識,假如毫無概念,那麼請嚴格按照以下步驟順序操作
準備工作
Truffle 3.X安裝
Truffle安裝教程
安裝truffle之前確保你已經安裝了Nodejs環境,推薦NodeJS 5.0+。新建終端,執行:
$ npm install -g truffle
Ethereum安裝
Ethereum安裝教程
安裝之前確保你安裝了Homebrew
新建終端,執行:
brew tap ethereum/ethereum
brew install ethereum複製程式碼
建立節點和賬戶
正式開始
新建專案
新建資料夾,命名為truffleProject
,然後新建一個終端,我們將其命名為終端1,從終端1進入此資料夾下,執行:
truffle init
此時truffleProject
資料夾下會出現contracts
migrations
test
三個資料夾和truffle.js
檔案
編寫合約
contracts
就是智慧合約存放的目錄,預設情況下已經幫你建立好ConvertLib.sol
MetaCoin.sol
Migrations.sol
合約,不用管它
在contracts
資料夾下建立一個新檔案Test.sol
,檔案內容如下:
pragma solidity ^0.4.4;
contract Test {
functionmultiply(uint a) returns(uint d) {
return a * 7;
}
}複製程式碼
合約內容很簡單,就是輸入一個整數,返回它乘以7的結果
修改配置
修改migrateions
檔案中2_deploy_contracts.js
的內容,如下:
var Test = artifacts.require("./Test.sol");
module.exports = function(deployer) {
deployer.deploy(Test);
};複製程式碼
修改truffle.js
的檔案內容如下:
module.exports = {
networks: {
live: {
host: "localhost", //本地地址,因為是在本機上建立的節點
port: 8545, //Ethereum的rpc監聽的埠號,預設是8545
network_id: 999// 自定義網路號
}
}
};複製程式碼
我們把合約部署在自己的私有網路上,所以自定義網路號。解釋一下,Ethereum本身有一個主網路,假如你的節點沒有連線到這個網路上去,那意味著你建立的是私有的Ethereum網路。network_id的設定可參見:github.com/ethereum/go…
啟動節點
新建一個終端,我們稱為終端2,輸入:
geth --identity "newEth" --rpc --rpccorsdomain "*" --datadir "你的節點的path" --port 30303 --rpcapi "db,eth,net,web3" --networkid 999 console
把上面命令中的“你的節點的path”
替換成你自己建立的節點的目錄,例如“/Users/JerryMissTom/Documents/blockchain/node1”
。注意,network-id
後的內容999
和你上面在truffle.js
檔案中設定的保持一致
解鎖賬戶:
部署之前必須先解鎖賬戶,不然會報錯Error encountered, bailing. Network state unknown. Review successful transactions manually.
在終端2上輸入如下命令來解鎖賬戶:
personal.unlockAccount("0x4c00224faec439c08abe669bd2b15e3530a6e754", "111111", 10000)
其中"0x4c00224faec439c08abe669bd2b15e3530a6e754"
是賬戶地址,需要替換成你的,假如不知道,可先在終端2上輸入:
personal.listAccounts
會返回你當前所有的賬戶,選擇第一個就好,假如不存在,則新建賬戶,見準備工作中的建立節點和賬戶
的內容。"111111"
是賬戶相對應的密碼,10000
是解鎖時間。
部署合約之前要保證你的賬戶裡有餘額,使用eth.getBalance("0x4c00224faec439c08abe669bd2b15e3530a6e754")
檢視餘額,假如為0,則先執行miner.start()
進行挖礦,等待一段時間執行miner.stop()
,挖礦停止,繼續查詢餘額,不為0,可進行下一步。
部署合約
切換到終端1,編譯合約,輸入:
truffle compile
此時truffleProject
資料夾下會多出一個build
資料夾
然後部署合約,輸入:
truffle migrate --network live
沒有錯誤的話,終端1上會出現:
Running migration: 1_initial_migration.js
Deploying Migrations...複製程式碼
geth的控制檯,也就是終端2上,會出現:
I0421 10:29:58.671910 internal/ethapi/api.go:1141] Tx(0x66643d8dd37a4d8c8b13ad6aa933cb069fb30eae5e3a6e1b4309496d34b9c17a) created: 0x8b6deb996f11d9d463d5db3d2bd4de9193c1a14f複製程式碼
合約正在部署,在終端2上輸入:txpool.status
結果是
{
pending: 1,
queued: 0
}複製程式碼
表明有一個交易在等待確認,需要繼續挖礦,把交易打包到下一個區塊,在終端2上繼續執行:miner.start()
現在等待一段時間,成功部署後,會在終端1上出現:
Running migration: 1_initial_migration.js
Deploying Migrations...
Migrations: 0x8b6deb996f11d9d463d5db3d2bd4de9193c1a14f
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying Test...
Test: 0x98cd084074fe3f15890c55822070ac8274d8f7f6
Saving successful migration to network...
Saving artifacts...複製程式碼
表明部署成功
在終端2上執行:miner.stop()
,停止挖礦
呼叫合約
開啟truffleProject/build/contracts/Test.json
檔案,內容如下:
{
"contract_name": "Test",
"abi": [
{
"constant": false,
"inputs": [
{
"name": "a",
"type": "uint256"
}
],
"name": "multiply",
"outputs": [
{
"name": "d",
"type": "uint256"
}
],
"payable": false,
"type": "function"
}
],
"unlinked_binary": "0x6060604052346000575b6077806100176000396000f300606060405263ffffffff60e060020a600035041663c6888fa181146022575b6000565b34600057602f6004356041565b60408051918252519081900360200190f35b600781025b9190505600a165627a7a72305820cf7ecb7716fc2496cf81a1249a8d74354554a193016fbeb30b18f473a6b989090029",
"networks": {
"999": {
"events": {},
"links": {},
"address": "0x98cd084074fe3f15890c55822070ac8274d8f7f6",
"updated_at": 1492742008225
}
},
"schema_version": "0.0.5",
"updated_at": 1492742008225
}複製程式碼
把abi內容拿出來先線上壓縮,然後在終端2中輸入:
abi=[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"type":"function"}]複製程式碼
結果顯示:
[{
constant: false,
inputs: [{
name: "a",
type: "uint256"
}],
name: "multiply",
outputs: [{
name: "d",
type: "uint256"
}],
payable: false,
type: "function"
}]複製程式碼
建立合約的例項,在終端2中繼續輸入:
test=eth.contract(abi).at("0x98cd084074fe3f15890c55822070ac8274d8f7f6")複製程式碼
其中"0x98cd084074fe3f15890c55822070ac8274d8f7f6"
就是合約儲存的地址,可以在truffleProject/build/contracts/Test.json
中找到.
在終端2中輸入:
test.multiply.call(3)
結果會顯示:21
總結
之前我已經知道如何使用Truffle編寫和編譯智慧合約,在TestRPC上執行官方的例子,也知道如何建立Ethereum節點和賬戶,最後卡在如何使用Truffle合約部署在我建立的私有鏈上。現在終於解決這個問題,下一步就是研究如何與合約進行通訊。
致謝
- 透過truffle部署以太坊智慧合約 (這個是Truffle2.X版本)
- 不是假的網站
- BlockChain-在一臺電腦上部署多個節點
- BlockChain --- 賬號間的交易
安利
我在研究BlockChain的過程中,也在著手把Ethereum Frontier Guide翻譯成中文版,已經翻譯一小部分了,由於我對Ethereum的理解還不夠深入,很多地方都是照字面意思翻譯,所以讀起來比較突兀,我會繼續完善。翻譯量還蠻大的,我只能在每天下班後翻譯一點兒,我儘量抽更多的時間吧。GitHub地址如下,歡迎Fork或者PR。
github.com/JerryMissTo…