怎么设置以太坊私链

怎么设置以太坊私链

选择网络 ID

网络 ID 是一个整数,用于隔离以太坊对等网络。只有当两个对等方使用相同的创世块和网络 ID 时,区块链节点之间的连接才会发生。使用--networkid命令行选项设置 geth 使用的网络 ID。

主网ID为1。如果您提供与主网不同的自定义网络ID,您的节点将不会连接到其他节点并形成私有网络。如果您计划连接到您的互联网上的私有链,最好选择一个尚未使用的网络 ID。您可以在https://chainid.network找到社区运行的以太坊网络注册表。选择共识算法

虽然主网络使用工作量证明来保护区块链,但 Geth 还支持“集团”权威证明共识算法作为私有网络的替代方案。我们强烈建议为新的私有网络部署使用“clique”,因为它比工作量证明占用的资源少得多。clique 系统还用于多个公共以太坊测试网,例如RinkebyGörli

以下是 Geth 中可用的两种共识算法之间的主要区别:

Ethash 共识是一种工作量证明算法,是一个允许任何愿意将资源用于挖矿的人公开参与的系统。虽然这对于公共网络来说是一个很好的属性,但区块链的整体安全性严格取决于用于保护它的资源总量。因此,对于矿工很少的私有网络来说,工作量证明是一个糟糕的选择。Ethash 挖矿“难度”会自动调整,因此新区块的创建间隔大约为 12 秒。随着网络上部署的挖矿资源越来越多,创建新区块变得更加困难,因此平均出块时间与目标出块时间相匹配。

Clique 共识是一种权威证明系统,只有经过授权的“签名者”才能创建新块。集团共识协议在EIP-225 中指定 。初始授权签名者集在创世区块中配置。可以使用投票机制对签名者进行授权和取消授权,从而允许在区块链运行时更改签名者集。Clique 可以配置为针对任何阻塞时间(在合理范围内),因为它与难度调整无关。

创建创世区块

每个区块链都从创世块开始。当您第一次使用默认设置运行 Geth 时,它会将主网络 genesis 提交到数据库。对于私有网络,您通常需要不同的创世块。

创世区块是使用genesis.json文件配置的。创建创世区块时,您需要为区块链确定一些初始参数:

  • 启动时启用的以太坊平台功能 ( config)。在区块链运行时启用协议功能需要安排硬分叉。
  • 初始区块气体限制 ( gasLimit)。您在此处的选择会影响单个块内可以发生的 EVM 计算量。我们建议使用主要的以太坊网络作为 指南来找到合适的数量。可以在启动后使用--miner.gastarget命令行标志调整块气体限制。
  • 初始分配 ether ( alloc)。这决定了您在创世区块中列出的地址有多少以太币可用。随着链的进展,可以通过挖矿创造额外的以太币。

Clique Example

这是用于权威证明网络的 genesis.json 文件的示例。该config 部分确保所有已知的协议更改都可用,并配置用于达成共识的“集团”引擎。

请注意,必须通过该extradata字段配置初始签名者集。该字段是 clique 工作所必需的。

首先使用geth account 命令创建签名者帐户密钥(多次运行此命令以创建多个签名者密钥)

geth account new --datadir data

记下此命令打印的以太坊地址。

要为您的网络创建初始额外数据,请收集签名者地址并将其编码 extradata为 32 个零字节、所有签名者地址和 65 个其他零字节的串联。在下面的示例中,extradata包含单个初始签名者地址 0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82.

您可以使用period配置选项来设置链的目标出块时间。

{
  "config": {
    "chainId": 15,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "clique": {
      "period": 5,
      "epoch": 30000
    }
  },
  "difficulty": "1",
  "gasLimit": "8000000",
  "extradata": "0x00000000000000000000000000000000000000000000000000000000000000007df9a875a174b3bc565e6424a0050ebc1b2d1d820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  "alloc": {
    "7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
    "f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
  }
}

Ethash 示例

由于 ethash 是默认的共识算法,因此无需配置其他参数即可使用它。您可以使用该difficulty参数影响初始挖矿难度 ,但请注意,难度调整算法会快速适应您在链上部署的挖矿资源量。

{
  "config": {
    "chainId": 15,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "ethash": {}
  },
  "difficulty": "1",
  "gasLimit": "8000000",
  "alloc": {
    "7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
    "f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
  }
}

初始化 Geth 数据库

要创建使用此创世块的区块链节点,请运行以下命令。这将为您的链导入并设置规范的创世块。

geth init --datadir data genesis.json

未来使用此数据目录运行 geth 将使用您定义的创世块。

geth --datadir data --networkid 15

调度硬分叉

随着以太坊协议开发的进展,新的以太坊功能变得可用。要在您的专用网络上启用这些功能,您必须安排硬分叉。

首先,选择硬分叉将激活的任何未来区块号。继续上面的 genesis.json 示例,假设您的网络正在运行,其当前块号为 35421。为了安排“伊斯坦布尔”分叉,我们选择块 40000 作为激活块号并修改我们的 genesis.json 文件以设置它:

{
  "config": {
    ...
    "istanbulBlock": 40000,
    ...
  },
  ...
}

为了更新到新的分叉,首先确保您的私有网络上的所有 Geth 实例实际上都支持伊斯坦布尔分叉(即确保您安装了最新版本的 Geth)。现在关闭所有节点并重新运行init命令以启用新的链配置:

geth init --datadir data genesis.json

设置网络

一旦您的节点初始化为所需的创世状态,就可以设置点对点网络了。任何节点都可以用作入口点。我们建议将单个节点用作所有其他节点用于加入的集合点。该节点称为“引导节点”。

首先,确定引导节点将在其上运行的机器的 IP 地址。如果您使用的是 Amazon EC2 等云服务,您将在管理控制台中找到虚拟机的 IP。还请确保您的防火墙配置允许端口 30303 上的 UDP 和 TCP 流量。

引导节点需要知道自己的 IP 地址,以便能够将其中继给其他人。IP 是使用--nat标志设置的(插入您自己的 IP 而不是下面的示例地址)。

geth --datadir data --networkid 15 --nat extip:你自己的ip地址

现在使用 JS 控制台提取 bootnode 的“节点记录”。

geth attach data/geth.ipc --exec admin.nodeInfo.enr

此命令应打印一个 base64 字符串,例如以下示例。其他节点将使用引导节点记录中包含的信息连接到您的对等网络。

"enr:-Je4QEiMeOxy_h0aweL2DtZmxnUMy-XPQcZllrMt_2V1lzynOwSx7GnjCf1k8BAsZD5dvHOBLuldzLYxpoD5UcqISiwDg2V0aMfGhGlQhqmAgmlkgnY0gmlwhKwQ_gSJc2VjcDI1NmsxoQKX_WLWgDKONsGvxtp9OeSIv2fRoGwu5vMtxfNGdut4cIN0Y3CCdl-DdWRwgnZf"

设置对等网络取决于您的要求。如果您通过 Internet 连接节点,请确保您的 bootnode 和所有其他节点都分配了公共 IP 地址,并且 TCP 和 UDP 流量都可以通过防火墙。

如果不需要 Internet 连接或所有成员节点都使用众所周知的 IP 连接,我们强烈建议设置 Geth 以将点对点连接限制到 IP 子网。这样做将进一步隔离您的网络并防止与其他区块链网络交叉连接,以防您的节点可从 Internet 访问。使用该 --netrestrict标志配置 IP 网络白名单:

geth <other-flags> --netrestrict 172.16.254.0/24

通过上述设置,Geth 将只允许来自 172.16.254.0/24 子网的连接,并且不会尝试连接到设置 IP 范围之外的其他节点。

运行成员节点

在运行成员节点之前,您必须使用与引导节点相同的创世文件对其进行初始化。

随着引导节点的运行和外部可访问(您可以尝试telnet <ip> <port> 确保它确实可访问),您可以启动更多的 Geth 节点并使用--bootnodes标志通过引导节点连接它们。

要创建与引导节点在同一台机器上运行的成员节点,请选择单独的数据目录(示例data-2:)和侦听端口(示例:)30305

geth --datadir data-2 --networkid 15 --port 30305 --bootnodes <bootstrap-node-record>

在成员节点运行时,您可以通过附加控制台并运行admin.peers. 节点最多可能需要几秒钟才能连接。

geth attach data-2/geth.ipc --exec admin.peers

Clique:运行签名者

要设置 Geth 以在授权证明模式下签署区块,必须有一个签名者帐户可用。必须解锁帐户才能挖掘区块。以下命令将提示输入帐户密码,然后开始签署区块:

geth <other-flags> --unlock 0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82 --mine

您可以通过更改默认 gas 限制块收敛到(with --miner.gastarget)并在(with --miner.gasprice)处接受价格交易来进一步配置挖掘。

Ethash:运行矿工

对于简单私有网络中的工作量证明,单个 CPU 矿工实例足以定期创建稳定的区块流。要启动一个用于挖掘的 Geth 实例,请使用所有常用标志运行它并添加以下内容以配置挖掘:

geth <other-flags> --mine --miner.threads=1 --miner.etherbase=0x0000000000000000000000000000000000000000

这将在单个 CPU 线程上开始挖掘区块和交易,将所有区块奖励记入由 指定的帐户--miner.etherbase

翻译自https://geth.ethereum.org/docs/interface/managing-your-accounts

猜你喜欢

转载自blog.csdn.net/qq_43263481/article/details/120877916