如下內容全是都是創建在MacOS X平臺上,在正式開始此以前,但願你對BlockChain的內容有所瞭解,對truffle,contract,Solidity,web3.js等概念有所認識,假如毫無概念,那麼請嚴格按照如下步驟順序操做html
Truffle安裝教程node
安裝truffle以前確保你已經安裝了Nodejs環境,推薦NodeJS 5.0+。新建終端,執行:git
$ npm install -g truffle
github
Ethereum安裝教程web
安裝以前確保你安裝了Homebrewnpm
新建終端,執行:json
brew tap ethereum/ethereum brew install ethereum
新建文件夾,命名爲 truffleProject
,而後新建一個終端,咱們將其命名爲終端1,從終端1進入此文件夾下,執行:api
truffle init
網絡
此時 truffleProject
文件夾下會出現 contracts
migrations
test
三個文件夾和 truffle.js
文件cors
contracts
就是智能合約存放的目錄,默認狀況下已經幫你建立好 ConvertLib.sol
MetaCoin.sol
Migrations.sol
合約,不用管它
在 contracts
文件夾下建立一個新文件 Test.sol
,文件內容以下:
pragma solidity ^0.4.4; contract Test { function multiply(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的設置可參見: https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options
新建一個終端,咱們稱爲終端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
是解鎖時間。
切換到終端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合約部署在我創建的私有鏈上。如今終於解決這個問題,下一步就是研究如何與合約進行通訊。