以太坊通过bootnode多节点连接,包含一个云主机

下面将要创建3个节点,节点1和2在本地主机,节点3在云主机

1.准备创世区块文件

{
  "config": {
    "chainID": 1024,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
  "alloc": {},
  "coinbase": "0x0000000000000000000000000000000000000000",
  "difficulty": "0x0400",
  "extraData": "0x00",
  "gasLimit": "0x2100000",
  "nonce": "0x0000000000000042",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp": "0x00"
}

1.2 创建创世块
下面要用上面的genesis.json创建一个创世块。运行下面的命令分别创建三个相同创世块,指定不同目录。
本地主机:
geth --datadir "date0" init genesis.json
geth --datadir "date1" init genesis.json
云主机:
geth --datadir "date2" init genesis.json

以后就用上面的数据库文件夹启动节点。

2.1 启动bootnode
2.1.1 什么是bootnode?
bootnode简化了Ethereum客户端实现,它只参与网络节点发现协议,但不运行任何高级应用程序协议。它可以用作轻量级的引导节点,以帮助在私有网络中找到对等点。
总而言之,就是一个用于节点发现或者说节点引导的轻量节点,方便联盟链的搭建~
bootnode的可执行文件和geth处于同一目录下,前面配置了系统环境变量的话就可以全局用bootnode命令了。
2.1.2 启动bootnode
先生成一个key,生成之后下次启动bootnode就不用再特意生成key了,直接用已有的key
bootnode --genkey=boot.key
然后指定nodekey来启动bootnode:
bootnode -addr=172.16.5.205:30301 --nodekey=boot.key
上面的命令运行完,会打印出类似下面的log:

enode://6c85f006a00960cc2c2c2dce10a47766ab7bd7fc854c45dd7ff89573dc4b55adf18e323edf0c0d0b2b184af773c7b126df8f8cd5a46e7d1e131003586e2b2a2c@172.16.5.205:0?discport=30301

encode后面的这么一长串东西,就是这个节点的ID信息,下面启动geth节点的时候要指定连接这个bootnode~

2.2 启动节点 0

geth --networkid="1024" --identity "zhangsan" --rpc --rpcport "8545" --datadir data0 --port "30303" --rpcaddr 172.16.5.205 --bootnodes "enode://6c85f006a00960cc2c2c2dce10a47766ab7bd7fc854c45dd7ff89573dc4b55adf18e323edf0c0d0b2b184af773c7b126df8f8cd5a46e7d1e131003586e2b2a2c@172.16.5.205:30301" --rpccorsdomain="*" console 2>>zhangsan.log

注意到,我们把bootnode里面的0.0.0.0改成了bootnode所在机器的IP地址,如果其他机子要起节点的时候才能找到我们起的bootnode。
上面的命令的主体是geth console,这个命令就启动了一个节点并进入到它的交互模式,可以调用相应的API查看这条私链上的所有信息。输入exit命令,退出且节点就不再运行。下面尝试解释一下其他参数的含义,具体可以运行geth --help查看。

选项 解释
identity 自定义节点的名字,方便节点中互相辨认识别
rpc 启用HTTP-RPC服务器
rpcport HTTP-RPC服务器监听端口(默认值:8545)
datadir 数据库目录
port 网络监听端口(默认值:30303)
bootnodes 逗号分隔的enode url,用于P2P发现引导
networkid 网络标识符(整型, 1=Frontier, 2=Morden (弃用), 3=Ropsten, 4=Rinkeby) (默认: 1)
rpccorsdomain 允许跨域请求的域名列表(逗号分隔),这里的*允许所有主机连接,不建议这么写,可以指定具体例如:http://10.222.49.22:3000, http://10.222.49.22:3001

2.3 加入已有私链(组成联盟链)
如果有已知节点在跑着了,我们想加进去它所在的网络,那该怎么办?首先明确一点:
Connections between nodes are valid only if peers have identical protocol version and network ID. 节点间要建立有效连接,当且仅当节点间有着相同版本的协议和网络ID。
问题来了,怎么查看节点的协议版本和网络ID?在节点交互模式中, 输入下面命令:
admin.nodeInfo.protocols

可以看到输出:

{
  eth: {
    config: {
      chainId: 1024,
      eip150Hash: "0x0000000000000000000000000000000000000000000000000000000000000000",
      eip155Block: 0,
      eip158Block: 0,
      homesteadBlock: 0
    },
    difficulty: 3154880,
    genesis: "0x2a25e92d4ed5cfe7e813c3088612487265f63595dce2443f8b28d6d0988a7f70",
    head: "0xb257b5489876646581da8f97d8fcf79564d77a877003e1f8e79f7e5b95f64513",
    network: 1024
  }
}

其中networkid是我们启动节点的时候参数--networkid=1024指定的,那genesis和head怎么指定呢?答案就是:使用相同的genesis.json文件初始化区块链!
所以,要想加入已有私链,首先拿到同样的genesis.json创建创世块,然后使用相同的networkid启动节点。
当准备好相同的创世块,就可以申请加入已有网络啦。这里列举两种方式:

通过指定相同的bootnode 启动节点 2:

geth --networkid="1024" --identity "lisi" --rpc --rpcport "8546" --datadir data1 --port "30304" --rpcaddr 172.16.5.205 --bootnodes "enode://6c85f006a00960cc2c2c2dce10a47766ab7bd7fc854c45dd7ff89573dc4b55adf18e323edf0c0d0b2b184af773c7b126df8f8cd5a46e7d1e131003586e2b2a2c@172.16.5.205:30301" --rpccorsdomain="*" console 2>>lisi.log

这样就可以和其他节点建立连接啦。起来之后,可以通过命令net.peerCount查看已经建立连接的节点数。要查看更具体的节点连接信息,可以输入:
admin.peers

结果:

[{
    caps: ["eth/63"],
    enode: "enode://103fbfa6133d7efbec4e8cc3132b16a1f342a51570ed2171a12663b9d3d07675884d8dde7ce71a7a3a3bdfab4f9c79596980800096e4f0dc12390f8db7c07f23@172.16.5.205:59618",
    id: "7d1a2e71e4b570b48c8be2324c25cfea1ae6cff59fe85073b0c117af164fb941",
    name: "Geth/lisi/v1.9.1-unstable-25215091-20190711/linux-amd64/go1.10.3",
    network: {
      inbound: true,
      localAddress: "172.16.5.205:30303",
      remoteAddress: "172.16.5.205:59618",
      static: false,
      trusted: false
    },
    protocols: {
      eth: {
        difficulty: 1024,
        head: "0x2a25e92d4ed5cfe7e813c3088612487265f63595dce2443f8b28d6d0988a7f70",
        version: 63
      }
    }
}]

可以看到打印出一个长度为1数组,里面是节点的具体信息。

2.3 云主机节点加入有私链
通过指定相同的bootnode 启动节点 3:

geth --networkid="1024" --identity "aliyun" --rpc  --rpcport "8547" --datadir data2 --port "30305" --bootnodes "enode://6c85f006a00960cc2c2c2dce10a47766ab7bd7fc854c45dd7ff89573dc4b55adf18e323edf0c0d0b2b184af773c7b126df8f8cd5a46e7d1e131003586e2b2a2c@127.0.0.1:1112" --rpccorsdomain="*" console 2>>aliyun.log

注:(由于云主机访问不通本地,需要在xshell中设置转移规则,我设置的 127.0.0.1:1112 ->172.16.5.205:30301)

我这里启动后admin.peers一直未查到连接信息,暂未找到原因
后面通过手动方式添加 成功

手动添加节点
首先,要得到你准备要握手的节点的信息:
admin.nodeInfo.enode

结果:

"enode://59787b1c750610926c1ea5731e6623d781265c655132fcabe2922d1a0648bce1cd80f8ecd6172725549d8695e75a9bb86e300b6bff4eb0f50c198731bad37205@127.0.0.1:30303"

把127.0.0.1改成对方的真实IP,然后回到我们自己的节点手动添加:

admin.addPeer("enode://59787b1c750610926c1ea5731e6623d781265c655132fcabe2922d1a0648bce1cd80f8ecd6172725549d8695e75a9bb86e300b6bff4eb0f50c198731bad37205@127.0.0.1:1113");

注:(由于云主机访问不通本地,需要在xshell中设置转移规则,我设置的 127.0.0.1:1113 ->172.16.5.205:30303)

再输入admin.peers确认是否添加成功。
完成后,任意一个节点挖矿miner.start(),另一个节点都会同步。可以通过eth.blockNumber查看区块链上的区块数量。要停止挖矿,miner.stop()。
至此,搭建完毕!

参考:
https://blog.csdn.net/qq_43701231/article/details/84870889
https://www.jianshu.com/p/1568a8097d7e

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容