XiaBee's Studio.

三天速成智能合约–DAY2:GETH 从入门到入土

字数统计: 1.4k阅读时长: 5 min
2021/08/29

上期回顾

上期我们介绍了一下主要工具,和一点点的概念,这期我们大概聊聊 GETH。

Geth 又名 Go Ethereum 是以太坊协议的三种实现之一,由 Go 语言开发,完全开源的项目。Geth 可以安装在多个平台上,包括Windows、Linux、Mac 的 OSX、Android 或者 IOS 系统。

Geth 的作用:Geth是以太坊协议的具体落地实现,通过 Geth,你可以实现以太坊的各种功能,如账户的新建编辑删除,开启挖矿,ether 币的转移,智能合约的部署和执行等等。

启动

还没装GETH的同学建议先看看上一篇:环境安装(用Windows的同学官网下载安装包就行,傻瓜式安装)

直接启动

直接输入 geth 会启动本地的一个测试网络,默认端口 30303(关闭的时候直接CTRL -C关闭)

但是这个网络不便于保存,所以不建议这么启动。

初始化启动

我们对本地网络初始化,创建一个固定的链。 我们需要创建一个 json文件,用于创建创世块;再创建一个文件夹,用于存放区块链信息、私钥等

1
2
3
4
5
6
7
mkdir geth
cd geth
touch genesis.json
# 创建创世块
mkdir mychain
# 创建目标文件夹,保存区块信息和私钥文件

参考的genesis.json如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"config": {
"chainId":666,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0
},
"alloc" : {},
"difficulty" : "0x400",
"extraData" : "",
"gasLimit":"0xffffffff",
"parentHash" :
"0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}

注意事项:

  • difficulty和gasLimit可以更改,但是后续部署的时候遇到了gas不足无法部署的情况,所以先把gasLimit设置到最大
  • 后期部署智能合约的时候可能会遇到部署成功但不能执行的情况,很有可能是应为truffle更新后不能很好的解决拜占庭将军问题,所以需要手动在创世块中添加拜占庭块 "byzantiumBlock": 0

之后直接初始化即可:

1
2
3
4
5
6
geth --datadir ./mychain init ./genesis.json
# 写入创世块
# --datadir: 目标目录
# init: 初始化文件
# 如果此时mychain非空,需要删除其内部的文件

这样生成的链,在退出后再次启动时也不会失效。

进入控制台

1
geth --networkid "30" --nodiscover --datadir="mychain" console 2>>"mychain"/"err.log"
  • --networkid: 设置网络id –nodiscover: 希望这条链不被其他节点发现,即搭建私有链
  • --datadir: 数据目录
  • console 2 >> : 控制台错误重定向,即保留错误日志

在后续部署智能合约的时候可能需要开启 RPC 和允许外部登录:手动添加即可

1
geth --networkid "30" --nodiscover --datadir="./mychain" console 2>>"mychain"/"err.log" --rpc --allow-insecure-unlock

在控制台输入 eth.getBlock(0),可以查看初始区块:可以看到 gasLimitdifficulty是我们刚才设置的值(转换成了十进制)

退出:在控制台输入 exit 或者 CTRL-D

用户相关

GETH 控制台运行

查看账户:

1
eth.accounts

创建账户:

1
2
3
personal.newAccount("pay")
personal.newAccount("collect")
# 创建两个账户,用于测试收付款

此时可以看到两个用户的地址

注意这里的 paycollect 均可以理解为 “密码”,区块链中实际的用户名为该用户的地址,我们创建用户时输入的字符串当作私钥的提示符,即 “密码”

解锁账户:用户解锁前不能进行汇款操作,一段时间会自动锁定,汇款前需手动解锁

1
2
3
personal.unlockAccount(user1)
# user1为需要解锁的用户地址;会提示输入phrase,即之前设置的"pay"
# 如果提示不安全,需要退出控制台,添加 --allow-insecure-unlock 参数重新启动

删除账户:控制台中不能直接删除账户,要删除账户的话需要手动删除目录中的私钥文件

宿主机执行

1
2
3
4
5
geth account list
# 查看账户列表

geth account new
# 创建账户

宿主机中删除账户同样需要手动删除用户文件

挖矿与汇款

(以下内容均在GETH控制台中执行)

挖矿

模拟挖矿: 先设置矿工地址,默认为第一个用户:

1
2
3
4
eth.coinbase
# 设置矿工地址,默认是第一个,如果为空则 eth.coinbase = xxxxxxxx
eth.getBalance(eth.accounts[0])
# 查看账户余额

挖矿:

1
2
3
4
5
6
miner.start()
# 开始挖矿
miner.stop()
# 结束挖矿
miner.getHashrate()
# 查看挖矿状态

转账

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
user1 = "0xdeada991bda83c68e2e4428d75bc86d59e3a4efb"
user2 = "0x9623aaf34567f3edb7ae0530bef9147f3de7b106"
# 设置汇款地址和收款地址


personal.unlockAccount(user1)
# 解锁账户
amount = web3.toWei(1, "ether")
# 设置汇款金额,1个以太币

eth.sendTransaction({from: user1, to: user2, value:amount})
# 执行转账

eth.pendingTransactions
# 查看未完成交易

转账操作本质也是区块打包并上传到链上,需要获得节点的共识才能被认可,即矿工(本地的user1或者user2)需要继续挖矿,直到挖到这块区块,才能完成交易。

本地块挖矿比较快,几秒钟就可以了。

再次查看账户余额:收款账户 user2 收到汇款,转账成功

1
2
eth.getBalance(user2)
eth.getBalance(user1)

小结

好的,你已经是一名成熟的矿工了,快来一起挖矿吧

关于 GETH,掌握以上内容基本可以满足需求了,再深入的操作可以参考官方文档和带佬博客。

Reference:https://geth.ethereum.org/docs/interface/command-line-options

CATALOG
  1. 1. 上期回顾
  2. 2. 启动
    1. 2.1. 直接启动
    2. 2.2. 初始化启动
  3. 3. 进入控制台
  4. 4. 用户相关
    1. 4.1. GETH 控制台运行
    2. 4.2. 宿主机执行
  5. 5. 挖矿与汇款
    1. 5.1. 挖矿
    2. 5.2. 转账
  6. 6. 小结