1

I written following a hyperledger chaincode. I am storing medicine details in public state & order details in private state. Inside this contract I am getting medicine details, order details, validate both, change ownership of medicine & then delete it from private collection.

func (c *MedicineContract) HandOver(ctx contractapi.TransactionContextInterface, medicineId, orderId, currentOwner, newOwner string) error {

    var dataBytes []byte
    var err error

    medicine, err := c.GetMedicine(ctx, medicineId)
    if err != nil {
        log.Println(err.Error())
        return nil
    }

    if medicine.OwnedBy != currentOwner {
        log.Printf("%v is not owner of this medicine, medicine owned by %v\n", currentOwner, medicine.OwnedBy)
        return fmt.Errorf("%v is not owner of this medicine, medicine owned by %v", currentOwner, medicine.OwnedBy)
    }

    log.Printf("medicine found for Id:%v and owned by %v\n", medicineId, medicine.OwnedBy)

    dataBytes, err = ctx.GetStub().GetPrivateDataHash(constant.OrderCollection, orderId)
    if err != nil {
        log.Println(err.Error())
        return nil
    }

    if len(dataBytes) <= 0 {
        log.Printf("empty hash found for orderId %v, dataBytes:%v", orderId, string(dataBytes))
        return fmt.Errorf("empty hash found for orderId %v, dataBytes:%v", orderId, string(dataBytes))
    }
    log.Println("orderdetails hash found for order: ", orderId)

    dataBytes, err = ctx.GetStub().GetPrivateData(constant.OrderCollection, orderId)
    if err != nil {
        log.Println(err.Error())
        return nil
    }

    if len(dataBytes) <= 0 {
        log.Printf("empty data found for orderId %v, dataBytes:%v", orderId, string(dataBytes))
        return fmt.Errorf("empty hash found for orderId %v, dataBytes:%v", orderId, string(dataBytes))
    }
    log.Println("details found for order: ", orderId)

    var order model.Order
    err = json.Unmarshal(dataBytes, &order)
    if err != nil {
        log.Println(err.Error())
        return nil
    }

    if order.MedicineID != medicine.Id {
        log.Printf("medicineId is diffent in order, medicineId:%v order having medicineId %v\n", medicineId, order.MedicineID)
        return err
    }

    if order.CreatedBy != newOwner {
        log.Printf("order is not created by %v, order is created by %v\n", newOwner, order.CreatedBy)
        return fmt.Errorf("order is not created by %v, order is created by %v", newOwner, order.CreatedBy)
    }

    medicine.OwnedBy = newOwner

    dataBytes, err = json.Marshal(medicine)
    if err != nil {
        log.Println(err.Error())
        return err
    }

    err = ctx.GetStub().PutState(medicineId, dataBytes)
    if err != nil {
        log.Println(err.Error())
        return err
    }
    log.Println("medicine details updated in statedb")

    err = ctx.GetStub().DelPrivateData(constant.OrderCollection, orderId)
    if err != nil {
        log.Println(err.Error())
        return err
    }
    log.Println("order details deleted from collectiondb")

    return nil
}

I am using minifab for invoking this contract. command I am using is minifab invoke -n KBA-Pharma -p '"HandOver","m01","ord01","producer-pharma-com","supplier-pharma-com"' -o "producer.pharma.com"

But I am getting error in response.

Minifab Execution Context:
    FABRIC_RELEASE=2.4.8
    CHANNEL_NAME=pharmachannel
    PEER_DATABASE_TYPE=couchdb
    CHAINCODE_LANGUAGE=go
    CHAINCODE_NAME=KBA-Pharma
    CHAINCODE_VERSION=2.0
    CHAINCODE_INIT_REQUIRED=false
    CHAINCODE_PARAMETERS="HandOver","m01","ord01","producer-pharma-com","supplier-pharma-com"
    CHAINCODE_PRIVATE=true
    CHAINCODE_POLICY=
    TRANSIENT_DATA={"ID":"b3JkMDE=","CreatedBy":"c3VwcGxpZXItcGhhcm1hLWNvbQ==","Producer":"cHJvZHVjZXItcGhhcm1hLWNvbQ==","CreatedAt":"MjIvMTAvMjAyMw==","MedicineID":"bTAx"}
    BLOCK_NUMBER=newest
    EXPOSE_ENDPOINTS=true
    CURRENT_ORG=producer.pharma.com
    HOST_ADDRESSES=179.100.0.2
    TARGET_ENV=DOCKER
    WORKING_DIRECTORY: /workspaces/kba/kba-pharma/deployment/minifab
.....
# Preparing for the following operations: *********************
  verify options, cc invoke
.......
# Running operation: ******************************************
  verify options
..
# Running operation: ******************************************
  cc invoke
..............
# Run the chaincode invoke script on cli container ************
  non-zero return code
  Error: could not assemble transaction: ProposalResponsePayloads do not match (base64): 'CiDbHCRxlJhQR4CqB0bVMaL5Zn2M0mj+SN/o0KoMhERRShL2AgrbAhJdCgpLQkEtUGhhcm1hEgsKCQoDbTAxEgIIChpCChZPcmRlckRldGFpbHNDb2xsZWN0aW9uEigKJgogCv20WWr9y/NadOJgs+YxxnzGdN6cpgEj4s0BUC0b1lkSAggLEvkBCgpfbGlmZWN5Y2xlEuoBCi4KKG5hbWVzcGFjZXMvZmllbGRzL0tCQS1QaGFybWEvQ29sbGVjdGlvbnMSAggJCjIKLG5hbWVzcGFjZXMvZmllbGRzL0tCQS1QaGFybWEvRW5kb3JzZW1lbnRJbmZvEgIICQorCiVuYW1lc3BhY2VzL2ZpZWxkcy9LQkEtUGhhcm1hL1NlcXVlbmNlEgIICQoxCituYW1lc3BhY2VzL2ZpZWxkcy9LQkEtUGhhcm1hL1ZhbGlkYXRpb25JbmZvEgIICQokCh5uYW1lc3BhY2VzL21ldGFkYXRhL0tCQS1QaGFybWESAggJGgMIyAEiERIKS0JBLVBoYXJtYRoDMi4w' vs 'CiDbHCRxlJhQR4CqB0bVMaL5Zn2M0mj+SN/o0KoMhERRShLzBArYBBLZAgoKS0JBLVBoYXJtYRK9AQoJCgNtMDESAggKGq8BCgNtMDEapwF7ImlkIjoibTAxIiwiZG9jdHlwZSI6Im1lZGljaW5lIiwic3RhdHVzIjoiY3JlYXRlZCBieSBwcm9kdWNlciIsInByb2R1Y2VyIjoicHJvZHVjZXItcGhhcm1hLWNvbSIsIm93bmVkYnkiOiJzdXBwbGllci1waGFybWEtY29tIiwicXVhbnRpdHkiOjEsImNyZWF0ZWRhdCI6IjIyLzA0LzIwMjMifRqKAQoWT3JkZXJEZXRhaWxzQ29sbGVjdGlvbhJOCiYKIAr9tFlq/cvzWnTiYLPmMcZ8xnTenKYBI+LNAVAtG9ZZEgIICxIkCiAK/bRZav3L81p04mCz5jHGfMZ03pymASPizQFQLRvWWRABGiDMsXUgHzK31EKxS5I35kIl/nrO/gOdq7xar3mIsP5c6BL5AQoKX2xpZmVjeWNsZRLqAQouCihuYW1lc3BhY2VzL2ZpZWxkcy9LQkEtUGhhcm1hL0NvbGxlY3Rpb25zEgIICQoyCixuYW1lc3BhY2VzL2ZpZWxkcy9LQkEtUGhhcm1hL0VuZG9yc2VtZW50SW5mbxICCAkKKwolbmFtZXNwYWNlcy9maWVsZHMvS0JBLVBoYXJtYS9TZXF1ZW5jZRICCAkKMQorbmFtZXNwYWNlcy9maWVsZHMvS0JBLVBoYXJtYS9WYWxpZGF0aW9uSW5mbxICCAkKJAoebmFtZXNwYWNlcy9tZXRhZGF0YS9LQkEtUGhhcm1hEgIICRoDCMgBIhESCktCQS1QaGFybWEaAzIuMA==' - proposal response: version:1 response:<status:200 > payload:"\n \333\034$q\224\230PG\200\252\007F\3251\242\371f}\214\322h\376H\337\350\320\252\014\204DQJ\022\363\004\n\330\004\022\331\002\n\nKBA-Pharma\022\275\001\n\t\n\003m01\022\002\010\n\032\257\001\n\003m01\032\247\001{\"id\":\"m01\",\"doctype\":\"medicine\",\"status\":\"created by producer\",\"producer\":\"producer-pharma-com\",\"ownedby\":\"supplier-pharma-com\",\"quantity\":1,\"createdat\":\"22/04/2023\"}\032\212\001\n\026OrderDetailsCollection\022N\n&\n \n\375\264Yj\375\313\363Zt\342`\263\3461\306|\306t\336\234\246\001#\342\315\001P-\033\326Y\022\002\010\013\022$\n \n\375\264Yj\375\313\363Zt\342`\263\3461\306|\306t\336\234\246\001#\342\315\001P-\033\326Y\020\001\032 \314\261u \0372\267\324B\261K\2227\346B%\376z\316\376\003\235\253\274Z\257y\210\260\376\\\350\022\371\001\n\n_lifecycle\022\352\001\n.\n(namespaces/fields/KBA-Pharma/Collections\022\002\010\t\n2\n,namespaces/fields/KBA-Pharma/EndorsementInfo\022\002\010\t\n+\n%namespaces/fields/KBA-Pharma/Sequence\022\002\010\t\n1\n+namespaces/fields/KBA-Pharma/ValidationInfo\022\002\010\t\n$\n\036namespaces/metadata/KBA-Pharma\022\002\010\t\032\003\010\310\001\"\021\022\nKBA-Pharma\032\0032.0" endorsement:<endorser:"\n\023supplier-pharma-com\022\240\007-----BEGIN CERTIFICATE-----\nMIICfzCCAiagAwIBAgIUBgXwK6Q0EClfj6wtDPtIkPCdat4wCgYIKoZIzj0EAwIw\neDELMAkGA1UEBhMCVVMxFzAVBgNVBAgMDk5vcnRoIENhcm9saW5hMRAwDgYDVQQH\nDAdSYWxlaWdoMRwwGgYDVQQKDBNzdXBwbGllci5waGFybWEuY29tMSAwHgYDVQQD\nDBdjYTEuc3VwcGxpZXIucGhhcm1hLmNvbTAeFw0yMzExMTEwNjEyNTlaFw0zMzA4\nMTAwNjEyNTlaMGsxCzAJBgNVBAYTAlVTMRcwFQYDVQQIDA5Ob3J0aCBDYXJvbGlu\nYTEQMA4GA1UEBwwHUmFsZWlnaDENMAsGA1UECwwEcGVlcjEiMCAGA1UEAwwZcGVl\ncjEuc3VwcGxpZXIucGhhcm1hLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBPOyW9Q0KsQSUfBNIUsB0X7MOqe/GD2Gbjm4hT1dj5m2nlNC9DwwGMcXwH0ACrse\nhu5VuaHdR9QXdiAGYQOFc2KjgZowgZcwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB\n/wQCMAAwVgYDVR0RBE8wTYcEs2QAAoIZcGVlcjEuc3VwcGxpZXIucGhhcm1hLmNv\nbYIZcGVlcjEtc3VwcGxpZXItcGhhcm1hLWNvbYIJbG9jYWxob3N0hwR/AAABMB8G\nA1UdIwQYMBaAFM5n1lKBZAWv++pxUno+82alMD+XMAoGCCqGSM49BAMCA0cAMEQC\nID9XQuDPJVRcjnJeG3NlcqdyAvKUR3kjYkFUt46wSHNeAiAD+X1c/vmMqKcXW0vz\nGHroY3UsENa0xiLL1ypRNUr7XA==\n-----END CERTIFICATE-----\n" signature:"0E\002!\000\333\361E\367`W\275\361\271\032\322;\237\246j.\307\336\305\212\245\321\\\331\035K\036\2103\343|-\002 x\r\016\237NGx\202\250(\371O\003\004\261\235PU\037\332\256\316J\356\\\005\234\346\307\005\220P" > interest:<chaincodes:<name:"KBA-Pharma" collection_names:"OrderDetailsCollection" > chaincodes:<name:"KBA-Pharma" > >

# STATS *******************************************************
minifab: ok=32  failed=1

real    0m6.336s
user    0m5.745s
sys     0m0.768s

But when I checked logs of dev-peer1 container, all logs are success logs as I am sharing bellow:

2023/11/11 06:18:58 Medicine.go:267: medicine found for Id:m01 and owned by producer-pharma-com
2023/11/11 06:18:58 Medicine.go:279: orderdetails hash found for order:  ord01
2023/11/11 06:18:58 Medicine.go:291: details found for order:  ord01
2023/11/11 06:18:58 Medicine.go:323: medicine details updated in statedb
2023/11/11 06:18:58 Medicine.go:330: order details deleted from collectiondb

What could be reason of this?

I am expecting successfully committing of data & changing ownership inside worldstate

1
  • Have you tested your code on the test-net? Minifab is no loger maintained. Btw, you should take a look at this stackoverflow.com/a/55289456/2007508. Commented Nov 13, 2023 at 18:55

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.