Fabric 链码可以不停机升级,这是其 RABC(Release Application Business Continuity)体系的一部分。版本管理通过 sequence 号和 approval 流程实现治理。
15.4.1 链码事务生命周期
graph TD
A[Pack 打包] --> B[Install 安装到 peer]
B --> C[Approve 各组织批准]
C --> D[Check Commit Readiness]
D --> E[Commit 提交到通道]
E --> F[Invoke 调用]
C -.升级.-> A
style A fill:#e3f2fd
style E fill:#c8e6c9
15.4.2 升级演练
bash
# 1. 打包新版本的链码
peer chaincode package assettransfer_v2.tar.gz -p ./ -l golang
# 2. 在所有组织的 peer 上安装
peer chaincode install assettransfer_v2.tar.gz
# 3. 各组织批准新版本(sequence 增加)
peer lifecycle chaincode approveformyorg \
--name assettransfer \
--version 2.0 \ # 语义版本
--package-id $NEW_PACKAGE_ID \
--sequence 2 \ # 序列号必须递增
--channelID mychannel \
--signature-policy "OR('Org1MSP.peer','Org2MSP.peer')"
# 4. 检查足够多组织已批准
peer lifecycle chaincode checkcommitreadiness \
--channelID mychannel \
--name assettransfer \
--version 2.0 \
--sequence 2
# 5. 提交升级(任何组织可以执行)
peer lifecycle chaincode commit \
--name assettransfer \
--version 2.0 \
--sequence 2关键的兼容性检查
| 检查项 | 规则 |
|---|---|
| Sequence + 1 | 必须递增 |
| Package ID | 新代码包哈希 |
| Version | 人读的语义版本(v2.0) |
| Organization 背书 | 需要各组织显式 approveformyorg |
15.4.3 状态兼容性
升级时世界状态保留。新链码必须兼容旧状态数据结构:
go
// 升级后的 Asset 结构可以添加新字段
// 但必须兼容旧 JSON
// 策略:新版本读取旧数据时填充默认值
type AssetV2 struct {
// 原有字段保留
ID string `json:"id"`
Color string `json:"color"`
// ...
// 新增字段,omitempty 兼容旧数据
LastService string `json:"lastService,omitempty"`
Status string `json:"status,omitempty"`
}15.4.4 应急处置:链码错误
bash
# 如果升级后的链码有 bug,影响无法 Invoke
# 可回滚到旧版本(降级)
peer lifecycle chaincode approveformyorg \
--name assettransfer \
--version 1.0 --sequence 3 # 降回旧版本,sequence 继续递增
# ... 然后 commit关键洞察:sequence 永远递增,不可以用旧 sequence 重新部署。
> ← 15.3 链码开发 | 前往 → 15.5 SDK 后端开发 |*
评论
0评论加载中…