mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-17 15:35:09 +00:00
121 lines
3.6 KiB
Go
121 lines
3.6 KiB
Go
/*
|
|
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
|
|
}
|