基础信息
注:以下内容参考了许多网络上其他教程,基于前辈们的基础上作者才成功完成私有链的搭建与使用,撰写此文是希望可以帮助到更多新手小白有一个相对完整的教程来快速起步!如有不足之处还请各路大神多多指教!
本文基于 Windows 10 操作系统,使用 Geth 客户端搭建 ETH 私有链、使用 Remix 编写及部署智能合约,使用 MetaMask 钱包管理账户。
根据本教程的步骤,你最终可以获得一个基于 ETH 私有链搭建的、搭载了智能合约的、可创建并交换 NFT 的一个平台…? 希望文章里的内容可以帮助到你。
ETH私有链搭建
前期准备
Step 1 :客户端下载
下载geth客户端 https://geth.ethereum.org/downloads/
以下为本文使用的Geth客户端版本信息
Geth
Version: 1.10.26-stable
Git Commit: e5eb32acee19cc9fca6a03b10283b7484246b15a
Git Commit Date: 20221103
Architecture: amd64
Go Version: go1.18.5
Operating System: windows
GOPATH=C:\MyCode
GOROOT=go
Step 2:准备目录结构
随便新建个文件夹放数据,目录结构如下:
document
|--file_location // 这个里面放geth生成的数据啥的
|
|--genesis.json // 创世区块配置文件
Step 3:准备创世区块配置文件
genesis.json
{
"config": {
//区块链的ID,随便起
"chainId": 21,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
// 用来预置账号以及账号内的以太币数量,应该也就是所谓的预挖
// 我这里不需要预挖,所以给了个空对象
// 如果需要可以这样加
// "alloc": {
// "0x0000000000000000000000000000000000000001": {"balance": "111111111"},
// "0x0000000000000000000000000000000000000002": {"balance": "222222222"}
// }
"alloc": {
},
// 币基地址,也就是默认的钱包地址,因为我没有地址,所以全0,为空
// 后面运行Geth后创建新账户时,如果Geth发现没有币基地址,会默认将第一个账户的地址设置为币基地址,俗称矿工账号
"coinbase": "0x0000000000000000000000000000000000000000",
// 出块/挖矿难度,可以随便控制,这里设置的难度比较小
"difficulty": "0x4000",
// 附加信息,随便填个文本或不填也行,类似中本聪在比特币创世块中写的报纸新闻
"extraData": "",
// gas最高限制,以太坊运行交易,合约等所消耗的gas最高限制,这里设置为最高
"gasLimit": "0xffffffff",
// 64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊黄皮书中的要求
"nonce": "0x0000000000000042",
// 与nonce共同用于挖矿,注意他和nonce的设置需要满足以太坊黄皮书中的要求
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
// 上一个区块的Hash值,因为是创世块,石头里蹦出来的,没有在它前面的,所以是0
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
// 创世块的时间戳,这里给0就好
"timestamp": "0x00"
}
注意!
genesis.json
文件里不能有注释,用的时候记得删了!
以下是对应字段的解释说明,具体请以官网信息为准:
key | 说明 |
---|---|
chainId | 网络ID,区分不同的区块链网络,值为0代表以太坊主网 |
coinbase | 一个账户地址,挖矿收益最终归属的账户 |
difficulty | 挖矿难度 |
gasLimit | 创世块能够消耗gas的上限,即最多消耗的gas值;智能合约运行在EVM上,运行机器码指令,每个指令都会对应相应的gas消耗,gas与以太不是等价的,它们之前有换算关系,gas * gasPrice = ether, gasPrice是gas单价(单位wei),可以上下浮动(感觉跟市场油价一样会发生变动) |
nonce | 随机数,挖矿的时候寻找到符合条件的nonce值 |
mixhash | 本块的hash值,因为是创世块,所以没有hash值,初始化为0 |
parentHash | 父块hash值,因为是创世块,所以没有父块hash值,初始化为0 |
timestamp | 时间戳,是从1970-01-01 00:00:00开始计算以秒为单位 |
Geth常用参数说明
可以通过
geth -h
帮助指令查看所以指令及对应功能说明,以下常用指令说明
指令 | 说明 |
---|---|
–datadir | 指定之前初始化的数据目录文件(指定工作目录) |
–networkid | 区分不同的区块链网络,与创世块chainId一样,0为以太坊主网 |
–port | 节点之间互相通信的端囗,默认是30303 |
–rpc | 开启远程调用服务,执行智能合约时连接的节点是借助于rpc服务 |
–rpcport | 远程服务端囗,默认是8545 |
–rpcapi | 远程服务提供的远程服务调用函数集(db、net、eth、web3、personal等) |
–rpccorsdomain | 指定可以接收请求来源的域名列表(浏览器访问时必须开启),默认为 “* ” |
–gasprice | gas的单价,单位wei |
–allow-insecure-unlock | 允许在Geth命令窗囗解锁账户(新版本1.9.0+增加的选项) |
–console | 进入管理后台(如修改rpc端囗) |
Geth常用命令说明
初始化命令
初次创建 Geth 私有链需要对区块链进行初始化,以后需要修改创世块设置时也需要初始化,之后其他情况不再需要初始化。
cmd 进入到 file_location 文件夹(也就是 genesis.json 所在的文件夹)键入以下命令:
geth --datadir file_location init genesis.json
命令解读:
geth ...... init
:初始化区块链
参数:
--datadir file_location
:指定数据存放目录为 file_location 位置,file_location 为目录名genesis.json
是init
的命令参数,表示使用此 json 文件进行初始化
初始化最后输出
Successfully xxxxx
就代表成功了
成功后会生成下列目录结构
document
├──file_location
│ ├── geth
│ │ ├── chaindata
│ │ │ ├── 000001.log
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ └── lightchaindata
│ │ ├── 000001.log
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000000
│ └── keystore // 这里以后会放在此节点创建的账号文件啥的
│ ├──
└── genesis.json
开启节点命令
初始化好区块链之后,我们需要开启这个区块链的节点,相当于是“启动”区块链。
cmd 进入到 document 文件夹(也就是 file_location 上层文件夹)键入以下命令:
geth --datadir file_location --networkid 202339 --http --http.addr 0.0.0.0 --http.port 8545 --http.corsdomain "*" --port 30305 --allow-insecure-unlock console
命令解读:
--networkid
:用于区分不同的区块链网络,与创世块chainId一样,0为以太坊主网--http
.addr
.port
指定区块链启动端口为8545.corsdomain
--port
--allow-insecure-unlock
运行完上面的代码后cmd内应该输出 Welcome to the Geth JavaScript console!
title:可能出现的报错
- 错误1:`Fatal: Error starting protocol stack: Access is denied.`
- 错误原因:因为你开启了 2 个或以上的 geth 进程。
- 解决方法:需要关闭另外的 ethereum 客户端。
其他相关命令
从cmd连接刚刚启动的私有链的控制台
geth attach ipc:http://127.0.0.1:8545
删除 filename位置的块
geth removedb --datadir filename
日志相关指令
在启动 Geth 的指令里加 console
指令,这样在开启节点的同时开启了 console 控制台。
但是节点启动后会一直在终端打印日志,会有点影响我们后续的操作观感。
这个时候可以使用以下两种指令来停止终端打印日志。
# 停止输出日志
geth <other flags> console 2> /dev/null
# 保存日志到某个位置
geth <other flags> console --verbosity 3 2> geth-logs.log
- 如果不需要日志,将他们重定向到
dev/null
的位置即可; - 如果还需要日志,那么可以把
dev/null
的路径换成一个文本文件的路径,日志将会被存入其中。
日志中提供的详细程度可以通过向 --verbosity
标志提供一个1-6之间的值来调整,如上述命令里的数字 3 。
Geth管理后台常用命令
管理后台使用的是 Javascript 语言。
如果你不太了解这门语言也不用担心,下面会介绍一些基础的指令,掌握这些指令足够满足你的基础使用需求。
查看此节点所有账户
> eth.accounts
此指令会返回一个数组,里面装载着此区块链里导入的所有账户地址。
因为我们刚刚才创建完一个全新的区块链,且我们在创世块文件 genesis.json 里并没有预设币基地址,所以此时在 Geth 客户端里键入这个命令只会返回一个空数组 []
。
新建账户
让我们来创建一个全新的账户用来存储在私有链上挖矿获得的奖励吧!
使用 personal.newAccount()
函数指令来创建一个账户:
> personal.newAccount()
Passphrase: // 输入密码
Repeat passphrase: // 再次输入密码
"0xc232e2add308136571bb8f9197ba4ae4e5ba9836"
注意:在输入密码时控制台不会显示任何字符或提示,这是正常的!
输入完成后就会显示新创建的账户地址。
账户默认会保存在数据目录的 keystore 文件夹中(也就是 file_location/keystore 路径下),一个文件对应刚才创建的一个账户。
创建账户会生成一个 json 格式的文本文件,可以打开查看,里面存的是私钥经过密码加密后的信息。
余额查询
使用此命令可以查看指定账户在区块链上的余额。
> eth.getBalance("0x26eb81b7bb07a517b08833f16061cb62e061eb7d") #(1)根据账户地址查询
> eth.getBalance(eth.accounts[0]) #(2)根据账户列表索引值查询
>
> acc0=eth.accounts[0] #设置变量
"0x26eb81b7bb07a517b08833f16061cb62e061eb7d"
> eth.getBalance(acc0) #(3)根据设置的变量查询
可以套娃查询: eth.getBalance(eth.accounts[0])
查询结果的单位是 Wei
。Wei
是以太币的最小单位,1 个以太币 = 10 的 18 次方个 Wei
。
单位转换
以 Wei
为单位查到的结果是一个很大的数,有很多零,不太方便我们更直观的了解账户里到底有多少币,此时可以使用“单位转换”命令来方便我们理解。
将返回值换算成以太币:
web3.fromWei()
套娃换算成 ETH:web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
矿工相关指令
启动挖矿
miner.start(1)
其中 start
的参数表示挖矿使用的线程数。
第一次启动挖矿会先生成挖矿所需的 DAG
文件,这个过程有点慢,等进度达到 100% 后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。
注意:有时候键入指令后并没有马上启动挖矿,需要耐心等一会儿。或者你也可以键入停止挖矿指令后再重新键入启动挖矿指令。
停止挖矿
miner.stop()
查看 Coinbase 账户
挖到一个区块会奖励 5 个以太币,挖矿所得的奖励会进入矿工的账户,这个账户就是 coinbase
。
默认情况下 coinbase
是本地账户中的第一个账户:
> eth.coinbase
"0xc232e2add308136571bb8f9197ba4ae4e5ba9836"
修改 Coinbase 账户
可以通过 miner.setEtherbase()
指令将其他账户设置成 coinbase
,使挖矿奖励进入其他账户
> miner.setEtherbase(eth.accounts[1])
true
> eth.coinbase
"0x814d39aa21f3eed069f2b21da7b5f857f7343afa"
查看当前区块总数
> eth.b