原文:https://blog.csdn.net/yinanmo5569/article/details/80339031
以太坊官方網絡(Official Network)
以太坊官方網絡有兩種:
- 生產環境網絡(又稱主網絡)
- 測試網絡TestNet
主網絡是產生真正有價值的以太幣的網絡,是全球化,部署在Internet環境上的.智能合約的代碼,執行,區塊的調用,都可以清晰地查看到.而所有節點都是全球化的,速度較慢.
TestNet是專供用戶來開發,調試和測試的.如果開發簡單的智能合約的話,用測試網絡就足夠了,用戶可以把更多的精力集中在智能合約的編寫.但是由於網路是官方提供的,因此對於以太坊技術的底層實現,Geth的各種參數接口,整個以太坊技術真是性能的理解就會弱很多.所以從開發者的角度來說,一個更好的選擇是Private Network,可以從技術的底層去深入理解以太坊.
以太坊私有網絡(Private Network)
以太坊私有網絡,就是由用戶自己通過Geth創建的私有網絡,是一個非常適合開發,調試和測試的網路.私有網路可以方便開發者深入理解以太坊的技術底層.
㈠安裝虛擬機


㈡虛擬機聯網


㈢安裝Go語言環境
1.10.3
由於后面會出現版本兼容問題,因此此處需要將golong版本更改采用新版的:官網地址
比如2018.6.18我下載1.10.3:1.10.3
1、下載復制放到:opt/ethfan目錄:



文件名:
tar -xvf go1.10.3.linux-amd64.tar.gz



1.8.1
舊版參照1.8.1安裝:訪問go官網下載
下載復制放到:opt/ethfan目錄






㈣配置yum
如果沒有配置yum就要先配置yum
㈤下載和編譯Geth
安裝C的編譯器,但是:centos7中沒有這個apt-get install -y build-essential
我安裝的是:yum -y install gcc

git clone https://github.com/ethereum/go-ethereum.git

cd go-ethereum make geth

錯誤說明我的版本是:1.8.1 不符合,應當改成至少是1.9
解決方法:要么更改golong版本,要么更改geth版本
更改golong版本為1.10.3:就好啦

檢驗是否安裝成功
查看命令:build/bin/geth –help 檢查版本:build/bin/geth version


source /etc/profile

Geth搭建私有網絡
Step1:定義私有genesis state
[admin@localhost ~]$ cd Code/blockchain
[admin@localhost blockchain]$ mkdir go-ethereum
[admin@localhost blockchain]$ gedit genesis.json
[admin@localhost blockchain]$ mkdir privateNetwork
創建一個新的文件夾privateNetwork,用來存儲genesis.json文件和之后的私有鏈
將下面的內容復制到genesis.json中:
{
"config": {
"chainId": 14,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x05000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
或者內容為:
{
"config": { "chainId": 22, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "alloc" : {}, "coinbase" : "0x0000000000000000000000000000000000000000", "difficulty" : "0x400", "extraData" : "", "gasLimit" : "0x2fefd8", "nonce" : "0x0000000000000032", "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp" : "0x00" }
官方文檔中的chainId為0,應該修改為非0的值,不然會導致 insufficient funds for gas * price + value
difficulty表示挖礦的難度值,官方文檔中為0x20000,由於測試機器配置低,修改為0x05000。
Step2:建立創世區塊
運行如下指令:
[admin@localhost blockchain]$ geth --datadir "./privateNetwork" init go-ethereum/genesis.json
結果如下:
然后在privateNetwork中能發現geth和keystore兩個新文件.
- geth保存的是區塊鏈的相關信息
- keystore中保存的是該鏈條中的用戶信息
Step3:創建自己的私有鏈條
運行如下命令:
[admin@localhost privateNetwork]$ geth --networkid 14 --nodiscover --datadir "data/chain0" --rpc --rpcapi net,eth,web3,personal --rpcaddr localhostconsole 2>>geth.log
nodiscover的意思是不被其他節點自動發現(可以手動添加節點)
或者命令類似為:geth --identity "TestNode" --rpc --rpcport "8545" --datadir /opt/ethfan/path/to/datadir --port "30303" --nodiscover console
console是啟動geth控制台,不加該選項,geth啟動之后成為一個后台進程不會自動結束
最后把geth中的log信息導入geth.log中,方便了解geth運行的情況。
注意路徑要加引號,不然會出問題.
--nodiscover 關閉p2p網絡的自動發現,需要手動添加節點,這樣有利於我們隱藏私有網絡
--datadir 區塊鏈數據存儲目錄
--networkid 網絡標識,私有鏈取一個大於4的隨意的值
--rpc 啟用ipc服務,默認端口號8545
--rpcapi 表示可以通過ipc調用的對象
--rpcaddr ipc監聽地址,默認為127.0.0.1,只能本地訪問
console 打開一個可交互的javascript環境
更多參數:https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options
運行后面的再進入是這樣的:
創建賬號:語法這里采用的是javascript輸入兩次密碼123456,顯示生成的賬號
創建新用戶,密碼是”ycx”,地址是"0x41b80248049bfa17e30beaa16c9f0e6b0e98fa6e"
>personal.newAccount("ycx")

Step4:在自己的私有鏈條上創建用戶
查看私有鏈已有賬戶,已經有賬戶(我創建過兩次).
>eth.accounts

查看賬戶余額
Step5:嘗試挖礦
繼續在console中輸入:
>miner.start()
開始挖礦,查看終端geth.log,如下:
過了一段時間之后,再停止挖礦,查看賬戶,只要不為0則挖礦成功
Geth搭建多節點私有鏈條
搭建0號節點
參照:上文
搭建1號節點
[root@localhost admin]# cd Code/blockchain/
[admin@localhost blockchain]$ mkdir data
創建步驟與之前是一樣的,要保證兩個節點在同一個區塊鏈上工作的話首先要保證genesis創世區塊鏈是一樣的,所以注意使用同樣的genesis.json文件來創建.用兩個端口分別創建
[root@localhost blockchain]$ geth --datadir "data/chain0" init go-ethereum/genesis.json

[root@localhost blockchain]$ geth --datadir "data/chain1" init go-ethereum/genesis.json

如果報錯:

啟動0號,1號節點
為了使兩個節點同時啟動,注意使用不同的port和rpc port.
啟動0號節點:
geth --networkid 14 --nodiscover --datadir "data/chain0" --rpc --rpcapi net,eth,web3,personal --rpcaddr localhost console 2>>geth0.log

如果報錯:可以查看端口https://www.cnblogs.com/chinas/p/4553179.html
geth --networkid 14 --nodiscover --datadir "data/chain0" --port 30303--rpc --rpcapi net,eth,web3,personal --rpcport 8545--rpcaddr localhost console 2>>geth0.log
啟動1號節點:
geth --networkid 14 --nodiscover --datadir "data/chain1" --port 55554 --rpc --rpcapi net,eth,web3,personal --rpcport 8101 --rpcaddr localhost console 2>>geth1.log
參數解釋:
--nodiscover 關閉p2p網絡的自動發現,需要手動添加節點,這樣有利於我們隱藏私有網絡
--datadir 區塊鏈數據存儲目錄
--port 網絡監聽端口,默認30303
--networkid 網絡標識,私有鏈取一個大於4的隨意的值
--rpc 啟用ipc服務
--rpcport ipc服務端口,默認端口號8545
--rpcapi 表示可以通過ipc調用的對象
--rpcaddr ipc監聽地址,默認為127.0.0.1,只能本地訪問
console 打開一個可交互的javascript環境
添加節點
通過addPeer來添加節點.關於Geth JavaScript console的具體api可以在查詢官方文檔:https://github.com/ethereum/go-ethereum/wiki/Management-APIs
首先查看1號節點的enode
在0號節點的console,添加1號節點
查看是否添加成功
查看連接的節點數量和連接的節點列表:
net.peerCount
admin.peers