从零开始搭建以太坊区块链:详细教程与实践指南**


以太坊作为全球第二大加密货币平台,不仅支持以太币(ETH)的交易,更重要的是,它提供了一个去中心化的、可编程的区块链平台,使得智能合约和去中心化应用(DApps)的开发成为可能,许多开发者和爱好者希望能够亲自搭建一个属于自己的以太坊区块链,无论是用于学习、测试还是特定应用场景,本文将为您提供一份详细的以太坊区块链搭建教程,主要侧重于使用Geth(Go-ethereum)客户端搭建一个私有链或测试链。

搭建前的准备工作

在开始之前,请确保您的计算机满足以下基本要求:

  1. 操作系统:推荐使用 Linux(如 Ubuntu)或 macOS,Windows 用户可以通过 WSL2(Windows Subsystem for Linux 2)或虚拟机来模拟 Linux 环境,本教程以 Ubuntu 20.04 为例。
  2. 硬件配置
    • CPU:至少双核,推荐四核及以上。
    • 内存:至少 4GB RAM,推荐 8GB 或以上,尤其是在运行节点和编译智能合约时。
    • 硬盘:至少 50GB 可用空间,用于存储区块链数据,随着区块增长,空间需求会增加,SSD 能显著提升同步速度。
    • 网络:稳定的互联网连接,尤其是在初始同步区块链数据时。
  3. 软件环境
    • Go 语言环境:Geth 是用 Go 语言编写的,需要安装 Go,推荐安装最新稳定版(如 Go 1.18 )。
    • Git:用于下载 Geth 源码(如果选择从源码编译)。

安装 Geth 客户端

Geth 是以太坊最常用的客户端之一,它是一个命令行工具,可以用来连接以太坊网络、管理账户、挖矿、运行智能合约等。

使用包管理器安装(推荐新手)

对于 Ubuntu/Debian 系统:

# 安装 Geth
sudo apt install geth

安装完成后,可以通过以下命令验证版本:

geth version

从源码编译安装(适合需要最新功能或自定义编译的用户)

  1. 安装 Go 和 Git

    # 安装 Git
    sudo apt install git
    # 下载并安装 Go(以 Go 1.19 为例)
    wget https://go.dev/dl/go1.19.linux-amd64.tar.gz
    sudo tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz
    # 配置 Go 环境变量
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
    source ~/.bashrc
  2. 下载 Geth 源码并编译

    # 克隆 Geth 仓库
    git clone https://github.com/ethereum/go-ethereum.git
    # 进入项目目录
    cd go-ethereum
    # 切换到最新稳定分支(release/1.13.x,请根据实际情况选择)
    git checkout release/1.13.x
    # 编译 Geth
    make geth

编译完成后,geth 可执行文件会位于 go-ethereum/build/bin/ 目录下,您可以将该目录添加到 PATH 环境变量中,方便全局调用。

初始化创世区块

每个独立的区块链都需要一个“创世区块”(Genesis Block),它是区块链的起点,我们需要创建一个创世区块配置文件。

  1. 创建创世配置文件

    创建一个名为 genesis.json 的文件,内容如下,这是一个自定义的创世区块配置,用于私有链:

    {
      "config": {
        "chainId": 15,             // 链ID,用于区分不同的以太坊链,私有链可以自定义,不要与主网(1)、测试网(3,4,5等)冲突
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0,
        "byzantiumBlock": 0,
        "constantinopleBlock": 0,
        "petersburgBlock": 0,
        "istanbulBlock": 0,
        "berlinBlock": 0,
        "londonBlock": 0,
        "mergeNetsplitBlock": 0,
        "terminalTotalDifficulty": 0,
        "terminalTotalDifficultyPassed": true,
        "ethash": {}
      },
      "alloc": {},               // 预分配账户,这里留空,后续手动创建
      "coinbase": "0x0000000000000000000000000000000000000000",
      "difficulty": "0x400000",  // 初始难度,私有链可以设低一些方便挖矿
      "extraData": "",
      "gasLimit": "0xffffffff",  // gas限制
      "nonce": "0x0000000000000042",
      "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "timestamp": "0x00"
    }

    您可以根据需要调整 chainIddifficulty 等参数。

  2. 初始化创世区块

    假设您的 genesis.json 文件位于 /home/user/ethereum/genesis.json,运行以下命令:

    geth --datadir /home/user/ethereum/data init /home/user/ethereum/genesis.json
    • --datadir:指定区块链数据存储的目录。
    • init:初始化命令,后面跟着创世配置文件的路径。

    执行成功后,您会在指定的 datadir 目录下看到 gethkeystore 等文件夹。

启动私有链节点

现在可以启动您的以太坊私有链节点了。

geth --datadir /home/user/ethereum/data --networkid 15 console
  • --datadir:与初始化时指定的数据目录一致。
  • --networkid:网络 ID,必须与 genesis.json 中的 chainId 保持一致,用于节点之间的识别。
  • console:启动 JavaScript 控制台,方便与节点交互。

启动后,节点会开始加载区块数据(如果是第一次启动,会从创世区块开始),您会看到类似以下的日志信息:

INFO [01-01|12:00:00] Maximum peer count                       ETH=25 LES=0 total=25
INFO [01-01|12:00:00] Starting peer-to-peer node               instance=Geth/v1.13.0/linux-amd64/go1.19
INFO [01-01|12:00:00] Allocated cache and file descriptors     cache=512MB handles=4096
INFO [01-01|12:00:00] Blockchain engine started                chainconfig={"chainId":15,"homestead":0,"eip150":0,"eip155":0,"eip158":0,"byzantium":0,"constantinople":0,"petersburg":0,"istanbul":0,"berlin":0,"london":0,"mergeNetsplit":0,"terminalTotalDifficulty":0,"terminalTotalDifficultyPassed":true}
INFO [01-01|12:00:00] Disk storage enabled for ancient blocks   limit=512MB
INFO [01-01|12:00:00] Mapped base state                        in=~/.ethereum/geth/chaindata hash=0xc337f1…a0d9b7
INFO [01-01|12:00:00] Loaded most recent local header          number=0 hash=c337f1…a0d9b7 td=400000
INFO [01-01|12:00:00] Loaded most recent local full block      number=0 hash=c337f1…a0d9b7 td=400000
INFO [01-01|12:00:00] Loaded most recent local fast block      number=0 hash=c337f1…a0d9b7 td=400000
INFO [01-01|12:00:00] Starting P2P networking

进入控制台后,您会看到 > 提示符。

私有链基本操作

在 Geth 控制台中,您可以执行以下常用命令:

  1. 查看账户信息

    // 查看当前账户列表
    eth.accounts
    // 初始为空 []