参考链接:http://www.360bchain.com/article/151.html#启动geth进程
https://github.com/ethereum/go-ethereum/wiki/Private-network
https://github.com/ethereum/go-ethereum/wiki/Private-network
https://blog.csdn.net/dev_csdn/article/details/78893014
https://blog.csdn.net/scau_lth/article/details/79570886
建议给虚拟机分配个3G或者4G的内存吧,其次还要看电脑配置好不好,初始化挖矿线程生成DAG实在太慢了,我4G内存初始化了半个小时…加上这是内存困难型(PoW共识机制)挖矿,内存不够,挖矿也非常慢啊!!!
前提首先需要安装好geth和go:
各种安装方法的链接:https://blog.csdn.net/u012254277/article/details/61429199/
go安装代码如下:
apt install golang-go
查看go是否安装成功:
go version
apt-get install software-properties-common //安装开发工具
add-apt-repository -y ppa:ethereum/ethereum //添加源文件
apt-get update //更新源
apt-get install ethereum //安装源
查看geth的版本、查看geth是否安装成功:
geth version
geth --help
1、配置初始状态
首先配置私有区块链的初始状态,新建文件genesis.json,内容如下:
{
"config": {
"chainId": 98,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "200000000",
"gasLimit": "2100000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}
chainId指定了独立的区块链的网络ID,不同ID网络节点无法互相连接。配置文件还对当前挖矿难度difficulty、区块Gas消耗限制gasLimit等参数进行了设置
2、启动区块链
用一下命令初始化区块链,生成创世区块和初始状态:
/nychain/data指定了存放数据的位置
geth --datadir /mychain/data init genesis.json
/mychain/data
├── data
│ ├── geth
│ │ ├── chaindata
│ │ │ ├── 000001.log
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ └── lightchaindata
│ │ ├── 000001.log
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000000
│ └── keystore
└── genesis.json
–datadir指定区块链数据的存储位置
接下来用一下命令启动节点,并进入Geth命令行界面:
98是当初的chainId
geth --datadir /mychain/data --networkid 98 --port 28000 --rpc --rpcaddr 192.168.197.132 --rpcport 8545 --rpcapi 'db,net,eth,web3' --rpccorsdomain '*' --nodiscover console
–identity:指定节点ID
–rpc:表示开启HTTP-RPC服务
–rpcport:指定HTTP-RPC服务监听端口号(默认为8545)
–datadir:指定区块链数据的存储位置
–port:指定和其他节点连接所用的端口号(默认为30303)
–nodiscover:关闭节点发现机制,防止加入有同样初始配置的陌生节点
nodiscover告诉geth最初不要找peers。这一点在这个案例中确实很重要。这是一个私有网络。不希望节点在没有指定的情况下尝试连接到其它节点,不希望这些节点在没有告诉它们的情况下被发现。
下次再进入geth控制台输入:
geth --datadir /mychain/data --nodiscover console
代码解释:
–datadir /mychain/data:–datadir是指定目录,/mychain/data是你当初创建区块链的位置,如何不指定就好像是会去/home/wuyou/e-ethereum云云的文件里去了,然后你当初创建的账号都没有了,又要重新创建过。。。。。。。唉!~~新手入门,没人带,摸了很多坑才知道的
–nodiscover:单词意思就是不被发现,也就是我们的私有区块链了,否则单纯一个geth就是进入以太坊的公链,然后一直下载以前的交易区块了。。。。。(而且8G内存的电脑要下载一周呢,以后你每次进入geth,它都自动帮你下载,你想阻止都阻止不了…)
console:当然就是控制台了~
3、创建账号
用上述geth console命令进入的命令行采用JavaScript语法,用一下命令新建一个账号
personal.newAccount()
Passphrase输入密码,Repeat passphrase再次确认密码
之后才显示出账号的哈希后的结果是0x19f24e1401ba93b1a13b63aa97e594746ed17c96
查看账户余额:
myAddress="0x19f24e1401ba93b1a13b63aa97e594746ed17c96"
eth.getBalance(myAddress)
eth.accounts
查看各账户余额:
eth.getBalance(eth.accounts[0])
eth.getBalance(eth.accounts[1])
开始挖矿
其中start的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。
一定要一套流程一起做完,否则你退出去再进入挖矿好像是在公有链上进行初始化挖矿,然后下载好多好多下不完的区块(以太坊的所有区块,一个8G内存的电脑要下载一周)
miner.start(1)
start 的参数表示挖矿使用的线程数,block reached canonical chain表示区块已经上链
停止挖矿
miner.stop()
另一种挖矿的语句(这是网课上的。。。)
开始在自己的私链上挖矿:
geth --datadir /mychain/data --networkid 98 --mine --minerthreads=1 --etherbase=0x19f24e1401ba93b1a13b63aa97e594746ed17c96
在自己单节点的私链上挖矿需要生成DAG(也就是生成挖矿的初始化线程,这个过程大约需要20~30分钟,视电脑性能而定)
再次挖矿的结果(Successfully sealed new block表示挖矿成功,这个过程我电脑给虚拟机分配了2G内存挖了十分钟…和比特币的TPS有的一拼):
修改保存挖矿收益的账户:
web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
退出以太坊客户端:
查看coinbase地址:
默认是eth.accounts[0]的地址,如果eth.acocunts为空则报错
eth.coinbase
设置coinbase地址,设置地址之后,挖矿所得将存入这个地址:
miner.setEtherbase(eth.accounts[0])