私有链能够免去测试过程的消费, 不用同步庞大数据库, 非常方便.
安装私有链工具集
没有安装 HomeBrew 的同学:
/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
没有安装 golang 的同学:
brew install go
没有安装 Geth 的同学:
推荐到 https://geth.ethereum.org/downloads/ 找到自己对应的系统, 进行下载.
建议在下面 “Stable releases” 中, 找到 “Geth & Tools” 的版本会连工具一同下载免去后面的一些麻烦, 如果有编译好的包, 尽量使用编译好的吧~
如果没有自己平台编译好的, 下载源代码后, 执行 make geth
或者 make all
安装 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 文件.