一、创建以太坊初始区块文件 genesis.json
{
"config": {
"chainId": 101,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x400",
"extraData": "",
"gasLimit": "0xffffffff",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
chainId:以太坊区块链网络Id,ethereum主链是1,私有链只用不要与主链冲突即可。
alloc:预留账户,如下:
"alloc":{
"0x0000000000000000000000000000000000000001":{"balance":"121312321"},
"0x0000000000000000000000000000000000000002":{"balance":"121312321"},
}
Coinbase:旷工账户
Difficulty:挖矿难度,0x400,这个是简单。
extraData:相当于备注
gasLimit:最小消耗gas
nonce:64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊黄皮书中的要求
parentHash:上一个区块的Hash值,因为是创世块,石头里蹦出来的,没有在它前面的,所以是0
Timestamp:时间戳
二、初始化区块节点
geth --datadir data0 init genesis.json
// data0 是当前文件夹存储节点数据
三、启动geth客户端节点
注意:在geth安装目录下执行
geth --identity "TestNode1" --datadir "data0" --rpc --rpcapi "db,eth,net,web3" --rpcaddr "127.0.0.1"
--rpcport "8545" --port "30304" --networkid "29382" console
使用命令 geth -h 可以查看geth 相关的帮助文档。这里我说几个常用的属性。
- --datadir : 指定当前节点存在位置,“data0”
- --Identity : 区块链的标示,自定义,用于标示目前网络的名字
- --rpc : 启用http-rpc服务器,可以进行智能合约的部署和调试
- --rpcapi : 基于http-rpc提供的api接口。eth,net,web3,db...
- --rpcaddr : http-rpc服务器接口地址:默认“127.0.0.1”
- --rpcport : http-rpc端口(多节点时,不要重复)
- --port : 节点端口号(多节点时,不要重复)
- --networkid : 网络标识符 随便指定一个id(确保多节点是统一网络,保持一致)
- --console :启动命令行模式,可以在Geth中执行命令
四、启动节点后常用的geth操作
# 创建账户
personal.newAccount("123456") // 括号里是密码
# 获取账户数组
eth.accounts
# 解锁账户,转账时可使用
personal.unlockAccount(eth.accounts[0], "123456")
# 节点主账户
eth.coinbase
# 查看账户余额
eth.getBalance(eth.accounts[0])
# 启动,结束挖矿,写区块
miner.start(), miner.stop()
五、配置多节点服务
单个节点运行太霸道,不能成为中心化,咱们给私有的以太坊网络在添加一个节点:
1.再初始化一个节点
geth --datadir data1 init genesis.json
2.启动新节点
geth --identity "TestNode2" --datadir "data1" --rpc --rpcapi "db,eth,net,web3" --rpcaddr "127.0.0.1"
--rpcport "8546" --port "30305" --networkid "29382" console
3.给新节点创建一个账户,否则无法启动挖矿
personal.newAccout(“123”)
4.查看:新节点enode信息,使用你本机ip替换[::]
admin.nodeInfo.enode
5. 主节点添加新节点
回到之前的节点,使用下面的命令:
admin.addPeer("enode://d4f64272de882d2e2ccefc6466c6580ddecd253f5c9d87f977ac3881cbea7b141c07681ea605c53af5815cbfc25b5138b9ddb07be61b757850a55b7197939ba4@192.168.1.175:30304")
这里"enode://......." 填写你节点 admin.nodeInfo.enode 的信息
6. 确保两个节点已经链接
首先使用命令
admin.nodeInfo
查看结果是否为空,然后在其中一个节点启动挖矿命令
miner.start()
如果另一个节点能够看到区块更新,则说明两个节点已经连通。
或者
查看连接的节点数量和连接的节点列表:
net.peerCount
admin.peers
六、使用Mist连接到私链
上图中geth.ipc是Mist连接到以太坊网络的入口,这个文件在我们启动网络的时候生成,关闭网络的时候就会消失。
进入该文件所在的文件夹使用如下命令连接私链:
mist --rpc geth.ipc
注:如果你创建了多个节点,你还可以同时打开多个Mist客户端,分别看不同的账户情况,只要进入相应的文件夹执行上面的命令即可。
在Mist中我们可以看到,需要创建合约账户才能交易,而这需要一定的ETH(大概1.02ETH)。因为我们自己的私链可以挖矿,所以账户里会有大量的ETH可以花。
创建合约账户时,要同时进行挖矿,否则创建账户会一直处于等待状态。也就是说,我们的合约以及合约地址都是通过挖矿写进区块链的。