创建一个目录用于存放私有链数据

手把手教你搭建以太坊私有链:从零开始的实验指南**


以太坊作为全球领先的智能合约平台,其公有链虽然功能强大,但在某些场景下(如企业内部应用、数据隐私要求高的项目、开发测试等),搭建一条私有链或联盟链更为合适,私有链允许参与者对交易数据进行完全控制,无需担心公有链上的网络拥堵和高昂Gas费用,本文将详细介绍如何通过Geth(Go-Ethereum)客户端,从零开始搭建一条简单的以太坊私有链,并进行基本的交互实验。

实验目的

  1. 理解以太坊私有链的基本概念与搭建原理。
  2. 掌握使用Geth客户端初始化、启动私有链的方法。
  3. 学会在私有链上创建账户、查看账户信息、转账及部署简单智能合约。
  4. 体验私有链的运行机制与特点。

实验环境准备

  1. 操作系统:Linux (Ubuntu 18.04/20.04)、macOS 或 Windows (本文以Linux为例)。
  2. Go语言环境:Geth是Go语言编写的,需要安装Go (建议1.16及以上版本)。
    # 安装Go (以Ubuntu为例,具体版本请参考Go官网)
    sudo apt update
    sudo apt install golang-go
  3. Geth客户端:可以从以太坊官方GitHub下载编译好的二进制文件或自行编译。
    # 下载并解压Geth (示例版本v1.10.25,请替换为最新稳定版)
    wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.10.25-4167d45b.tar.gz
    tar -xzf geth-linux-amd64-1.10.25-4167d45b.tar.gz
    sudo cp geth-linux-amd64-1.10.25-4167d45b/geth /usr/local/bin/
    geth version # 验证安装
  4. 文本编辑器:如VS Code, Vim等,用于编写智能合约。
  5. Solidity编译器 (solc):用于编译智能合约。
    # 安装solc (通过npm,需先安装Node.js)
    sudo apt install nodejs npm
    npm install -g solc

实验步骤

设计创世区块 (Genesis Block)

私有链的第一个区块——创世区块需要我们手动定义,创建一个名为custom.json的文件,内容如下:

{
  "config": {
    "chainId": 15,         // 私有链ID,避免与公有链冲突 (1-14为公有链保留)
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0
  },
  "alloc": {
    // 预分配一些以太坊给指定地址,可选
    "0x1234567890123456789012345678901234567890": {
      "balance": "100000000000000000000" // 100 ETH
    }
  },
  "coinbase": "0x0000000000000000000000000000000000000000",
  "difficulty": "0x4000",  // 初始难度,私有链可以设置低一些方便挖矿
  "extraData": "",
  "gasLimit": "0xffffffff",
  "nonce": "0x0000000000000042",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp": "0x00"
}

说明

  • chainId:私有链的唯一标识符,非常重要。
  • alloc:预分配地址和余额,方便初始测试。
  • difficulty:挖矿难度,私有链可以设置较低值,以便快速出块。

初始化私有链

使用Geth的init命令,根据创世区块文件初始化私有链数据目录。

cd my_private_chain
# 使用创世区块文件初始化
geth --datadir "./data" init ../custom.json

执行成功后,会在./data目录下生成gethkeystorechaindata等文件夹,用于存储链数据、账户信息和区块数据。

启动私有链节点

初始化完成后,启动私有链节点。

geth --datadir "./data" --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport "8545" --rpcapi "db,eth,net,web3,personal" --mine --minerthreads 1 --console

参数说明

  • --datadir "./data":指定数据目录。
  • --nodiscover:禁止节点自动发现其他节点,适用于私有链。
  • --rpc:启用HTTP-RPC服务。
  • --rpcaddr "0.0.0.0":RPC服务监听地址,0.0.0.0表示监听所有网络接口。
  • --rpcport "8545":RPC服务端口,默认8545。
  • --rpcapi "db,eth,net,web3,personal":允许通过RPC调用的API列表。
  • --mine:开启挖矿。
  • --minerthreads 1:挖矿线程数,根据CPU核心数调整。
  • --console:启动后自动进入JavaScript控制台,方便交互。

启动后,节点会开始尝试挖矿,由于我们设置了较低的难度,出块会很快,如果没有预分配地址或预分配地址没有解锁,节点会使用默认的coinbase地址挖矿。

私有链交互 (通过Geth控制台)

当看到miner.start()返回的哈希值,并且区块高度开始增长时,表示节点运行正常,我们可以在Geth控制台进行以下操作:

  1. 查看账户信息

    // 查看当前账户列表
    personal.listAccounts
    // 应该能看到预分配的地址(如果解锁了)和默认的coinbase地址
    // 查看当前使用的账户(默认为coinbase)
    eth.coinbase
  2. 创建新账户

    // 创建一个新账户,并设置密码(注意:控制台输入密码不会显示)
    personal.newAccount("your_password")
    // 记住返回的新账户地址
  3. 解锁账户

    // 解锁账户,以便进行交易(如转账、部署合约)
    personal.unlockAccount(eth.coinbase, "your_coinbase_password")
    // 解锁预分配的账户(如果需要)
    // personal.unlockAccount("0x1234567890123456789012345678901234567890", "alloc_password")
  4. 转账 (发送ETH)

    // 从coinbase账户向新创建的账户转账1 ETH
    // 参数:发送方,接收方,金额(单位:wei),单位
    eth.sendTransaction({from: eth.coinbase, to: "0x新创建的账户地址", value: web3.toWei(1, "ether")})
    // 查看交易状态,返回交易哈希
    // 交易被打包后,接收方余额会增加
  5. 查看余额

    // 查看指定地址的余额(单位:wei)
    web3.eth.getBalance("0x1234567890123456789012345678901234567890")
    // 转换为ether显示
    web3.fromWei(web3.eth.getBalance("0x1234567890123456789012345678901234567890"), "ether")
  6. 停止/开始挖矿

    // 停止挖矿
    miner.stop()
    // 开始挖矿
    miner.start(1) // 1为线程数

部署和调用智能合约 (可选)

  1. 编写智能合约: 创建一个简单存储合约SimpleStorage.sol
     

相关文章