首先需要安裝 Docker,Docker 的安裝和使用可以參看阮一峰老師的 《Docker 入門教程》 。
創(chuàng)新互聯(lián)始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過(guò)多達(dá)十載累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的全網(wǎng)營(yíng)銷推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:小攪拌車等企業(yè),備受客戶稱譽(yù)。
Ethereum 官方是支持 docker 的,可以參看 官方文檔 。
centOS
其中 -v /home/linshan/works/block-chain/ethereum:/root 是把我們當(dāng)前的 ethereum 目錄,掛到了docker 的 /root 下。
在 Windows 環(huán)境下使用 -v /home/linshan/works/block-chain/ethereum:/root 不能啟動(dòng)容器,原因不明,所以在 Windows 下先不要使用目錄掛載。
各字段具體用途參看 官方文檔 。
Windows
Windows 不必創(chuàng)建 start-ethereum.sh 文件, genesis.json 也可以在 Docker 容器啟動(dòng)后創(chuàng)建。
centOS
Windows
運(yùn)行成功后執(zhí)行
進(jìn)入 docker 容器命令行
因?yàn)?Windows 沒(méi)有掛載共享目錄,所以 root 目錄下沒(méi)有 genesis.json 文件,我們要在這里手動(dòng)創(chuàng)建 genesis.json 文件,內(nèi)容要和 centOS 的一致。
data 用來(lái)存放區(qū)塊數(shù)據(jù)
geth 的參數(shù)參看 以太坊客戶端Geth命令用法-參數(shù)詳解
啟動(dòng)私有節(jié)點(diǎn)后進(jìn)入 geth 命令行執(zhí)行:
輸出的內(nèi)容就是節(jié)點(diǎn)信息,我們?cè)谑謩?dòng)連接節(jié)點(diǎn)是會(huì)用到,注意要把“0.0.0.0“換成你自己的IP,然后將這個(gè)信息發(fā)送給其他節(jié)點(diǎn)。手動(dòng)連接節(jié)點(diǎn)有兩種方式:
當(dāng)然不管使用哪種方法連接節(jié)點(diǎn)都要保證創(chuàng)世區(qū)塊文件 genesis.json 一致,還有在啟動(dòng)時(shí) networkid 也要一致。
至此以太坊私有鏈已搭建完畢。
geth命令
docker命令
geth命令的實(shí)現(xiàn)在文件
go-ethereum/cmd/geth/main.go中
調(diào)用關(guān)系
其中app在main.go的全局變量中初始化
cli的實(shí)現(xiàn)采用的是
庫(kù) 該庫(kù)的用法待學(xué)習(xí)
node中包含了rpc,ipc,http,ws,p2p等各種服務(wù)及在5中所注冊(cè)的服務(wù)
startNode如下
Geth 又名 go-ethereum,是 ethereum 協(xié)議的具體落地實(shí)現(xiàn),通過(guò) geth,可以實(shí)現(xiàn) ethereum 的各種功能
Geth 可以被安裝在很多操作系統(tǒng)上,包括 Windows、Linux、Mac 的 OSX、Android 或者 iOS 系統(tǒng)。
Geth客戶端主要功能:
JavaScript Console:通過(guò)后臺(tái)進(jìn)行命令操作;
Management API:管理相關(guān)的API;
JSON-RPC server:JSON-RPC相關(guān)調(diào)用API
賬號(hào)管理(創(chuàng)建賬號(hào)、鎖定賬號(hào)、解除鎖定等);
查詢賬戶信息;
查詢交易信息;
查詢gasPrice;
交易;
挖礦停止挖礦;
部署智能合約
等其他相關(guān)功能。
(歡迎打賞,一分也是愛(ài))
操作系統(tǒng):linux或Mac OS
安裝geth執(zhí)行以下命令:
linux:sudo apt-get install ethereum
Mac OS:brew install ethereum
直接創(chuàng)建兩個(gè)geth的工作目錄,用于之后的組建聯(lián)盟鏈的使用:
mkdir eth-private1
mkdir eth-private2
首先 cd eth-private1 進(jìn)入節(jié)點(diǎn)1的工作目錄該目錄下執(zhí)行下面命令
geth --datadir data --nodiscover console (data是之后geth節(jié)點(diǎn)的數(shù)據(jù)目錄,可自行修改)
使用geth自帶的工具 puppeth 用于生成創(chuàng)世區(qū)塊,過(guò)程如下:
puppeth
+-----------------------------------------------------------+
| Welcome to puppeth, your Ethereum private network manager |
| |
| This tool lets you create a new Ethereum network down to |
| the genesis block, bootnodes, miners and ethstats servers |
| without the hassle that it would normally entail. |
| |
| Puppeth uses SSH to dial in to remote servers, and builds |
| its network components out of Docker containers using the |
| docker-compose toolset. |
+-----------------------------------------------------------+
Please specify a network name to administer (no spaces, please)
輸入私鏈名稱后,會(huì)出現(xiàn)二級(jí)菜單,現(xiàn)在2:配置一個(gè)新的創(chuàng)世快
What would you like to do? (default = stats)
再次出現(xiàn)二級(jí)菜單,讓你選擇共識(shí)機(jī)制(這里采用poa共識(shí))
Which consensus engine to use? (default = clique)
Ethash - proof-of-work(PoW) :工作量證明,通過(guò)算力達(dá)成共識(shí) (以太坊就是使用這種方式)
Clique - proof-of-authority(PoA): 權(quán)威證明、通過(guò)預(yù)先設(shè)定的權(quán)威節(jié)點(diǎn)來(lái)負(fù)責(zé)達(dá)成共識(shí) (不消耗算力,一般用于私有鏈測(cè)試開(kāi)發(fā))
如果選擇Pow的共識(shí)方法,直接輸入1,回車即可。
如果選擇PoA的共識(shí)方法,輸入2后會(huì)提示讓你選擇處快的間隔時(shí)間,一般測(cè)試開(kāi)發(fā)使用可以設(shè)置相對(duì)的將處快時(shí)間設(shè)置較少5秒即可,然后會(huì)讓你選擇哪個(gè)賬戶來(lái)作為權(quán)威生成區(qū)塊(至少有一個(gè),輸入剛才創(chuàng)建的賬戶,若只是單節(jié)點(diǎn)就輸入那個(gè)節(jié)點(diǎn)目錄生成的地址,若想組建聯(lián)盟鏈就填寫(xiě)生成的兩個(gè)地址)
How many seconds should blocks take? (default = 15)
選擇好共識(shí)機(jī)制后會(huì)讓你指定給那些賬號(hào)初始化ether(至少有一個(gè)),輸入我們剛才創(chuàng)建的賬戶地址回車即可。
Which accounts should be pre-funded? (advisable at least one)
選擇輸入私有鏈的網(wǎng)絡(luò)ID,任意數(shù)字即可(不能為1,1是公鏈),也可以不輸入會(huì)給定一個(gè)隨機(jī)數(shù)作為私有鏈的網(wǎng)絡(luò)ID
Specify your chain/network ID if you want an explicit one (default = random)
選擇導(dǎo)出創(chuàng)世區(qū)塊配置文件
選擇導(dǎo)出創(chuàng)世區(qū)塊配置文件的保存路徑,可以保存到當(dāng)前目錄,直接按回車即可
Which file to save the genesis into? (default = my-private-chain.json)
INFO [02-09|14:56:33] Exported existing genesis block
這樣就完成了創(chuàng)世區(qū)塊文件的配置了,直接退出puppeth即可。
輸入命令 geth --datadir data init private.json 其中data自己制定,private.json就是剛才生成的創(chuàng)世區(qū)塊
若出現(xiàn)如圖錯(cuò)誤:
輸入命令:
geth --datadir data --syncmode full --port 2001 --networkid 1234 --rpc --rpcport "8545" --rpccorsdomain "*" --rpcaddr "0.0.0.0" --rpcapi "db,eth,net,web3,personal,admin,clique" --nodiscover console 進(jìn)入控制臺(tái)
--datadir data:節(jié)點(diǎn)的數(shù)據(jù)目錄
--syncmode full:塊同步的方式(若只是單節(jié)點(diǎn)可不填)
--port 2001: 網(wǎng)卡監(jiān)聽(tīng)端口
--networkid 1234:網(wǎng)絡(luò)標(biāo)識(shí)符
--rpc:開(kāi)啟rpc服務(wù)
--rpcport "8545":rpc服務(wù)的端口
--rpccorsdomain "*":允許跨域請(qǐng)求的域名列表(逗號(hào)分隔)(瀏覽器強(qiáng)制)
--rpcaddr "0.0.0.0" :HTTP-RPC服務(wù)器接口地址(默認(rèn)值:“l(fā)ocalhost”)
--rpcapi "db,eth,net,web3,personal,admin,clique":基于HTTP-RPC接口提供的API(私有鏈可以任意開(kāi)發(fā),公有鏈需要謹(jǐn)慎)
--nodiscover:不允許節(jié)點(diǎn)自動(dòng)加入
若想搭建聯(lián)盟鏈,必須保證創(chuàng)世區(qū)塊一致,進(jìn)入到剛才創(chuàng)建的eth-private2的目錄
將之前生成的創(chuàng)世區(qū)塊拷貝過(guò)來(lái),初始化創(chuàng)世區(qū)塊,然后使用啟動(dòng)命令啟動(dòng)分別啟動(dòng)兩個(gè)節(jié)點(diǎn),進(jìn)入控制臺(tái),使用 admin.nodeInfo 命令獲取節(jié)點(diǎn)的信息
總結(jié):
兩個(gè)服務(wù)器部署兩個(gè)節(jié)點(diǎn)是可以聯(lián)通的,但是只能使用兩個(gè)節(jié)點(diǎn)對(duì)應(yīng)的地址進(jìn)行挖礦,所以只能是兩個(gè)節(jié)點(diǎn)對(duì)應(yīng)兩個(gè)地址進(jìn)行挖礦,使用poa共識(shí),當(dāng)一個(gè)節(jié)點(diǎn)掛掉,挖礦停止,因?yàn)閜oa共識(shí)挖礦必須超過(guò)50%的節(jié)點(diǎn)進(jìn)行錢增,現(xiàn)在只是兩個(gè)節(jié)點(diǎn),掛掉一個(gè)節(jié)點(diǎn)挖礦就會(huì)停止等待另一個(gè)節(jié)點(diǎn)的確認(rèn),停掉的節(jié)點(diǎn)可以通過(guò)正常運(yùn)作的節(jié)點(diǎn)信息重新連接到網(wǎng)絡(luò)中。
問(wèn)題:
同步塊有可能報(bào)錯(cuò)情況:
1:Synchronisation failed "retrieved hash chain is invalid" 解決目前找到的方法是removedb 數(shù)據(jù)目錄 ,重新init創(chuàng)世區(qū)塊
2:內(nèi)存溢出初步確認(rèn)為開(kāi)啟rpc服務(wù)造成的,有可能服務(wù)器惡意被黑,暴力破解密碼,占有內(nèi)存,解決,將服務(wù)器的ip設(shè)置一條防火墻
若存在問(wèn)題可給本人留言或訪問(wèn)本人的github: 記錄了一些本人搭建使用的命令