前言

  • 学eth碰上好时代了,geth刚好在1.131.14之间存在很大改动。而我下载的是1.14版本,教程什么的都是旧版本的。对于我这个初学eth的来说非常的不友好。现在先来介绍一下geth1.13和geth1.14之间的改动。

改动1移除 personal 命名空间

  • 在 1.14 版本中,personal 命名空间中的许多功能被移除。尽管你可以通过 --rpc.enabledeprecatedpersonal 标志继续使用一些功能,但在未来的版本中,可能会完全移除该功能。

改动2矿工命令

  • 1.14 版本中,矿工相关命令有所简化,某些功能可能会在将来的版本中进一步修改或移除。

改动3API 更新

  • 1.14 版本更新了一些 API,增加了对新的 Ethereum 改进提案(EIP)的支持。

  • geth1.13主要依赖的是PoW网络,PoS网络还没怎么实施,但是在

  • Geth 1.14:进一步简化了 PoW 的相关操作,并继续引入与 PoS 相关的支持,强调了向以太坊 2.0 的转型。

改动4配置文件

  • 配置文件中的这个Clique在geth1.14被弃用

  • 智能合约有一个开发环境,该开发环境为geth

  • geth实际上是以太坊的客户端,是go语言开发的以太坊的客户端
  • 使用geth可以连接到mainnettestnetprivatenet,建议使用类unix操作系统如linux或者mac,windows上运行geth可能会有些问题
  • 在配置文件出现如下配置会导致报错
  • ethash共识算法,也是PoW的运行机制
1
2
3
4
"clique": {
"period": 5,
"epoch": 30000
}
  • 而新版的最好要在配置文件中添加这一个配置,来标识你用PoS网络,要不然就会报错
1
"terminalTotalDifficultyPassed": true,
  • 示例配置文件:旧版
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
{
"config": {
"chainId": 12345,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"clique": {
"period": 5,
"epoch": 30000
}
},
"difficulty": "1",
"gasLimit": "8000000",
"extradata": "0x00000000000000000000000000000000000000000000000000000000000000007df9a875a174b3bc565e6424a0050ebc1b2d1d820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}
  • 示例配置文件新版:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"terminalTotalDifficultyPassed": true,
"terminalTotalDifficulty": 10000000000000000000000
},
"difficulty": "1",
"gasLimit": "8000000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "1000000000000000000000" }
}
}

改动5废除挖矿机制

  • 在 Geth 1.14 及更高版本中,传统意义上的“挖矿”概念已经被替代为“验证”或“出块”。
  • 所以geth1.14没有挖矿机制了

geth环境搭建

windows上安装(不推荐)

  • 下面先配一个智能合约的环境,这里直接去官网下载:首页 |去以太坊

    image-20241027223350345

  • 点击下载后会跳转到如下界面,然后点击下图红框

image-20241027223417234

  • 接下来就是安装了,基本上没啥问题,我这边安装没有额外安装一个开发工具。
  • 安装好后就会出现geth.exe点击运行该程序即可

image-20241027224120985

  • 运行好后就会出现该环境

image-20241027224220814

  • 这里出现了没有添加环境变量的问题,手动添加环境变量。这里就不介绍如何添加环境变量了

linux上安装

方法1—ppa源安装

  • 打开linux虚拟机,我使用的是wsl2,输入指令,等待下载安装完即可
1
2
3
4
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
  • 但是这里出现了一个问题,这个问题就是在国内使用ppa源下载网速非常的慢
  • 所以我选择使用方法而下载

image-20241027233508369

方法2—官网下载

image-20241027233723810

  • 找到对应架构的程序,点击下载

image-20241027233950496

  • 下载到Windows上的指定文件夹

image-20241027234033157

  • 由于我使用的是wsl2,所以我可以将该文件移动到linux系统的文件目录里面

image-20241027234141744

  • 之后使用命令,将该文件包进行解压缩
1
tar -xzvf geth-alltools-linux-amd64-1.14.11-f3c696fa.tar.gz
  • 解压缩后使用mv命令修改文件名
1
mv geth-alltools-linux-amd64-1.14.11-f3c696fa geth

image-20241027234543751

  • 然后添加环境变量,临时加入环境变量
1
PATH=$HOME/geth:$PATH
  • 然后查看环境变量是否添加成功(永久加入环境变量)(建议使用)
1
echo 'export PATH=$HOME/geth:$PATH' >> ~/.bashrc
  • 这下geth就安装完成了,使用geth -h也可以查看帮助了

image-20241027235243390

geth使用

  • 注意:不同版本的命令会不一样

  • 在启动之前先熟悉一下geth的命令

  • 连接geth到网络:geth --datadir ./path/chain --networkid 1,注意chain是一个文件夹
    • --datadir:用于指定在哪里存储区块链,默认路径为~/.ethereum
    • --networkid:用于指定网络ID(默认为1)。1代表主网ID。非1的数字代表测试网络的ID。
  • 对于geth与账户有关的命令
1
2
3
4
5
6
eth.accounts   //查看现有账户

personal.newAccount("账户密码")
之后会返回一个账户

eth.getBalance(eth.accounts[0]) //查看第一个创建的账户余额
  • geth初始化测试
1
geth --datadir ./chain init ./genesis.json 
  • geth有两种模式,普通模式和开发者模式。开发者模式的好处就是能自动的去挖矿,出矿速度很快
  • 如果启用geth开发者模式,就会先初始化一个账户,该账户里面会有大量的以太,该账户默认已经是解锁状态可以直接使用

普通模式启动

  • 搭建私有链的步骤如下:
1
2
3
1.创建并配置一个创世块文件
2.初始化该创世块
3.连接网络和进入指定模式
  • 我们先创建一个chain文件夹,该文件夹用于存放一些数据

image-20241030102143632

  • 接下来我们要自定义并初始化一个创世块

  • 这时我们要进行一些配置文件,创建一个genesis.json,该文件与chain目录同级,创建如下内容,这里不同版本的geth配置文件会不一样,作为初学者尽量先使用AI跑出能用的json文件,先玩起来后面再理解

    • config:配置文件,里面的内容会逐一介绍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"londonBlock": 0,
"terminalTotalDifficultyPassed": true,
"terminalTotalDifficulty": 10000000000000000000000
},
"difficulty": "1",
"gasLimit": "8000000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "1000000000000000000000" }
}
}
  • 先输入命令初始化一下,在我们所创建的chain文件夹下执行如下命令
  • 这里注意,在第一次init的时候Geth 会从 genesis.json 中创建新的创世块并写入到链数据库中。这时链的首个状态尚未完全更新,因而出现 “Head block is not reachable” 错误。
  • 一旦创世块写入成功,再次运行 init 命令,Geth 发现链数据库已经包含了创世块,因此跳过了新建创世块的步骤,这时链头状态是正常的,ERROR 信息不再出现,显示初始化成功。
1
geth --datadir ./chain init ./genesis.json 

image-20241030213416402

  • 通过geth控制台进行操作,使用如下命令就
1
geth --identity chainpi --http --http.port 8545 --http.corsdomain "*" --datadir ./chain --port 30303 --nodiscover --http.api "db,eth,net,web3,personal,miner" --networkid 8888 --rpc.enabledeprecatedpersonal console
  • 在 Geth 中,8545 端口是默认用于 HTTP RPC (Remote Procedure Call) 的端口。当你启动 Geth 节点并启用 HTTP RPC 时,它会监听该端口,以便外部应用程序或用户可以通过 HTTP 请求与以太坊节点进行交互。
  • 输入上方指令后就会出现如下界面

image-20241030163632596

  • 现在我查看账户,目前工作台还没有账户
1
2
> eth.accounts
[]
  • 接下来我们创建一个账户,输入personal.newAccount("123456"),下一行会返回你的账户
1
2
3
4
5
> personal.newAccount("123456")
INFO [10-30|16:56:16.049] Your new key was generated address=0x035E801B5368ca3a02f03749c9DCF773aE7f6977
WARN [10-30|16:56:16.049] Please backup your key file! path=/home/myheart/CTF/eth/chain/keystore/UTC--2024-10-30T08-56-15.103181792Z--035e801b5368ca3a02f03749c9dcf773ae7f6977
WARN [10-30|16:56:16.049] Please remember your password!
"0x035E801B5368ca3a02f03749c9DCF773aE7f6977"
  • 我们可以使用如下命令来查看我们的账户,查看第一个账户
1
2
> eth.accounts[0]
"0xd769b8a41cfae6697a9809151203bae466fe0454"
  • 还可以使用该指令查看所有账户
1
2
> eth.accounts
["0xd769b8a41cfae6697a9809151203bae466fe0454"]
  • 创建好账户后我们来查看该账户的余额,发现该账户的余额为0
1
2
> eth.getBalance(eth.accounts[0])
0

开发者模式

MetaMask和Ethereum Wallet环境搭建

  • MetaMask是一个去中心化的、分散的web3.0应用浏览器。
  • Ethereum Wallet是一个只绑定了以太坊钱包的Mist浏览器(它只绑定了以太坊钱包一个应用)。

MetaMask环境搭建

image-20241030230221184

  • 然后再点击

image-20241030230241091

  • 然后在eg会提示你要不要安装MetaMask插件,同意安装即可
  • 安装好后就会出现该网页

image-20241030230334097

  • 然后就是一步一步的注册账号

image-20241030230432325

Ethereum Wallet环境搭建

智能合约