Win10以太坊私鏈多節點部署
【前言】我覺得學習一個新的東西,最難的就是環境部署,部署好之後後續的開發工作就都是比較簡單的語法問題了。所以我這篇文章重點講述環境部署,部署成功的常規操作很容易查到的。雖然關於以太坊的部署的文章也很多,但是發現不夠細,或者其實運行不起來,或者寫的比較亂,所以才決定寫。
【摘要】在學習區塊鏈,看了很多論文,幾乎沒怎麼實踐。所以,想從以太坊部署、智能合約應用入手,熟練以太坊使用常規操作,後續再着手源碼研讀,可以包括以太坊、超級賬本。因爲覺得,論文看的再多,再怎麼明白道理,都不如讀源碼的體會來得更深、更細。所以這算是作爲新的進展計劃吧。
本篇文章主要是講解自己在部署以太坊的時候遇到的一些問題,以及對應的解決方法,希望給在這條路上的新手們寫個“踩雷執導”。
一、環境及工具
操作系統:Windows10
以太坊開發客戶端geth:
版本:我下載的是1.9.1
下載地址https://ethereum.github.io/go-ethereum/downloads/
geth:是Go Ethereum開源項目簡稱,是用於與以太坊網絡連接並進行相關開發的客戶端工具。使用Geth也可以搭建自己的以太坊私鏈、部署智能合約、挖礦、進行交易等等。(聯盟鏈搭建以後嘗試。)wiki裏爲使用文檔。
以太坊錢包Ethereum Wallet:
下載地址:https://github.com/ethereum/mist/releases/
注意:錢包要與geth版本相匹配,具體什麼版本,等錢包報錯的時候就知道。
Ethereum Wallet一個以太坊賬戶圖像化管理工具,用於直觀的顯示節點賬戶餘額以及進行創建賬戶和轉賬交易等。錢包所做的操作都可以在geth命令行裏面操作,且不是很難。再加上版本兼容問題,所以我覺得可以不用。不過看看什麼樣還是可以的。
二、geth和Ethereum Wallet安裝
geth雙擊.exe文件,安裝到默認位置C:/Program Files/Geth或者自定義安裝。區別在於,如果安裝在C盤,對於Geth文件夾下面的文件訪問,比如後續提到的genesis.json需要使用管理員權限纔行。也就是打開一個cmd終端得“右擊開始菜單,選擇管理員模式Windows Powershell”。如果自定義安裝到非系統盤,則直接win+R,輸入cmd即可。
Ethereum Wallet直接解壓即可使用。
三、多節點私鏈搭建
我們以三個節點爲例。三個節點屬於Ip下的不同端口,即都是Localhost(127.0.0.1)。如圖:
1、準備創世節點配置內容
在geth安裝位置Geth文件夾裏面genesis.json文件,文件內容如下。注意,後綴必須爲json。有的文件夾不顯示文件後綴名。可以點擊查看顯示文件擴展名。我開始就是沒有顯示,實際弄了一個genesis.json.txt文件,所以沒成功。
{
"config":{
"chainId":15,
"homesteadBlock":0,
"eip155Block":0,
"eip158Block":0
},
"nonce":"0x0000000000000042", "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x40000",
"alloc": {},
"coinbase":"0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "",
"gasLimit":"0xffffffff"
}
2、創建並啓動第一個節點
打開一個終端:Win+R,輸入cmd,回車。在命令行中進入Geth目錄,如圖:
執行兩條指令:
(1)初始化創世節點:geth --datadir "node1" init genesis.json
(2)啓動node1節點:geth --datadir "node1" --rpccorsdomain "*" --networkid 989898 --rpc console --port 30304 --rpcapi "db,eth,net,web3" --rpcaddr "localhost" --rpcport 8546 --ipcdisable --allow-insecure-unlock
當第一條指令顯示如下表示第一步成功:
當第二條指令顯示如下表示第二步成功:
當兩條指令執行成功之後,你進入Geth文件夾,就可以看到多了一個node1文件夾,node1的相關配置就在裏面了。其中keystore是後面爲該節點創建的賬戶保存信息的地方。一個節點可以創建多個賬戶,創建一個賬戶,keystore裏面就會多一條記錄。geth裏面放置的就是node1的其他配置了,具體還沒了解,暫時沒需要。以後啓動node1的時候,cmd進入geth文件目錄之後,直接執行第二條指令就可以啦。
3、創建並啓動第2、3個節點
爲每一個節點打開一個cmd窗口。執行與步驟2裏面幾乎相同的操作。因爲三個節點都要加入同一個私鏈,所以創世節點都得通過genesis.json文件配置。指令關鍵關鍵點就是不同節點:
- port端口不同
- rpcport不同
- 相同的networkid
- 關閉進程間通信:--ipcdisable。
否則會報錯:
Error starting protocol stack: Access is denied.
指令裏面的其他參數可以在cmd進入Geth目錄下之後,輸出geth --help查看詳情。文章後面也會進行分析。
node2節點創建與啓動:
(1)geth --datadir "node2" init genesis.json
(2)geth --datadir "node2" --rpccorsdomain "*" --networkid 989898 --rpc console --port 30303 --rpcapi "db,eth,net,web3" --rpcaddr "localhost" --rpcport 8547 --ipcdisable --allow-insecure-unlock
node3節點創建與啓動
(1)geth --datadir "node3" init genesis.json
(2)geth --datadir "node3" --rpccorsdomain "*" --networkid 989898 --rpc console --port 30306 --rpcapi "db,eth,net,web3" --rpcaddr "localhost" --rpcport 8548 --ipcdisable --allow-insecure-unlock
成功之後:
4、之後就可以在節點間執行如下操作:
多節點以太坊私鏈搭建成功之後可以執行很多事情,然後這些很容易在網上查到,我就不再這裏展開細講了。注意凡是涉及到和私鏈或者節點交互的操作都需要在挖礦後生效,最好拿一個節點一直在挖礦。每次轉賬都得解鎖。
- 爲各節點創建賬戶:personal.newAccount(“admin123” ) ()裏面是賬戶密碼
- 查詢節點賬戶:eth.accounts 顯示該該節點下所有賬戶地址,rth.accounts相當於數組
- 查詢賬戶餘額:eth.getBalance(eth.accounts[0]) 查詢第一個賬戶的餘額,括號裏爲賬戶地址
- 節點挖礦:miner.start(2) ()裏面是線程數。注意一旦節點開始挖礦,終端就會一直刷新,如果需要輸入指令,不斷輸入你想輸入的指令即可,即使被沖掉也沒關係。最好提前寫好,複製粘貼會好些。終端裏複製選中即可複製,粘貼直接右擊即可。有時候在終端粘貼了不顯示,需要點擊下空格,或者回車應該纔會刷新。
- 停止節點挖礦:miner.stop()
- 查看節點信息:admin.nodeInfo.enode 顯示全部信息用於被別的節點添加使用,包括雙引號,應該是節點地址
- 添加節點:admin.addPeer(上一條指令顯示的全部信息,包括雙引號) 括號應該是其他節點的地址
- 查看peer節點:admin.peers,以數組形式展示
- 轉賬:eth.sendTransaction({from:“第一個賬戶地址”,to:"第二個賬戶地址",value:web3.toWei(10,"ether")}) 第一個賬戶轉10個ether到第二個賬戶
- 賬戶解鎖:personal.unlockAccount(eth.accounts[0]) 括號裏面爲賬戶地址,或者(“賬戶地址”)
5、以太坊錢包使用
只有在Ethereum Wallet客戶端顯示出“private net”才說明錢包鏈接的是本地自己搭建的私鏈,否則應該是連接到了以太坊的公鏈上了。遇到一個問題,雙擊運行錢包軟件之後,發現無法連接到私鏈。
解決方案:
管理員模式打開命令行,進入以太坊目錄下之後,執行指令 ./Wallet --rpc”127.0.0.1:30303” ( ./Wallet --rpc”127.0.0.1” 這也可以)(前提是你的可執行錢包文件改名爲Wallet,而且必須得在管理員權限下的終端纔可以執行./Wallet指令,好像"./"是管理員模式下的指令)
但是我在寫這篇文章的時候發現這個解決方案又不奏效了,雖然我確實成功過。提示如下圖所示。我猜測應該還是因爲錢包和geth版本不匹配。所以正如我前文提到的,錢包只是圖形化而已。如果找不到一個與geth匹配的錢包,我建議直接不使用錢包了。因爲你改成爲其他版本,相關啓動節點的指令可能會發生變化(我試過)。
錢包就是這樣的。我猜測一個節點應該需要運行一個錢包應用。錢包用於顯示該節點下所有的賬戶。一個節點可以有多個賬戶。在錢包裏面或者geth命令行創建賬戶的效果一樣。有幾個賬戶該節點的keystore文件夾裏就有幾條記錄。
其實當你發現錢包弄得亂七八糟的時候,因爲可能保留了以前的信息。你可以刪除掉錢包保存的信息。存儲位置如下圖所示。當找不到路徑中某個對應的文件夾的時候,可能是隱藏了。點擊顯示,勾選顯示隱藏文件。
6、節點啓動指令參數講解
因爲多數參數作用已經在前文提到過,這裏不再贅述。主要講解兩個參數:
geth --datadir "node2" --rpccorsdomain "*" --networkid 989898 --rpc console --port 30303 --rpcapi "db,eth,net,web3" --rpcaddr "localhost" --rpcport 8547 --ipcdisable --allow-insecure-unlock
- --rpcapi "db,eth,net,web3":啓動這幾個庫的接口,纔可以在geth控制檯中使用,例如eth.accounts;而且不寫這個參數,在使用remix部署智能合約的時候會發現連接不上私鏈,無法完成部署;
- --allow-insecure-unlock:沒有這個參數,無法解鎖賬戶。執行personal.unlockAccount(eth.accounts[0])指令時報錯:account unlock with HTTP access is forbidden
7、Tips:命令行行前顯示">":表示geth控制檯模式,執行geth相關指令。退出geth,直接輸入exit回車即可
命令行前顯示文件目錄才表示,回到系統命令控制檯模式。例如geth --help就不可以在geth控制檯模式下輸入,應該在cmd進入Geth目錄之後輸入指令。
8、下節預告:應該會講解下智能合約使用,現在我也只是簡單瞭解了下用remix部署簡單合約以及測試。