1. 程式人生 > >搭建以太坊私鏈(單節點,多節點,windows,linux)

搭建以太坊私鏈(單節點,多節點,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就行了

節點相關基本操作

  • 檢視賬戶

這時候是沒有賬戶的

  • 建立賬戶
personal.newAccount()


Passphrase是輸入密碼,下面的repeat passphrase是重複密碼,建立的賬戶地址是:

0x8b2bd44cec6caedcc0664f965d895a17db326e0a

這是我們會看到nodedata0資料夾下面的keystore下面會多出個檔案,就是儲存賬戶資訊


再檢視賬戶列表,發現有賬戶了


如果你記不清楚personal有哪些方法,可以執行personal命令檢視一下,其它的eth,miner也一樣


  • 啟動挖礦

miner.start()


看到null,不要慌,因為你的日誌資訊都儲存到了geth.log檔案裡了,下面這小圖示代表啥自己領會哈


挖了半天,到底挖了幾個區塊了?賺了多少以太幣了?看下面的查詢餘額和檢視區塊數

另外說明一點,節點挖礦的以太幣會自動存入到eth.coinbase賬戶裡,預設是eth.accounts裡的第一個,你也可以自己指定coinbase

  • 停止挖礦
miner.stop()

  • 檢視賬戶餘額

eth.getBalance

eth.accounts[0]得到的是賬戶地址而已,你可能被這麼大的數值嚇一跳,怎麼這麼多以太幣?一個以太幣等於10的18次方個wei,這裡的數值是wei的個數,顯示以太幣的個數,可以用下面的命令,405個以太幣,如果是真的,簡直不要太爽,以太坊創始人V神以前肯定也在家裡這麼偷偷的挖了不少


  • 檢視區塊數
eth.blockNumber

81個區塊,一個區塊獎勵5個以太幣

  • 指定coinbase賬戶

先建立第二個賬戶,然後把第二個賬戶指定為coinbase,修改之前和修改之後已經改變


  • 轉賬

先建立第三個沒有幣的賬戶,從賬戶1轉5個比特幣到賬戶3裡,有的同學會問,不是有個賬戶2嗎,你怎麼不用呢?因為轉賬發起了交易,然而發起交易僅僅是發起交易,交易要被確認需要打包進區塊裡,挖礦就是做這個的,挖礦本身的收益會存進coinbase賬戶裡,而現在coinbase賬戶是賬戶2,所以不考慮賬戶2


再檢視coinbase賬戶2的餘額,不僅挖礦獎勵,連交易費都收了哦


  • 退出

exit


驗證私鏈

寫了這麼多,一頓操作猛如虎,這個私鏈到底能不能用?

我們用remix驗證一樣,連線這個私鏈





賬戶和餘額資訊會顯示出來,如果你的工具找不到你的私鏈,請確認啟動節點的引數中,有沒有設定 --rpccorsdomain "*" 

單節點就寫到這裡,下面是多節點的內容

2.windows多節點

我們在上面已經建立了一個節點了,下面我們直接建立第二個節點,然後連線兩個節點,第二個節點的建立要滿足下面條件

  • 創世區塊的資訊得一樣
就是要用一樣的.json配置檔案初始化,因為區塊鏈的本質就是所有節點記錄的賬本都是一樣的,所以第一個區塊的資料也得一致
  • 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.祝好運!