如何在Invoke json response

时间:2016-07-20 17:23:00

标签: json go blockchain hyperledger

我正在尝试设计一个超链接链代码,可以通过Web API访问,该代码将json对象传递给代码。但是,每当我执行一个invoke方法时,我实际上无法在json响应中向用户返回值。

例如,下面是一些示例代码:

func (t *TLCChaincode) Invoke(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
    //Do some stuff
    return []byte("Some string"), nil
}

一些用于返回错误的示例代码

func (t *TLCChaincode) Invoke(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) {
    //Try to do some stuff
    //Get some sort of error
    return nil, errors.New("someError")
}

然而这两个都返回这样的消息,消息总是像下面的一些随机字符串(我怀疑某种哈希):

{
  "jsonrpc": "2.0",
  "result": {
    "status": "OK",
    "message": "1e1123e3-b484-4120-a28e-c3a8db384557"
  },
  "id": 11
}

正如您所看到的,此响应既不包含我返回的响应(如第一种情况),也不包含我返回的错误(在第二种情况下)。我将如何获取返回的字节,或返回的错误返回到返回的json?

编辑:请注意,如果我从另一个链代码调用一个调用方法,它会收到正确的返回值。只有当它返回给用户时才会无法正常工作。

2 个答案:

答案 0 :(得分:2)

“Invoke”不是同步调用。 Peer在收到您的Web请求时立即生成此OK消息。 稍后,当验证对等体将尝试生成新块时,此“调用”方法将与其他缓存事务一起执行。

反过来,链码到链码调用是同步的并且同时执行。

作为一种解决方法,我们使用另一个Query请求来检查此提交的Invoke的状态。如果有人可以提出更好的解决方案,那就太好了。

答案 1 :(得分:1)

如果你需要在处理Invoke(包含在一个块中)后立即获得返回值,那么最好的办法是使用一些事件(目前我猜)。

在您的链代码中,只需使用以下命令设置事件:

func (stub *ChaincodeStub) SetEvent(name string, payload []byte) error

GoDoc

您可以直接使用SDK或protobuf消息监听应用程序中的事件。我在开发者预览中这样做;但似乎检索Invoke结果的标准方法是通过Queries轮询区块链。

存在相关的GitHub问题here