/* SPDX-License-Identifier: Apache-2.0 */ package auction import ( "encoding/base64" "fmt" "github.com/hyperledger/fabric-chaincode-go/v2/pkg/statebased" "github.com/hyperledger/fabric-chaincode-go/v2/shim" "github.com/hyperledger/fabric-contract-api-go/v2/contractapi" ) func (s *SmartContract) GetSubmittingClientIdentity(ctx contractapi.TransactionContextInterface) (string, error) { b64ID, err := ctx.GetClientIdentity().GetID() if err != nil { return "", fmt.Errorf("failed to read clientID: %v", err) } decodeID, err := base64.StdEncoding.DecodeString(b64ID) if err != nil { return "", fmt.Errorf("failed to base64 decode clientID: %v", err) } return string(decodeID), nil } // setAssetStateBasedEndorsement sets the endorsement policy of a new auction func setAssetStateBasedEndorsement(ctx contractapi.TransactionContextInterface, auctionID string, orgToEndorse string) error { endorsementPolicy, err := statebased.NewStateEP(nil) if err != nil { return err } err = endorsementPolicy.AddOrgs(statebased.RoleTypePeer, orgToEndorse) if err != nil { return fmt.Errorf("failed to add org to endorsement policy: %v", err) } policy, err := endorsementPolicy.Policy() if err != nil { return fmt.Errorf("failed to create endorsement policy bytes from org: %v", err) } err = ctx.GetStub().SetStateValidationParameter(auctionID, policy) if err != nil { return fmt.Errorf("failed to set validation parameter on auction: %v", err) } return nil } // addAssetStateBasedEndorsement adds a new organization as an endorser of the auction func addAssetStateBasedEndorsement(ctx contractapi.TransactionContextInterface, auctionID string, orgToEndorse string) error { endorsementPolicy, err := ctx.GetStub().GetStateValidationParameter(auctionID) if err != nil { return err } newEndorsementPolicy, err := statebased.NewStateEP(endorsementPolicy) if err != nil { return err } err = newEndorsementPolicy.AddOrgs(statebased.RoleTypePeer, orgToEndorse) if err != nil { return fmt.Errorf("failed to add org to endorsement policy: %v", err) } policy, err := newEndorsementPolicy.Policy() if err != nil { return fmt.Errorf("failed to create endorsement policy bytes from org: %v", err) } err = ctx.GetStub().SetStateValidationParameter(auctionID, policy) if err != nil { return fmt.Errorf("failed to set validation parameter on auction: %v", err) } return nil } // getCollectionName is an internal helper function to get collection of submitting client identity. func getCollectionName(ctx contractapi.TransactionContextInterface) (string, error) { // Get the MSP ID of submitting client identity clientMSPID, err := ctx.GetClientIdentity().GetMSPID() if err != nil { return "", fmt.Errorf("failed to get verified MSPID: %v", err) } // Create the collection name orgCollection := "_implicit_org_" + clientMSPID return orgCollection, nil } // verifyClientOrgMatchesPeerOrg is an internal function used to verify that client org id matches peer org id. func verifyClientOrgMatchesPeerOrg(ctx contractapi.TransactionContextInterface) error { clientMSPID, err := ctx.GetClientIdentity().GetMSPID() if err != nil { return fmt.Errorf("failed getting the client's MSPID: %v", err) } peerMSPID, err := shim.GetMSPID() if err != nil { return fmt.Errorf("failed getting the peer's MSPID: %v", err) } if clientMSPID != peerMSPID { return fmt.Errorf("client from org %v is not authorized to read or write private data from an org %v peer", clientMSPID, peerMSPID) } return nil } func contains(sli []string, str string) bool { for _, a := range sli { if a == str { return true } } return false }