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)
}
}
版权声明:本文为so5418418原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。