以太坊私有链配置过程

以太坊私有链配置过程

一. 环境配置和程序安装

基于macOS High Sierra安装,系统版本 10.13.2

1.1 安装geth

  • 确认安装过homebrew, 执行brew -v即可检查,如果没有安装,则去官网查看如何安装
  • 命令行中执行brew tap ethereum/ethereum
  • 命令行中执行brew install ethereum
  • 命令行中输入geth -h,如果显示如下内容说明安装成功

1.2 安装solc

  • 确认安装过npm,执行npm -v即可检查,如果没有安装,通过brew intall node安装完成node之后,npm也安装成功
  • 命令行中执行npm install -g solc安装solc
  • 执行solc --help检查是否安装成功,如果提示找不到命令,可尝试使用npm install -g solc solc-cli --save-dev来取代上一条命令安装solc,如果显示如下内容,代表安装成功

二. 配置私有链节点

2.1 创世块设置

新建文件夹,命名为TedEth(随意命名),在文件夹下创建genesis.json和data文件夹。genesis.json文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"config": {
"chainId": 123456,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"nonce": "0x0000000000000042",
"difficulty": "0x020000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
"gasLimit": "0x4c4b40",
"alloc": {}
}

解释一下各个参数的含义:

字段 含义
mixhash 与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
nonce nonce就是一个64位随机数,用于挖矿
difficulty 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度
alloc 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。
coinbase 矿工的账号,随便填
timestamp 设置创世块的时间戳
parentHash 上一个区块的hash值,因为是创世块,所以这个值是0
extraData 附加信息,随便填,可以填你的个性信息,内容必须0x开头,16进制内容
gasLimit 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大

2.2 初始化

在命令行中进入刚才创建的TedEth文件夹,然后执行如下命令:
geth --datadir data init genesis.json
各参数代表的含义如下:

字段 含义
init 表示初始化区块,后面跟着创世块的配置文件genesis.json
datadir 数据存放的位置

命令执行之后输出如下结果:

2.3 启动节点

geth --datadir data --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover console

各参数代表的含义如下:

字段 含义
identity 区块链的标示,随便填写,用于标示目前网络的名字
port 网络监听端口
rpc 启动rpc通信,可以进行智能合约的部署和调试
rpcapi 设置允许连接的rpc的客户端,一般为db,eth,net,web3,默认情况下,Geth允许web3
networkid 设置当前区块链的网络ID,用于区分不同的网络,是一个数字
console 启动命令行模式,可以在Geth中执行命令
rpccorsdomain 设置请求ip白名单 * 为所有
nodiscover 使用这个参数,你的节点就不会被其他人发现,除非手动添加你的节点。否则,就只有一个被无意添加到一个陌生区块链上的机会,那就是跟你有相同的genesis文件和networkID。

执行成功后将进入区块链的JavaScript控制台环境

2.4 Geth JavaScript控制台使用说明

  • 创建新账号 personal.newAccount()或者 personal.newAccount("123456")

  • 查看节点信息 admin.nodeInfo

  • 挖矿 开始挖矿 miner.start(1) 停止挖矿 miner.stop()

  • 查看当前矿工账号 eth.coinbase 默认为第一个账户

  • 修改矿工账号 miner.setEtherbase(eth.accounts[1])

  • 查看账户信息 eth.accounts[0]

  • 查看账户余额 eth.getBalance(eth.accounts[0]) 或者 web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")

  • 解锁账号 personal.unlockAccount(eth.accounts[0]) 使用账户资金前都需要先解锁账号

  • 转账 eth.sendTransaction({from:eth.accounts[0],to:"0x587e57a516730381958f86703b1f8e970ff445d9",value:web3.toWei(3,"ether")}) 使用 txpool.status 可以看到交易状态

  • 查看区块数据 eth.blockNumber eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8ff5ec37fea6710adcab825") eth.getBlock(1) 通过区块号查看区块

2.5 挖矿记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
> personal.newAccount() //创建A账户
Passphrase:
Repeat passphrase:
"0x9d28685f89f56025636a9664ced22befc5d2cf1b"
> personal.newAccount() //创建B账户
Passphrase:
Repeat passphrase:
"0x58b61b8c168e2610cec0081cc6456cb7cd87e7ba"
> eth.accounts //查看所有账户信息
["0x9d28685f89f56025636a9664ced22befc5d2cf1b", "0x58b61b8c168e2610cec0081cc6456cb7cd87e7ba"]
> miner.setEtherbase(eth.accounts[0]) //指定A账户为矿工
true
> eth.coinbase //查看矿工是谁
"0x9d28685f89f56025636a9664ced22befc5d2cf1b"
> miner.start(1) //使用1个线程开始挖矿,第一次挖矿需要时间较长,大概5分钟左右
//直到屏幕出现“🔨 mined potential block number=1 hash=f53358…85e38a”信息时说明挖出矿了
> miner.stop() //停止挖矿
> eth.getBalance(eth.accounts[0]) //查看A账户的余额
125000000000000000000
> eth.getBalance(eth.accounts[1]) //查看B账户的余额
0
> personal.unlockAccount(eth.accounts[0]) //解锁A账户,方便后面转账
Unlock account 0x9d28685f89f56025636a9664ced22befc5d2cf1b
> amount = web3.toWei(5,'ether') //设定转账额度
"5000000000000000000"
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount}) //执行转账操作
INFO [12-20|17:51:11] Submitted transaction //输出信息省略
> txpool.status //查看交易池的状态,因为没人挖矿,所以有一笔记录阻塞
{
pending: 1,
queued: 0
}
> miner.start(1);admin.sleepBlocks(1);miner.stop(); //重新开始挖矿,挖出一个区块即可停止
> eth.getBalance(eth.accounts[1]) //查看B账户余额,如果有余额,则转账成功
5000000000000000000
> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')
5

参考文章:
以太坊私链与智能合约部署入门教程
【区块链】go ethereum 安装与使用 - mac


0%