2016-07-20 101 views
0

我想設計一個超鏈接chaincode,它是通過一個web API訪問的,它將json對象傳遞給代碼。然而,每當我做一個invoke方法,我實際上不能在json響應中將值返回給用戶。如何返回調用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 
} 

As您可以看到,此響應既不包含我返回的響應(如第一種情況),也不包含我返回的錯誤(在第二種情況下)。我將如何去獲取返回的字節,或返回的錯誤到返回的json?

編輯:請注意,如果我從另一個chaincode調用invoke方法,它會收到正確的返回值。只有當它返回給用戶時,它才能正常工作。

回答

1

如果您需要在處理Invoke(包含在一個塊中)後立即獲得返回值,那麼最好的辦法就是使用一些事件(目前我猜測)。

在你chaincode,只是設置了與事件:

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

GoDoc

您可以監聽你的應用程序中使用SDK直接事件或protobuf的消息。我在開發人員預覽中這樣做。但似乎檢索Invoke結果的標準方法是通過查詢來輪詢區塊鏈。

有一個相關的GitHub問題here

2

「調用」不是同步調用。 Peer在收到您的Web請求時立即生成此OK消息。 稍後,當驗證對等方將嘗試生成新塊時,此「調用」方法將與其他緩存事務一起執行。

反過來,chaincode-chain-chain調用是同步的並且同時執行。

作爲一種解決方法,我們使用另一個查詢請求來檢查此提交的Invoke的狀態。如果有人能提出更好的解決方案,那將是非常好的。

+0

那麼,至少現在我真的明白爲什麼它不按我期望的方式工作。你知道我將如何去檢查調用調用的狀態與查詢調用嗎?這並不理想,但我可以讓它工作。 –