透過本文所述方法和專案中的指令碼,我們可以快速的搭建好自己的私有鏈進行區塊鏈開發測試,本文基於以太坊技術進行搭建,分兩個部分,一個是ubuntu下搭建方法,另一個是windwos下搭建方法,關於以太坊相關的基礎知識,可以看我原先發表的一些文章,地址如下:http://blog.csdn.net/sportshark
一、ubuntu下安裝geth客戶端
之所以採用ubuntu,是因為以太坊的官方對ubuntu支援的很好,是在各個linux系統中安裝最簡單。
geth官方安裝指南:
https://github.com/ethereum/go-ethereum/wiki/building-ethereum
進入ubuntu命令列,執行如下命令
sudo apt-get update
sudo apt-get installsoftware-properties-common
sudo add-apt-repository -yppa:ethereum/ethereum
sudo add-apt-repository -yppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum
系統聯網執行後,即完成了安裝以太坊客戶端,其中包括geth,bootnode, evm, disasm, rlpdump,ethtest
此時如果輸入geth命令,會出現啟動以太坊啟動的畫面
二、安裝windows下geth客戶端
windows必須64位系統,從官方網站下載編譯好的win64客戶端,解壓縮即可執行,下載地址如下:https://github.com/ethereum/go-ethereum/releases/
下載後,只有一個geth.exe的檔案。
安裝影象化客戶端mist,依然是從官方地址下載編譯好的客戶端即可,下載地址:https://github.com/ethereum/mist/releases/
下載解壓縮後,ethereum-wallet即為以太坊圖形化介面。
三、準備創世塊檔案
配置自己的創世塊是為了區分公有鏈,同一個網路中,創世塊必須是一樣的,否則無法聯通,此方法在windows和ubuntu下通用。
新建檔案piccgenesis.json,輸入如下內容並儲存
{
"nonce":"0x0000000000000042",
"mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x4000",
"alloc": {},
"coinbase":"0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parenthash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"extradata": "picc genesisblock",
"gaslimit":"0xffffffff"
}
解釋一下各個引數的作用:
mixhash
與nonce配合用於挖礦,由上一個區塊的一部分生成的hash。注意他和nonce的設定需要滿足以太坊的yellow paper, 4.3.4. block header validity, (44)章節所描述的條件。.
nonce
nonce就是一個64位隨機數,用於挖礦,注意他和mixhash的設定需要滿足以太坊的yellow paper, 4.3.4. block header validity, (44)章節所描述的條件。
difficulty
設定當前區塊的難度,如果難度過大,cpu挖礦就很難,這裡設定較小難度
alloc
用來預置賬號以及賬號的以太幣數量,因為私有鏈挖礦比較容易,所以我們不需要預置有幣的賬號,需要的時候自己建立即可以。
coinbase
礦工的賬號,隨便填
timestamp
設定創世塊的時間戳
parenthash
上一個區塊的hash值,因為是創世塊,所以這個值是0
extradata
附加資訊,隨便填,可以填你的個性資訊
gaslimit
該值設定對gas的消耗總量限制,用來限制區塊能包含的交易資訊總和,因為我們是私有鏈,所以填最大。
四、啟動私有鏈節點
啟動geth即可以啟動以太坊的區塊鏈,為了構建私有鏈 ,需要在geth啟動時加入一些引數,geth引數含義如下:
identity
區塊鏈的標示,隨便填寫,用於標示目前網路的名字
init
指定創世塊檔案的位置,並建立初始塊
datadir
設定當前區塊鏈網路資料存放的位置
port
網路監聽埠
rpc
啟動rpc通訊,可以進行智慧合約的部署和除錯
rpcapi
設定允許連線的rpc的客戶端,一般為db,eth,net,web3
networkid
設定當前區塊鏈的網路id,用於區分不同的網路,是一個數字
console
啟動命令列模式,可以在geth中執行命令
1、在ubuntu啟動區塊鏈節點
在ubuntu下,首先切換到打算執行的目錄,目錄下應該有配置好的piccgenesis.json檔案,執行如下命令
basepath=$(cd `dirname $0`; pwd)
獲取當前的目錄
geth --datadir "$basepath/chain" init piccgenesis.json
建立資料存放地址並初始化創世塊
geth --identity"piccetherum" --rpc --rpccorsdomain "*" --datadir "$basepath/chain" --port "30303" --rpcapi "db,eth,net,web3"--networkid 95518 console
啟動後介面如下,游標停留在最後的命令列上,可以執行以太坊命令。
i0707 00:45:43.680087 ethdb/database.go:82]alloted 128mb cache and 1024 file handles to /home/lihe/桌面/chain/chaindata
i0707 00:45:43.726008ethdb/database.go:169] closed db:/home/lihe/桌面/chain/chaindata
i0707 00:45:43.728913 ethdb/database.go:82]alloted 128mb cache and 1024 file handles to /home/lihe/桌面/chain/chaindata
i0707 00:45:43.908795 ethdb/database.go:82]alloted 16mb cache and 16 file handles to /home/lihe/桌面/chain/dapp
i0707 00:45:43.969506 core/genesis.go:92]genesis block already in chain. writing canonical number
i0707 00:45:43.980337 eth/backend.go:274]successfully wrote custom genesis block:6e92f8b23bcdfdf34dc813cfaf1d84b71beac80530506b5d63a2df10fe23a660
i0707 00:45:43.980618 eth/backend.go:184]protocol versions: [63 62], network id: 95518
i0707 00:45:43.981567core/blockchain.go:204] last header: #81 [6193c4b0…] td=10836704
i0707 00:45:43.981645core/blockchain.go:205] last block: #81 [6193c4b0…] td=10836704
i0707 00:45:43.981677core/blockchain.go:206] fast block: #81 [6193c4b0…] td=10836704
i0707 00:45:43.985253 p2p/server.go:313]starting server
i0707 00:45:45.834488p2p/discover/udp.go:217] listening,enode://134881790e54c803955715e3661c27f91caaf499be813e29c9f986e2eac62d47e02b13a8e51776c1caea554655614ed26ce0185d84e626da7ac48a83a60113ff@[::]:30303
i0707 00:45:45.835853 node/node.go:366]http endpoint opened: http://localhost:8545
i0707 00:45:45.848008 p2p/server.go:556]listening on [::]:30303
i0707 00:45:45.849731 node/node.go:296] ipcendpoint opened: /home/lihe/桌面/chain/geth.ipc
welcome to the geth javascript console!
instance:geth/v1.5.0-unstable/linux/go1.5.1/piccetherum
coinbase:0x93509a2f4b2b974b07ef0b52e07c3992601f5de1
at block: 81 (tue, 05 jul 2016 21:02:25cst)
datadir: /home/lihe/桌面/chain
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
可以看到listening on [::]:30303和welcome to the geth javascript console!的提示,說明已經啟動成功
注意:如果想將ubuntu作為永久區塊鏈節點使用,當使用nohup命令時,geth啟動引數console必須去掉,否則geth會自動停止。
2、在windows啟動區塊鏈節點
進入windows下geth的目錄 ,放置配置好的piccgenesis.json檔案,執行如下命令:
geth --datadir "%cd%\chain" init piccgenesis.json
建立資料存放地址並初始化創世塊
geth--identity "piccetherum" --rpc--rpccorsdomain "*" --datadir "%cd%\chain" --port"30303" --rpcapi"db,eth,net,web3" --networkid 95518 console
當看到listening on [::]:30303和welcome to the geth javascript console!的提示,說明已經啟動成功
五、使用節點建立賬號
啟動節點成功後,會進入geth的命令列模式,輸入如下命令
personal.newaccount()
系統會提示你輸入賬號密碼,並確認,最後會顯示一個新生成的賬號。
六、啟動windows下私有鏈圖形節點
首先按上面的步驟啟動geth並建立了賬號,然後解壓縮ethereum-wallet,執行ethereum-wallet.exe,即啟動成功,如果區塊鏈正常的話,會在右上角顯示“private-net”,點選“launch application”進入圖形介面即可。
七、連線其他節點
首先要知道自己的節點資訊,在geth命令列介面下輸入命令,注意大小寫
admin.nodeinfo
系統會顯示
enode:"enode://1e3c1727cd3bee9f25edeb5dbb3b880e03e41f8eec99566557f3ee0422734a8fcad17c161aa93d61bdbfb28ed152c143c7eb501db58bc63502a104a84b62d742@0.0.0.0:30303“
其中
enode://1e3c1727cd3bee9f25edeb5dbb3b880e03e41f8eec99566557f3ee0422734a8fcad17c161aa93d61bdbfb28ed152c143c7eb501db58bc63502a104a84b62d742@0.0.0.0:30303
就是自己節點的資訊,注意要把“0.0.0.0“換成你自己的ip。將這個資訊傳送給其他節點,在其他節點的命令列中輸入:
admin.addpeer(‘enode://1e3c1727cd3bee9f25edeb5dbb3b880e03e41f8eec99566557f3ee0422734a8fcad17c161aa93d61bdbfb28ed152c143c7eb501db58bc63502a104a84b62d742@192.168.1.101:30303’)
如果新增成功,輸入admin.peers會顯示出新新增的節點。
八、使用節點進行挖礦
在geth命令列介面下,輸入miner.start()即啟動挖礦,挖礦後,會不停刷屏,輸入miner.stop()即停止,不用管刷屏導致的命令不全,命令會正常執行。
到這一步,已經組建一個私有鏈的網路,可以像其他區塊鏈一樣不停的擴充這個網路,下一篇文章,我會介紹如何在私有鏈上編寫、除錯和部署智慧合約。
參考文章:
1. http://tech.lab.carl.pro/kb/ethereum/testnet_setup
2. http://www.ethdocs.org/en/latest/network/test-networks.html#setting-up-a-local-private-testnet
3. https://github.com/ethereum/go-ethereum/wiki/connecting-to-the-network
4. https://github.com/ethereum/go-ethereum/wiki/javascript-console
5. https://github.com/ethereum/go-ethereum/wiki/mining
6. https://github.com/ethereum/go-ethereum/wiki/managing-your-accounts
7. https://github.com/janx/ethereum-bootstrap