使用 Geth 构建你自己的私有以太坊网络 - 手把手教程

描述

准备好超越开发工具了吗?在我分享了如何使用 Ganache 和 Remix 部署智能合约之后,这次我们将使用 Geth 构建一个私有以太坊网络!这份实用指南将帮助你入门,非常适合想要尝试区块链技术的初学者。

使用设备的信息

在本文中,我使用的是 Ubuntu 22.04.3 LTS 作为我的操作系统,如果你使用其他 Linux 发行版,或使用 Windows 或 Mac,我认为没有问题,但你需要调整安装预备条件

预备条件

  • Go 语言(在本文中,我使用的是 Go 版本 1.22.0)
  • Go Ethereum(在本文中,我使用的是 Geth 版本 1.13.14-stable)
  • VSCode(这是可选的,你可以使用你喜欢的代码编辑器)

步骤如下:

创建项目文件夹

在第一步中,我们将创建一个项目文件夹,用于创建区块链网络

mkdir geth-tutorial

使用命令行导航到你的项目文件夹。

cd geth-tutorial

创建节点

在这一步中,我们将在区块链网络中为每个节点设置单独的文件夹。让我们创建名为“node1”和“node2”的文件夹来表示我们的网络节点。

mkdir node1 node2

管理节点信息

在创建每个 node1 和 node2 文件夹后,我们将在项目文件夹的根目录中创建一个 info.txt 文件,以存储 node1 和 node2 的账户地址和密码等信息。这将帮助我们跟踪与节点相关的重要细节。

touch info.txt

打开代码编辑器(可选,便于查看)

在这一步中,我使用 VS Code

code .

为 Node1 和 Node2 创建账户

接下来,我们将为 node1 和 node2 创建账户。我们将为每个节点文件夹打开一个单独的终端,并运行如下命令

geth --datadir "./data" account new

验证账户创建

为了确保 node1 和 node2 的账户已成功创建,我们将检查每个节点数据目录中的 keystore 文件夹。

  1. 打开 node1 和 node2 数据目录中的 keystore 文件夹。
  2. 验证每个 keystore 文件夹中是否存在新账户文件。

通过确认账户文件的存在,我们可以确保 node1 和 node2 的账户已成功创建。

保存账户信息

对于之前创建的账户,我们将 node1 和 node2 创建的账户的公钥地址和密码保存到 info.txt 文件中。

  1. 打开位于项目文件夹根目录的 info.txt 文件。
  2. 添加为 node1 和 node2 创建的每个账户的公钥地址和密码。

创建配置文件

在这一步中,账户已创建,接下来我们将在项目根目录中创建一个名为“privateblock.json”的文件进行配置。然后,我们将复制并粘贴下面提供的脚本到“privateblock.json”文件中。

  1. 在项目的根目录中创建一个名为“privateblock.json”的文件。
  2. 将以下脚本复制并粘贴到“privateblock.json”中:
{  
  "config": {  
    "chainId": 1234567,  
    "homesteadBlock": 0,  
    "eip150Block": 0,  
    "eip155Block": 0,  
    "eip158Block": 0,  
    "byzantiumBlock": 0,  
    "constantinopleBlock": 0,  
    "petersburgBlock": 0,  
    "istanbulBlock": 0,  
    "berlinBlock": 0,  
    "clique": {  
      "period": 5,  
      "epoch": 30000  
    }  
  },  
  "difficulty": "1",  
  "gasLimit": "8000000",  
  "extradata": "0x0000000000000000000000000000000000000000000000000000000000000000{ INITIAL_SIGNER_ADDRESS }0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",  
  "alloc": {  
    "{ FIRST_NODE_ADDRESS }": {  
      "balance": "3000000000000000000000000000000000000"  
    },  
    "{ SECOND_NODE_ADDRESS }": {  
      "balance": "3000000000000000000000000000000000000"  
    }  
  }  
}

3. 将“{ FIRST_NODE_ADDRESS }”替换为每个节点账户的公钥地址,并将“{ INITIAL_SIGNER_ADDRESS }”更改为其中一个节点的公钥地址(去掉前导的“0x”字符)。
例如,这些是我为每个节点创建的账户

这是我在 privateblock.json 中的脚本

{  
    "config": {  
        "chainId": 1234567,  
        "homesteadBlock": 0,  
        "eip150Block": 0,  
        "eip155Block": 0,  
        "eip158Block": 0,  
        "byzantiumBlock": 0,  
        "constantinopleBlock": 0,  
        "petersburgBlock": 0,  
        "istanbulBlock": 0,  
        "berlinBlock": 0,  
        "clique": {  
            "period": 5,  
            "epoch": 30000  
        }  
    },  
    "difficulty": "1",  
    "gasLimit": "8000000",  
    "extradata": "0x0000000000000000000000000000000000000000000000000000000000000000A43ffF7C765A30f797C7F0108291958faA30Fa170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",  
    "alloc": {  
        "A43ffF7C765A30f797C7F0108291958faA30Fa17": {  
            "balance": "3000000000000000000000000000000000000"  
        },  
        "5b5cD226194D0EDe2652102D52Fc0A9ed0F38C0D": {  
            "balance": "3000000000000000000000000000000000000"  
        }  
    }  
}

初始化节点

账户和配置已创建,现在是时候使用以下命令初始化每个节点:

geth --datadir ./data init ../privateblock.json

设置 Bootnode

在这一步中,我们将在项目目录的根目录中创建一个名为“bnode”的文件夹来设置 bootnode。bootnode 充当以太坊网络中节点发现的中心枢纽。它生成唯一的 enode URL 并促进新节点的连接,实现网络同步和去中心化通信。

在项目的根目录中创建一个名为“bnode”的文件夹。

mkdir bnode  
cd bnode

生成 Bootnode 密钥并运行 Bootnode

接下来,我们将生成 bootnode 密钥并运行 bootnode。

  1. 在“bnode”文件夹中生成 bootnode 密钥:
bootnode -genkey boot.key

2. 生成密钥后,使用以下命令运行 bootnode:

bootnode -nodekey boot.key -verbosity 7 -addr "127.0.0.1:30301"

存储 Bootnode Enode

为了方便起见,我们将在项目根目录的“info.txt”文件中存储 bootnode 的 enode 信息。

  1. 打开位于项目目录根目录的“info.txt”文件。
  2. 添加引导节点的 enode 信息:

存储密码

在运行每个节点之前,我们将在 node1 和 node2 文件夹中创建一个名为“password.txt”的文件,并在相应的文件中输入每个节点的密码。

启动签名账户(Node1)

好了,现在我们将运行脚本以使用 node1 启动一个签名账户。我们将使用适当的参数自定义脚本,例如 enode、网络 ID(chainId)、签名节点地址、密码和签名地址。

geth --datadir "./data"  --port 30304 --bootnodes enode://{ YOUR_VALUE } --authrpc.port 8547 --ipcdisable --allow-insecure-unlock  --http --http.corsdomain="https://remix.ethereum.org" --http.api web3,eth,debug,personal,net --networkid { NETWORK_ID } --unlock { ADDRESS_NODE1 } --password { PASSWORD_FILE_NAME_EXTENSION }  --mine --miner.etherbase= { SIGNER_ADDRESS }

例如,这是我的脚本

geth - datadir "./data" - port 30304 - bootnodes enode://7c8ae5080a4e655b82868853abf24164dc62a13f16118ae0e9a6d6446fa5013e7e7809912474057836628804837380549d680b29f26b350c1350dad385e2b538@127.0.0.1:0?discport=30301 - authrpc.port 8547 - ipcdisable - allow-insecure-unlock - http - http.corsdomain="https://remix.ethereum.org" - http.api web3,eth,debug,personal,net - networkid 1234567 - unlock 0xA43ffF7C765A30f797C7F0108291958faA30Fa17 - password password.txt - mine - miner.etherbase=0xA43ffF7C765A30f797C7F0108291958faA30Fa17

注意:

要设置 CORS 允许“http://127.0.0.1:8000”,请将“http://127.0.0.1:8000”添加到“ — http.corsdomain”

例如:

geth --datadir "./data"  --port 30304 --bootnodes enode://7c8ae5080a4e655b82868853abf24164dc62a13f16118ae0e9a6d6446fa5013e7e7809912474057836628804837380549d680b29f26b350c1350dad385e2b538@127.0.0.1:0?discport=30301 --authrpc.port 8547 --ipcdisable --allow-insecure-unlock  --http --http.corsdomain="https://remix.ethereum.org, http://127.0.0.1:8000" --http.api web3,eth,debug,personal,net --networkid 1234567 --unlock 0xA43ffF7C765A30f797C7F0108291958faA30Fa17 --password password.txt  --mine --miner.etherbase=0xA43ffF7C765A30f797C7F0108291958faA30Fa17

运行其他节点

那么,如何运行签名节点以外的节点呢?我们可以使用下面的脚本命令运行签名节点(node1)以外的节点

geth --datadir "./data"  --port 30306 --bootnodes enode://{ YOUR_VALUE }  -authrpc.port 8546 --networkid { NETWORK_ID } --unlock { ADDRESS_NODE2 } --password { PASSWORD_FILE_WITH_EXTENSION }

这是我运行 node2 的脚本示例

geth --datadir "./data"  --port 30306 --bootnodes enode://7c8ae5080a4e655b82868853abf24164dc62a13f16118ae0e9a6d6446fa5013e7e7809912474057836628804837380549d680b29f26b350c1350dad385e2b538@127.0.0.1:0?discport=30301  -authrpc.port 8546 --networkid 1234567 --unlock 0x5b5cD226194D0EDe2652102D52Fc0A9ed0F38C0D --password password.txt

部署智能合约

区块链网络已创建,要检查部署智能合约,请尝试在 REMIX IDE 中使用提供者“custom — external http provider”进行部署,主机和端口为http://127.0.0.1:8545

我是 AI 翻译官,为大家转译优秀英文文章,如有翻译不通的地方,在这里修改,还请包涵~

  • 翻译
  • 学分: 19
  • 标签:
点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

2 条评论

请先 登录 后评论
Ferdy Hahan Pradana
Ferdy Hahan Pradana
江湖只有他的大名,没有他的介绍。