猿问

无法将状态置于查询上下文中

我试图在我的链码中使用一个代码来定期更新链码状态,基于某些条件:


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

}


我正在使用用于调用的链码 REST api 发送调用事务:


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 = false,为什么将这个上下文视为查询上下文 ?


猛跑小猪
浏览 137回答 1
1回答

隔江千里

原始调用事务已完成并返回。来自 goroutine 的 PutState 在事务上下文之外继续(可以说,成为由链码本身发起的“事务”)。这是不允许的。与分类帐的所有交互都必须是外部交易的一部分。
随时随地看视频慕课网APP

相关分类

Go
我要回答