链码调用的第一个返回值的目的是什么?

时间:2016-06-27 13:21:37

标签: hyperledger-fabric hyperledger

Chaincode接口的Invoke方法返回两个值:

Invoke(stub *ChaincodeStub, function string, args []string) ([]byte, error)

source

但是,第一个返回值似乎被忽略了。在示例中,它始终设置为nil,并且在验证事务(不包括在块中)之后似乎没有任何方法可以检索该值。

这是预期的行为吗?如果是,为什么这个返回值存在?

通过使用stub.SetEvent发出事件,还有另一种保存此值的方法,但是当直接返回值似乎存在时,这是非常不愉快的。

2 个答案:

答案 0 :(得分:1)

此返回值有一个用例。也就是说,如果您从另一个内部调用一个链代码。在这种情况下,返回值将传递给第一个链代码,允许它根据响应执行处理。

例如,考虑用户通过以下方法调用链码A,而后者又调用B。

func (t *ChaincodeA) Invoke(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
    //DO stuff
    valFromB, err := stub.InvokeChaincode("ChaincodeBDeployName", "someFunc", args)

    fmt.Println(string(valFromB))
    return nil,nil
}

这是链码B供参考

func (t *ChaincodeB) Invoke(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
    return []byte("This is a value from B"),nil
}

这应该在执行时将以下内容打印到控制台,显示已收到该值:

  

这是B

的值

答案 1 :(得分:0)

大多数现有样本都是微不足道的,并且返回零。可能不理想,但它们就是现在的样子。但是,目的是提供一个Invoke来返回响应值。