Ubuntu 搭建以太坊私有链

非常感谢Mentor的指导,避免我踩了很多坑...

准备工作

目标

在虚拟机内安装ubutnu 16.04 或者 18.04都可以。因为要求需要局域网下搭建一个私链,所以虚拟机的网络适配器设置为桥接模式,开机后根据宿主机的ip、子网掩码、DNS服务器和网关进行设置,设置好后要求在每个主机都能够项目ping通。

安装GO语言环境

  • 下载linux下的go的安装包

    wget https://studygolang.com/dl/golang/go1.10.3.linux-amd64.tar.gz
  • 下载完成后,进入到下载目录,并将其解压到 /usr/local文件夹下

    sudo tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz
  • 配置环境变量

使用下边命令打开环境配置文件

sudo vim ~/.bashrc

将下边的代码复制粘贴到文件的末尾,并wq命令保存退出

export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOBIN

输入如下命令使环境变量生效,不要加 sudo

source ~/.bashrc

至此go语言环境已经安装完成,可以输入 go version查看

安装以太坊客户端

记得换源,不然下载速度超级慢

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

在命令行输入 geth version 如果显示版本号的话就证明安装以太坊平台成功

搭建以太坊私有链

本文以下步骤在每台电脑上都执行

创世区块配置

新建一个文件夹,用来保存私有链的数据。创建一个创世块的配置文件,这个文件格式是json格式的,要求每个节点的创始区块一致。

mkdir Mychain
cd Mychain
vim genesis.json

然后将下边的配置信息复制到genesis.json文件中

{
  "config": {
        "chainId": 666,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },  
  "alloc"      : {}, 
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x20000",
  "extraData"  : "", 
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}

创世块配置详解

创世块根据配置用途可分为三大类:

  • 链的配置

config是链的配置,会影响共识协议,新块的出块规则都依赖于该配置。

  • 创始区块的头部信息

    • nonce : 一个64位的随机数,用于挖矿
    • timestamp: UTC时间戳
    • mixshash:与nonce配合用于挖矿,由上一个区块的一部分生成的hash
    • difficulty: 设置当前区块的难度,如果难度过大,cpu挖矿就很难。
    • parentHash: 上一个区块的hash值,因为是创世块,所以这个值是0
    • coinbase: 矿工的账号
    • gasLimit: 值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大
    • extraData:额外的数据
  • 初始账户的资产配置

    • alloc 项是创世中初始账户资产配置。在生成创世区块时,将此数据集中的账户资产写入区块中,相当于预挖矿。这对开发测试和私有链非常好用,不需要挖矿就可以直接为任意多个账户分配资产。

初始化创世块

geth --datadir ./data/00 init genesis.json

datadir是生成创始块放在的目录,从上条命令可以看出我们把初始化生成的文件放在当前目录下的data/00下。

启动私有链节点

geth --datadir ./data/00 --nodiscover --networkid 666 --netrestrict 172.16.0.0/16  console

geth的命令参数可以参考这个博客

启动后你可能会看到log信息,看到Welcome to the Geth JavaScript console!就成功进入到gethconsole,在这里就可以使用geth提供的API。

至此,以太坊私有链环境已经搭好,接下来进行把其他节点连接进来。

连接其他节点

创建账户

console模式下创建账户,执行下边命令

personal.newAccount("密码")

按回车后返回账户的地址。

连接其他用户

console模式下执行下边命令,查看自己节点的信息。

admin.nodeInfo

会显示下面的json

{
  enode: "enode://104ad4c6bcba6806766b359234eb18a871dec3e6a5a7293b45ce3ad323a4b26d78ab7b392aa361493663e1e6637687f5a9e1e4e2bc8f495f0e1cb048986c7a52@127.0.0.1:30303?discport=0",
  enr: "enr:-JC4QNVfhjDkJYLtUHn7foCjMLa4L6B4PWVw6jnrC6nigFDNGAUSGM33radU0hPVjIcWez73xTQUZXZxmGpbooaEWt0Dg2V0aMfGhHEB0w2AgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQIQStTGvLpoBnZrNZI06xiocd7D5qWnKTtFzjrTI6SybYN0Y3CCdl8",
  id: "31f5433bf253056417efb4b924deee1580c998ff8c20fcf0d6404265520c2d64",
  ip: "127.0.0.1",
  listenAddr: "[::]:30303",
  name: "Geth/v1.9.1-stable-b7b2f60f/linux-amd64/go1.11.5",
  ports: {
    discovery: 0,
    listener: 30303
  },
  protocols: {
    eth: {
      config: {
        chainId: 666,
        eip150Hash: "0x0000000000000000000000000000000000000000000000000000000000000000",
        eip155Block: 0,
        eip158Block: 0,
        homesteadBlock: 0
      },
      difficulty: 131072,
      genesis: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
      head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
      network: 666
    }
  }
}

找到其中的enode字段,在其他电脑上的console模式下执行

admin.addPeer("enode://814c8627d1e65dfab99806ff3cc05f27301ec02abe65c848fda88ec225cba760a88a7c029cad687c0fca4365788bc82dc8d85fe73ed677bdaa8701f8cd631ad3@ip:30303?discport=0")

执行之前,把encode里边ip改为自己本机真实的ipv4地址,每台电脑上都需要相互执行addPeer,这样就把每个节点连接起来了。

连接后可以执行net.peerCount查看网络里有多少个节点。

至此,我们成功地在局域网下搭建一个私链,并把每个节点加到链上了。

无论你犯了多少错,或者进步得有多慢,你都走在了那些不曾尝试的人的前面

文章名: 《Ubuntu 搭建以太坊私有链》
文章链接:http://hrhr7.cn/index.php/archives/18/
联系方式:tensor7@163.com
除特别注明外,文章均为Cupidr原创,转载时请注明本文出处及文章链接
Last modification:July 27th, 2019 at 10:37 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment