geth搭建私链小结
写入创世区块
geth --datadir data0 init genesis.json
genesis.json作为区块链的头部,genesis.json部分内容举例如下
{
"config": {
"chainId": 10,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
字段解释:
head.png--datadir data0表示存储私有链节点的文件夹,拷贝genesis.json到/home/kindol/eth 文件夹下,方便命令行操作
在运行以上语句之后,会有在data文件夹下产生两个新的文件夹,geth和keystore两个文件夹,其中geth/chaindata目录中存放的是区块数据,keystore存放的是账户数据
启动私有链节点
geth --datadir data0 --networkid 1108 console
- 主要是geth console,表示启动节点并且进入交互式控制台
- --networkid 1108表示这个私有链的网络id为1108,网络id在连接到其他节点的时候会用到,以太坊公网的网络id是1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络id
接着会进入一个交互式Javascript执行环境,这些对象主要包括:
- eth:包含一些跟操作区块链相关的方法
- net:包含以下查看p2p网络状态的方法
- admin:包含一些与管理节点相关的方法
- miner:包含启动&停止挖矿的一些方法
- personal:主要包含一些管理账户的方法
- txpool:包含一些查看交易内存池的方法
- web3:包含了以上对象,还包含一些单位换算的方法
geth console的使用
- eth.accounts:查看所有私有链用户地址
- personal.newAccount("password"):新建账户
- eth.getBalance(eth.accounts[0]):通过账户地址查看账户余额(eth.accounts[0]可以替换为用户地址)
- miner.start(2):开始挖矿,参数表示启动的线程数量,第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。
- miner.stop():停止挖矿
挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做coinbase,默认情况下coinbase是本地账户中的第一个账户,使用
- eth.coinbase:获得本地账户的第一个用户
要想使挖矿奖励进入其他账户,通过miner.setEtherbase()将其他账户设置成coinbase即可:
- miner.setEtherbase(eth.accounts[1])
默认情况下,getBalance()返回值是wei,wei是以太币的最小单位,要查看有多少个以太币,可以使用如下换算:
- web3.fromWei(eth.getBalance(eth.accounts[1]), 'ether');
发起交易
从user0转移5个以太币到user1中
user0 = eth.accounts[0]
"..."
amount = web3.fromWei(5, 'ether')
"..."
personal.unlockAccount(user0)
"..."
eth.sendTransaction({from:user0, to:user1, value:amount})
-
personal.unlockAccount(user0):账户每隔一段时间就会被锁住,要发送交易,必须先解锁账户,由于我们要从账户0发送交易,所以要解锁账户0
-
eth.sendTransaction({from:user0, to:user1, value:amount}):固定格式,从user0发送amount比特币给user1
-
txpool.status:前面交易已经上交,但是还未处理,通过txpool查看
> txpool.status
{
pending: 1, //已经提交但还未被处理的交易
queued: 0
}
要使交易被处理,必须要挖矿。这里我们启动挖矿,然后等待挖到一个区块之后就停止挖矿:
miner.start(1); admin.sleepBlocks(1);miner.stop();
结果如下:
> txpool.status
{
pending: 0,
queued: 0
}
再次查看user1,发现已经获得了5个比特币
web3.fromWei(eth.getBalance(user1), 'ether')
5
查看交易和区块
- eth.blockNumber:查看当前的区块数量
- eth.getTransaction("..."):通过交易hash查看交易
- eth.getBlock(23):通过区块号查看区块
创建私有链集群
先启动一个节点,注意私有链的节点networkid必须一致
geth --datadir data0 --networkid 1111 console
- admin.nodeInfo.enode:获取节点实例的encode url
再打开一个终端,初始化第二个节点:
geth --datadir data1 --networkid 1111 init genesis.json
geth --datair data1 --networkid 1111 --port 30304 --bootnodes "填入从另一个节点获得的encode url"
注意当中的url的ip需要设置@[::]当中的内容为对应机子的ip
- admin.nodeInfo:当前节点的信息,当中的enode即为encode url
- admin.addPeer(encodeUrlOfFirst instance):也可以不在这里设置 --bootnodes,直接启动,进入命令行,通过命令把其他节点添加进来
- net.peerCount:统计当前节点的邻居节点的数目
- admin.peers:列举出其他节点的详细信息
推荐阅读:
https://blog.csdn.net/jomozz/article/details/79528741
https://blog.csdn.net/w88193363/article/details/79402074
注:区块链学习新人,若有不正确的地方,望指出