Hyperledger fabric Hyperledger结构链码引发MVCC\u读取\u冲突
调用chaincode函数时出错。我为这个函数做了两个修改。一个使用常规密钥,另一个使用复合密钥。我认为使用复合键可以解决任何MVCC_-READ_冲突,因为我不再更新同一个键 但是,我在这两个函数上都得到了错误。请注意,这两个函数都包含在相同的链码中。我不知道这是否会引起冲突 以下是带有常规键的函数:Hyperledger fabric Hyperledger结构链码引发MVCC\u读取\u冲突,hyperledger-fabric,hyperledger,Hyperledger Fabric,Hyperledger,调用chaincode函数时出错。我为这个函数做了两个修改。一个使用常规密钥,另一个使用复合密钥。我认为使用复合键可以解决任何MVCC_-READ_冲突,因为我不再更新同一个键 但是,我在这两个函数上都得到了错误。请注意,这两个函数都包含在相同的链码中。我不知道这是否会引起冲突 以下是带有常规键的函数: func (*AddTokenCallFunction) Start(stub shim.ChaincodeStubInterface, args []string) pb.Respon
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)
}
以下是相同的函数,但具有复合键:
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)))
}
有人能解释一下为什么我在以后的实现中仍然遇到MVCC_-READ_冲突吗?我做错了什么?我正在进行基准测试并多次发送相同的accountID。虽然我的印象是,在使用复合键时,这并不重要
提前感谢。我通过删除自己的实现并替换为高通量示例[]中的实现,解决了这个问题
我猜我在实现中做了一些Golang不同意的事情。因为实现没有那么不同。第二个实现在我看来很好,因为事务id保证是唯一的。你确定你删除了旧的链码映像并重试了吗?@arnabkaycee我正在运行GCE,昨天我删除了所有实例,包括它们的磁盘。我尝试了来自织物样本repo的high throuput示例,该示例运行正常。所以我想这与我的实现有关。尽管我的实现基于高通量示例,但请确保避免在一个块中多次修改同一密钥。