环境准备与工具安装

在Mac系统上搭建以太坊私有链,需要先安装必要的开发工具和环境,以下是详细步骤:

安装Homebrew(包管理器)

Mac系统默认未安装Homebrew,需先通过终端安装,打开终端(Terminal),执行以下命令:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安装完成后,可通过 brew --version 验证是否成功。

安装Go以太坊客户端(geth)

Geth(Go-Ethereum)是以太坊官方的Go语言客户端,用于搭建私有链,执行以下命令安装:

brew install geth

安装后,通过 geth version 检查版本,确保安装成功(建议安装最新稳定版)。

安装Node.js与Truffle(可选)

若需开发智能合约,可安装Node.js和Truffle框架(以太坊开发工具链),Node.js安装命令:

brew install node

Truffle安装(需先通过npm安装Node.js后执行):

npm install -g truffle

初始化私有链配置

私有链的核心是自定义创世区块(Genesis Block),通过配置文件定义链的初始规则。

创建项目目录

在Mac用户目录下创建以太坊私有链项目文件夹,

mkdir ~/ethereum-private-chain
cd ~/ethereum-private-chain

编写创世区块配置文件

在项目目录下创建 genesis.json 文件,内容如下(可根据需求调整参数):

{
  "config": {
    "chainId": 15,              // 私有链ID,避免与公有链冲突
    "homesteadBlock": 0,        // 启用Homestead规则的区块高度
    "eip155Block": 0,          // 启用EIP-155规则的区块高度
    "eip158Block": 0           // 启用EIP-158规则的区块高度
  },
  "alloc": {},                // 预分配的账户(地址: 余额),留空表示初始无预分配
  "coinbase": "0x0000000000000000000000000000000000000000",  // 矿工地址
  "difficulty": "0x40000",    // 初始难度值(私有链可调低,便于挖矿)
  "extraData": "",            // 附加数据(可留空或填写自定义信息)
  "gasLimit": "0xffffffff",   // Gas限制(区块最大Gas消耗)
  "nonce": "0x0000000000000042",  // 随机数
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",  // 混合哈希
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",  // 父区块哈希(创世区块为0)
  "timestamp": "0x00"         // 时间戳
}

参数说明

  • chainId:必须唯一,用于区分不同私有链;
  • difficulty:值越小挖矿越容易,私有链可设置为 0x40000 或更低;
  • alloc:可预分配地址和余额,格式如 "0x...": {"balance": "0x100000000000000000000"}(单位为Wei)。

初始化创世区块

使用geth的 init 命令基于配置文件初始化私有链:

geth --datadir ./data init ./genesis.json

执行成功后,会在当前目录下生成 data 文件夹,包含私有链的区块链数据(如 geth/chaindatakeystore 等)。

启动私有链节点

初始化完成后,即可启动私有链节点,启动时可配置多种参数,如网络端口、节点ID、挖矿模式等。

基础启动命令

geth --datadir ./data --nodiscover --rpc --rpcport 8545 --rpcapi "eth,net,web3,personal" --networkid 15 console

参数说明

  • --datadir ./data:指定数据目录(与初始化时的目录一致);
  • --nodiscover:禁止自动发现其他节点(私有链无需暴露公网);
  • --rpc:启用HTTP-RPC服务,方便外部应用连接;
  • --rpcport 8545:RPC服务端口(默认8545,可自定义);
  • --rpcapi "eth,net,web3,personal":开放的API接口(如eth用于交易操作,personal用于账户管理);
  • --networkid 15:网络ID(与genesis.json中的chainId一致);
  • console:启动交互式JavaScript控制台(方便直接执行命令)。

后台启动(可选)

若希望节点在后台运行,可使用 nohup 命令:

nohup geth --datadir ./data --nodiscover --rpc --rpcport 8545 --rpcapi "eth,net,web3,personal" --networkid 15 > geth.log 2>&1 &
  • > geth.log:将日志输出到 geth.log 文件;
  • 2>&1:将错误输出重定向到标准输出;
  • &:让命令在后台执行。

控制台常用操作

启动节点后,终端会进入geth交互式控制台(JavaScript环境),可通过以下命令管理私有链。

查看节点信息

// 查看当前节点版本
admin.nodeInfo
// 查看网络连接情况
admin.peers
// 查看链ID
eth.chainId

账户管理

// 创建新账户(需输入密码)
personal.newAccount("your_password")
// 查看所有账户
eth.accounts
// 查看账户余额(单位:Wei)
eth.getBalance(eth.accounts[0])
// 解锁账户(挖矿或交易前需解锁)
personal.unlockAccount(eth.accounts[0], "your_password")
// 锁定账户
personal.lockAccount(eth.accounts[0])

挖矿操作

// 启动挖矿(第二个参数为线程数,默认为CPU核心数)
miner.start(1)
// 停止挖矿
miner.stop()
// 查看当前挖矿状态
eth.mining

注意:私有链初始难度较低,启动挖矿后很快会生成区块,若需预分配账户余额,可在 genesis.jsonalloc 字段中配置,或在创世后通过转账交易发送。

交易操作

// 转账(从账户0到账户1,金额1 ETH,单位:Wei)
// 1 ETH = 1e18 Wei
eth.sendTransaction({
  from: eth.accounts[0],
  to: eth.accounts[1],
  value: 1e18,
  gas: 21000  // 交易Gas限制,普通转账默认21000
})
// 查看交易状态(txHash为交易哈希)
eth.getTransaction("0x...")
// 等待交易被打包(返回交易收据)
eth.waitForTransactionReceipt("0x...")

连接私有链(外部工具)

除了geth控制台,还可通过HTTP-RPC连接私有链,使用工具如MetaMask、Postman或自定义脚本。

MetaMask连接

  1. 安装MetaMask浏览器插件(Chrome/Firefox等);
  2. 点击插件,切换网络到“本地主机”(默认RPC地址为 http://localhost:8545);
  3. 若未自动检测,可手动添加网络:网络名称(如“私有链”)、RPC URL(http://localhost:8545)、链ID(15);
  4. 导入geth控制台中的账户(点击“导入账户”,粘贴私钥)。

Postman调用API

使用Postman发送HTTP请求,调用RPC接口(如获取账户列表):

  • URLhttp://localhost:8545
  • MethodPOST
  • HeadersContent-Type: application/json
  • Body(JSON格式):
    {
      "jsonrpc": "2.0",
      "method": "eth_accounts",
      "params": [],
      "id": 1
    }
  • 响应