MetaForce 佛萨奇系统开发技术流程(成熟代码)佛萨奇 2.0 源码部署教程
在 Hyperledger Fabric 中,链码一般分为:(刘森-180-2857-8624)
系统链码
用户链码
系统链码
系统链码负责 Fabric 节点自身的处理逻辑,包括系统配置、背书、校验等工作。系统链码仅支持 Go 语言,在 Peer 节点启动时会自动完成注册和部署,所以安装,实例化和升级不适用于系统链码。
Init 函数在链码实例化以及升级的时候会被调用。在实现 Init 函数的过程中,可使用 Go 语言版本的合约 API 列表来对参数和分布式账本进行操作。
func(t*SimpleChaincode)Init(stub shim.ChaincodeStubInterface)peer.Response{
fmt.Println("ex02 Init")
//调用 GetFunctionAndParameters 方法对参数进行解析
_,args:=stub.GetFunctionAndParameters()
var A,B string//Entities
var Aval,Bval int//Asset holdings
var err error
if len(args)!=4{
return shim.Error("Incorrect number of arguments.Expecting 4")
}
//初始化相关数据
A=args[0]
Aval,err=strconv.Atoi(args[1])
if err!=nil{
return shim.Error("Expecting integer value for asset holding")
}
B=args[2]
Bval,err=strconv.Atoi(args[3])
if err!=nil{
return shim.Error("Expecting integer value for asset holding")
}
fmt.Printf("Aval=%d,Bval=%dn",Aval,Bval)
//调用 PutState 方法将数据写入账本中
err=stub.PutState(A,[]byte(strconv.Itoa(Aval)))
if err!=nil{
return shim.Error(err.Error())
}
err=stub.PutState(B,[]byte(strconv.Itoa(Bval)))
if err!=nil{
return shim.Error(err.Error())
}
return shim.Success(nil)
}
本示例要求用户输入的参数为 KEY1_NAME,VALUE1,KEY2_NAME,VALUE2,并初始化 2 个键值对,调用 PutState 将数据写入分布式账本中。
Invoke 示例
Invoke 函数是对用户具体业务逻辑的实现,用户可以根据不同的业务处理逻辑,调用不用的业务函数,如 invoke,delete 和 query 函数。
//Invoke 把用户调用的 function 细分到几个子 function,包含 invoke,delete 和 query
func(t*SimpleChaincode)Invoke(stub shim.ChaincodeStubInterface)peer.Response{
fmt.Println("ex02 Invoke")
//调用 GetFunctionAndParameters 方法对参数进行解析
function,args:=stub.GetFunctionAndParameters()
if function=="invoke"{
//将 A 的资产转移 X 个单位给 B
return t.invoke(stub,args)
}else if function=="delete"{
//从状态中删除实体
return t.delete(stub,args)
}else if function=="query"{
//老的“Query”功能可以在调用中实现
return t.query(stub,args)
}
return shim.Error("Invalid invoke function name.Expecting"invoke""delete""query"")
}
系统链码主要包括以下几种:
生命周期系统链码(LSCC):Lifecycle System Chaincode,负责对用户链码的生命周期进行管理。
配置系统链码(CSCC):Configuration System Chaincode,负责处理 Peer 端的 Channel 配置。
查询系统链码(QSCC):Query System Chaincode,提供账本查询 API,如获取区块和交易等信息。
Go 语言的链码主要由以下方法组成:
//Chaincode interface must be implemented by all chaincodes.The fabric runs
//the transactions by calling these functions as specified.
type Chaincode interface{
//Init is called during Instantiate transaction after the chaincode container
//has been established for the first time,allowing the chaincode to
//initialize its internal data
Init(stub ChaincodeStubInterface)peer.Response
//Invoke is called to update or query the ledger in a proposal transaction.
//Updated state variables are not committed to the ledger until the
//transaction is committed.
Invoke(stub ChaincodeStubInterface)peer.Response
}
评论