数字货币已从实体硬币演进为分布式账本上的加密通证。本教程带你用 Go 语言从零创建一条最小可运行的区块链硬币(Coin),并配套命令行钱包。读完即可拥有自己的 加密货币、区块链 与 钱包 CLI,为后续扩展智能合约、共识算法打下坚实基础。
目录
- 区块链中的硬币 vs 代币
- 环境准备与项目初始化
- 用创世区块启动区块链
- 设计账户、交易与全局状态机
- 开发命令行 CLI
- 测试链上转账
- 下一步升级方向
- FAQ
1. 区块链中的硬币 vs 代币
| 术语 | 定义 | 示例 |
|---|---|---|
| 硬币 Coin | 独立区块链的原生资产 | BTC、ETH |
| 代币 Token | 依托现有链的智能合约资产 | USDC、AAVE、NFT |
只要记住一句话:硬币自带主权链,代币依赖他人链。本篇文章专注前者,教你 发行一条专属区块链硬币。
2. 环境准备与项目初始化
安装 Go
- 访问 官方安装指南,根据系统一键安装。
- 设置
GOPATH与PATH,确保终端可运行go version。
克隆示例代码
git clone https://github.com/smartcontractkit/smart-contract-examples
cd smart-contract-examples/my-crypto-coin若首次接触 Go Modules,可直接在项目根目录运行:
go mod init my-crypto-coin3. 用创世区块启动区块链
每个区块链必须定义“起源”——genesis.json。在文件夹 ledger 内创建:
{
"genesis_time": "2024-04-12T00:00:00Z",
"chain_id": "my-first-chain",
"balances": {
"alice": 1000000
}
}上述内容为 创世状态:链启动时,alice 拥有 100 万枚新币。
数据存放约定
ledger/genesis.json: 初始余额快照ledger/ledger.db: 追加写入的交易日志 (纯文本 JSON-Line)
4. 设计账户、交易与全局状态机
4.1 交易模型
type Account string
type Tx struct {
From Account `json:"from"`
To Account `json:"to"`
Value uint `json:"value"`
}一条交易仅需 发送方、接收方、金额。
4.2 全局状态 State
State 结构持有两类数据:
Balances map[Account]uint—— 实时账户余额dbFile *os.File—— 可供追加写入的交易日志文件
顺序执行流程:
genesis.json → replay ledger.db 中的所有交易 → 最新世界状态
4.3 核心方法
loadGenesis:解析 JSON 创世纪writeTransaction:扣减 & 增加余额(含余额不足检查)SyncState:启动节点时一次性重放交易,返回最新状态
关键代码片段 (state.go):
func (s *State) writeTransaction(tx Tx) error {
if s.Balances[tx.From] < tx.Value {
return fmt.Errorf("insufficient balance")
}
s.Balances[tx.From] -= tx.Value
s.Balances[tx.To] += tx.Value
return nil
}5. 开发命令行 CLI
5.1 选择库
使用 cobra 构建优雅 CLI。
5.2 子命令设计
| 命令 | 含义 |
|---|---|
mcc version | 显示当前版本 |
mcc balances list | 打印所有账户余额 |
mcc tx new | 新建交易 |
5.3 构建 & 安装
go install ./cli/mcc/...
which mcc # 验证输出:/.../bin/mcc示例操作:
mcc balances list输出:
Accounts balances:
alice: 1000000再发起一笔转账:
mcc tx new --from alice --to bob --value 100再次查询:
alice: 999900
bob: 100至此,原生区块链硬币已成功发行并投入使用 🎉
6. 测试链上转账
链上可见
每笔交易均在 ledger.db 追加一行 JSON:
{"from":"alice","to":"carol","value":50}任何节点重启后,重放此日志即可恢复至最新余额,实现 去中心化记账 雏形。
7. 下一步升级方向
- 账户抽象:使用
secp256k1公钥/私钥取代明文昵称。 - 共识算法:引入 PoW 或 PoS 防止女巫攻击。
- P2P 网络:节点发现、消息广播、数据同步。
- 手续费市场:防止垃圾交易。
- DeFi 扩展:桥接 加密货币 到其他生态 👉 查找最新的开发资源
8. FAQ(常见问题与解答)
Q1:初学 Go 能跟上流程吗?
A:能。本教程无需深入 Go,仅需能理解结构体及基础文件操作。
Q2:为什么用文件存交易而不是数据库?
A:低耦合易调试,适合原型阶段。正式网络应采用 LevelDB/BadgerDB 等嵌入 KV 存储。
Q3:如何让更多节点加入网络?
A:需实现 P2P 层,例如基于 libp2p;同时引入共识规则,保证所有节点账本最终一致。
Q4:硬币总量有限吗?
A:目前仅在创世文件写死 100 万枚。未来可在协议层面设计增发或减半机制。
Q5:如何保证资金安全?
A:下一版将引入数字签名。每笔交易必须由私钥签名,其他节点用公钥验证,防止冒领。
Q6:如果想发行代币而非独立硬币该怎么办?
A:直接在以太坊、Polygon 等链上部署 ERC-20 合约即可,无需自建区块链;可参考相关智能合约教程。
恭喜!你已亲手跑通整条链,创造了真正意义上的区块链加密货币。下一步,给它起个响亮的名字,然后继续向主网、跨链、DeFi 进军吧!