以太坊作为目前最知名的智能合约平台之一,其公链虽然功能强大,但对于开发者而言,在进行应用测试、学习智能合约开发或进行某些不希望公开的实验时,搭建一个本地或私有的以太坊网络(即“私链”)则更为便捷和安全,本文将详细介绍如何在Windows操作系统上,从零开始搭建一个以太坊私链。

准备工作

在开始之前,请确保你的Windows系统满足以下条件:

  1. 操作系统:Windows 10 或更高版本(64位系统)。
  2. Windows Subsystem for Linux (WSL):为了获得更好的Linux兼容性和开发体验,推荐安装WSL 2,你可以通过在PowerShell(管理员模式)中运行 wsl --install 来安装(需要Windows 10版本2004及以上)。
  3. Git:用于下载和管理以太坊相关工具,从Git官网下载并安装。
  4. Go语言环境(可选):如果你打算从源码编译以太坊客户端(如geth),则需要安装Go,但对于大多数用户,直接下载预编译的二进制文件更为方便。
  5. 足够的磁盘空间:至少预留几个GB的空间用于数据和客户端安装。

安装以太坊客户端(Geth)

Geth(Go-Ethereum)是以太坊官方的Go语言实现,是最常用的以太坊客户端之一,我们将使用它来搭建私链。

使用预编译二进制文件(推荐)

  1. 下载Geth: 访问Geth的官方发布页面,找到Windows对应的预编译二进制文件(通常是 windows-amd64 版本的zip压缩包)。 geth-windows-amd64-1.13.6-9666d30e.zip (版本号可能更新)

  2. 解压并配置环境变量

    • 将下载的zip文件解压到一个固定的目录,C:\Program Files\geth
    • C:\Program Files\geth 添加到系统的环境变量 Path 中,以便在命令行中直接调用 geth 命令。
      • 右键“此电脑” -> “属性” -> “高级系统设置” -> “环境变量”。
      • 在“系统变量”中找到 Path 变量,点击“编辑”。
      • 点击“新建”,然后添加 C:\Program Files\geth
      • 确认所有对话框。
  3. 验证安装: 打开一个新的命令提示符(CMD)或PowerShell窗口,输入以下命令:

    geth version

    如果显示Geth的版本信息,则表示安装成功。

通过WSL安装(如果已安装WSL)

如果你更习惯Linux环境,可以通过WSL安装Geth:

  1. 打开Ubuntu(或其他你安装的Linux发行版)。
  2. 更新包列表:sudo apt update
  3. 安装Geth:sudo apt install geth -y
  4. 验证安装:geth version

初始化创世区块

以太坊的每个网络都有一个创世区块(Genesis Block),它是区块链的起点,私链需要自定义创世区块配置文件。

  1. 创建创世配置文件: 在你的工作目录(C:\Ethereum~/ethereum)下,创建一个名为 genesis.json 的文件,你可以使用记事本、VS Code等文本编辑器。

  2. 编写创世配置内容: 以下是一个简单的私链创世配置文件示例:

    {
      "config": {
        "chainId": 15,           // 私链的ID,用于区分不同的以太坊网络,自定义一个非0且不同于公链的ID(主网1,Ropsten3,Rinkeby4,Goerli5)
        "constantinopleblock": 0, // 启用Constantinople分叉的区块号,设为0表示立即启用
        "eip150block": 0,        // 启用EIP150分叉的区块号
        "eip155block": 0,        // 启用EIP155分叉的区块号
        "eip158block": 0         // 启用EIP158分叉的区块号
      },
      "alloc": {},              // 预分配地址的以太币,这里留空
      "coinbase": "0x0000000000000000000000000000000000000000", // 矿工地址
      "difficulty": "0x40000",  // 初始难度,私链可以设置得很低以便快速出块
      "extraData": "",          // 附加信息,可以留空或填写自定义信息
      "gasLimit": "0xffffffff", // Gas限制
      "nonce": "0x0000000000000042", // 随机数
      "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", // 与nonce配合使用
      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", // 父区块哈希,创世区块为0
      "timestamp": "0x00"       // 时间戳
    }
    • chainId 是私链的唯一标识,非常重要,不要与已知公链冲突。
    • difficulty 设置较低值(如 0x400000x2000)可以让私链出块更快,方便测试。
  3. 初始化创世区块: 打开命令提示符或PowerShell,进入你创建 genesis.json 文件的目录。

    cd C:\Ethereum

    然后运行以下命令(如果使用WSL,则进入对应Linux目录):

    geth --datadir "./data" init genesis.json
    • --datadir "./data" 指定了数据存储目录,./data 会在当前目录下创建,你也可以指定其他路径。
    • 如果执行成功,你会在 data 目录下看到 gethkeystore 等文件夹。

启动私链节点

我们可以启动私链节点了。

  1. 基本启动命令: 在命令提示符或PowerShell中,继续在 genesis.json 所在目录运行:

    geth --datadir "./data" console
    • --datadir "./data":指定数据目录,必须与初始化时一致。
    • console:启动JavaScript交互式控制台,方便我们与节点交互。
  2. 启动参数说明

    • --networkid 15:指定网络ID,必须与 genesis.json 中的 chainId 一致,如果genesis.json中已配置,此处可省略,但显式指定更清晰。
    • --nodiscover:禁止自动发现其他节点,因为是私链,不需要发现其他网络中的节点。
    • --maxpeers 0:限制最大连接节点数为0,即不接受外部连接,也可以设置为一个较小的数,如 --maxpeers 1
    • --mine:启动挖矿。
    • --minerthreads 1:指定挖矿线程数,默认是CPU的逻辑核心数。
    • --rpc:启用HTTP-RPC服务。
    • --rpcaddr "localhost":RPC服务监听的地址。
    • --rpcport "8545":RPC服务监听的端口。
    • --rpccorsdomain "*":允许跨域访问的域名,开发时可设为 ,生产环境请谨慎设置。
  3. 带挖矿和RPC的启动示例(推荐): 为了方便后续与私链交互(例如使用Truffle、MetaMask或直接调用RPC),建议启动时开启RPC和挖矿:

    geth --datadir "./data" --networkid 15 --nodiscover --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" console

    启动后,你会看到Geth的启动日志,包括节点信息、同步情况等,最后会进入 > 提示符的JavaScript控制台。

与私链交互(在Geth控制台)

进入Geth控制台后,你可以执行各种以太坊命令。

  1. 查看账户信息
    // 查