环境
Geth
Version: 1.10.21-stable
Architecture: amd64
Go Version: go1.18.4
Operating System: darwin
GOPATH=
GOROOT=go
node
v16.16.0
npm
8.11.0
开发工具
https://remix.ethereum.org/
MetaMask 谷歌插件
需要提前做的事情
提前安装go,node,npm,geth,web3.js(通过npm安装)
创建工作并进入目录,后续所有的命令都在工作目录中完成
$ mkdir ~/my_chain
$ cd ~/my_chain
step1. 创建账户
在开启本地私链时可以指定账户和初始余额,所以在开启前首先创建一个账号。需要注意的是,创建账号会生成一个keystore文件,为了能让账号可以被将要启动的私链识别,需要将生成的文件放到私链工作目录中。运行如下创建账户命令后会要求输入两次密码,完成后会在~/my_chain/keystore目录下生成【UTC–】开头的文件,该文件为keystore(私钥=keystore+密码)。当然我们可以创建多个账户
$ geth account new --keystore ./keystore
文件名称示例:UTC–2022-08-19T12-05-39.441584000Z–6aeb37cf3eabe984b36cbb5e7196e19ef36a70b3
(需要说明的是最后一个中划线后边的一串前面加上0x就是地址,我们姑且称它为尾地址)
step2. 启动私链
- 首先我们需要在工作目录下创建配置文件Genesis.json,内容如下
- chainId 私链id,自己随便取值
- alloc 配置初始化账户的余额balance,单位为wei,前面那一串为尾地址
{
"config": {
"chainId": 911,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "1000",
"gasLimit": "2100000",
"alloc": {
"6aeb37cf3eabe984b36cbb5e7196e19ef36a70b3": { "balance": "20000000000000000000000" }
}
}
- 初始化并启动私链,注意911为配置文件中的chainId
- -http 需要注意这个参数,没有它就不能使用web3.js访问
- –allow-insecure-unlock,没有这个参数我们不能解锁账户,不能解锁账户就不能用Remix工具
- personal.unlockAccount 该命令在geth命令窗口中执行,用户解锁账户,参数分别是(地址,密码,时间)
$ geth --datadir ./ init Genesis.json
$ geth --networkid 911 -http --http.corsdomain="*" --datadir . console --allow-insecure-unlock
$ personal.unlockAccount("0x6Aeb37cF3eABe984b36CBB5e7196e19EF36A70b3", "***", 60)
执行结果如图
step3. 验证结果
运行如下命令可以查到账户余额
$ eth.getBalance(eth.accounts[0])
效果图,有币就好办了
step4. 开启处理请求
不开启处理请求命令没发执行,所以我们需要开启,获得所得的费用会转到私链第一个账户,也就是刚才创建的账户中
以下命令分别是开始和停止,都需要再geth命令窗口中执行
$ miner.start(1)
$ miner.stop()
step4. 获取私钥
为了使用MetaMask,我们需要导出私钥,keystore导入会导致卡死,目前使用私钥导入,但是我们需要通过keystore获取私钥,方法是创建web3.js文件,内容如下。然运行 node web3.js
- 第一个参数,keystore文件内容
- 第二个参数,密码
const Web3 = require('web3');
const web3 = new Web3('http://localhost:8545');
console.log(web3.eth.accounts.decrypt("第一个参数",'密码'));//第二个参数是密码
输出如下,privateKey为我们要的私钥
step5. 配置MetaMask
点击箭头指向的地方,然后点击添加网络会出现如下表单
- 网络名称,自己随便填
- 新增RPC URL (http://127.0.0.1:8545)
- 链 ID,私链id(911)
- 货币符号 (PCTT),这个目前还不知道为什么不是eth
上述配置完成后可以导入账号了输入上个步骤获取的私钥,导入完成
step6. 配置remix.ethereum.org
打开 http://remix.ethereum.org
选择External Http Provider,然后点击OK,完事。注意如果使用过程中出现账号锁定的情况,在geth窗口执行解锁命令(personal.unlockAccount(“0x6Aeb37cF3eABe984b36CBB5e7196e19EF36A70b3”, “***”, 60))
有问题大家随时留言,必要的话建群交流
-----------------------------------常见问题汇总-----------------------------------
- the method personal_listAccounts does not exist/is not available
启动geth时没有指定服务,参照(https://geth.ethereum.org/docs/rpc/server),增加如下参数解决
$ geth --http --http.api personal,eth,net,web3