以太坊(Ethereum)自2017年5月誕生以來,發展迅速。作為了一個小白,博主初步打算上個車,過個癮。那什么是以太坊?請參看度娘的解釋(https://baike.baidu.com/item/%E4%BB%A5%E5%A4%AA%E5%9D%8A/20865117?fr=aladdin)。
事物是個新事物,也是個好東西,但資料不多,所以小白博主也只能慢慢找尋資料,慢慢記錄自己填坑的過程。
第一篇的主題是:以太坊私鏈的創建:)
一、配置環境與軟件安裝
1、安裝geth
以下的資料來自:http://8btc.com/article-4537-1.html
MAC OSX
首先確保已安裝 homebrew,沒有安裝過的可以在命令行下執行/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 進行安裝 brew tap ethereum/ethereum brew install ethereum WINDOWS 訪問 https://geth.ethereum.org/downloads/ 下載並安裝 Geth for Windows LINUX git clone https://github.com/ethereum/go-ethereum sudo apt-get install -y build-essential golang cd go-ethereum make geth
在這里,我們約定,go-ethereum的絕對路徑為:/alidata/go-ethereum。
如果你覺得按照上面的命令能順利執行,那就圖森破了。這里有兩點需要注意:
首先:千萬選用ubuntu而不是centos,各種庫無法編譯,單單填centos依賴庫的坑都能把搓衣板跪穿。對於像我這樣的小白級別,建議跟着教程走,調通了demo之后再去折騰centos。
其次:golang的安裝,要到https://www.golangtc.com/download下載go1.9.2.linux-amd64.tar.gz,進行編譯安裝。因為apt-get下載后的版本是1.6,而go-ethereum需要的最低版本是1.7。報錯信息為:go-ethereum 1.6 Makefile:15: recipe for target 'geth' failed。編譯步驟:
tar -xvf go1.9.linux-amd64.tar.gz
mv go /usr/local/src mkdir $HOME/gosrc && cd $HOME/gosrc mkdir bin pkg src
更新系統變量:
vim ~/.profile
export GOROOT=/usr/local/src/go export GOPATH=$HOME/gosrc export GOBIN=$GOROOT/bin export PATH=$PATH:$GOROOT/bin source ~/.profile
安裝完Golang之后,再進入/alidata/go-ethereum,進行make geth,就可以順利編譯了。成功之后執行/alidata/go-ethereum/build/bin/geth -h,有如下回顯則說明安裝成功:
2、安裝npm
因為solc的安裝要依賴於nodejs的npm組件。這一步相對簡單:apt-get install npm
3、安裝solc
按照教程示例,只需要簡單的npm install -g solc,慢慢坐着等即可。
運行一段時間后,你會發現,自己又太天真了,天朝的網絡質量,可以讓你等到天荒地老。天朝的問題,只能在天朝內解決,我們可以依靠無所不能的大淘寶:
npm install -g cnpm --registry=https://registry.npm.taobao.org
apt-get install install nodejs-legacy
cnpm install solc
cnpm install -g solc
注意:到這里,solc安裝成功。(但博主仍感覺有什么地方怪怪的,之后的文章會進一步求證,廣大客官就先不用糾結了,答案近期分曉)
二、配置私鏈節點
以下這一部分,參照http://8btc.com/article-4537-1.html 說明的步驟進行操作,不會有問題。
1、創世區塊的設置
創建/alidata/godblock/路徑,這個路徑的名稱隨意,覺得怎么牛B就怎么取。在這個路徑下創建genesis.json文件和data目錄。
genesis.json 的內容如下:
{
"config": { "chainId": 123456, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "nonce": "0x0000000000000042", "difficulty": "0x020000", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "gasLimit": "0x4c4b40", "alloc": {} }
解釋一下各個參數的作用:(來自:http://blog.csdn.net/sportshark/article/details/51855007)
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的消耗總量限制,用來限制區塊能包含的交易信息總和,因為我們是私有鏈,所以填最大。 |
2.2 初始化
在命令行下進入剛才創建的文件夾/alidata/godblock/,輸入如下命令:
/alidata/go-ethereum/build/bin/geth --datadir data init genesis.json
2.3 啟動節點
/alidata/go-ethereum/build/bin/geth --datadir data --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover console
geth的參數解釋:
identity |
區塊鏈的標示,隨便填寫,用於標示目前網絡的名字 |
init |
指定創世塊文件的位置,並創建初始塊 |
datadir |
設置當前區塊鏈網絡數據存放的位置 |
port |
網絡監聽端口 |
rpc |
啟動rpc通信,可以進行智能合約的部署和調試 |
rpcapi |
設置允許連接的rpc的客戶端,一般為db,eth,net,web3 |
networkid |
設置當前區塊鏈的網絡ID,用於區分不同的網絡,是一個數字 |
console |
啟動命令行模式,可以在Geth中執行命令 |
不出所料,這時節點將成功啟動,並進入JavaScript控制台,如下圖所示:
第一篇就先到這里吧,下一篇將一步一步地布署屬於小白的第一個智能合約。不見不散:)
參考文章:
http://8btc.com/article-4537-1.html 以太坊私鏈與智能合約部署入門教程
http://blog.csdn.net/sportshark/article/details/51855007 區塊鏈開發(一)搭建基於以太坊的私有鏈環境
http://npm.taobao.org/ 淘寶NPM鏡像
http://blog.csdn.net/weixin_40139875/article/details/77879915 go-ethereum 1.6 Makefile:15: recipe for target 'geth' failed