5.4.2.1 Hyperledger Fabric链码包规范
Fabric链码(智能合约)支持多种语言编写,包括golang、java、node.js。每个链码程序都必须实现Chaincode接口,链码包含:Init、Invoke和Query三个基本操作:
- Init: 链码初始化的方法,在链码实例化或者升级的时候调用一次,以便链码可以执行任何必要的初始化,包括应用程序状态的初始化。
- Invoke: 接收和处理链下业务系统调用事务处理提案,其参数包含调用的链码程序中函数的名称和具体业务处理数据参数,即在Invoke中根据不同的方法参数调用其他分支处理响应的业务。Invoke可以简单的理解为链码方法的入口。
- Query: 提供查询链码数据的方法,该方法只作为查询使用,不提供操作链上数据的操作。可在Query操作时调用,亦可在Invoke方法中作为某些方法的分支被调用,该方法可以不实现。
注:
Fabric 1.4中的链码包不能直接在Fabric 2.3.2及Fabric2.2.1国密这两个版本中使用,需要根据对应语言最新链码依赖库进行修改。
为实现自动化部署,提升部署效率,不同语言开发的链码在BSN发布时需按照以下规范要求来组织链码部署包。
1. Golang
main函数必须在项目中所有链码的上级或同级,打包路径为main函数所在同级文件夹,main函数路径为基于src的引用路径。
例:bsnBaseCC链码包(预置链码包)
bsnBaseCC
└─main.go
└─ChainCode/
└─models/
└─utils/
需在bsnBaseCC/下进行打包(包名称无要求),main函数路径(引用路径)为bsnBaseCC。
例:github上的FabricBaseChaincode链码包(预置链码包)
github.com
└─BSNDA
└─FabricBaseChaincode
└─chaincode
└─go
└─bsnBaseCC
└─main.go
└─ChainCode/
└─models/
└─utils/
需在github.com/BSNDA/FabricBaseChaincode/chaincode/go/bsnBaseCC/下进行打包(包名称无要求),main函数路径(引用路径)为github.com/BSNDA/FabricBaseChaincode/chaincode/go/bsnBaseCC。说明:main.go入口,ChainCode:链码;models:实体;utils:工具类。
注:针对Fabric2.3.2及Fabric2.2.1国密预制链码包参考如下
chaincode-demo
└─main.go
└─chaincode/
└─vendor/
└─go.sum
└─go.mod
2. Java
gradle或maven构建的项目,项目中必须包含build.gradle或pom.xml文件。
例:bsnBaseCC链码包(预置链码包)
bsnBaseCC
└─build.gradle
└─src
└─main
└─java
└─com.example.javacc
└─javacc.java
需在bsnBaseCC/下进行打包,zip包名称无要求。
说明:src/main/java:项目目录,com.example.javacc:包名,javacc.java:链码信息
3. NodeJs
必须在项目根目录下创建package.json。需在bsnBaseCC/下进行打包,zip包名称无要求。
例:bsnBaseCC链码包
bsnBaseCC
└─marbles_chaincode.js
└─package.json
说明:marbles_chaincode.js:链码
注:发布服务时,链码包打包时进入项目根目录进行打包,格式为.zip。