Hyperledger Fabric 1.0 链码(chaincode)的原理、接口和结构

chaincode原理

在Hyperledger Fabric 1.0中,链码(chaincode)延伸自智能合约的概念,采用主流高级编程语言编写。链码会对fabric应用发出的交易做出响应,执行代码逻辑,与账本进行交互。区块链网络中的成员商定业务逻辑后,可将业务逻辑编程到链码中,大家遵循此合约执行。
链码会创建一些状态(state)并写入账本中。状态带有绑定到链码的命名空间,仅限于创建他的链码使用,不能被其他链码直接访问。不过,在合适的范围内,一个链码也可以调用另一个链码,间接访问其状态。
链码在fabric节点上的隔离沙盒(docker容器)中执行,并通过gRPC协议来与节点进行交互。必要的交互包括调用链码、读写账本、返回响应结果等。
Fabric中支持多种语言实现链码,包括golang、javascript、java等。下面例子为golong。

chaincode接口

每个链码都需要实现chaincode接口:

type Chaincode interface{
   Init(stub ChaincodeStubInterface) pb.Response
   Invoke(stub ChaincodeStubInterface) pb.Response
   }

其中:
Init:当链码收到实例化(instantiate)或者升级(update)类型的交易时,Init被调用。
Invoke:当链码收到调用(invoke)或者查询(query)类型的交易时,invoke方法被调用。

chaincode结构

一个链码的必要结构如下所示:

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)
    }
}

你可能感兴趣的:(区块链技术)