1、安装geth
下载地址: https://geth.ethereum.org/downloads/
下载之后是个 .exe文件,直接双击安装 安装路径目录不要有中文字符,打开cmd窗口,输入 geth version 查询版本信息,显示正常 表示安装成功 如下图 。(千万别直接运行 geth
,它会自动连接到以太坊公网,此时会开始同步区块,网络差或者磁盘空间不够 就gg )
2.初始化创世区块
新建一个文件夹,我的是 在 H:\blockchain\privatechain 路径下
然后新建 json文件,叫什么名字不重要 genesis.json frist.json one.json 都可以 内容如下:
{
"config": {
"chainId": 666,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"ethash": {}
},
"nonce": "0x0",
"timestamp": "0x5ddf8f3e",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x00002",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": { },
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
然后打开cmd窗口,跳转到当前目录下执行命令:
geth --datadir .\nodedata0 init first.json
表示初始化区块链, 其中–datadir选项后面跟一个目录名,这里为nodedata0,表示指定数据存放目录为 nodedata0, first.json是init命令的参数,就是刚才创建的json文件
出现Successfully表示初始化成功了(把这行命令保存为一个.cmd命令备用),这时候你会发现,你的目录下面自动生成了一个nodedata0的文件夹,目录如下:
其中geth/chaindata中存放的是区块数据,keystore中存放的是账户数据。
如果要移除配置,重新配置创世节点的话 执行命令 removedb 再执行 init
geth removedb --datadir nodedata0
geth --datadir .\nodedata0 init first.json
3、启动节点
执行命令:
geth --http --nodiscover --datadir "./nodedata0" --port 30303 --http.api "db,eth,net,web3" --http.port 8545 --http.corsdomain "*" --networkid 666 --ipcdisable console 2>>geth.log
注意 networkid 666,以太坊节点之间能够互相连接需要满足
1)相同的协议版本
2)相同的networkid
所以搭建私有网络最方便的方法就是通过geth命令中的--networkid选项,设置一个与主网不同的networkid(主网的networkid为1),这也是官方推荐的方法.
--nodiscover 关闭p2p网络的自动发现,需要手动添加节点,这样有利于我们隐藏私有网络
--datadir 区块链数据存储目录
--networkid 网络标识,私有链取一个大于4的随意的值
--http 启用http服务,默认端口号8545
--http.api 表示可以通过http调用的对象,一般为 db,eth,net,web3
--http.addr http监听地址,默认为localhost 也就是 127.0.0.1,只能本地访问
2>>geth.log 把geth中的log信息导入geth.log,也可以不加这个,把信息直接输出在console里,这样直观 更多参数:Command-line Options | Go Ethereum
执行之后 出现如下图,表示geth启动成功
因为是私有链,没有执行 geth 命令去同步公链区块,显示的 block为 0
4、创建账户挖矿
personal.newAccount("test")
这里给到了一个地址 0xa0f94aafb1b3027d406ace2ce720d73b28f3302f
查看账户信息:
eth.accounts
如果不记得personal有哪些方法,可以执行personal命令查看一下,其它的eth,miner也一样
挖矿:miner.start()
miner.start(1)
后者表示只使用一个线程工作,这样系统不会太卡
看到null,不要慌,因为日志信息都保存到了geth.log文件里
停止挖矿:miner.stop()
查看余额: eth.getBalance(eth.accounts[0])
查看区块数: eth.blockNumber
1449个区块,以太坊2898个, 一个区块 2个以太坊
另外说明一下,节点挖矿的以太币会自动存入到eth.coinbase账户里,默认是eth.accounts里的第一个,你也可以自己指定coinbase
5、安装 metamask 插件
安装 谷歌浏览器插件 metamask ,能自动知道你本地环境的 节点
然后倒入你本地私有链上的账户到metamask上面
json文件地址 H:\blockchain\privatechain\nodedata0\keystore 下面有你账户信息的文件
密码就是我们上面创建账户后面写的 test 点击导入,等待一会,就可以看到你账户上的余额了
6、指定coinbase账户
先创建第二个账户,然后把第二个账户指定为coinbase,修改之前和修改之后已经改变
7、转账
先创建第三个没有币的账户,从账户1转5个比特币到账户3里,有的同学会问,不是有个账户2吗,你怎么不用呢?因为转账发起了交易,然而发起交易仅仅是发起交易,交易要被确认需要打包进区块里,挖矿就是做这个的,挖矿本身的收益会存进coinbase账户里,而现在coinbase账户是账户2,所以不考虑账户2
当执行personal.unlockAccount()或在程序中调用personal_unlockAccount接口时,会出现:account unlock with HTTP access is forbidden异常。
异常原因
新版本geth,出于安全考虑,默认禁止了HTTP通道解锁账户,相关issue:https://github.com/ethereum/go-ethereum/pull/17037
解决方案
如果已经了解打开此功能的风险,可通启动命令中添加参数:
--allow-insecure-unlock
来进行打开操作。
执行 exit 退出客户端
然后打开cmd 执行命令
geth --http --nodiscover --datadir "./nodedata0" --port 30303 --http.api "db,eth,net,web3" --http.port 8545 --http.corsdomain "*" --networkid 666 --ipcdisable --allow-insecure-unlock console 2>>geth.log
截图中文描述错误,是交易手续费和挖矿收益
exit命令退出
8、验证私链
写了这么多,一顿操作猛如虎,这个私链到底能不能用?
我们用remix验证一样,连接这个私链
参考的链接:https://blog.csdn.net/hantangduhey/article/details/81017602
https://blog.csdn.net/wo541075754/article/details/98847308