准备好超越开发工具了吗?在我分享了如何使用 Ganache 和 Remix 部署智能合约之后,这次我们将使用 Geth 构建一个私有以太坊网络!这份实用指南将帮助你入门,非常适合想要尝试区块链技术的初学者。
在本文中,我使用的是 Ubuntu 22.04.3 LTS 作为我的操作系统,如果你使用其他 Linux 发行版,或使用 Windows 或 Mac,我认为没有问题,但你需要调整安装预备条件
在第一步中,我们将创建一个项目文件夹,用于创建区块链网络
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 创建账户。我们将为每个节点文件夹打开一个单独的终端,并运行如下命令
geth --datadir "./data" account new
为了确保 node1 和 node2 的账户已成功创建,我们将检查每个节点数据目录中的 keystore 文件夹。
keystore
文件夹。keystore
文件夹中是否存在新账户文件。通过确认账户文件的存在,我们可以确保 node1 和 node2 的账户已成功创建。
对于之前创建的账户,我们将 node1 和 node2 创建的账户的公钥地址和密码保存到 info.txt
文件中。
info.txt
文件。在这一步中,账户已创建,接下来我们将在项目根目录中创建一个名为“privateblock.json”的文件进行配置。然后,我们将复制并粘贴下面提供的脚本到“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
在这一步中,我们将在项目目录的根目录中创建一个名为“bnode”的文件夹来设置 bootnode。bootnode 充当以太坊网络中节点发现的中心枢纽。它生成唯一的 enode URL 并促进新节点的连接,实现网络同步和去中心化通信。
在项目的根目录中创建一个名为“bnode”的文件夹。
mkdir bnode
cd bnode
接下来,我们将生成 bootnode 密钥并运行 bootnode。
bootnode -genkey boot.key
2. 生成密钥后,使用以下命令运行 bootnode:
bootnode -nodekey boot.key -verbosity 7 -addr "127.0.0.1:30301"
为了方便起见,我们将在项目根目录的“info.txt”文件中存储 bootnode 的 enode 信息。
在运行每个节点之前,我们将在 node1 和 node2 文件夹中创建一个名为“password.txt”的文件,并在相应的文件中输入每个节点的密码。
好了,现在我们将运行脚本以使用 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
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!