1. 程式人生 > >Ubuntu下Geth客戶端搭建私有網路叢集

Ubuntu下Geth客戶端搭建私有網路叢集

本篇部落格主要介紹一下在一臺機器上建立多個節點,並且把節點連線在一起形成一個叢集的方法筆記,以及配置時遇到的一些問題。
本文基於Ubuntu14.04 和 Geth 1.4.5-stable

建立一個私有節點時常用引數:

--nodiscover 使用這個引數,你的節點就不會被其他人發現,除非手動新增你的節點。否則,就只有一個被無意新增到一個陌生區塊鏈上的可能,那就是跟你有相同的genesis檔案和networkID。
--maxpeers 0 如果你不想有人連上你的測試鏈,就用maxpeers 0。或者,你可以調整引數,當你確切的知道有幾個節點要連線上來的時候。
--rpc 允許RPC操作你的節點。這個引數在Geth
上是預設的。
--rpcapi "db,eth,net,web3" 這個命令指示了允許通過RPC訪問的命令。預設情況下,Geth允許web3。 --rpcport "8080" --rpccorsdomain "http://chriseth.github.io/browser-solidity/" --datadir "/home/etherTest" 私有鏈存放路徑(最好跟公有鏈路徑不同) --port "30303" 網路監聽埠,用來和其他節點手動連線 --identity “yooliee" 用來標識你的節點的,方便在一大群節點中識別出自己的節點 --networkid 1990 你自己的私有網路的id號
--rpccorsdomain "http://chriseth.github.io/browser-solidity/" 指定可以遠端訪問你的節點的URL, 值為"*"時是指任何地方都可以遠端訪問(避免使用*)

本地建立多個節點

為了能在本地建立多個節點,你必須確保:

  • 每個節點所在路徑不同(–datadir的值不同)
  • 每個節點執行在不同的埠上(包括eth和rpc) (–port和–rpcport不同)
  • ipc端點是唯一的或者禁用ipc介面(–ipcpath唯一或者–ipcdisable

為了建立一個本地叢集,除了上面幾個引數值不同以外,必須確保–networkid相同,即節點是屬於同一個網路;創世區塊相同、叢集中的節點必須知道彼此。本測試建立三個節點,然後三個節點彼此相連,形成一個叢集。

首先,建立一個資料夾,用來存放三個節點:

mkdir ether

所有節點的genesis.json檔案必須相同:

{
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x0",
  "gasLimit": "0x80000000",
  "difficulty": "0x1",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {     }
}

建立第一個節點:

# 在ether目錄下建立第一個目錄,然後把上面的genesis.json檔案複製到此目錄下
$ cd ether
$ mkdir 01 && cd 01
# 用genesis.json生成創世區塊
$ geth --datadir ~/ether/01 init genesis.json
# 此時01目錄中生成了chaindata目錄,裡面就是存放區塊鏈資料的地方
# 啟動第一個節點
$ geth --identity "test" --rpc --rpccorsdomain "*" --datadir ~/ether/01 --port "30301" --nodiscover --rpcport 8101 --rpcapi "db,eth,net,web3" --networkid 1998 console 2>> ~/ether/01/geth.log

此時第一個節點啟動成功了,可以通過eth.getBlock(0),檢視創世區塊資訊,如下:

> eth.getBlock(0)
{
  difficulty: 1,
  extraData: "0x00",
  gasLimit: 2147483648,
  gasUsed: 0,
  hash: "0x6099b65e564bd511f49e8f39ba27b6a68b6b78fd1481592257f06bbf93abe624",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x3333333333333333333333333333333333333333",
  nonce: "0x0000000000000042",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  receiptRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 505,
  stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  timestamp: 0,
  totalDifficulty: 1,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}

通過admin.nodeInfo檢視此節點的節點資訊:

> admin.nodeInfo
{
  enode: "enode://2f86dbb18242371fa0a8e7098cb13a012ad9d8ee80f0bbba94a798b16d3c6c3c2[email protected][::]:30301?discport=0",
  id: "2f86dbb18242371fa0a8e7098cb13a012ad9d8ee80f0bbba94a798b16d3c6c3c247d3e333b8da27a591b38365f927a25359376d4bf38575bb0371a1365294f91",
  ip: "::",
  listenAddr: "[::]:30301",
  name: "Geth/v1.4.5-stable-a269a713/linux/go1.4.2/test",
  ports: {
    discovery: 0,
    listener: 30301
  },
  protocols: {
    eth: {
      difficulty: 13919423,
      genesis: "0x6099b65e564bd511f49e8f39ba27b6a68b6b78fd1481592257f06bbf93abe624",
      head: "0xdf1d69ee935ac6091eecf8a0f495f9dcdb644445feb265ea11f961ff9f5b45b5",
      network: 1998
    }
  }
}

當連線同一個網路中的其他節點時,使用的就是上面的第一個欄位enode的值,注意一下。

建立第二個節點

# 在ether目錄下建立第二個目錄,然後把上面的genesis.json檔案複製到此目錄下
$ cd ether
$ mkdir 02 && cd 02
# 用genesis.json生成創世區塊
$ geth --datadir ~/ether/02 init genesis.json
# 此時02目錄中生成了chaindata目錄,裡面就是存放區塊鏈資料的地方
# 啟動第二個節點
$ geth --identity "test" --rpc --rpccorsdomain "*" --datadir ~/ether/02 --port "30302" --nodiscover --rpcport 8102 --rpcapi "db,eth,net,web3" --networkid 1998 console 2>> ~/ether/02/geth.log

同樣,第二個節點成功啟動,可以通過eth.getBlock(0)檢視區塊資訊:

> eth.getBlock(0)
{
  difficulty: 1,
  extraData: "0x00",
  gasLimit: 2147483648,
  gasUsed: 0,
  hash: "0x6099b65e564bd511f49e8f39ba27b6a68b6b78fd1481592257f06bbf93abe624",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x3333333333333333333333333333333333333333",
  nonce: "0x0000000000000042",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  receiptRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 505,
  stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  timestamp: 0,
  totalDifficulty: 1,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}

可以發現,02下的創世區塊資訊和01下的創世區塊資訊完全一樣,因為是由同一個genesis.json生成,同一個網路中的創世區塊也必須相同。

現在,已經建立好了兩個節點,但是它們都還不知道彼此,兩個節點是相對獨立的存在。接下來,我們把兩個節點連線起來:

# 在02節點的控制檯裡通過admin.addPeer(enodeUrlOfFirstInstance)新增第一個節點的資訊,使節點1和節點2相連。
>admin.addPeer("enode://2f86dbb18242371fa0a8e7098cb13a012ad9d8ee80f0bbba94a798b16d3c6c3c2[email protected][::]:30301?discport=0")
> net.peerCount  #檢測有沒有連線的節點
1
> admin.peers   #檢視連在02節點上的節點資訊,可以看見id就是之前的01節點的id
[{
    caps: ["eth/61", "eth/62", "eth/63"],
    id: "2f86dbb18242371fa0a8e7098cb13a012ad9d8ee80f0bbba94a798b16d3c6c3c247d3e333b8da27a591b38365f927a25359376d4bf38575bb0371a1365294f91",
    name: "Geth/v1.4.5-stable-a269a713/linux/go1.4.2/test",
    network: {
      localAddress: "[::1]:36114",
      remoteAddress: "[::1]:30301"
    },
    protocols: {
      eth: {
        difficulty: 13919423,
        head: "df1d69ee935ac6091eecf8a0f495f9dcdb644445feb265ea11f961ff9f5b45b5",
        version: 63
      }
    }
}]

同理,建立第三個節點

# 在ether目錄下建立第三個目錄,然後把上面的genesis.json檔案複製到此目錄下
$ cd ether
$ mkdir 03 && cd 03
# 用genesis.json生成創世區塊
$ geth --datadir ~/ether/03 init genesis.json
# 此時03目錄中生成了chaindata目錄,裡面就是存放區塊鏈資料的地方
# 啟動第三個節點
$ geth --identity "test" --rpc --rpccorsdomain "*" --datadir ~/ether/03 --port "30303" --nodiscover --rpcport 8103 --rpcapi "db,eth,net,web3" --networkid 1998 console 2>> ~/ether/03/geth.log

然後在啟動的控制檯裡面新增第一個節點:

> admin.addPeer("enode://2f86dbb18242371fa0a8e7098cb13a012ad9d8ee80f0bbba94a798b16d3c6c3c2[email protected][::]:30301?discport=0")
true
> net.peerCount
1

此時03節點添加了01節點,02節點添加了01節點,在01控制檯中輸入:

> net.peerCount
2

可以看見01節點現在有兩個節點跟它相連。現在,三個節點相連,形成了一個小的叢集,任意一個節點挖礦,挖到區塊之後,都會同步到其他的兩個節點。

以上是正確配置叢集時用的方法,如果genesis.json檔案不相同或者networkid不相同時,都不能新增成功。genesis.json不同,將會生成不一樣的創世區塊,networkid不同就是兩個不同的網路,自然就不能新增成功。

在一臺電腦上建立多個節點,然後把多個節點連線起來形成一個叢集網路是成功的。但是,現在我想在Windows下,同樣用geth客戶端,同樣的genesis.json檔案,最後在控制檯下檢視創世區塊時跟上面的一樣,但是在新增節點時總是失敗的,沒有新增成功,不知道為什麼(Windows下geth節點連線上面在Ubuntu下建立的叢集)。哪位大神知道原因的幫忙的留個言,謝謝分享。

相關推薦

UbuntuGeth客戶搭建私有網路叢集

本篇部落格主要介紹一下在一臺機器上建立多個節點,並且把節點連線在一起形成一個叢集的方法筆記,以及配置時遇到的一些問題。 本文基於Ubuntu14.04 和 Geth 1.4.5-stable 建立一個私有節點時常用引數: --nodiscover 使用

UbuntuSVN客戶的安裝與配置

6、 刪 除 文 件 , 例 如 : svn delete svn://192.168.100.249/server/common/test.c -m “delete test file” 。 7、 如果哪個命令不會使用可以通過輸入:svn help 命令 的形式來檢視幫助資訊,例如:      sv

VirtualBox Centos6.10+Hadoop2.6叢集搭建 Windows客戶搭建

1 Centos下載安裝 Centos映象下載地址https://www.centos.org/download/ 我選擇的是DVD版本 在VitrualBox裡面新建一個虛擬機器 硬碟給了10G,其他屬性預設,開機,選擇啟動盤,把下載好的映象放入,開始安裝 趁

區塊鏈實踐(一) 以太坊網路+geth搭建私有網路實戰

一、乙太網網路 理解以太坊 PrivateNetwork 先要理解以太坊的兩種官方網路, 目前以太坊官方提供了兩種網 生產環境網路 測試網路 TestNet ** 1 以太坊生產網路 以太坊的生產網路顧名思義,也就是產生真正有價值的 的以太幣的網路

ubuntu(服務)+windows(客戶)搭建iscsi

需要實現多個客戶端(windows平臺)通過網線讀寫一個磁碟陣列,就是網路儲存的概念 2016.3.3修正:ISCSI僅是一種協議,提供高速連線,要實現資料同步還需要相應的檔案系統支援(GFS, O

ubuntu SVN 服務器搭建及使用

root version use packages ups mar 運行 登錄 file 1.安裝Subversion ServerSubversion server binaries maintained by the Ubuntu Project. Packages i

openvpn 服務器和客戶搭建和配置

window linux openvpn1, 搭建環境: 電腦A : win7 64bit, 作為openvpn server 網上下載openvpn安裝包,直接安裝。 網口1, 有線網絡,可以訪問外網

Win7Git服務搭建

命令行 tps java應用程序 java xxx tor config 初始 tin 1. 安裝jdk-8u172-windows-x64.exe,使用缺省設置安裝   兩個JRE:   C:\Program Files\Java\jdk1.8.0_172\jre :

Linuxl2tp客戶配置並解決pppd斷線問題

不為 dead minutes 根據 1.4 安裝 signal 未能 請求 1.安裝客戶端軟件使用xl2tpd,pppyum install -y xl2tpd ppp 2.配置xl2tpd vim /etc/xl2tpd/xl2tpd.conf 最下方追加下面代碼 [l

cas單點登錄服務客戶搭建

tool 配置https ip訪問 ads 地址 問題 安全證書 pool ash jdk1.6 apache-tomcat-7 cas-server-webapp-4.0.0.war、cas-client-core-3.2.1.jar (1)cas服務端 一、.修改h

LINUXmysql客戶不能輸入中文

自己 很多 輸入中文 sql linu 如果 lan 自帶 linux 今天遇到了這個問題,在LINUX下輸入中文,沒有問題,但在MYSQL客戶端上無法輸入中文,很奇怪? 找了很多資料終於解決了這個問題,其實這個和字符集無關。通常出現在自己編譯的mysql版本上,如果是

Linux實現客戶兩連跳ping百度,修改dns和nmcil的用法

1.客戶端跳兩次路由器ping百度 rht vmctl reset 重置虛擬機器 真機和虛擬機器開啟火牆策略 用在配置網路單元學的修改兩機閘道器 設定server為雙網絡卡路由端接觸客戶端Desktop閘道器為1.1.1.100 路由器端設定GATEWAY為真機,記得syste

ubuntu使用ssh客戶

ubuntu自帶的有openssh-client,所以可以通過 1      ssh [email protected] 來遠端連線linux 可是要想通過ssh被連線,ubuntu系統需要有openssh-server,可以通過 1  &n

CentOS7使用 Seafile安裝搭建私有云盤

一、系統環境 二、安裝seafile 三、設定防火牆、selinux 設定SELinux[[email protected] ~]#vi /etc/selinux/config將SELINUX=enforcing改為SELINUX=disabled使selinux立即生效[[email&#

SpringCloud原始碼分析(一)--客戶搭建

一、前言 上一節的註冊中心搭建完成了,本節開始搭建客戶端,其實對於springcloud的Eureka註冊中心而言,他本身就是服務端也是客戶端,我們上節待見服務端註冊中心的時候,已經通過配置來設定其不向自己註冊,和不去檢索服務的功能,保持了其作為服務註冊中心的相對的功能單一性。 二、pom檔案

SpringCloud源碼分析(一)--客戶搭建

cati service sco 分享 project 功能單 ice utf work 一、前言 上一節的註冊中心搭建完成了,本節開始搭建客戶端,其實對於springcloud的Eureka註冊中心而言,他本身就是服務端也是客戶端,我們上節待見服務端註冊中心的時候,已經通

ubuntuzephyr開發環境搭建以及移植到iMX.7S的M4核心的過程

zephyr開發環境搭建 首先介紹如何在ubuntu16.04 Desktop環境下搭建Zephyr開發環境。構建Zephyr開發環境除了需要正確獲取Zephyr原始碼和Zephyr SDK,還需要正確安裝python3、cmake和git等工具。 更新軟體源 sudo apt-get

SpringCloud 2.0(二)——Eureka客戶搭建

上一篇:SpringCloud 2.0(一)——註冊中心Eureka搭建 這一節,我們基於SpringBoot搭建一個服務的提供方,然後註冊到上一節中我們搭建的Eureka註冊中心。還是跟上一篇一樣,去Spring的官網搜尋對應的Eureka Discovery依賴,如下圖:因

ubuntutensorflow的環境搭建

ubuntu下tensorflow的環境搭建 官網參考文件地址:https://www.tensorflow.org/install/,由於博主用的是ubuntu 14.04,因此以Ubuntu為例,進行說明,其他OS請參考上面給出的連結。 提示:最好別用window