以太坊开发基础(2)搭建私链和geth命令

一、创建以太坊初始区块文件 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可以花。

创建合约账户时,要同时进行挖矿,否则创建账户会一直处于等待状态。也就是说,我们的合约以及合约地址都是通过挖矿写进区块链的。

在以太坊上使用智能合约是需要专门的交易的,我们需要花费一定的ether来调用智能合约,把一定的ether转账到智能合约的地址中。在我们学习实现智能合约之前,先要了解一下如何创建一个交易。 一、发布交易 ...