fabric执行合约中的函数调用

fabric执行合约中的函数调用

本文主要讲解,peer命令中,fabric chaincode函数处理逻辑。这里把区块链看成了一个分布式数据库,操作逻辑也相似。当内部细节封装好后,提供给用户的就是一个数据库的操作逻辑。实际中通过打印日志到文件中,探究fabric chaincode的调用过程。

  • invoke参数
peer chaincode invoke -n cvchain -c '{"Args":["addRecord","1001", "2006","corp1", "engineer"]}' -C myc
//fabric网络启动且加入chaincode。通过上述命令,将会激活加入的chaincode处理过程。
//peer invoke参数将会调用chaincode中的invoke处理函数,并通过传入的参数进行逻辑处理。

func (t *EncCC) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
    // 这里了将获得peer命令的参数,接收到Args的内容,包括func及其参数
    f, args := stub.GetFunctionAndParameters()
    tMap, err := stub.GetTransient()
    if err != nil {
        return shim.Error(fmt.Sprintf("Could not retrieve transient, err %s", err))
    }
    //根据参数判断处理逻辑
    switch f {
    case "addRecord"://加入数据
        result,err:=addRecord(stub,args)
        if err!=nil{
            return shim.Error(err.Error())
        }
        return shim.Success([]byte(result))
    case "getRecord"://查询数据
        result,err:=getRecord(stub,args)
        if err!=nil{
            return shim.Error(err.Error())
        }
        return shim.Success([]byte(result))
    case "encRecord"://以加密的方式插入数据
        // make sure there's a key in transient - the assumption is that
        // it's associated to the string "ENCKEY"
        if _, in := tMap[ENCKEY]; !in {
            return shim.Error(fmt.Sprintf("Expected transient encryption key %s", ENCKEY))
        }
        return t.encRecord(stub, args[0:], tMap[ENCKEY], tMap[IV])
    case "decRecord"://以加密的方式获取解密数据
        if _, in := tMap[DECKEY]; !in {
            return shim.Error(fmt.Sprintf("Expected transient decryption key %s", DECKEY))
        }
        return t.decRecord(stub, args[0:], tMap[DECKEY], tMap[IV])
    default:
        return shim.Error(fmt.Sprintf("Unsupported function %s", f))
    }
}
  • query参数
peer chaincode query -n cvchain  -c '{"Args":["getRecord","1001", "2003"]}' -C myc
//这里的peer命令虽然选取的是query参宿,但对于fabric网络来说,触发的仍是chaincode的invoke函数,处理逻辑同invoke参数。
  • 关于加密
# 为了保护私密数据,fabric支持加密的方式插入获取数据。
#具体使用方式可参考enccc_example,其readme.md有使用方法。其命令调用和合约的处理方式相似。
#插入数据
peer chaincode invoke -n cvchain -c '{"Args":["encRecord","1009","2012","corp3", "manager"]}' --transient "{\"ENCKEY\":\"$ENCKEY\",\"IV\":\"$IV\"}"  -C myc
#获取数据
peer chaincode query -n cvchain -C myc -c '{"Args":["decRecord","1009","2006"]}' --transient "{\"DECKEY\":\"$DECKEY\"}"


  • fabric合约开发

1.chaincode开发demo:sacc
2.chaincode加密方式开发demo:enccc
3.fabric官方文档_pdf

你可能感兴趣的:(区块链,Hyperledger,Fabric)