本系列文章代码均为Go语言。
- Hyperledger Fabric 开发——初步认识智能合约(链码)
- Hyperledger Fabric 开发——开发用户链码
- Hyperledger Fabric 开发——测试用户链码(待更新)
在 Hyperledger Fabric 中,链码(Chaincode)又称为智能合约(下文中我们统一称为链码),是用Go,node.js或Java编写的程序,主要用于操作账本上的数据。用户的应用程序通过链码与 Fabric 账本数据进行交互。
在 Hyperledger Fabric 中,链码一般分为:
- 系统链码
- 用户链码
系统链码负责 Fabric 节点自身的处理逻辑,包括系统配置、背书、校验等工作。系统链码仅支持 Go 语言,在 Peer 节点启动时会自动完成注册和部署,所以安装,实例化和升级不适用于系统链码。
底层的 Fabric 开发人员和管理员可以根据自己的需要修改这些系统链码。然而,系统链码的开发和管理是一项专门的活动,完全独立于智能合约的开发,通常没有必要进行系统链码的开发和管理。
系统链码主要包括以下几种:
- 生命周期系统链码(LSCC):Lifecycle System Chaincode,负责对用户链码的生命周期进行管理。
- 配置系统链码(CSCC):Configuration System Chaincode,负责处理 Peer 端的通道配置。
- 查询系统链码(QSCC):Query System Chaincode,提供账本查询 API,如获取区块和交易等信息。
用户链码是由应用程序开发人员根据业务场景需求使用 Golang、node.js 或 Java 语言编写的操作区块链分布式账本的状态的业务处理逻辑代码,用户链码运行在与 peer 进程隔离的 Docker 容器中,通过 Fabric 提供的接口与账本状态进行交互。
用户链码在区块链应用上处于非常关键的一环,它直接接受用户业务逻辑的调用,并对区块链分布式账本数据进行操作。
链码API完整 API 介绍请参照官方文档:
https://pkg.go.dev/github.com/hyperledger/fabric/core/chaincode/shim?utm_source=godoc#ChaincodeStub
以下为部分常用 API 的简单介绍,详细用法见链接 Hyperledger Fabric 链码API的介绍
参数读取API| 接口名称 | 说明 |
|---|---|
| GetStringArgs() []string | 获取链码调用请求中调用参数 |
| GetFunctionAndParameters() (function string, params []string) | 获取链码调用的函数名和调用参数,默认第一个参数为函数名 |
| 接口名称 | 说明 |
|---|---|
| GetState(key string) ([]byte, error) | 获取指定键对应的值 |
| PutState(key string, value []byte) error | 在账本中添加或者更新一对键值 |
| DelState(key string) error | 在账本中删除一对键值 |
| GetStateByRange(startKey, endKey string) (StateQueryIteratorInterface, error) | 查询指定范围内的键值,startKey为起始key,endKey为终止key |
| GetHistoryForKey(key string) (HistoryQueryIteratorInterface, error) | 返回对应键的历史值 |
| 接口名称 | 说明 |
|---|---|
| CreateCompositeKey(objectType string, attributes []string) (string, error) | 组合属性,构造复合键 |
| SplitCompositeKey(compositeKey string) (string, []string, error) | 将复合键拆分成一系列属性 |
| GetStateByPartialCompositeKey(objectType string, attributes []string) (StateQueryIteratorInterface, error) | 根据局部的复合键返回所有的匹配的键值 |
| GetQueryResult(query string) (StateQueryIteratorInterface, error) | 对状态数据库进行富查询(目前仅有CouchDB支持富查询) |
| InvokeChaincode(chaincodeName string, args [][]byte, channel string) pb.Response | 调用其它链码的 Invoke 方法 |
- https://www.jianshu.com/p/9809a0c4e5e7
- https://help.aliyun.com/document_detail/141365.html?spm=a2c4g.11186623.6.621.1d791ef7kaeGiY
- https://hyperledger-fabric.readthedocs.io/zh_CN/release-1.4/smartcontract/smartcontract.html#developing



