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

·

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

目录

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

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

术语定义示例
硬币 Coin独立区块链的原生资产BTCETH
代币 Token依托现有链的智能合约资产USDCAAVENFT

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


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