以太坊私有网络集群搭建

一、安装geth客户端

geth是以太坊的官方客户端,它是一个命令行工具,提供很多命令和选项,可以运行以太坊节点、创建和管理账户、发送交易、挖矿、部署智能合约等。
geth客户端可使用三种方法进行安装:

  • 源码编译安装
  • 直接下载可执行文件

一、源码编译安装

在前面Go语言学习笔记章节中详细介绍了Go语言开发环境的搭建,搭建好Go语言开发环境之后,我使用的是ubuntu系统搭建,通过

git clone https://github.com/ethereum/go-ethereum.git

没有安装git的需要先安装git,Ubuntu下使用sudo apt-get install git安装。

下载以太坊源码,源代码需要放在之前Go语言开发环境设置的$GOPATH/src目录下。

cd go-ethereum
make geth

make会执行build目录下的编译脚本,会在** go-ethereum/build/bin**目录下编译生成geth程序。

二、直接下载可执行文件

直接只用命令:

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 ,会自动连接到以太坊公网,此时会开始同步区块,在Linux系统中,区块数据默认存储在~/.ethereum中。

在以太坊的共有链上部署智能合约、发起交易需要花费以太币。而通过修改配置,可以在本机搭建一套以太坊私有链,因为与公有链没关系,既不用同步公有链庞大的数据,也不用花钱购买以太币,很好地满足了智能合约开发和测试的要求,开发好的智能合约也可以很容易地切换接口部署到以太坊公有链上。

下面开始建立私有以太坊网络:

mkdir private-geth
cd private-geth

建立创世纪区块文件,是一个json格式的文件:
在创世纪区块的json文件中填入以下内容, 并保存:

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

初始化创世纪节点,并设置data目录:

geth --datadir ./data init genesis.json
以太坊私有网络集群搭建_第1张图片

创世纪节点文件参数说明:

alloc:用来预设置账号以及账号的 ether 数量。因为私有链挖矿比较容易,所以我们不需要预设置账号。比如,{“0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a”:{“balance”:“100000000000000000000000000000”}}
nonce:一个64位随机数,用于挖矿。
mixhash:和 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash。
difficulty:设置当前区块的难度,如果难度过大,cpu挖矿就很难,所以这边设置的很小,不要跟自己过不去嘛。
coinbase:默认挖矿的矿工账号。
timestamp:设置创世块的时间戳。
parentHash:上一个区块的hash值,因为是创世块,所以值是0。
extraData:附加信息,随便填。
gasLimit:设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和。因为我们是私有链,所以可以写的大一些,方便开发测试。

初始化后目录结构为:
以太坊私有网络集群搭建_第2张图片
其中keystore目录用来保存账户信息,geth目录用来保存区块信息。

启动节点, 加上console 表示启动后,启用命令行:

geth --datadir ./data/00 --networkid 15 console
networkid表示网络id,主网络为1
以太坊私有网络集群搭建_第3张图片

现在私有网络就搭建成功,下面就可以在这个刚刚搭建出来的私有以太坊网络中执行挖矿操作了。

二、挖矿

挖矿首先必须有一个账户,输入下面的命令,查看当前node中的所有账户:

# 查看一下系统有的用户
> eth.accounts
[]

# 查看详细的用户信息
> personal

# 创建两个账号用于转账,或者使用 personal.newAccount() 也会提示输入密码
> personal.newAccount('123456')
> personal.newAccount('123456')

> eth.accounts
["0x18a6581a285f40ac3faaa646e13d7c6dd87276f4", "0x2455572ef500cf8634a4090d6d6096c588013e2a"]
# 此时可以看下 keystore 目录,多出了两个文件,也就是我们刚才创建的两个账户密钥(丢了它,你就等于丢了币)

账号创建好了,但是一开始账号都没有 ether,这时就需要挖矿获取币了。
使用miner.start()命令开启挖矿,默认挖出的 ether 是存到 eth.coinbase 账户中的,也就是第一个账户。

# 查看账号1下的余额
> eth.getBalance(eth.accounts[0])

# 查看coinbase账号
> eth.coinbase
0x18a6581a285f40ac3faaa646e13d7c6dd87276f4

# 如果想要把挖到的矿存入其他账户,可以使用
> miner.setEtherbase(eth.accounts[1])
true

开始挖矿,我们先把coinbase改成账号1
> miner.setEtherbase(eth.accounts[0])
true

# 如果出现 miner.start() 直接返回 null 的情况,请先查看是否还未创建过账户。
> miner.start(1)
INFO [05-31|19:57:17] Updated mining threads                   threads=0
INFO [05-31|19:57:17] Transaction pool price threshold updated price=18000000000
INFO [05-31|19:57:17] Starting mining operation
INFO [05-31|19:57:17] Commit new mining work                   number=12 txs=0 uncles=0 elapsed=194.667µs
INFO [05-31|19:57:19] Successfully sealed new block            number=12 hash=82d29d…65290c
INFO [05-31|19:57:19]  mined potential block                  number=12 hash=82d29d…65290c
INFO [05-31|19:57:19] Commit new mining work                   number=13 txs=0 uncles=0 elapsed=159.066µs
INFO [05-31|19:57:19] Successfully sealed new block            number=13 hash=e91844…e962a6
INFO [05-31|19:57:19]  mined potential block                  number=13 hash=e91844…e962a6
等到 percentage 达到100就能挖出来了,请耐心等待~,出现小锤头的时候意味着你挖到了!

# 已经挖到了,我们先暂停挖矿,注意:输入的字符会被挖矿刷屏信息冲掉,没有关系,只要输入完整的miner.stop()之后回车,即可停止挖矿。正在执行的挖矿进程不会立即暂停,仍然会等到当前完整快写完后才会暂停
> miner.stop()
true

然后查看账户余额
> eth.getBalance(eth.accounts[0])
112000000000000000000
# 不要被这个零的个数吓到,这里默认显示的以 wei 为单位的,而 1 ether = 10^18 wei,所以我们转换一下单位立马就清晰了,

> web3.fromWei(eth.getBalance(eth.accounts[0]), 'ether')
112
# 嗯,其实我们目前就挖了112个ether

三、转账

在转账前,我们需要先解锁账号

> personal.unlockAccount(eth.accounts[0])

# 我们先转8个ether给账号2
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(8,'ether')})

INFO [03-12|20:24:15] Submitted transaction      fullhash=0x996a3037b75585415ece5b1dc28181833691760176b3f24066c93e7093a967e5 recipient=0x29a079BdbC6D4d122178FBe01558E5DF2D008523

我们可以看到目前只是向区块链提交了这笔转账交易,谁来执行这笔交易呢?矿工。我们还是得开启挖矿模式,把这笔转账交易执行掉。然后我们再来看看好朋友的账户里面有多少 ether 了,

> miner.start(1)
# 持续几秒
> miner.stop()

# 然后查看账号2的余额,已经有余额
> eth.getBalance(eth.accounts[1])
8000000000000000000

四、连接到其他节点

以太坊节点之间能够互相链接需要满足两个条件:

  • (1)相同的协议版本;
  • (2)相同的networkid,所以搭建私有网络最方便的方法就是通过geth命令中的–networkid选项,设置一个与主网不同的networkid(主网的networkid为1),这也是官方推荐的方法。

为了在本地网络运行多个以太坊节点的实例,必须确保一下几点:

  1. 每个实例都有独立的数据目录(–datadir)
  2. 每个实例运行都有独立的端口.(eth和rpc两者都是)(–port 和 --rpcprot)
  3. 在集群的情况下, 实例之间都必须要知道彼此.
  4. 唯一的ipc通信端点,或者禁用ipc.

节点之间相互连接有三种办法:

  • 使用admin.addPeer添加;
  • 通过bootnodes选项;
  • 通过static-nodes.json文件添加。

一、通过admin.addPeer添加

首先在节点一上查看enode信息:

admin.nodeInfo
enode: “enode://5b3b7c5d65a4cf3e65875b15cd14a1abdc30f94931e67e68bf606941cc1630624da83c00c83f7b843f303668c184d914e36890147738d5e7fe03a560bd9548d9@[::]:61910”,

然后在节点二上执行admin.addPeer添加节点一:

admine.addPeer(“enode://5b3b7c5d65a4cf3e65875b15cd14a1abdc30f94931e67e68bf606941cc1630624da83c00c83f7b843f303668c184d914e36890147738d5e7fe03a560bd9548d9@[::]:61910”)
true

返回true就说明执行成功,我们可以通过admin.peers查看新增的节点信息,同步操作是异步的,可能不能立马看到节点一的信息。
以太坊私有网络集群搭建_第4张图片

连接成功后,两个节点都可以通过admine.peers查看到对方的节点信息,节点二就会开始同步节点一的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块,向任意一个节点发送交易,另一个节点也会收到该笔交易。

二、通过bootnodes 添加

启动节点的时候指定–bootnodes选项连接到其他节点。
可以先启动一个节点,通过admin.nodeInfo查看 enode信息,其他节点启动的时候添加配置 --bootnodes “enode://5b3b7c5d65a4cf3e65875b15cd14a1abdc30f94931e67e68bf606941cc1630624da83c00c83f7b843f303668c184d914e36890147738d5e7fe03a560bd9548d9@[::]:61910” 可以都和这个节点形成连接,从而相互之间相互连接。
如节点一启动:

geth --datadir ./data/01 --networkid 15 --ipcdisable --port 61910 --rpcport 8200 --bootnodes “enode://5b3b7c5d65a4cf3e65875b15cd14a1abdc30f94931e67e68bf606941cc1630624da83c00c83f7b843f303668c184d914e36890147738d5e7fe03a560bd9548d9@[::]:61910” console

三、通过static-nodes.json文件

节点data的所在路径(刚才启动时–datadir路径),默认:

Mac: ~/Library/Ethereum
Linux: ~/.ethereum
Windows: %APPDATA%\Ethereum

在此目录下创建名为:static-nodes.json的文件。
文件内容及格式如下:

[
"enode://91922b12115c067005c574844c6bbdb114eb262f90b6355cec89e13b483c3e4669c6d63ec66b6e3ca7a3a462d28edb3c659e9fa05ed4c7234524e582a8816743@120.27.164.92:13333"
"enode://6427b7e7446bb05f22fe7ce9ea175ec05858953d75a5a6e4f99a6aec0779a8bd6276f1959a42fe5948acbe14bcd0652082dc546d3b37ae8f2aea41eba4eca43b@121.201.14.181:30303",
"enode://91922b12115c067005c574844c6bbdb114eb262f90b6355cec89e13b483c3e4669c6d63ec66b6e3ca7a3a462d28edb3c659e9fa05ed4c7234524e582a8816743@120.27.164.92:13333",
"enode://3dde41a994b3b99f938f75ddf6d48318c78ddd869c70b48d00b922190bb434fc5474f6250c143723f4387273d123e02f6a38f07d0311f240d2915f6140e09850@207.226.141.212:30303",
"enode://7ab8fa90b204f2146c00939b8474549c544caa3598a0894fa639a5cdbd992cbc6135fd776f8bcf97ae95fdaa3afbfa2d107fea71549119afd7ea57356b899be5@121.201.24.236:30303",
"enode://db81152a8296089b04a21ad9bf347df3ff0450ffc8215d9f50c400ccf8d18963118010cacf03c4b71981cf9cac5394438cab3039e98db4d2aae5859ab7d1793e@139.198.1.244:30303",
"enode://68dd1360f0a4ac362b41124692e31652ffe26f6f06a284ca11f3b514b3968594ac1f4320d1aa1ca343b06327c18a2e40eded74edfb3086e1baaa27ca24226b21@113.106.85.172:30303",
"enode://58f6b6908286cefe43c166cfc4fed033c750caa1bc3f6e1e1e1507752c0b91248addb3122f8557c5f8912e702285a160ab3a10203ae1eff3807eda25d6ed6478@45.113.71.186:30303",
"enode://87190a01c02cafb97e7f49672b4c3be2937cf79c3969e0b8e7b35cac28cebfbda52a13d56fd2113c726a1dd359c9476ccf7e60651439cef56e3a71039f6a4f5e@119.29.207.90:30303",
"enode://d1fdd05a62fd9544eeb455e4f4d4bd8bb574138d82d8f909f3041d0792e3401f8695133d39ad0a3aa5d217e3c5bed0511b531505a67b03607a909ae9096720d2@120.26.129.121:30303",
"enode://a1e9cf99eca94590ae776c8dd5c6c043a8c1f0375e9e391c9fb55133385bf453ac3d3fb3ead8e63415b2ef99d54a19e2a7bc830cd1fdbbb283818e3bcb0ea31e@182.254.209.254:30303",
"enode://562796b19d43d79dfb6160abd2d7bb78a2f2efd9501a0a767c00677e0fb3a4407235f813c3003682c2a421a58709c52f595827bc15708cc5f534f55d0f8d03ad@121.40.199.54:30303",
"enode://fa2c17dcc83a6e2825668210abf7480452de4b13d8bdea8f301c3b603701918bc4dade9e68d119d7a8214e90e7ea10a2782041c98951385d97bee73358fb08f4@120.26.124.58:30303",
"enode://0b331b27e2976d797aed1d1464ac483a7f262860334cb5737a01a0188da08d79226a6973adc5f2a2c1a20192b399161eee23a0d56ecf472cbe4058d010ecc89f@47.89.49.61:30303",
"enode://fd2a5d30e4f3917ee640876cc57d72a8bf5ecf049e9106c95e60cf306dd7a5dd68d1a295f3718af44a7083252686926d6e8a402f1abe6f805e10e7281967db28@121.201.29.82:30303",
"enode://0d1b9eed7afe2d5878d5d8a4c2066b600a3bcac2e5730586421af224e93a58cd03cac75bf0b2a62fd8049cd3692a085758cc1e407c8b2c94bb069814a5e8d0f0@209.9.106.245:30303"
]

static-nodes.json的文件中的节点将组网形成集群。

以太坊客户端默认启动连接的节点数位11-13个,如果觉得不够,可以使用在启动时增加启动参数 –maxpeers 100命令,让连接启动节点数增加到100上限,当然,也会大量消耗你的硬盘和CPU。

自动集群部署脚本下载

五、Geth命令用法参数详解

命令用法

geth [选项] 命令 [命令选项] [参数…]

命令

命令 详解
account 管理账户
attach 启动交互式JavaScript环境(连接到节点)
bug 上报bug Issues
console 启动交互式JavaScript环境
copydb 从文件夹创建本地链
dump Dump(分析)一个特定的块存储
dumpconfig 显示配置值
export 导出区块链到文件
import 导入一个区块链文件
init 启动并初始化一个新的创世纪块
js 执行指定的JavaScript文件(多个)
license 显示许可信息
makecache 生成ethash验证缓存(用于测试)
makedag 生成ethash 挖矿DAG(用于测试)
monitor 监控和可视化节点指标
removedb 删除区块链和状态数据库
version 打印版本号
wallet 管理Ethereum预售钱包
help,h 显示一个命令或帮助一个命令列表

ETHEREUM选项

选项 详解
–config value TOML 配置文件
–datadir “xxx” 数据库和keystore密钥的数据目录
–keystore keystore存放目录(默认在datadir内)
–nousb 禁用监控和管理USB硬件钱包
–networkid value 网络标识符(整型, 1=Frontier, 2=Morden (弃用), 3=Ropsten, 4=Rinkeby) (默认: 1)
–testnet Ropsten网络:预先配置的POW(proof-of-work)测试网络
–rinkeby Rinkeby网络: 预先配置的POA(proof-of-authority)测试网络
–syncmode “fast” 同步模式 (“fast”, “full”, or “light”)
–ethstats value 上报ethstats service URL (nodename:secret@host:port)
–identity value 自定义节点名
–lightserv value 允许LES请求时间最大百分比(0 – 90)(默认值:0)
–lightpeers value 最大LES client peers数量(默认值:20)
–lightkdf 在KDF强度消费时降低key-derivation RAM&CPU使用

开发者(模式)选项

命令 详解
–dev 使用POA共识网络,默认预分配一个开发者账户并且会自动开启挖矿。
–dev.period value 开发者模式下挖矿周期 (0 = 仅在交易时) (默认: 0)

ETHASH 选项

命令 详解
–ethash.cachedir ethash验证缓存目录(默认 = datadir目录内)
–ethash.cachesinmem value 在内存保存的最近的ethash缓存个数 (每个缓存16MB ) (默认: 2)
–ethash.cachesondisk value 在磁盘保存的最近的ethash缓存个数 (每个缓存16MB) (默认: 3)
–ethash.dagdir “” 存ethash DAGs目录 (默认 = 用户hom目录)
–ethash.dagsinmem value 在内存保存的最近的ethash DAGs 个数 (每个1GB以上) (默认: 1)
–ethash.dagsondisk value 在磁盘保存的最近的ethash DAGs 个数 (每个1GB以上) (默认: 2)

交易池选项

命令 详解
–txpool.nolocals 为本地提交交易禁用价格豁免
–txpool.journal value 本地交易的磁盘日志:用于节点重启 (默认: “transactions.rlp”)
–txpool.rejournal value 重新生成本地交易日志的时间间隔 (默认: 1小时)
–txpool.pricelimit value 加入交易池的最小的gas价格限制(默认: 1)
–txpool.pricebump value 价格波动百分比(相对之前已有交易) (默认: 10)
–txpool.accountslots value 每个帐户保证可执行的最少交易槽数量 (默认: 16)
–txpool.globalslots value 所有帐户可执行的最大交易槽数量 (默认: 4096
–txpool.accountqueue value 每个帐户允许的最多非可执行交易槽数量 (默认: 64)
–txpool.globalqueue value 所有帐户非可执行交易最大槽数量 (默认: 1024)
–txpool.lifetime value 非可执行交易最大入队时间(默认: 3小时)

性能调优的选项

命令 性能
–cache value 分配给内部缓存的内存MB数量,缓存值(最低16 mb /数据库强制要求)(默认:128)
–trie-cache-gens value 保持在内存中产生的trie node数量(默认:120)

帐户选项

命令 性能
–unlock value 需解锁账户用逗号分隔
–password value 用于非交互式密码输入的密码文件

API和控制台选项

命令 性能
–rpc 启用HTTP-RPC服务器
–rpcaddr value HTTP-RPC服务器接口地址(默认值:“localhost”)
–rpcport value HTTP-RPC服务器监听端口(默认值:8545)
–rpcapi value 基于HTTP-RPC接口提供的API
–ws 启用WS-RPC服务器
–wsaddr value WS-RPC服务器监听接口地址(默认值:“localhost”)
–wsport value WS-RPC服务器监听端口(默认值:8546)
–wsapi value 基于WS-RPC的接口提供的API
–wsorigins value websockets请求允许的源
–ipcdisable 禁用IPC-RPC服务器
–ipcpath 包含在datadir里的IPC socket/pipe文件名(转义过的显式路径)
–rpccorsdomain value 允许跨域请求的域名列表(逗号分隔)(浏览器强制)
–jspath loadScript JavaScript加载脚本的根路径(默认值:“.”)
–exec value 执行JavaScript语句(只能结合console/attach使用)
–preload value 预加载到控制台的JavaScript文件列表(逗号分隔)

网络选项

命令 性能
–bootnodes value 用于P2P发现引导的enode urls(逗号分隔)(对于light servers用v4+v5代替)
–bootnodesv4 value 用于P2P v4发现引导的enode urls(逗号分隔) (light server, 全节点)
–bootnodesv5 value 用于P2P v5发现引导的enode urls(逗号分隔) (light server, 轻节点)
–port value 网卡监听端口(默认值:30303)
–maxpeers value 最大的网络节点数量(如果设置为0,网络将被禁用)(默认值:25)
–maxpendpeers value 最大尝试连接的数量(如果设置为0,则将使用默认值)(默认值:0)
–nat value NAT端口映射机制 (any
–nodiscover 禁用节点发现机制(手动添加节点)
–v5disc 启用实验性的RLPx V5(Topic发现)机制
–nodekey value P2P节点密钥文件
–nodekeyhex value 十六进制的P2P节点密钥(用于测试)

矿工选项

命令 性能
–mine 打开挖矿
–minerthreads value 挖矿使用的CPU线程数量(默认值:8)
–etherbase value 挖矿奖励地址(默认=第一个创建的帐户)(默认值:“0”)
–targetgaslimit value 目标gas限制:设置最低gas限制(低于这个不会被挖?) (默认值:“4712388”)
–gasprice value 挖矿接受交易的最低gas价格
–extradata value 矿工设置的额外块数据(默认=client version)

GAS价格选项

命令 性能
–gpoblocks value 用于检查gas价格的最近块的个数 (默认: 10)
–gpopercentile value 建议gas价参考最近交易的gas价的百分位数,(默认: 50)

虚拟机的选项:

命令 性能
–vmdebug 记录VM及合约调试信息

日志和调试选项

命令 性能
–metrics 启用metrics收集和报告
–fakepow 禁用proof-of-work验证
–verbosity value 日志详细度:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3)
–vmodule value 每个模块详细度:以 =的逗号分隔列表 (比如 eth/*=6,p2p=5)
–backtrace value 请求特定日志记录堆栈跟踪 (比如 “block.go:271”)
–debug 突出显示调用位置日志(文件名及行号)
–pprof 启用pprof HTTP服务器
–pprofaddr value pprof HTTP服务器监听接口(默认值:127.0.0.1)
–pprofport value pprof HTTP服务器监听端口(默认值:6060)
–memprofilerate value 按指定频率打开memory profiling (默认:524288)
–blockprofilerate value 按指定频率打开block profiling (默认值:0)
–cpuprofile value 将CPU profile写入指定文件
–trace value 将execution trace写入指定文件

WHISPER实验选项

命令 性能
–shh 启用Whisper
–shh.maxmessagesize value 可接受的最大的消息大小 (默认值: 1048576)
–shh.pow value 可接受的最小的POW (默认值: 0.2)

弃用选项

命令 性能
–fast 开启快速同步
–light 启用轻客户端模式

其他选项

–help, -h 显示帮助

你可能感兴趣的:(区块链基础)