一、Geth创建私链
1.创建一个genesis.json文件
内容如下:
{"config": {
"chainId": 110,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x07000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
关于JSON文件参数的解释
参数 |
描述 |
mixhash |
与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的黄皮书描述条件 |
nonce |
nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的黄皮书描述的条件 |
difficulty |
设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度 |
alloc |
用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。 |
coinbase |
矿工的账号,随便填 |
timestamp |
设置创世块的时间戳 |
parentHash |
上一个区块的hash值,因为是创世块,所以这个值是0 |
extraData |
附加信息,随便填,可以填你的个性信息 |
gasLimit |
该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和。 |
2.将genesis.json拷贝至任意目录
创建私有链 | geth --datadir .\persondata\ init .\persondata\genesis.json |
登录私有链 | geth --datadir .\persondata\ --networkid 110 console |
datadir是表示当前区块链网络存储的位置。
networkId:表示目前私链网络Id,这个ID是唯一标识,需要注意。
如上图,当执行完以上命令后,会出现两个目录:
Geth目录:用于保存该链上geth保存的该链上的区块数据
keystore目录:保存的该链上的用户信息
二、账户操作
创建一个账户 | personal.newAccount("123456") ,输入参数就是密码,账户地址保存在keystore目录下 。 |
注意:一定要输入字符串,否则会报错!
查询账户信息 | personal.listAccounts ,读取的是本地keystore目录下的账户地址信息 |
三、检查连接信息和Enode
查看连接状态 | net.listening ,查看当前连接状态信息 |
查看对等节点连接数量 | net.peerCount |
查看所连接的私有链 | net.version |
查看自己的Enode | admin.nodeInfo ,把自己的Enode暴露出去,可以让别人添加你的节点,让别人连入你搭建的私有链网络 |
查看自己连接的节点 | admin.peers ,这个命令可以查看自己连接了那些对端节点,这里仅仅是网络自发现的节点。 |
添加别人的节点 | admin.addPeer("enode://[email protected]:port") , admin.nodeInfo可以看字enode信息格式 |
四、挖矿
启动挖矿 | miner.start(x) ,x是启动几个核心来挖矿 |
第一次挖矿的话,时间稍微有点长,如下图会先生成DAG文件,等DAG文件下载到百分之百后,就会开始挖矿。
停止挖矿 | miner.stop() ,另外一种方法就是直接关掉当前geth的进程 |
查看挖矿账户余额 | eth.getBalance(eth.accounts[0]) ,默认的挖矿账户是当前账户列表中的第一个 |
账户中以太币余额默认以最小单位显示:1个以太币=10的18次方个wei,将wei转为以太币:
余额转换 | web3.fromWei(eth.getBalance(eth.accounts[0]),'ether') |
设置挖矿账户 | miner.setEtherbase(eth.accounts[1]) ,设置挖矿账户 eth.coinbase |
成功挖到一次矿后就停止 | miner.start(1);admin.sleepBlocks(1);miner.stop() |
五、转账
在第四步我们已经进行了挖矿,我们在创建一个账户就可以进行转账了。
从上图可以看到第一个账户通过挖矿获得了105个以太币,第二个账户没有以太币。那么执行转账交易。
上图中在执行过程中首先第一步是解锁转账人账户也就是第一个账户,然后在发送交易。发送完交易后,可以查看第二个账户上并没有转过来的5个以太币,这是为什么呢?因为没人挖矿,所以这笔交易并没有计入区块链,当有矿工挖矿计入区块链后,第二个账户才真正拿到这笔交易。如下图,说明这笔交易提交了,但是还在处理中。挖矿后,pending就为0了。
查看转账交易 | eth.getTransaction("xxxx"),参数为交易返回hash |
下图是两笔转账交易,第一笔是提交了,还没有记入区块的,第二笔是已经被矿工挖到的,所以块是有hash的。从下图参数中可以看到区块号,可以通过区块号查看这个块信息:
查看区块信息 | eth.getBlock(22) ,入参是区块号 |
下图就是一个典型的区块的数据结构,我们可以看到transactions字段中得知看当前块记录了几笔交易。
六、智能合约的部署和调用
关于转账和智能合约的部署以及调用,后期会通过以太坊钱包来操作,这样可以简化命令行操作繁杂操作,更好入门。不过命令行操作能够更好的理解以太坊客户端运行的流程和部分信息,后期还会在讲解以太坊的过程中使用Geth。
七、配置静态节点
Geth支持一个叫静态节点的特征,如果你有特定的端点,你会一直想与静态节点连接。如果断开连接,静态节点会再次连接。你可以配置永久性静态节点,方法是将如下所说的放进/personData/Geth/static-nodes.json(这应该是和chaindata以及keystone在同一个文件夹),下边的数据是demo。