【区块链】以太坊Geth私有链条(单节点多节点)

原文:https://blog.csdn.net/yinanmo5569/article/details/80339031

以太坊官方网络(Official Network)

以太坊官方网络有两种:

  • 生产环境网络(又称主网络)
  • 测试网络TestNet

主网络是产生真正有价值的以太币的网络,是全球化,部署在Internet环境上的.智能合约的代码,执行,区块的调用,都可以清晰地查看到.而所有节点都是全球化的,速度较慢. 
TestNet是专供用户来开发,调试和测试的.如果开发简单的智能合约的话,用测试网络就足够了,用户可以把更多的精力集中在智能合约的编写.但是由于网路是官方提供的,因此对于以太坊技术的底层实现,Geth的各种参数接口,整个以太坊技术真是性能的理解就会弱很多.所以从开发者的角度来说,一个更好的选择是Private Network,可以从技术的底层去深入理解以太坊.

以太坊私有网络(Private Network)

以太坊私有网络,就是由用户自己通过Geth创建的私有网络,是一个非常适合开发,调试和测试的网路.私有网路可以方便开发者深入理解以太坊的技术底层.

㈠安装虚拟机

Root密码:123456
Root密码:123456

Admin密码:1234
Admin密码:1234

㈡虚拟机联网

vmware netword adapter vmnet8主机ipv4的IP地址为:192.168.2.3
vmware netword adapter vmnet8主机ipv4的IP地址为:192.168.2.3

虚拟机ip地址为:192.168.2.12
虚拟机ip地址为:192.168.2.12

㈢安装Go语言环境

1.10.3

由于后面会出现版本兼容问题,因此此处需要将golong版本更改采用新版的:官网地址
比如2018.6.18我下载1.10.3:1.10.3
1、下载复制放到:opt/ethfan目录:

1.1
1.2
如果之前安装过就删除无效的go
1.3
2、解压 tar -xvf
文件名:tar -xvf go1.10.3.linux-amd64.tar.gz
2.1 解压
3、配置环境:gedit /etc/profile
3.1
4、查看版本
版本

1.8.1

旧版参照1.8.1安装:访问go官网下载
下载复制放到:opt/ethfan目录

下载
解压 tar -xvf 文件名
解压
配置GOPATH环境变量
①
②
③
④

㈣配置yum

如果没有配置yum就要先配置yum

㈤下载和编译Geth

安装C的编译器,但是:centos7中没有这个apt-get install -y build-essential
 我安装的是:yum -y install gcc

①
 克隆Github项目
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 version
⑥ 查看geth version

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

运行后面的再进入是这样的:

进入geth

创建账号:语法这里采用的是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

原文地址:https://www.cnblogs.com/ycx95/p/9181941.html