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

发布于 2021-05-24  342 次阅读


0x00 上期回顾

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

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

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

0x01 启动

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

直接启动

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

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

初始化启动

我们对本地网络初始化,创建一个固定的链。

我们需要创建一个json文件,用于创建创世块;再创建一个文件夹,用于存放区块链信息、私钥等

mkdir geth
cd geth
touch genesis.json
# 创建创世块
mkdir mychain
# 创建目标文件夹,保存区块信息和私钥文件
目录结构

参考的genesis.json如下:

{
    "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,

之后直接初始化即可:

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

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

0x02 进入控制台

geth --networkid "30" --nodiscover --datadir="mychain" console 2>>
"mychain"/"err.log"

简单解释一下命令:

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

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

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

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

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

0x03 用户相关

1.进入GETH控制台中执行:

查看账户:

eth.accounts

创建账户:

personal.newAccount("pay")
personal.newAccount("collect")
# 创建两个账户,用于测试收付款
此时可以看到两个用户的地址