2016-05-20 1 views
1

Im пытается использовать бегущую строку в моей chaincode обновить состояние chaincode периодически, основываясь на некоторых условиях:не может поставить государство в контексте запроса

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 

}

Я посылаю транзакцию Invoke с помощью chaincode REST API для 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 
} 

Но PutState терпит неудачу в следующем журнале:

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 

Почему isTransaction = ложь, и почему его считают этот контекст как контекст запроса ?

+0

Можете ли вы редактировать и делиться командой, которую вы используете для запуска этого сетевого кода? Вы должны использовать «peer chaincode invoke» или подобное. – dubek

+0

@ dubek im, используя код цепи REST api для вызова функции chaincode. – cjcroix

ответ

4

Оригинальная транзакция invoke завершена и возвращена. PutState из goroutine продолжается за пределами контекста транзакции (становясь как бы «транзакцией», инициированной самим цепочкой). Это запрещено. Все взаимодействия с регистратором имеют как часть внешней транзакции.

+0

Есть ли способ установить состояние в повседневной рутине? Благодарю. http://stackoverflow.com/questions/42617003/is-it-possible-to-set-the-world-stateledger-in-a-go-routine –