以太坊私链搭建与预置账号密码,快速启动开发与测试环境

时间: 2026-02-27 11:48 阅读数: 1人阅读

在区块链应用的开发、测试与学习过程中,搭建一个本地或私有的以太坊网络(即“私链”)是至关重要的一步,相较于测试网(如Ropsten, Goerli)或主网,私链提供了完全可控、无需成本、高自由度的环境,而为了方便开发调试和快速上手,为私链预置已知账号和密码(更准确地说是“私钥”和“地址”)是一个非常常见的需求,本文将详细介绍以太坊私链的搭建以及如何预置账号密码,助您快速启动开发与测试工作。

为何需要预置账号密码

在以太坊网络中,账号的本质是由一对密钥组成的:私钥(Private Key)公钥(Public Key),以及由公钥生成的 地址(Address),私钥相当于密码,拥有私钥就控制了该地址上的资产和操作权限。

在私链环境中预置账号密码,主要基于以下几点考虑:

  1. 快速测试:无需每次都通过挖矿或转账来获取测试币,可以直接使用预置的、拥有初始余额的账号进行合约部署、交易发送等操作。
  2. 确定性结果:开发者和测试人员可以预先知道账号信息,方便复现特定的测试场景和调试问题。
  3. 简化流程:避免了繁琐的账号创建和助记词管理,专注于业务逻辑的实现和验证。
  4. 团队协作:团队成员可以使用统一的预置账号,确保测试环境的一致性。

以太坊私链搭建常用工具

搭建以太坊私链有多种工具可选,其中最常用的是:

  • Geth (Go-Ethereum):以太坊官方的Go语言实现功能全面,是搭建私链的经典工具。
  • Parity:另一个功能强大的以太坊客户端,同样支持私有网络搭建。
  • Hardhat / Truffle:这两个是以太坊开发框架,它们通常内置了简化私链搭建和管理的功能,例如Hardhat Network和Truffle Develop,更适合智能合约开发。

本文将以Geth为例,介绍如何搭建私链并预置账号。

使用Geth搭建私链并预置账号密码

准备工作

确保您已经安装了Geth,您可以通过以太坊官方文档或包管理器(如apt, brew, yum等)进行安装。

创建自定义创世块配置文件

创世块是区块链的起始块,每个私有网络都需要一个独特的创世块配置文件,创建一个名为custom genesis.json的文件,内容如下:

{
  "config": {
    "chainId": 12345, // 私链的ID,确保与主网、测试网不同
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "berlinBlock": 0,
    "londonBlock": 0,
    "mergeNetsplitBlock": 0,
    "ethash": {}
  },
  "alloc": {}, // 在这里预置账号和初始以太币
  "coinbase": "0x0000000000000000000000000000000000000000",
  "difficulty": "0x40000",
  "extraData": "",
  "gasLimit": "0xffffffff",
  "nonce": "0x0000000000000042",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp": "0x00"
}

关键在于alloc字段,我们将在这里预置账号。

预置账号(生成私钥并分配余额)

假设我们想预置两个账号:

  • 账号1:私钥 0x1234567890123456789012345678901234567890123456789012345678901234,地址 0x742d35Cc6634C0532925a3b844Bc454e4438f44e,初始余额 10000 ETH。
  • 账号2:私钥 0x5678901234567890123456789012345678901234567890123456789012345678,地址 0x8ba1f109551bD432803012645Hac136c6Ee8a3e5,初始余额 20000 ETH。

我们需要将这两个账号的信息(地址和初始余额)填入alloc字段。注意:创世块配置中通常只填地址和余额,不直接填私钥,私钥由开发者自行妥善保管。

随机配图

修改后的custom genesis.json如下:

{
  "config": {
    "chainId": 12345,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0,
    "constantinopleBlock": 0,
    "petersburgBlock": 0,
    "istanbulBlock": 0,
    "berlinBlock": 0,
    "londonBlock": 0,
    "mergeNetsplitBlock": 0,
    "ethash": {}
  },
  "alloc": {
    "0x742d35Cc6634C0532925a3b844Bc454e4438f44e": {
      "balance": "0x2386f26fc10000" // 10000 ETH in wei (1 ETH = 1e18 wei)
    },
    "0x8ba1f109551bD432803012645Hac136c6Ee8a3e5": {
      "balance": "0x47b760e00000000" // 20000 ETH in wei
    }
  },
  "coinbase": "0x0000000000000000000000000000000000000000",
  "difficulty": "0x40000",
  "extraData": "",
  "gasLimit": "0xffffffff",
  "nonce": "0x0000000000000042",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp": "0x00"
}

初始化并启动私链

打开终端,执行以下命令初始化私链:

geth --datadir "./my_private_chain" init custom genesis.json
  • --datadir 指定了链数据的存储目录。

启动私链节点:

geth --datadir "./my_private_chain" --networkid 12345 --nodiscover --console
  • --networkid 必须与genesis.json中的chainId一致。
  • --nodiscover 防止节点被公网发现,保持私有。
  • --console 启动后自动进入JavaScript控制台,方便交互。

在控制台中管理预置账号

启动成功后,您会进入Geth控制台,我们可以使用预置账号的私钥来解锁账号并进行操作。

  • 导入账号(使用私钥)

    personal.importRawKey("0x1234567890123456789012345678901234567890123456789012345678901234", "password1")

    这里的"password1"是为该账号设置的密码,您可以根据需要设定,导入成功后会返回账号地址,确认与alloc中的一致。

    对第二个账号执行相同操作:

    personal.importRawKey("0x5678901234567890123456789012345678901234567890123456789012345678", "password2")
  • 解锁账号: 在进行交易前,需要解锁账号: