From 27225eb96f453d237c72991a98bb522f7b72b89e Mon Sep 17 00:00:00 2001 From: Sandeep Nishad Date: Tue, 7 May 2024 16:46:35 +0530 Subject: [PATCH] fix(weaver-go-sdk): use updated weaver protobuf for fabric and corda view Signed-off-by: Sandeep Nishad --- sdks/fabric/go-sdk/Makefile | 11 +++- .../interoperable-helper.go | 61 ++++++++++++++++--- 2 files changed, 63 insertions(+), 9 deletions(-) diff --git a/sdks/fabric/go-sdk/Makefile b/sdks/fabric/go-sdk/Makefile index b487573bc..1b543f1f3 100644 --- a/sdks/fabric/go-sdk/Makefile +++ b/sdks/fabric/go-sdk/Makefile @@ -9,7 +9,16 @@ undo-vendor: build-local: run-vendor build undo-vendor build: - go build -v . + cd helpers && go build -v . + cd asset-manager && go build -v . + cd interoperablehelper && go build -v . + +test-local: run-vendor test undo-vendor + +test: + cd helpers && go test -v . + cd asset-manager && go test -v . + cd interoperablehelper && go test -v . clean: rm -rf vendor \ No newline at end of file diff --git a/sdks/fabric/go-sdk/interoperablehelper/interoperable-helper.go b/sdks/fabric/go-sdk/interoperablehelper/interoperable-helper.go index 0174d658c..eb2abed8f 100644 --- a/sdks/fabric/go-sdk/interoperablehelper/interoperable-helper.go +++ b/sdks/fabric/go-sdk/interoperablehelper/interoperable-helper.go @@ -7,12 +7,14 @@ SPDX-License-Identifier: Apache-2.0 package interoperablehelper import ( + "bytes" "encoding/base64" "encoding/json" "errors" "fmt" "strings" + "github.com/golang/protobuf/proto" "github.com/google/uuid" "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/common" "github.com/hyperledger-labs/weaver-dlt-interoperability/common/protos-go/corda" @@ -20,6 +22,7 @@ import ( "github.com/hyperledger-labs/weaver-dlt-interoperability/sdks/fabric/go-sdk/helpers" "github.com/hyperledger-labs/weaver-dlt-interoperability/sdks/fabric/go-sdk/relay" "github.com/hyperledger-labs/weaver-dlt-interoperability/sdks/fabric/go-sdk/types" + "github.com/hyperledger/fabric-protos-go/peer" log "github.com/sirupsen/logrus" protoV2 "google.golang.org/protobuf/proto" ) @@ -220,16 +223,40 @@ func isPatternAndAddressMatch(pattern string, address string) bool { * Argument is a View protobuf ('statePb.View') **/ func GetResponseDataFromView(view *common.View) ([]byte, error) { - var interopPayload common.InteropPayload + var viewAddress string + var viewPayload []byte if view.Meta.Protocol == common.Meta_FABRIC { var fabricViewData fabric.FabricView err := protoV2.Unmarshal(view.Data, &fabricViewData) if err != nil { return nil, logThenErrorf("fabricView unmarshal error: %s", err.Error()) } - err = protoV2.Unmarshal(fabricViewData.Response.Payload, &interopPayload) - if err != nil { - return nil, logThenErrorf("unable to unmarshal interopPayload: %s", err.Error()) + for i := 0; i < len(fabricViewData.EndorsedProposalResponses); i++ { + var ccAction peer.ChaincodeAction + err = proto.Unmarshal(fabricViewData.EndorsedProposalResponses[i].GetPayload().GetExtension(), &ccAction) + if err != nil { + return nil, logThenErrorf("unable to unmarshal chaincodeAction: %s", err.Error()) + } + var interopPayload common.InteropPayload + err = protoV2.Unmarshal(ccAction.Response.Payload, &interopPayload) + if err != nil { + return nil, logThenErrorf("unable to unmarshal interopPayload: %s", err.Error()) + } + if interopPayload.GetConfidential() { + // TODO Add support for confidential (encrypted) view payloads + return nil, logThenErrorf("Encrypted view payloads not currently supported in Weaver Go SDK") + } + if i == 0 { + viewAddress = interopPayload.GetAddress() + viewPayload = interopPayload.GetPayload() + } else { + if viewAddress != interopPayload.GetAddress() { + return nil, logThenErrorf("Proposal response view addresses mismatch: 0 - %s, %d - %s", viewAddress, i, interopPayload.GetAddress()) + } + if bytes.Compare(viewPayload, interopPayload.GetPayload()) != 0 { + return nil, logThenErrorf("Proposal response payloads mismatch: 0 - %s, %d - %s", string(viewPayload), i, string(interopPayload.GetPayload())) + } + } } } else if view.Meta.Protocol == common.Meta_CORDA { var cordaViewData corda.ViewData @@ -237,14 +264,32 @@ func GetResponseDataFromView(view *common.View) ([]byte, error) { if err != nil { return nil, fmt.Errorf("cordaView unmarshal error: %s", err.Error()) } - err = protoV2.Unmarshal(cordaViewData.Payload, &interopPayload) - if err != nil { - return nil, fmt.Errorf("unable to unmarshal interopPayload: %s", err.Error()) + for i := 0; i < len(cordaViewData.NotarizedPayloads); i++ { + var interopPayload common.InteropPayload + err = protoV2.Unmarshal(cordaViewData.NotarizedPayloads[i].Payload, &interopPayload) + if err != nil { + return nil, fmt.Errorf("unable to unmarshal interopPayload: %s", err.Error()) + } + if interopPayload.GetConfidential() { + // TODO Add support for confidential (encrypted) view payloads + return nil, logThenErrorf("Encrypted view payloads not currently supported in Weaver Go SDK") + } + if i == 0 { + viewAddress = interopPayload.GetAddress() + viewPayload = interopPayload.GetPayload() + } else { + if viewAddress != interopPayload.GetAddress() { + return nil, logThenErrorf("Proposal response view addresses mismatch: 0 - %s, %d - %s", viewAddress, i, interopPayload.GetAddress()) + } + if bytes.Compare(viewPayload, interopPayload.GetPayload()) != 0 { + return nil, logThenErrorf("Proposal response payloads mismatch: 0 - %s, %d - %s", string(viewPayload), i, string(interopPayload.GetPayload())) + } + } } } else { return nil, logThenErrorf("cannot extract data from view; unsupported DLT type: %+v", view.Meta.Protocol) } - return interopPayload.Payload, nil + return viewPayload, nil } func verifyView(contract GatewayContract, b64ViewProto string, address string) error {