Я просто пытаюсь выучить Hyperledger Fabric, и я сделал небольшой тест:
type Valami struct {
ObjectType string `json:"docType" binding:"required"`
Value string `json:"value" binding:"required"`
ID string `json:"id" binding:"required"`
}
func (t *SimpleChaincode) test(stub shim.ChaincodeStubInterface) pb.Response {
id := "104"
asbytes, err := stub.GetState(id) //get the marble from chaincode state
obj := &Valami{}
if err != nil {
return shim.Error("Failed to get state ")
} else if asbytes == nil {
fmt.Println("not found")
objtype := "test"
obj = &Valami{objtype, "", id}
} else {
fmt.Println("found")
err = json.Unmarshal(asbytes, obj)
if err != nil {
return shim.Error("Can not process to a JSON type!")
}
}
now := time.Now()
value := now.String()
fmt.Println("value: "+value)
obj.Value = value
// update
JSONasBytes, err := json.Marshal(obj)
if err != nil {
return shim.Error("Can not update the " + obj.ID + ". Reason: "+err.Error())
}
// save in state
err = stub.PutState(obj.ID, JSONasBytes)
if err != nil {
return shim.Error("Can not save "+ obj.ID + ". Reason: "+err.Error())
}
return shim.Success([]byte("value: "+obj.Value))
}
После того, как я выполню это дважды быстро один за другим:
docker exec -e CORE_PEER_LOCALMSPID=Org1MSP -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp cli peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mur2 -c '{"Args":["test" ]}'
docker exec -e CORE_PEER_LOCALMSPID=Org1MSP -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp cli peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mur2 -c '{"Args":["test" ]}'
Возвращение:
2019-03-13 09:33:05.297 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 payload:"value: 2019-03-13 09:33:05.292254505 +0000 UTC m=+391.210396576"
2019-03-13 09:33:05.776 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 payload:"value: 2019-03-13 09:33:05.770792084 +0000 UTC m=+391.688934322"
Так что все выглядит хорошо.Однако, когда я проверяю значение:
"{\"docType\":\"test\",\"id\":\"104\",\"value\":\"2019-03-13 09:33:05.292254505 +0000 UTC m=+391.210396576\"}"
Таким образом, фактически второй коммит не встречается.Если я посплю между двумя коммитами, они сработают.Поэтому я думаю, что первый не заканчивается до второго старта, а второй почему-то упал.Я не ожидал этого, потому что это может произойти в любое время в сети.Может ли кто-нибудь объяснить мне, что происходит на заднем плане и как мы можем справиться с такой ситуацией?