【区块链】以太坊Geth私有链条(单节点多节点)
原文:https://blog.csdn.net/yinanmo5569/article/details/80339031
以太坊官方网络(Official Network)
以太坊官方网络有两种:
- 生产环境网络(又称主网络)
- 测试网络TestNet
主网络是产生真正有价值的以太币的网络,是全球化,部署在Internet环境上的.智能合约的代码,执行,区块的调用,都可以清晰地查看到.而所有节点都是全球化的,速度较慢.
TestNet是专供用户来开发,调试和测试的.如果开发简单的智能合约的话,用测试网络就足够了,用户可以把更多的精力集中在智能合约的编写.但是由于网路是官方提供的,因此对于以太坊技术的底层实现,Geth的各种参数接口,整个以太坊技术真是性能的理解就会弱很多.所以从开发者的角度来说,一个更好的选择是Private Network,可以从技术的底层去深入理解以太坊.
以太坊私有网络(Private Network)
以太坊私有网络,就是由用户自己通过Geth创建的私有网络,是一个非常适合开发,调试和测试的网路.私有网路可以方便开发者深入理解以太坊的技术底层.
㈠安装虚拟机
㈡虚拟机联网
㈢安装Go语言环境
1.10.3
由于后面会出现版本兼容问题,因此此处需要将golong版本更改采用新版的:官网地址
比如2018.6.18我下载1.10.3:1.10.3
1、下载复制放到:opt/ethfan目录:
2、解压 tar -xvf
文件名:
tar -xvf go1.10.3.linux-amd64.tar.gz
3、配置环境:gedit /etc/profile
4、查看版本
1.8.1
旧版参照1.8.1安装:访问go官网下载
下载复制放到:opt/ethfan目录
配置GOPATH环境变量
㈣配置yum
如果没有配置yum就要先配置yum
㈤下载和编译Geth
安装C的编译器,但是:centos7中没有这个apt-get install -y build-essential
我安装的是:yum -y install gcc
git clone https://github.com/ethereum/go-ethereum.git
进入到文件目录,源码安装
cd go-ethereum
make geth
错误说明我的版本是:1.8.1 不符合,应当改成至少是1.9
解决方法:要么更改golong版本,要么更改geth版本
更改golong版本为1.10.3:就好啦
检验是否安装成功
查看命令:build/bin/geth –help
检查版本:build/bin/geth version
配置geth环境source /etc/profile
Geth搭建私有网络
Step1:定义私有genesis state
[admin@localhost ~]$ cd Code/blockchain
[admin@localhost blockchain]$ mkdir go-ethereum
[admin@localhost blockchain]$ gedit genesis.json
[admin@localhost blockchain]$ mkdir privateNetwork
创建一个新的文件夹privateNetwork,用来存储genesis.json文件和之后的私有链
将下面的内容复制到genesis.json中:
{
"config": {
"chainId": 14,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x05000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
或者内容为:
{
"config": {
"chainId": 22,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x400",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000032",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
官方文档中的chainId为0,应该修改为非0的值,不然会导致 insufficient funds for gas * price + value
difficulty表示挖矿的难度值,官方文档中为0x20000,由于测试机器配置低,修改为0x05000。
Step2:建立创世区块
运行如下指令:
[admin@localhost blockchain]$ geth --datadir "./privateNetwork" init go-ethereum/genesis.json
结果如下:
然后在privateNetwork中能发现geth和keystore两个新文件.
- geth保存的是区块链的相关信息
- keystore中保存的是该链条中的用户信息
Step3:创建自己的私有链条
运行如下命令:
[admin@localhost privateNetwork]$ geth --networkid 14 --nodiscover --datadir "data/chain0" --rpc --rpcapi net,eth,web3,personal --rpcaddr localhostconsole 2>>geth.log
nodiscover的意思是不被其他节点自动发现(可以手动添加节点)
或者命令类似为:geth --identity "TestNode" --rpc --rpcport "8545" --datadir /opt/ethfan/path/to/datadir --port "30303" --nodiscover console
console是启动geth控制台,不加该选项,geth启动之后成为一个后台进程不会自动结束
最后把geth中的log信息导入geth.log中,方便了解geth运行的情况。
注意路径要加引号,不然会出问题.
--nodiscover 关闭p2p网络的自动发现,需要手动添加节点,这样有利于我们隐藏私有网络
--datadir 区块链数据存储目录
--networkid 网络标识,私有链取一个大于4的随意的值
--rpc 启用ipc服务,默认端口号8545
--rpcapi 表示可以通过ipc调用的对象
--rpcaddr ipc监听地址,默认为127.0.0.1,只能本地访问
console 打开一个可交互的javascript环境
更多参数:https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options
运行后面的再进入是这样的:
创建账号:语法这里采用的是javascript输入两次密码123456,显示生成的账号
创建新用户,密码是”ycx”,地址是"0x41b80248049bfa17e30beaa16c9f0e6b0e98fa6e"
>personal.newAccount("ycx")
Step4:在自己的私有链条上创建用户
查看私有链已有账户,已经有账户(我创建过两次).
>eth.accounts
查看账户余额
Step5:尝试挖矿
继续在console中输入:
>miner.start()
开始挖矿,查看终端geth.log,如下:
过了一段时间之后,再停止挖矿,查看账户,只要不为0则挖矿成功
Geth搭建多节点私有链条
搭建0号节点
参照:上文
搭建1号节点
[root@localhost admin]# cd Code/blockchain/
[admin@localhost blockchain]$ mkdir data
创建步骤与之前是一样的,要保证两个节点在同一个区块链上工作的话首先要保证genesis创世区块链是一样的,所以注意使用同样的genesis.json文件来创建.用两个端口分别创建
[root@localhost blockchain]$ geth --datadir "data/chain0" init go-ethereum/genesis.json
[root@localhost blockchain]$ geth --datadir "data/chain1" init go-ethereum/genesis.json
如果报错:
启动0号,1号节点
为了使两个节点同时启动,注意使用不同的port和rpc port.
启动0号节点:
geth --networkid 14 --nodiscover --datadir "data/chain0" --rpc --rpcapi net,eth,web3,personal --rpcaddr localhost console 2>>geth0.log
如果报错:可以查看端口https://www.cnblogs.com/chinas/p/4553179.html
geth --networkid 14 --nodiscover --datadir "data/chain0" --port 30303--rpc --rpcapi net,eth,web3,personal --rpcport 8545--rpcaddr localhost console 2>>geth0.log
启动1号节点:
geth --networkid 14 --nodiscover --datadir "data/chain1" --port 55554 --rpc --rpcapi net,eth,web3,personal --rpcport 8101 --rpcaddr localhost console 2>>geth1.log
参数解释:
--nodiscover 关闭p2p网络的自动发现,需要手动添加节点,这样有利于我们隐藏私有网络
--datadir 区块链数据存储目录
--port 网络监听端口,默认30303
--networkid 网络标识,私有链取一个大于4的随意的值
--rpc 启用ipc服务
--rpcport ipc服务端口,默认端口号8545
--rpcapi 表示可以通过ipc调用的对象
--rpcaddr ipc监听地址,默认为127.0.0.1,只能本地访问
console 打开一个可交互的javascript环境
添加节点
通过addPeer来添加节点.关于Geth JavaScript console的具体api可以在查询官方文档:https://github.com/ethereum/go-ethereum/wiki/Management-APIs
首先查看1号节点的enode
在0号节点的console,添加1号节点
查看是否添加成功
查看连接的节点数量和连接的节点列表:
net.peerCount
admin.peers