Hyperledger Fabric Chaincode throws MVCC_READ_CONFLICT

我与影子孤独终老i 提交于 2020-04-16 03:04:08

问题


I'm getting an error when I invoke a chaincode function. I've created two adaptations for the function. One uses a regular key, the other a composite key. I thought that using a composite key would solve any MVCC_READ_CONFLICT's since I'm no longer updating the same key.

However I get the error on both functions. Note that both function are contained in the same chaincode. I don't know if that can cause conflicts.

Here's the function with a regular key:

    func (*AddTokenCallFunction) Start(stub shim.ChaincodeStubInterface, args []string) pb.Response {
        if len(args) != 2 {
            s := fmt.Sprintf(ERROR_INCORRECT_AMOUNT_OF_ARGUMENTS, "add-tokens", 2, len(args))
            return shim.Error(s)
        }

        account := args[0]
        tokens := args[1]

        currentTokensBytes, err := stub.GetState(account)
        if err != nil {
            s := fmt.Sprintf(ERROR_SYSTEM, err.Error())
            return shim.Error(s)
        }
        currentAmountOfTokens := binary.LittleEndian.Uint64(currentTokensBytes)
        tokensToAdd, err := strconv.ParseUint(tokens, 10, 64)
        if err != nil {
            s := fmt.Sprintf(ERROR_SYSTEM, err.Error())
            return shim.Error(s)
        }
        currentAmountOfTokens += tokensToAdd
        tokenBytes, err := UintToBytes(currentAmountOfTokens)
        if err != nil {
            s := fmt.Sprintf(ERROR_SYSTEM, err.Error())
            return shim.Error(s)
        }
        err = stub.PutState(account, tokenBytes)
        if err != nil {
            s := fmt.Sprintf(ERROR_SYSTEM, err.Error())
            return shim.Error(s)
        }

        return shim.Success(nil)
    }

Here's the same function but with a composite-key:

func (*AddTokenCompositeCallFunction) Start(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    if len(args) != 2 {
        s := fmt.Sprintf(ERROR_INCORRECT_AMOUNT_OF_ARGUMENTS, "add-composite-tokens", 2, len(args))
        return shim.Error(s)
    }

    account := args[0]
    tokens := args[1]

    // Retrieve info needed for the update procedure
    txid := stub.GetTxID()
    compositeIndexaccount := "account~tokens~txID"

    // Create the composite key that will allow us to query for all deltas on a particular variable
    compositeKey, compositeErr := stub.CreateCompositeKey(compositeIndexaccount, []string{account, tokens, txid})
    if compositeErr != nil {
        return shim.Error(fmt.Sprintf("Could not create a composite key for %s: %s", account, compositeErr.Error()))
    }

    // Save the composite key index
    compositePutErr := stub.PutState(compositeKey, []byte{0x00})
    if compositePutErr != nil {
        return shim.Error(fmt.Sprintf("Could not put operation for %s in the ledger: %s", account, compositePutErr.Error()))
    }

    return shim.Success([]byte(fmt.Sprintf("Successfully added %s to %s", tokens, account)))
}

Could someone explain why I'm still getting a MVCC_READ_CONFLICT on the later implementation? What am I doing wrong? I'm benchmarking and sending the same accountID several times. Though I was under the impression that this would not matter when using a composite-key.

Thanks in advance.


回答1:


I resolved this issue by removing my own implementation and replacing it with the one from the high-throughput sample [ https://github.com/hyperledger/fabric-samples/blob/release/high-throughput/chaincode/high-throughput.go ].

My guess is that I'm doing something in my implementation that Golang does not agree with. Since the implementations are not that different.



来源:https://stackoverflow.com/questions/51722254/hyperledger-fabric-chaincode-throws-mvcc-read-conflict

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!