美文网首页
Ethereum私有链搭建

Ethereum私有链搭建

作者: 理查德009 | 来源:发表于2018-04-01 13:47 被阅读0次

    1. 环境准备

    2. 开始搭建

    2.1 准备创世区块文件

    每一条区块链都有一个创世块。当你第一次用geth的默认参数运行一个节点的时候,ethereum主网的创世块就会同步到你本地的数据库。对于私有链,我们通常用一个自定义的创世块,将下面的代码保存至D:\privatechain\genesis.json文件。

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

    2.2 创建创世块

    下面要用上面的genesis.json创建一个创世块。进入D:\privatechain工作空间,运行下面的命令:

    geth --datadir "D:\\privatechain\\book_sharing" init genesis.json
    

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

    2.3 启动bootnode

    2.3.1 什么是bootnode?

    bootnode简化了Ethereum客户端实现,它只参与网络节点发现协议,但不运行任何高级应用程序协议。它可以用作轻量级的引导节点,以帮助在私有网络中找到对等点。
    总而言之,就是一个用于节点发现或者说节点引导的轻量节点,方便联盟链的搭建~

    bootnode的可执行文件和geth处于同一目录下,前面配置了系统环境变量的话就可以全局用bootnode命令了。

    2.3.2 启动bootnode

    先生成一个key,生成之后下次启动bootnode就不用再特意生成key了,直接用已有的key

    bootnode --genkey=boot.key
    

    然后指定nodekey来启动bootnode:

    bootnode --nodekey=boot.key
    

    上面的命令运行完,会打印出类似下面的log:

    INFO [03-17|13:40:29] UDP listener up                          self=enode://b4c360879ca11b222ac910136f3fbd3939a376b346aad1fdf1f825bd35864835f163290957b68aab95888916dcba43cafa74809a56b2373a467cc1ac562f6ff9@0.0.0.0:30301
    

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

    2.4 启动节点

    geth --identity "richard" --rpc --rpcport "8545" --datadir book_sharing --port "30303"  --bootnodes "enode://b4c360879ca11b222ac910136f3fbd3939a376b346aad1fdf1f825bd35864835f163290957b68aab95888916dcba43cafa74809a56b2373a467cc1ac562f6ff9@10.222.49.22:30301" --networkid="1024" --rpccorsdomain="*" console 2>>richard.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.5 加入已有私链(组成联盟链)

    如果有已知节点在跑着了,我们想加进去它所在的网络,那该怎么办?首先明确一点:

    Connections between nodes are valid only if peers have identical protocol version and network ID. 节点间要建立有效连接,当且仅当节点间有着相同版本的协议和网络ID。

    问题来了,怎么查看节点的协议版本和网络ID?在节点交互模式中, 输入下面命令:

    admin.nodeInfo.protocols
    

    可以看到输出:

    {
      eth: {
        difficulty: 381952414,
        genesis: "0xb240e0678c2a8f87cf350225b528e3d97688aad6d4d84ee84e405c7fc9e37e4e",
        head: "0xaef4be11304786d60302570aa2c53bb5b5bea21b6204a6f52d9bcfb618e66811",
        network: 1024
      }
    }
    

    其中networkid是我们启动节点的时候参数--networkid=1024指定的,那genesis和head怎么指定呢?答案就是:使用相同的genesis.json文件初始化区块链!

    所以,要想加入已有私链,首先拿到同样的genesis.json创建创世块,然后使用相同的networkid启动节点。

    当准备好相同的创世块,就可以申请加入已有网络啦。这里列举两种方式:

      1. 通过指定相同的bootnode:
    geth --identity "richard1" --rpc --rpcport "8545" --datadir book_sharing --port "30303"  --bootnodes "enode://b4c360879ca11b222ac910136f3fbd3939a376b346aad1fdf1f825bd35864835f163290957b68aab95888916dcba43cafa74809a56b2373a467cc1ac562f6ff9@10.222.49.22:30301" --networkid="1024" --rpccorsdomain="*" console 2>>richard1.log
    

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

    admin.peers
    

    结果:

    [{
        caps: ["eth/62", "eth/63"],
        id: "c9c20dca4374f3605a2015dd53fbddd1ebacfb13c124870971b767a972b4970342a339818cb5affed25321261126b6936c39437df96978cb3bef3305d8d481e0",
        name: "Geth/richard1/v1.7.3-stable-4bb3c89d/windows-amd64/go1.9",
        network: {
          localAddress: "10.222.49.22:30304",
          remoteAddress: "10.222.49.22:49469"
        },
        protocols: {
          eth: {
            difficulty: 381952414,
            head: "0xaef4be11304786d60302570aa2c53bb5b5bea21b6204a6f52d9bcfb618e66811",
            version: 63
          }
        }
    }]
    

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

      1. 手动添加节点

    首先,要得到你准备要握手的节点的信息:

    admin.nodeInfo.enode
    

    结果:

    enode://d2376964a9e24afec972d9b694dcf3574b171a1517b486532ee7b9e488503f46f97b6c1cc6bf55c9309ceab4fa7bb05427e7a213bb3efa43beeac5dae580ae12@0.0.0.0:30304
    

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

    admin.addPeer("enode://d2376964a9e24afec972d9b694dcf3574b171a1517b486532ee7b9e488503f46f97b6c1cc6bf55c9309ceab4fa7bb05427e7a213bb3efa43beeac5dae580ae12@0.0.0.0:30303");
    

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

    至此,搭建完毕!

    相关文章

      网友评论

          本文标题:Ethereum私有链搭建

          本文链接:https://www.haomeiwen.com/subject/cbgocftx.html