看黎跃春写得教程的笔记3-以太坊私链

私有链能够免去测试过程的消费, 不用同步庞大数据库, 非常方便.

安装私有链工具集

  1. 没有安装 HomeBrew 的同学:

    /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  2. 没有安装 golang 的同学:

    brew install go

  3. 没有安装 Geth 的同学:

推荐到 https://geth.ethereum.org/downloads/ 找到自己对应的系统, 进行下载.

建议在下面 “Stable releases” 中, 找到 “Geth & Tools” 的版本会连工具一同下载免去后面的一些麻烦, 如果有编译好的包, 尽量使用编译好的吧~

如果没有自己平台编译好的, 下载源代码后, 执行 make geth 或者 make all

  1. 安装 Solidity:

    brew install solidity

如果出错 The GitHub credentials in the macOS keychain may be invalid. , 请排查: http://blog.csdn.net/Sico2Sico/article/details/71082130

建立私有链

geth的文档, 可以参考: https://github.com/ethereum/go-ethereum/

geth --networkid 1224 --dev --datadir datadev --rpc --rpcaddr 192.168.1.5 --rpcport 22001 --port 3001 --nodiscover
  • –identity:指定节点 ID;
  • –rpc:表示开启 HTTP-RPC 服务;
  • –rpcaddr:HTTP-RPC 服务ip地址;
  • –rpcport:指定 HTTP-RPC 服务监听端口号(默认为 8545);
  • –datadir:指定区块链数据的存储位置;
  • –port:指定和其他节点连接所用的端口号(默认为 30303);
  • –nodiscover:关闭节点发现机制,防止加入有同样初始配置的陌生节点。

连接私有链

在 datadev 目录下, 可以看到 geth, keystore 文件夹和 geth.ipc 文件.

使用命令行 geth attach geth.ipc 进入区块链交互环境

  • eth:包含一些跟操作区块链相关的方法
  • net:包含一些查看p2p网络状态的方法
  • admin:包含一些与管理节点相关的方法
  • miner:包含启动&停止挖矿的一些方法
  • personal:主要包含一些管理账户的方法
  • txpool:包含一些查看交易内存池的方法
  • web3:包含了以上对象,还包含一些单位换算的方法, 参考Web3

具体对私有链的操作, 参考原文: http://liyuechun.org/2017/10/14/eth-private-blockchain/

单机多节点

单机多节点, 就需要使用不同路径存储数据, 使用不同端口进行监听访问.

geth --networkid 1224 --dev --datadir datadev1 --rpc --rpcaddr 192.168.31.143 --rpcport 32001 --port 3001 --nodiscover
geth --networkid 1224 --dev --datadir datadev2 --rpc --rpcaddr 192.168.31.143 --rpcport 32002 --port 3002 --nodiscover

节点1查看节点信息: admin.nodeInfo.enode

节点2添加节点1地址组网: admin.addPeer(“enode://verify_long_hash_string@[::]:3001”)

查看节点连接情况: admin.peers 或者 web3.net.peerCount

注意, 经过多次测试, 无法组网成功, 网上有人说要使用相同的 genesis.json, 本部分不使用 genesis.json 文件暂时没有测试通过.

经查看, --dev 会使用一个默认的配置生成钱包, 开启自动挖矿, 查看了两个节点的 admin.nodeInfo , 发现两节点的 “genesis” 并不相同, “head” 值也不同. 估计是使用 --dev 生成了不同起始区块造成组网失败.

多机多节点

与单机多节点基本相同, 但是可以选择使用相同端口.

创世快初始化区块链

genesis.json 文件:

{
  "config": {
        "chainId": 10,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {
    "0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82": {
        "balance": "0x493e0"
    },
    "0xf41c74c9ae680c1aa78f42e5647a62f353b7bdde": {
        "balance": "0x61a80"
    }
  },
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x0200",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}

设置中出现问题, 参考: https://blog.csdn.net/superswords/article/details/75049323

各个参数含义: https://ethereum.stackexchange.com/questions/2376/what-does-each-genesis-json-parameter-mean

geth init path/to/genesis.json --datadir datadev1

详细内容参考: https://github.com/ethereum/go-ethereum/

geth --networkid 1224 --datadir datadev1 --rpc --rpcaddr 192.168.31.143 --rpcport 32001 --port 3001 --nodiscover

注意1, 此处不能再使用上面的 --dev 了, 因为 –dev 就是会使用默认的 genesis 配置初始化, 与我们预先初始化的有冲突, 否则报错如下:

Fatal: Error starting protocol stack: database already contains an incompatible genesis block

参考: https://gitter.im/ethereum/go-ethereum/archives/2017/09/21 的聊天记录.

注意2, 此处如果不加 --nodiscover 则会连接全球的网络, 不是私网;
这样情况下无法通过手动 admin.addPeer() 来增加节点, 普通情况不报错, 使用 --verbosity 10 会看到
too many peers 错误:

DEBUG[03-28|09:51:50] Adding static node                       node="enode://very_long_id@[::]:50280?discport=0"
TRACE[03-28|09:51:50] New dial task                            task="staticdial e4d42036598fb85d :::50280"
TRACE[03-28|09:51:50] Failed proto handshake                   id=e4d42036598fb85d addr=[::1]:50280 conn=staticdial err="too many peers"
TRACE[03-28|09:51:50] Setting up connection failed             id=e4d42036598fb85d err="too many peers"
TRACE[03-28|09:51:50] Dial error                               task="staticdial e4d42036598fb85d :::50280" err="too many peers"
TRACE[03-28|09:51:50] Dial task done                           task="staticdial e4d42036598fb85d :::50280"
TRACE[03-28|09:51:50] New dial task                            task="wait for dial hist expire (29.999989929s)"
DEBUG[03-28|09:51:50] Recalculated downloader QoS values       rtt=20s confidence=1.000 ttl=1m0s
DEBUG[03-28|09:52:10] Recalculated downloader QoS values       rtt=20s confidence=1.000 ttl=1m0s
TRACE[03-28|09:52:20] Dial task done                           task="wait for dial hist expire (29.999989929s)"
...

注意3, 网上说集群节点初始化的时候要使用相同的 genesis.json 文件.

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.