想在不耗费主网 Gas 的前提下深入理解 以太坊私有链、智能合约部署 与 链上交互?本文用人人都能上手的步骤,带你 30 分钟搭好一条本地链,完成代币合约从发行、转账到余额查询的完整闭环。步骤零门槛、可自由搬砖实验,是 Web3·DApp 入门与 区块链测试 的绝佳沙箱。
目录
- 环境准备与核心概念
- 一句话读懂得“私有链”与“创世块”
- 三步生成你的第一条私有链
- Geth 控制台:账号、挖矿、转账一条龙
- 编写 & 部署代币智能合约
- 控制台与 JSON-RPC 双轨交互
- 常踩的 5 个坑与解决方案
- FAQ:高频疑问速查表
- 结语 & 资源扩展
1. 环境准备与核心概念
必需组件 | 版本建议 | 下载链接 |
---|---|---|
Geth | ≥1.12 | 👉 点我直达官方一键安装包 |
Solidity 在线编译 | 0.4.x(教学合约适用) | 浏览器打开即可 |
系统 | Windows 10 / macOS 12+ / Ubuntu 20+ | — |
读完本文,你将掌握的 核心关键词:
私有链、创世块、Geth、智能合约、Solidity、ABI、JSON-RPC、挖矿、代币转账、余额查询。
2. 一句话读懂“私有链”与“创世块”
- 私有链=只属于你自己的“迷你以太坊”,链 ID、节点、难度、出块间隔全部可自定义。
- 创世块(Genesis Block)=区块链的“第 0 块”,定义了后续所有区块必须遵循的规则。
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
。
示例:发行代币
- ABI 编码规范详见 Ethereum Contract ABI
经编码后的
data
与to(合约地址)
一起 POST:{ "jsonrpc": "2.0", "method": "eth_sendTransaction", "params": [{ "from": "0x...", "to": "0x...contractAddress...", "data": "0x867904b4..." }], "id": 1 }
返回交易哈希之后,挖矿确认即可生效。
7. 常踩的 5 个坑与解决方案
- 启动端口被占用:改用
--port 30304
。 - 刚创建账户余额 0 无法部署? 先挖矿奖励到你账户。
- 账户锁定报错:每次都
personal.unlockAccount
。 - ABI 编码出错:确保方法名后无空格,参数类型与顺序一致。
- JSON-RPC 调用无返回:检查
--rpcaddr
,本机以外访问请放行防火墙并设置--rpccorsdomain
。
8. FAQ:高频疑问速查表
Q1:私有链与测试网(Goerli、Sepolia)区别是什么?
私有链可控、无外部节点、秒出块;测试网是公共链,需申请测试币、出块时间 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 在线的区块链一键搭建秘籍