以太坊私有链创建全流程:从创世块到智能合约交互

·

想在不耗费主网 Gas 的前提下深入理解 以太坊私有链智能合约部署链上交互?本文用人人都能上手的步骤,带你 30 分钟搭好一条本地链,完成代币合约从发行、转账到余额查询的完整闭环。步骤零门槛、可自由搬砖实验,是 Web3·DApp 入门与 区块链测试 的绝佳沙箱。

目录

  1. 环境准备与核心概念
  2. 一句话读懂得“私有链”与“创世块”
  3. 三步生成你的第一条私有链
  4. Geth 控制台:账号、挖矿、转账一条龙
  5. 编写 & 部署代币智能合约
  6. 控制台与 JSON-RPC 双轨交互
  7. 常踩的 5 个坑与解决方案
  8. FAQ:高频疑问速查表
  9. 结语 & 资源扩展

1. 环境准备与核心概念

必需组件版本建议下载链接
Geth≥1.12👉 点我直达官方一键安装包
Solidity 在线编译0.4.x(教学合约适用)浏览器打开即可
系统Windows 10 / macOS 12+ / Ubuntu 20+

读完本文,你将掌握的 核心关键词
私有链、创世块、Geth、智能合约、Solidity、ABI、JSON-RPC、挖矿、代币转账、余额查询。


2. 一句话读懂“私有链”与“创世块”


3. 三步生成你的第一条私有链

步骤 1:书写 genesis.json

在项目根目录新建文件 genesis.json,粘贴以下内容并保存:

{
  "nonce": "0x0000000000000042",
  "difficulty": "0x020000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x0000000000000000000000000000000000000000",
  "timestamp": "0x00",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
  "gasLimit": "0x4c4b40",
  "alloc": {}
}

解释

  • difficulty:调低可 CPU 急速出块。
  • gasLimit:私有链想多高就多高,方便后续部署复杂合约。

步骤 2:一键初始化

Windows 下创建 start_init.bat

geth --identity "MyTestChain" --datadir "%cd%\data" init genesis.json
@pause

双击执行出现 Successfully wrote genesis state 即成功。

步骤 3:启动链

新建 startup.bat

geth --identity "MyTestChain" ^
     --datadir data ^
     --networkid 123456 ^
     --rpc --rpcaddr 0.0.0.0 ^
     --rpccorsdomain "*" ^
     --port 30303 ^
     --rpcapi "db,eth,net,web3" ^
     --nodiscover console

双击后进入 JavaScript 控制台,恭喜你完成创世!


4. Geth 控制台:账号、挖矿、转账一条龙

4.1 常用命令速查

// 创建账户
personal.newAccount("123456")

// 查看账户列表
eth.accounts

// 解锁发币账户
personal.unlockAccount(eth.accounts[0], "123456")

// 开始挖矿(每线程)
miner.start(1)

// 停止挖矿
miner.stop()

// 查看余额(单位:wei)
web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")

4.2 转账实战

eth.sendTransaction({
  from: eth.accounts[0],
  to: eth.accounts[1],
  value: web3.toWei(10, "ether")
})
不挖矿交易永远 pending,记得先 miner.start(1)

5. 编写 & 部署代币智能合约

5.1 合约源代码

pragma solidity ^0.4.2;

contract Token {
    address issuer;
    mapping (address => uint) balances;

    event Issue(address account, uint amount);
    event Transfer(address from, address to, uint amount);

    function Token() public { issuer = msg.sender; }

    function issue(address account, uint amount) public {
        if (msg.sender != issuer) revert();
        balances[account] += amount;
        Issue(account, amount);
    }

    function transfer(address to, uint amount) public {
        if (balances[msg.sender] < amount) revert();
        balances[msg.sender] -= amount;
        balances[to] += amount;
        Transfer(msg.sender, to, amount);
    }

    function getBalance(address account) public constant returns (uint) {
        return balances[account];
    }
}

5.2 在线编译

打开 Solidity Remix 在线编译器,将源码粘入,选择 0.4.x 版本,点击 Compile,复制 ABI 与 Bytecode。

5.3 部署脚本

在 Geth 控制台完整粘贴(根据你实际 ABI & Bytecode 替换):

var abi = [...];  // 粘贴 ABI
var bytecode = "0x606060...";
var tokenContract = web3.eth.contract(abi);
var token = tokenContract.new(
  {
    from: eth.accounts[0],
    data: bytecode,
    gas: 4300000
  },
  function (e, contract) {
    if (!e && contract.address) {
      console.log("合约已部署,地址:", contract.address);
    }
  });

出现 Contract mined! address: 0x... 即部署成功,记录 合约地址,下一步交互必备。


6. 控制台与 JSON-RPC 双轨交互

6.1 控制台交互示例

// 1. 先解锁账户
personal.unlockAccount(eth.accounts[0])

// 2. 发行 100 代币给账户 0
token.issue.sendTransaction(eth.accounts[0], 100, {from: eth.accounts[0]})

// 3. 转账 30 代币给账户 1
token.transfer.sendTransaction(eth.accounts[1], 30, {from: eth.accounts[0]})

// 4. 查询账户 1 余额
token.getBalance.call(eth.accounts[1])

每次 sendTransaction 都需新区块确认,别忘了后台挖矿。

6.2 JSON-RPC 外挂调用

场景:后端或前端想脱离控制台,直接通过 HTTP私有链 交互。

核心思路:把调用方法 + 参数→编码 data→调用 eth_sendTransaction/eth_call

示例:发行代币


7. 常踩的 5 个坑与解决方案

  1. 启动端口被占用:改用 --port 30304
  2. 刚创建账户余额 0 无法部署? 先挖矿奖励到你账户。
  3. 账户锁定报错:每次都 personal.unlockAccount
  4. ABI 编码出错:确保方法名后无空格,参数类型与顺序一致。
  5. JSON-RPC 调用无返回:检查 --rpcaddr,本机以外访问请放行防火墙并设置 --rpccorsdomain

8. FAQ:高频疑问速查表

Q1:私有链与测试网(GoerliSepolia)区别是什么?
私有链可控、无外部节点、秒出块;测试网是公共链,需申请测试币、出块时间 12 秒左右。

Q2:能把 MetaMask 连接到私有链吗?
可以。在 MetaMask 添加网络:
RPC URL = http://<本地IP>:8545、链 ID = 123456、符号随便写。

Q3:如何导出 / 导入钱包?
控制台输入 personal.importRawKey(privKey, "新密码")。务必保管好 Keystore 文件。

Q4:部署新合约旧区块会变吗?
不变。智能合约一旦上链即永久留存,仅新增状态数据。

Q5:同一台电脑能跑多条私有链吗?
可以,换不同的 --datadir--port--networkid 即可。


9. 结语 & 资源扩展

恭喜!你已完整体验 以太坊私有链创建→智能合约部署→代币交互 全流程。下一步,可升级到 Hardhat/Foundry 框架进行单元测试,或在 Remix 里实验 ERC-20、NFT 标准。若想继续深耕,推荐阅读 以太坊官方文档 与 Solidity 0.8+ 新版特性。

想用最简单的节点托管方案跑 私有链
👉 无需服务器 24h 在线的区块链一键搭建秘籍