2016-05-20 11 views
1

Im einen Ticker in meinem chaincode zu verwenden versuchen, den chaincode Zustand periodisch basierend auf einer Bedingung, zu aktualisieren:Kann nicht Zustand in Abfragekontext setzen

func (t *SimpleChaincode) Invoke(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) { 

    ticker := time.NewTicker(time.Millisecond * 10000) 
    go func() { 
     for t := range ticker.C { 
      fmt.Println("Tick at", t) 
      a = a+5 
      err:= stub.PutState("a", []byte(strconv.Itoa(a)))  
      fmt.Println(err.Error()) 
     } 
    }() 

return nil, nil 

}

Ich schicke die invoke-Transaktion mit der chaincode REST-aPI für invoke:

POST http://<ip>:<port>/chaincode 
{ 
    "jsonrpc": "2.0", 
    "method": "invoke", 
    "params": { 
    "type": 1, 
    "chaincodeID":{ 
     "name":"c7b3c82f1170423115dcfc2524189f96f156b30961e0a0e84426c425c22f3b4e8b6ecbf477b76e014bfce74b996dee476a2470cbddc14d390617192f00c22c38" 
    }, 
    "ctorMsg": { 
     "function":"invoke", 
     "args":[] 
    }, 
"secureContext": "tom" 
}, 
    "id": 1 
} 

Aber PutState versagt mit folgendem Protokoll:

2016/05/20 13:44:04 [8bcbe40e]Inside putstate, isTransaction = false 
Tick at 2016-05-20 13:44:04.609079034 +0000 UTC 
Cannot put state in query context 
Tick at 2016-05-20 13:44:14.609093012 +0000 UTC 
Cannot put state in query context 
2016/05/20 13:44:14 [8bcbe40e]Inside putstate, isTransaction = false 
Tick at 2016-05-20 13:44:24.609070317 +0000 UTC 
Cannot put state in query context 

Warum ist isTransaction = false, und warum es diesen Zusammenhang als Abfragekontext nicht berücksichtigt?

+0

Können Sie den Befehl, den Sie zum Ausführen dieses Chaincodes verwenden, bearbeiten und freigeben? Sie sollten 'peer chaincode invoke' oder ähnliches verwenden. – dubek

+0

@dubek Ich benutze die Chaincode-REST-API, um die Chaincode-Funktion aufzurufen. – cjcroix

Antwort

4

Die ursprüngliche Aufruftransaktion wurde abgeschlossen und zurückgegeben. Der PutState von goroutine wird außerhalb des Transaktionskontexts fortgesetzt (sozusagen eine "Transaktion", die vom Chaincode selbst initiiert wird). Das ist nicht erlaubt. Alle Interaktionen mit dem Ledger haben, um Teil einer externen Transaktion zu sein.

+0

Gibt es irgendeine Möglichkeit für mich, den Status in einer täglichen Routine zu setzen? Vielen Dank. http://stackoverflow.com/questions/42617003/is-it-possible-to-set-the-world-stateledger-in-a-go-routine –