2016-07-20 34 views
0

Ich versuche, einen Hyperledger-Chaincode zu entwerfen, auf den über eine Web-API zugegriffen wird, die JSON-Objekte an den Code übergibt. Wenn ich jedoch eine Methode aufrufen, kann ich tatsächlich keine Werte an den Benutzer in der JSON-Antwort zurückgeben.Wie Werte in Invoke-JSON-Antwort zurückgegeben werden

Zum Beispiel, hier einige Codebeispiel:

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

Und einige Beispielcode einen Fehler für die Rückgabe

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") 
} 

jedoch diese beiden eine Meldung wie diese zurückgeben, mit der Nachricht immer sein eine zufällige Zeichenkette wie unten (ich vermute einen Hash von irgendeiner Art):

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

As Sie sehen, diese Antwort enthält weder die Antwort, die ich zurückgegeben habe (wie im ersten Fall), noch den Fehler, den ich zurückgegeben habe (im zweiten Fall). Wie gehe ich vor, um die zurückgegebenen Bytes oder den zurückgegebenen Fehler in den zurückgegebenen JSON zu bekommen?

Bearbeiten: Bitte beachten Sie, dass, wenn ich eine Aufrufmethode von einem anderen Chaincode aufrufen, es die richtigen Rückgabewerte erhält. Nur wenn es an den Benutzer zurückgegeben wird, funktioniert es nicht ordnungsgemäß.

Antwort

1

Wenn Sie so schnell einen Rückgabewert zu erhalten, wie die Invoke (in einem Block enthalten) verarbeitet wird, ist die beste Wahl einige Ereignisse zu verwenden (im Moment glaube ich).

In Ihrem chaincode, nur Setup das Ereignis mit:

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

GoDoc

Unter Umständen können Sie für Veranstaltungen in Ihrer Anwendung direkt mit dem SDK oder protobuf Nachrichten abzuhören. Ich mache es so auf der Entwicklervorschau; aber es scheint, dass die Standardmethode, Invoke-Ergebnis abzurufen, ist, die Blockchain über Abfragen abzufragen.

Es ist eine verwandte GitHub Ausgabe here.

2

"Invoke" ist kein synchroner Aufruf. Peer generiert diese OK-Nachricht sofort, wenn er Ihre Webanforderung empfängt. Später, wenn Validierungs-Peers versuchen, einen neuen Block zu generieren, wird diese "invoke" -Methode zusammen mit anderen zwischengespeicherten Transaktionen ausgeführt.

In seinem Turn Chain Chain-to-Chain-Code-Aufrufe sind synchron und gleichzeitig ausgeführt.

Als Workaround verwenden wir eine andere Abfrageanforderung, um den Status dieser übermittelten Invoke zu überprüfen. Es wäre großartig, wenn jemand bessere Lösungen vorschlagen könnte.

+0

Nun, zumindest jetzt eigentlich verstehe ich, warum es nicht so, wie ich erwartet funktioniert. Wissen Sie, wie ich den Status der Aufrufaufrufe mit einem Abfrageaufruf überprüfen würde? Es ist kaum ideal, aber ich könnte wahrscheinlich macht es funktionieren. –