原文地址: 石匠的bloggit
爲了測試以太坊智能合約,最方便的是在本地搭建一個以太坊私有鏈。在mac上搭建環境主要須要如下步驟。github
geth是go-ethereum的簡寫,是一個用go語言編寫的以太坊客戶端,是在以太坊智能合約開發中最經常使用的命令行工具。
在mac上能夠經過brew工具直接安裝:web
brew tap ethereum/ethereum brew install ethereum
詳細的安裝說明也能夠查看官方文檔。json
安裝完成後,能夠再mac的terminal中,用如下命令測試工具是否正常:api
geth -h
爲了建立一個本身測試的私有鏈,須要首先建立一個創世區塊,能夠自定義創世區塊信息信息genesis.json:安全
{ "config": { "chainId": 10, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "alloc": {}, "coinbase": "0x0000000000000000000000000000000000000000", "difficulty": "0x20000", "extraData": "", "gasLimit": "0x2fefd8", "nonce": "0x0000000000000042", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp": "0x00" }
區塊參數釋義:網絡
chainId: 指定了獨立的區塊鏈網絡ID。網絡ID在鏈接到其餘節點的時候會用到,以太坊公網的網絡ID是 1,爲了避免與公有鏈網絡衝突,運行私有鏈節點的時候要指定本身的網絡ID。不一樣ID網絡的節點沒法相互鏈接。 HomesteadBlock: 當設置爲0表示使用Homestead發佈該鏈。 nonce: 一個64位隨機數,用於挖礦,注意它和mixhash的設置須要知足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件。 mixhash: 與nonce配合用於挖礦,由上一個區塊的一部分生成的hash。注意它和nonce的設置須要知足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章節所描述的條件。 difficulty: 設置設置當前區塊的難度,值越大挖礦就越難。 alloc: 用來預置帳號以及帳號的以太幣數量。 coinbase: 礦工帳號 timestamp: 設置創世塊的時間戳 parentHash: 上一個區塊的hash,創世塊就爲0 extraData: 附加信息,本身能夠填寫任意信息 gasLimit: 該值設置對GAS的消耗總量限制,用來限制區塊能包含的交易信息總和
找一個合適的目錄,執行命令,建立創世區塊:cors
geth --datadir "./" init genesis.json
運行成功後會在當前目錄建立geth和keystore兩個文件夾dom
前面創建創世區塊成功後,啓動區塊鏈程序:ide
geth --datadir "./" --nodiscover console 2>>geth.log
相關參數:
--nodiscover 使用這個參數,你的節點就不會被其餘人發現,除非手動添加你的節點。不然,就只有一個被無心添加到一個陌生區塊鏈上的機會,那就是跟你有相同的genesis文件和networkID。 --maxpeers 0 若是你不想有人連上你的測試鏈,就用maxpeers 0。或者,你能夠調整參數,當你確切的知道有幾個節點要鏈接上來的時候。 --rpc 容許RPC操做你的節點。這個參數在Geth上是默認的。 --rpcapi "db,eth,net,web3" 這個命令指示了容許經過RPC訪問的命令。默認狀況下,Geth容許web3。 --rpcport "8080" --rpccorsdomain "http://chriseth.github.io/browser-solidity/" --datadir "/home/TestChain1" 私有鏈存放路徑(最好跟公有鏈路徑不一樣) --port "30303" 網絡監聽端口,用來和其餘節點手動鏈接 --identity 「TestnetMainNode" 用來標識你的節點的,方便在一大羣節點中識別出本身的節點
console指定了啓動成功後進入命令行界面,2>>將日誌重定向到geth.log中,否則日誌也會輸出到界面上,會和命令行界面混在一塊兒,不方便命令行測試。
在命令行中建立帳號:
>personal.newAccount()
而後會提示輸入帳號密碼,成功後會返回一個帳號地址,好比:0xc7ca64442b98cbfdb6f056841ccd40f8b7f054bb
也能夠經過給newAccount傳遞密碼做爲參數,一次性完成建立:
>personal.newAccount("123456")
查看帳戶的餘額:
>eth.getBalance("0xc7ca64442b98cbfdb6f056841ccd40f8b7f054bb")
開始挖礦:
>miner.start()
開始後,能夠tailf geth.log看看挖礦初始化是否成功,以及挖礦過程細節。
中止挖坑:
>miner.stop()
將一個帳戶的代幣轉移到另一個帳戶,須要經過事務接口完成 eth.sendTransaction({from: acc0, to: acc1, value: amount}),好比:
>eth.sendTransaction({from: "0x01b5ecbcd8d46c1a9ee52e8b8a30bb6426dffb1b", to: "0xe6e4e20c95abc11dca8b3e9c292a34725bf89930", value: 20})
轉出的帳戶須要密碼解鎖,否則會發生相似如下錯誤:
Error: authentication needed: password or unlock at web3.js:3143:20 at web3.js:6347:15 at web3.js:5081:36 at <anonymous>:1:1
很好理解,若是轉出別人帳戶的代幣,不須要密碼驗證,那就毫無安全可言了,能夠經過如下方式,解鎖帳戶後繼續轉帳:
>personal.unlockAccount("0xab04698365ed79ef22921edad8f6f516ca40cecb")
轉帳完成後,能夠經過eth.getBalance()查看餘額,可是立刻查詢卻發現並無變化,這是由於sendTransaction這是發起了一筆交易事務,尚未獲得確認,只是將這個事務放到了待提交池中。區塊鏈的機制中是新建立區塊的時候,會就從事務池中找出全部事務,進行有效性驗證,驗證成功後進行挖礦並將全部相關事務打包到區塊中,待新的去區塊成功加入到區塊鏈中後,以前的轉帳就獲得了最終的確認和永久固話。
因此,sendTransaction成功後,須要調用挖礦命令miner.start()建立區塊,而後再查看餘額會發現轉帳金額變化已經生效。