更新时间: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)
        }
    }

相关文档