用 Go 亲手打造你的第一条区块链加密货币

·

数字货币已从实体硬币演进为分布式账本上的加密通证。本教程带你用 Go 语言从零创建一条最小可运行的区块链硬币(Coin),并配套命令行钱包。读完即可拥有自己的 加密货币、区块链 与 钱包 CLI,为后续扩展智能合约、共识算法打下坚实基础。

目录

  1. 区块链中的硬币 vs 代币
  2. 环境准备与项目初始化
  3. 用创世区块启动区块链
  4. 设计账户、交易与全局状态机
  5. 开发命令行 CLI
  6. 测试链上转账
  7. 下一步升级方向
  8. FAQ

1. 区块链中的硬币 vs 代币

术语定义示例
硬币 Coin独立区块链的原生资产BTC、ETH
代币 Token依托现有链的智能合约资产USDC、AAVE、NFT

只要记住一句话:硬币自带主权链,代币依赖他人链。本篇文章专注前者,教你 发行一条专属区块链硬币。


2. 环境准备与项目初始化

安装 Go

克隆示例代码

git clone https://github.com/smartcontractkit/smart-contract-examples
cd smart-contract-examples/my-crypto-coin
若首次接触 Go Modules,可直接在项目根目录运行:
go mod init my-crypto-coin

3. 用创世区块启动区块链

每个区块链必须定义“起源”——genesis.json。在文件夹 ledger 内创建:

{
  "genesis_time": "2024-04-12T00:00:00Z",
  "chain_id": "my-first-chain",
  "balances": {
    "alice": 1000000
  }
}

上述内容为 创世状态:链启动时,alice 拥有 100 万枚新币。

数据存放约定


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 结构持有两类数据:

  1. Balances map[Account]uint —— 实时账户余额
  2. dbFile *os.File —— 可供追加写入的交易日志文件

顺序执行流程:
genesis.json → replay ledger.db 中的所有交易 → 最新世界状态

4.3 核心方法

关键代码片段 (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. 下一步升级方向


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 进军吧!