搭建以太坊私鏈(單節點,多節點,windows,linux)
網上關於如何搭建私鏈的文章很多,但是看來看去都是一樣的,千篇一律,想找點不一樣,新鮮的知識很難,本文總結歸納那些文章的內容,從使用私鏈的角度出發寫了一篇比較全面的部落格,內容包含以下幾點:
- windows單節點
- windows多節點
- linux建立節點並,windows遠端使用linux節點
- linux節點和Windows節點建立連線(網路原因,提供思路)
1.windows單節點
安裝geth
下載地址:https://geth.ethereum.org/downloads/,下載之後是個 .exe檔案,然後安裝就好了,安裝之後把geth的安裝目錄加入到系統環境變數的path裡。驗證是否安裝成功,開啟cmd視窗,輸入 geth version 如果出來下面的內容,表示安裝好了。(如果不加任何任何引數直接執行 geth
,會自動連線到以太坊公網,此時會開始同步區塊)
初始化創世區塊
新建個空資料夾,比如
然後在裡面建立個first.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" }
然後開啟cmd視窗,跳轉到當前目錄下執行命令:
geth --datadir .\nodedata0 init first.json
上面的命令的主體是 geth init,表示初始化區塊鏈,命令可以帶有選項和引數,其中–datadir選項後面跟一個目錄名,這裡為nodedata0,表示指定資料存放目錄為 nodedata0, first.json是init命令的引數,就是剛才建立的json檔案
出現Successfully表示初始化成功了(把這行命令儲存為一個.cmd命令備用),這時候你會發現,你的目錄下面自動生成了一個nodedata0的資料夾,目錄如下:
其中geth/chaindata中存放的是區塊資料,keystore中存放的是賬戶資料。
啟動節點
執行命令:
geth --rpc --nodiscover --datadir "./nodedata0" --port 30303 --rpcapi "db,eth,net,web3" --rpccorsdomain "*" --networkid 1001 --ipcdisable console 2>>geth.log
引數說明--nodiscover 關閉p2p網路的自動發現,需要手動新增節點,這樣有利於我們隱藏私有網路
--rpc 啟用ipc服務,預設埠號8545
--datadir 區塊鏈資料儲存目錄
--port 網路監聽埠,預設30303
--rpcapi 表示可以通過ipc呼叫的物件
--rpccorsdomain 指定可以訪問APi的domain地址,設定為“*”則任何地址都可以訪問,這樣做不安全
--networkid 網路標識,私有鏈取一個大於4的隨意的值
console 開啟一個可互動的javascript環境
2>>geth.log 把geth中的log資訊匯入geth.log,也可以不加這個,把資訊直接輸出在console裡,這樣直觀
更多引數:https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options
http://www.yaozihao.cn/2017/07/07/geth%E5%91%BD%E4%BB%A4%E9%80%89%E9%A1%B9%E4%BB%8B%E7%BB%8D/
出現javascript console說明節點啟動成功了,geth.log檔案也生成了
把這啟動命令也儲存start0.cmd命令,以後再啟動這個節點直接雙擊這個cmd就行了
節點相關基本操作
- 檢視賬戶
這時候是沒有賬戶的
- 建立賬戶
Passphrase是輸入密碼,下面的repeat passphrase是重複密碼,建立的賬戶地址是:
0x8b2bd44cec6caedcc0664f965d895a17db326e0a
這是我們會看到nodedata0資料夾下面的keystore下面會多出個檔案,就是儲存賬戶資訊
再檢視賬戶列表,發現有賬戶了
如果你記不清楚personal有哪些方法,可以執行personal命令檢視一下,其它的eth,miner也一樣
- 啟動挖礦
miner.start()
看到null,不要慌,因為你的日誌資訊都儲存到了geth.log檔案裡了,下面這小圖示代表啥自己領會哈
挖了半天,到底挖了幾個區塊了?賺了多少以太幣了?看下面的查詢餘額和檢視區塊數
另外說明一點,節點挖礦的以太幣會自動存入到eth.coinbase賬戶裡,預設是eth.accounts裡的第一個,你也可以自己指定coinbase
- 停止挖礦
- 檢視賬戶餘額
eth.getBalance
eth.accounts[0]得到的是賬戶地址而已,你可能被這麼大的數值嚇一跳,怎麼這麼多以太幣?一個以太幣等於10的18次方個wei,這裡的數值是wei的個數,顯示以太幣的個數,可以用下面的命令,405個以太幣,如果是真的,簡直不要太爽,以太坊創始人V神以前肯定也在家裡這麼偷偷的挖了不少
- 檢視區塊數
81個區塊,一個區塊獎勵5個以太幣
- 指定coinbase賬戶
先建立第二個賬戶,然後把第二個賬戶指定為coinbase,修改之前和修改之後已經改變
- 轉賬
先建立第三個沒有幣的賬戶,從賬戶1轉5個比特幣到賬戶3裡,有的同學會問,不是有個賬戶2嗎,你怎麼不用呢?因為轉賬發起了交易,然而發起交易僅僅是發起交易,交易要被確認需要打包進區塊裡,挖礦就是做這個的,挖礦本身的收益會存進coinbase賬戶裡,而現在coinbase賬戶是賬戶2,所以不考慮賬戶2
再檢視coinbase賬戶2的餘額,不僅挖礦獎勵,連交易費都收了哦
- 退出
exit
驗證私鏈
寫了這麼多,一頓操作猛如虎,這個私鏈到底能不能用?
我們用remix驗證一樣,連線這個私鏈
賬戶和餘額資訊會顯示出來,如果你的工具找不到你的私鏈,請確認啟動節點的引數中,有沒有設定 --rpccorsdomain "*"
單節點就寫到這裡,下面是多節點的內容
2.windows多節點
我們在上面已經建立了一個節點了,下面我們直接建立第二個節點,然後連線兩個節點,第二個節點的建立要滿足下面條件
- 創世區塊的資訊得一樣
- rpcport 和 port引數必須和第一個不同
節點1 啟動的命令沒有這個引數rpcport,預設的值是8545,我們就用9545吧,port用30306
初始化創世區塊
geth --datadir .\nodedata1 init first.json
自動建立了存放節點資料的資料夾nodedata1
啟動節點
geth --rpc --rpcport 9545 --nodiscover --datadir "./nodedata1" --port 30306 --rpcapi "db,eth,net,web3" --rpccorsdomain "*" --networkid 1001 --ipcdisable console
nodiscover,ipcdisable,這兩個引數很關鍵,windows沒有ipcdisable引數,第二個節點啟動會報錯的。nodiscover讓節點2不會被節點1自動掃描到。
節點1和節點2建立連線
我們用節點2主動新增節點1,兩個節點只要一方主動建立連線就可以了,另一方會自動獲得這個連線關係的,效果一樣的
先檢視節點1的enode資訊,作為節點2 admin.addPeer()方法的引數
節點1的console:
節點2的console:
再看節點1的console:
再用remix連線一下我們的節點2吧
windows多個節點的私鏈就是這樣了
3.linux建立節點並和windows節點建立連線
注意你的linux是多少位的就下載多少位的二進位制檔案,我的是32位的,我就下載32位的然後把geth複製到/usr/bin目錄下面,我們就可以使用geth命令了,geth help,出現下的介面,表示成功。
網上其它的文章都是先安裝go語言,再下載geth原始碼編譯安裝,最終的效果都是一樣的。
然後執行初始化區塊的命令:
geth --datadir nodedata2 init first.json
命令跟在windows差不多,自動生成的nodedata2資料夾也是一樣的啟動節點,步驟跟在windous一樣
geth --rpc --rpcport 8545 --rpcaddr 65.49.132.28 --nodiscover --datadir "/root/privatechain/nodedata2" --port 30303 --rpcapi "db,eth,net,web3" --rpccorsdomain "*" --networkid 1001 --ipcdisable console
命令多了一個:
--rpcaddr 65.49.132.28
這個ip是linux伺服器的地址,如果我們在windows本地想要訪問伺服器的私鏈,這個引數得加上
已經啟動,我們可以在命令列視窗執行一些geth的命令
windows電腦上的remix訪問一下linux的私鏈:
一個賬戶,地址也是一樣的,it works。
額外操作:把啟動命令儲存為linux可執行檔案,方便以後啟動:
linux的私鏈執行成功了,接下來我們讓window的節點和linux的節點連線起來(因為網路原因沒實現,只有思路)
windows上已經有兩個節點了,現在我們的linux要訪問這兩個節點,所以這兩個節點的啟動命令得加上--rpcaddr這個引數,但是這部分實現不了了,因為自己電腦連線的是路由器,直接用公網ip+埠號訪問不到自己的電腦,要在路由器上做埠對映才能讓伺服器訪問到自己的電腦,我沒有路由器的登入許可權,所以做不了了
2.節點建立連線方法應該跟windous連線點相連方法是一樣的,關鍵是節點啟動的時候加上--rpcaddr引數
3.祝好運!