从0开始搭建基于eth私有链的NFT交换平台

基础信息

注:以下内容参考了许多网络上其他教程,基于前辈们的基础上作者才成功完成私有链的搭建与使用,撰写此文是希望可以帮助到更多新手小白有一个相对完整的教程来快速起步!如有不足之处还请各路大神多多指教!

本文基于 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.jsoninit 的命令参数,表示使用此 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])

查询结果的单位是 WeiWei 是以太币的最小单位,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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值