主页 > 苹果手机如何下载imtoken > 使用Geth搭建以太坊私有链网络

使用Geth搭建以太坊私有链网络

苹果手机如何下载imtoken 2023-07-26 05:14:22

什么是 Geth

Geth 是以太坊协议的 Go 语言实现。 Geth 支持以太坊中的各种操作; 并且得益于 Go 语言的多平台特性,Geth 也支持在多平台上使用。

安装 Geth

有两种安装方式:

直接下载编译好的Geth二进制文件,从源码编译生成二进制文件

本例中不需要修改Geth代码,所以选择下载编译好的Geth二进制文件

在 MacOS 上安装

在终端执行

brew tap ethereum/ethereum
brew install ethereum

在 ubuntu 上安装

在终端执行

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

验证安装是否成功

在终端执行

geth version

如果出现如下显示则安装成功

Geth
Version: 1.7.3-stable
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.9.3
Operating System: darwin
GOPATH=/Users/lamo/go/default
GOROOT=/Users/lamo/.gvm/gos/go1.8

创世区块

任何以太坊链都是从创世块开始的,所以我们需要定义创世块的一些参数,以便更好地服务于我们的开发和测试。

以下是创世块的示例配置,json格式:

{
  "config": {
        "chainId": 11
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x20000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}

初始化以太坊链

定义创世块配置文件后,使用创世块配置文件初始化以太坊链;

geth --datadir "~/geth/nodes/node_1" init genesis.json

出现以下显示

WARN [02-11|17:49:04] No etherbase set and no accounts found as default 
INFO [02-11|17:49:04] Allocated cache and file handles         database=/Users/lamo/geth/node_1/geth/chaindata cache=16 handles=16
INFO [02-11|17:49:04] Writing custom genesis block 
INFO [02-11|17:49:04] Successfully wrote genesis state         database=chaindata                              hash=7d416a…b75a26
INFO [02-11|17:49:04] Allocated cache and file handles         database=/Users/lamo/geth/node_1/geth/lightchaindata cache=16 handles=16
INFO [02-11|17:49:04] Writing custom genesis block 
INFO [02-11|17:49:04] Successfully wrote genesis state         database=lightchaindata                              hash=7d416a…b75a26

初始化完成后,启动geth进入交互式命令行工具

geth --datadir "~/geth/nodes/node_1" \
 --networkid 11 \
console 2> ~/geth/logs/console.log

查看节点信息

> admin.nodeInfo
{
  enode: "enode://860d8e7e94dfdc72c0c3ca8f5aa919f1a32cf3a2461a74eb0c1b0f8b3563b757b1e0c9cd53068e79774da3ec0d652acbfddeb75420b670fe9b208313293600af@[::]:30303",
  id: "860d8e7e94dfdc72c0c3ca8f5aa919f1a32cf3a2461a74eb0c1b0f8b3563b757b1e0c9cd53068e79774da3ec0d652acbfddeb75420b670fe9b208313293600af",
  ip: "::",
  listenAddr: "[::]:30303",
  name: "Geth/v1.7.3-stable/darwin-amd64/go1.9.3",
  ports: {
    discovery: 30303,
    listener: 30303
  },
  protocols: {
    eth: {
      difficulty: 65536,
      genesis: "0x7d416a4ed27810d9154d9407a9b2b8ea4094fe8c5ce1d87e50bf6016d6b75a26",
      head: "0x7d416a4ed27810d9154d9407a9b2b8ea4094fe8c5ce1d87e50bf6016d6b75a26",
      network: 11
    }
  }
}

至此,我们已经成功创建了一条只有一个创世块和一个节点的以太坊私有链,但是这条以太坊链上没有账户和交易,所以我们来创建一个账户。

创建账户

在交互式命令行中运行

> personal.newAccount('geth')
"0xb6e09535504452d5f1be75b510944fa5942efb08"

创建了一个名为 0xb6e09535504452d5f1be75b510944fa5942efb08 的帐户,密码为 geth

使用命令确认

> personal.listAccounts
["0xb6e09535504452d5f1be75b510944fa5942efb08"]

添加节点

新开一个终端,使用刚才的创世块配置文件,初始化一个节点,启动

geth --datadir "~/geth/nodes/node_2" init genesis.json
geth --datadir "~/geth/nodes/node_2" \
 --networkid 11 \
 --port 30304 \
console 2> ~/geth/logs/console2.log

这是第二个节点的信息

> admin.nodeInfo
{
  enode: "enode://a94ece1f720ba0c5a83f52ac7915bb495c83f3b0a6f8691eb7e97f61c6f9c1c7becb6c6d4af7410ec634cd2ef35a5ea3d2ed8f0eab81cd7d7a559f9eb416893c@[::]:30304",
  id: "a94ece1f720ba0c5a83f52ac7915bb495c83f3b0a6f8691eb7e97f61c6f9c1c7becb6c6d4af7410ec634cd2ef35a5ea3d2ed8f0eab81cd7d7a559f9eb416893c",
  ip: "::",
  listenAddr: "[::]:30304",
  name: "Geth/v1.7.3-stable/darwin-amd64/go1.9.3",
  ports: {
    discovery: 30304,
    listener: 30304
  },
  protocols: {
    eth: {
      difficulty: 65536,
      genesis: "0x7d416a4ed27810d9154d9407a9b2b8ea4094fe8c5ce1d87e50bf6016d6b75a26",
      head: "0x7d416a4ed27810d9154d9407a9b2b8ea4094fe8c5ce1d87e50bf6016d6b75a26",
      network: 11
    }
  }
}

连接两个节点

以上操作只创建了两个孤立的节点

在第二个节点上执行

> admin.peers
[]

发现都是空的,现在我们需要把两个节点连接起来,在第二个节点上执行

admin.addPeer("enode://860d8e7e94dfdc72c0c3ca8f5aa919f1a32cf3a2461a74eb0c1b0f8b3563b757b1e0c9cd53068e79774da3ec0d652acbfddeb75420b670fe9b208313293600af@[::]:30303")

其中admin.addPeer("enode://860d8e7e94dfdc72c0c3ca8f5aa919f1a32cf3a2461a74eb0c1b0f8b3563b757b1e0c9cd53068e79774da3ec0d652acbfddeb75420b670fe9b208313293600af@[::]:30303")这一串地址是节点1的信息。

现在你可以看到

> admin.peers
[{
    caps: ["eth/63"],
    id: "860d8e7e94dfdc72c0c3ca8f5aa919f1a32cf3a2461a74eb0c1b0f8b3563b757b1e0c9cd53068e79774da3ec0d652acbfddeb75420b670fe9b208313293600af",
    name: "Geth/v1.7.3-stable/darwin-amd64/go1.9.3",
    network: {
      localAddress: "[::1]:64498",
      remoteAddress: "[::1]:30303"
    },
    protocols: {
      eth: {
        difficulty: 65536,
        head: "0x7d416a4ed27810d9154d9407a9b2b8ea4094fe8c5ce1d87e50bf6016d6b75a26",
        version: 63
      }
    }
}, {
    caps: ["eth/62", "eth/63", "par/1", "par/2", "pip/1"],
    id: "c2b237a4fabf631170f058f54f1aa685b7893ae75ff6260aa08e0698fd636573cae7bd1c303d41927aeebc46c5aebb8888994201226fff29c4664d9099b0281b",
    name: "Parity/v1.8.7-stable-e322fd8-20180124/x86_64-linux-gnu/rustc1.23.0",
    network: {
      localAddress: "100.100.34.41:64751",
      remoteAddress: "109.230.215.17:30304"
    },
    protocols: {
      eth: "handshake"
    }
}]

至此,两条节点相互连接的以太坊链已经搭建成功。

矿业

首先要设置的是挖矿,在任意节点上执行

>  miner.start(1)
null

挖矿开始,然后风扇的呜呜声开始了

查看此时挖出的区块数

> eth.blockNumber
0

找到开始 0

为了能够查看进度,执行

tail -f ~/geth/logs/console.log

或者

tail -f ~/geth/logs/console2.log

看你用哪个节点挖矿

出现以下输出

INFO [02-11|18:09:52] Generating DAG in progress               epoch=0 percentage=29 elapsed=35.565s
INFO [02-11|18:09:53] Generating DAG in progress               epoch=0 percentage=30 elapsed=36.822s
INFO [02-11|18:09:54] Generating DAG in progress               epoch=0 percentage=31 elapsed=38.024s
INFO [02-11|18:09:55] Generating DAG in progress               epoch=0 percentage=32 elapsed=39.206s
INFO [02-11|18:09:56] Generating DAG in progress               epoch=0 percentage=33 elapsed=40.389s
INFO [02-11|18:09:58] Generating DAG in progress               epoch=0 percentage=34 elapsed=41.649s
INFO [02-11|18:09:59] Generating DAG in progress               epoch=0 percentage=35 elapsed=42.837s
INFO [02-11|18:10:00] Generating DAG in progress               epoch=0 percentage=36 elapsed=43.992s
INFO [02-11|18:10:01] Generating DAG in progress               epoch=0 percentage=37 elapsed=45.181s
INFO [02-11|18:10:02] Generating DAG in progress               epoch=0 percentage=38 elapsed=46.317s
INFO [02-11|18:10:04] Generating DAG in progress               epoch=0 percentage=39 elapsed=47.516s
INFO [02-11|18:10:05] Generating DAG in progress               epoch=0 percentage=40 elapsed=48.662s

当percentage=100时,开始挖矿,稍等片刻,然后执行

> eth.blockNumber
4
> eth.blockNumber
5

发现挖完了,为了废除扇子,及时停止了挖矿

> miner.stop()
true

查看区块信息

查看上一个区块的信息

> eth.getBlock(eth.blockNumber)
{
  difficulty: 131904,
  extraData: "0xd883010703846765746887676f312e392e338664617277696e",
  gasLimit: 3187903,
  gasUsed: 0,
  hash: "0xbd6806c5a0c5f9e43106e0f55dfc5db1765ad89c9a72962b8e7a0b54ca53ee2b",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0xb6e09535504452d5f1be75b510944fa5942efb08",
  mixHash: "0x4951508a4d389ae7358154c332be764f80276c36823affb5bafb1b401d0602c2",
  nonce: "0x47c27c170524dd8f",
  number: 15,
  parentHash: "0xe4b8d62f2e765c5e89eb9f46757e350a6abc199afb3d0066ef3c6631b06a64b5",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 536,
  stateRoot: "0xcbe4197bbedb50693d3dc41a8cf36b418b3bd853cafcf598abdb78778d0cf9c0",
  timestamp: 1518343931,
  totalDifficulty: 2037440,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}

获取挖出最后一个区块的矿工的名字

> eth.getBlock(eth.blockNumber).miner
"0xb6e09535504452d5f1be75b510944fa5942efb08"

查看矿工总共有多少以太币

> eth.getBalance(eth.getBlock(eth.blockNumber).miner)
75000000000000000000

注意,以太币的时间单位是微搭建私有以太坊节点搭建私有以太坊节点,是不可分割的最小单位。 10^18 wei是一个以太币,所以上面的矿工总共有75个以太币,因为一共挖出了15个区块,按照每个区块奖励5 ETH的设定正好是75 ETH。