透過Geth搭建多節點私有鏈

nt1979發表於2021-09-09

中,介紹了一些區塊鏈前端開發必知必會的基本概念以及區塊鏈前端開發與傳統業務前端開發的區別。這篇開始,我們將進入實戰環節。跟做任何開發一樣,區塊鏈前端開發,首先也要搭建區塊鏈的開發環境。下面將以Windows系統為例進行講解。

下載go1.10.windows-amd64.msi,安裝到C:Go目錄下,並將C:Gobin新增到系統環境變數Path中。

如果你之前裝過go的話,現在再安裝則可能會看到詢問是否解除安裝舊版本的提示。只需要選擇“Yes, Uninstall”繼續安裝即可。

開啟系統控制檯,在其中輸入命令

go version

然後回車執行,如果返回如下資訊,說明Go已經安裝成功:

go version go1.10 windows/amd64

2、安裝Geth

Geth是官方提供的以太坊協議的Go語言實現,是一個以太坊的客戶端,一個命令列工具,透過它可以進行一系列以太坊的操作。

首先從下載Geth 1.8.2 for Windows版本。如果你下載過程中遇到反覆終端連線,無法下載成功的情況,可以嘗試把下載地址複製到迅雷中下載。

然後,將Geth安裝到C:Program FilesGeth目錄下,並將C:Program FilesGeth 新增到系統環境變數path中。

然後到控制檯中執行命令

geth version

看到如下提示,則表示geth安裝成功:

Geth
Version: 1.8.2-stable
Git Commit: b8b9f7f4476a30a0aaf6077daade6ae77f969960
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.9.2
Operating System: windows
GOPATH=
GOROOT=C:Go

 以及 。

執行這個命令後,等待片刻,當你看到如下這樣的提示:

INFO [03-11|11:14:29] Block synchronisation started
INFO [03-11|11:15:01] Imported new block headers               count=0 elapsed=3.976ms number=240  hash=37f92c…39e00c ignored=192
INFO [03-11|11:15:01] Imported new block receipts              count=0 elapsed=0s      number=54   hash=8387c7…c0d90e size=0.00B ignored=6

則表明已經在進行同步了。

預設情況下,在筆者的Windows 10系統中,會同步到C:Users【我的使用者名稱】AppDataRoamingEthereumgethchaindata這個目錄下。如果你看不到AppData這個資料夾,請確認下你有沒有勾選中下圖中所示的“隱藏的專案核取方塊”。

圖片描述

怎麼退出Geth JavaScript Console呢?在控制檯中輸入exit並按回車即可。

因為同步的以太坊的資料比較佔空間,所以我們更改儲存以太坊網路同步資料的位置,改成存在d:ethereum目錄下:

geth --datadir d:ethereum console

其中,–datadir配置的地址指明瞭用來儲存區塊鏈資料庫與keystore的地址,即d:ethereum。

同步的過程中,會不斷出現下圖這樣的區塊同步提示:

圖片描述

表示剛剛將以太坊網路上的哪個區塊同步到了本地。其中,number是區塊號,而hash就是該區塊的hash值。我們拿著這個區塊號到以太坊區塊瀏覽器Etherscan上去瀏覽一下該區塊的資訊,比如,這裡的區塊號是30344,那麼在這個頁面中就可以看到該區塊的詳細資訊,如下圖。

圖片描述

當你同步到的區塊與中顯示的最新區塊的height一樣時,就說明本地節點已經同步到最新狀態了。

2、同步以太坊測試網路上的資料到本機

因為在以太坊主網路進行部署智慧合約、傳送交易等操作是需要花費真實的以太幣的,所以對於開發者來說,更多的除錯和測試工作,不能在主網路上進行(誰的真金白銀花得不心疼?),而應該在測試網路上。測試網路上用的是測試幣(play-Ether),而不是主網路上真正需要真金白銀換來的以太幣。所以,作為開發者,你通常需要同步測試網路上的全節點。透過如下命令來完成:

geth --testnet console

其它操作與同步以太坊主網路上的全節點一樣,不再贅述。

 下載後安裝即可),因為windows自帶的控制檯是不支援bash檔案的執行的。裝好Git Bash,我們就可以透過bash starthttp.shbash startws.sh命令來分別啟動提供HTTP-RPC服務的私有鏈和提供WebSockets-RPC服務的私有鏈,達成簡化啟動命令的目的。

3、新增節點,組成多節點網路

至此,一個單節點的私有鏈網路已經啟動起來。可以透過admin.nodeInfo檢視當前網路節點資訊如下:

{
  enode: "enode://4eaf1ef8fd69bb3669741df19a0bfe58b827da56446b7513901631b95b395797277909be4dbbadc25c343fc4c1ca538319311bcae6d17bd7006bbe8c655fdcdf@[::]:30303",
  id: "4eaf1ef8fd69bb3669741df19a0bfe58b827da56446b7513901631b95b395797277909be4dbbadc25c343fc4c1ca538319311bcae6d17bd7006bbe8c655fdcdf",
  ip: "::",
  listenAddr: "[::]:30303",
  name: "Geth/v1.8.2-stable-b8b9f7f4/windows-amd64/go1.9.2",
  ports: {
    discovery: 30303,
    listener: 30303
  },
  protocols: {
    eth: {
      config: {
        chainId: 1337,
        eip150Hash: "0x0000000000000000000000000000000000000000000000000000000000000000",
        eip155Block: 0,
        eip158Block: 0,
        homesteadBlock: 0
      },
      difficulty: 131072,
      genesis: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
      head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
      network: 23
    }
  }
}

但是,目前只是單節點的網路,如何新增節點,讓它不再是單節點網路呢?

透過如下命令,用上文中建立的同一份創世塊配置檔案初始化另一個目錄(d:/privatechain2)下的創世塊。

geth --datadir d:/privatechain2 init d:/privatechain/genesis.json

我們將d:/starthttp.sh檔案複製一份,命名為starthttp2.sh,同樣放在d:/下。將starthttp2.sh的內容修改為:

#!/bin/bashgeth  --datadir "d:privatechain2" --port 30304 --ipcdisable --networkid 23 --rpc  --rpcaddr "localhost" --rpcport "8546" --rpccorsdomain "*" --rpcapi "db,eth,net,web3" console

即修改了--datadir--rpcport兩個選項的值,新增了--port 30304 --ipcdisable,以免與現有節點相沖突。然後另開一個Git Bash控制檯視窗,我們透過bash starthttp2.sh命令啟動了另一個節點。 再用admin.nodeInfo命令檢視下新節點的資訊,發現與原有節點enode是不一樣的,證明兩個節點確實不同(不過,需要確保兩個節點的protocols資訊是一致的,因為它們必須是基於同一份創世區塊配置產生出來的,才能連線成功,具體需要滿足哪些條件才能連線成功,可以參考)。

{
  enode: "enode://d5e8b09b13ddff0b88e13259e8d764e8ec982e76592f48fc1db11c4829f5d9cabdaaeecf13b5812e216506536b1f8a53068470975650beb86ab46c27718c7cdd@[::]:30304",
  id: "d5e8b09b13ddff0b88e13259e8d764e8ec982e76592f48fc1db11c4829f5d9cabdaaeecf13b5812e216506536b1f8a53068470975650beb86ab46c27718c7cdd",
  ip: "::",
  listenAddr: "[::]:30304",
  name: "Geth/v1.8.2-stable-b8b9f7f4/windows-amd64/go1.9.2",
  ports: {
    discovery: 30304,
    listener: 30304
  },
  protocols: {
    eth: {
      config: {
        chainId: 1337,
        eip150Hash: "0x0000000000000000000000000000000000000000000000000000000000000000",
        eip155Block: 0,
        eip158Block: 0,
        homesteadBlock: 0
      },
      difficulty: 131072,
      genesis: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
      head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
      network: 23
    }
  }
}

接下來我們讓兩個節點連線起來。

在第二個控制檯中用admin.peers檢視一下,發現返回是空陣列。 然後執行:

admin.addPeer("enode://4eaf1ef8fd69bb3669741df19a0bfe58b827da56446b7513901631b95b395797277909be4dbbadc25c343fc4c1ca538319311bcae6d17bd7006bbe8c655fdcdf@[::]:30303")

其中括號內的是第一個節點的節點資訊中的enode的值。

然後再透過amin.peers檢視,可以看到如下內容,表示新增成功:

[{
    caps: ["eth/63"],
    id: "4eaf1ef8fd69bb3669741df19a0bfe58b827da56446b7513901631b95b395797277909be4dbbadc25c343fc4c1ca538319311bcae6d17bd7006bbe8c655fdcdf",
    name: "Geth/v1.8.2-stable-b8b9f7f4/windows-amd64/go1.9.2",
    network: {
    inbound: false,
    localAddress: "127.0.0.1:53792",
    remoteAddress: "127.0.0.1:30303",
    static: true,
    trusted: false
    },
    protocols: {
    eth: {
        difficulty: 131072,
        head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
        version: 63
    }
    }
}]


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4822/viewspace-2800712/,如需轉載,請註明出處,否則將追究法律責任。

相關文章