更新时间:2023-01-16 GMT+08:00
链代码结构
本章以Go语言为例来介绍。链代码即一个Go文件,创建好文件后进行函数开发等操作。
当前支持两种方式编写链码:1.4风格(使用shim包)和2.2风格(使用fabric-contract-api-go包)。
区块链服务BCS支持使用两种风格编写的链代码。
链代码接口
Fabric架构版本的区块链实例:
- 链代码启动必须通过1.4风格(调用shim包)中的Start函数,入参为shim包中定义的Chaincode接口类型。实际开发中, 您需要自行定义一个结构体,实现Chaincode接口。
type Chaincode interface { Init(stub ChaincodeStubInterface) pb.Response Invoke(stub ChaincodeStubInterface) pb.Response }
- 2.2风格(使用fabric-contract-api-go包)的链代码实际开发中, 您需要自行定义一个结构体,实现Chaincode接口。
type Chaincode interface { Init(ctx contractapi.TransactionContextInterface, args…) error Invoke(ctx contractapi.TransactionContextInterface, args…) error }
链代码结构
- Fabric架构版本的区块链实例1.4风格Go语言的链代码结构如下:
package main // 引入必要的包 import ( "github.com/hyperledger/fabric/core/chaincode/shim" pb "github.com/hyperledger/fabric/protos/peer" ) // 声明一个结构体 type SimpleChaincode struct {} // 为结构体添加Init方法 func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response { // 在该方法中实现链代码初始化或升级时的处理逻辑 // 编写时可灵活使用stub中的API } // 为结构体添加Invoke方法 func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response { // 在该方法中实现链代码运行中被调用或查询时的处理逻辑 // 编写时可灵活使用stub中的API } //主函数,需要调用shim.Start()方法 func main() { err := shim.Start(new(SimpleChaincode)) if err != nil { fmt.Printf("Error starting Simple chaincode: %s", err) } }
- Fabric架构版本的区块链实例2.2风格Go语言的链代码结构如下:
package main // 引入必要的包 import ( "github.com/hyperledger/fabric/plugins/fabric-contract-api-go/contractapi") // 声明一个结构体 type Chaincode struct { contractapi.Contract } // 为结构体添加Init方法 func (ch * Chaincode) Init(ctx contractapi.TransactionContextInterface, args…) error { // 在该方法中实现链代码初始化或升级时的处理逻辑 } // 为结构体添加Invoke方法 func (ch * Chaincode) Invoke(ctx contractapi.TransactionContextInterface, args…) error { // 在该方法中实现链代码运行中被调用或查询时的处理逻辑 } //主函数 func main() { cc, err := contractapi.NewChaincode(new(ABstore)) if err != nil { panic(err.Error()) } if err := cc.Start(); err != nil { fmt.Printf("Error starting ABstore chaincode: %s", err) } }
父主题: Go语言链代码开发