This is an automated email from the ASF dual-hosted git repository. cmorris pushed a commit to branch splitroles-blockchain in repository https://gitbox.apache.org/repos/asf/incubator-milagro-dta.git
commit d47ed061d00a0c43b3aa7267fc7f1696015a446f Author: Christopher Morris <[email protected]> AuthorDate: Mon Sep 30 15:05:38 2019 +0100 Refactor and cleanup --- pkg/api/client.go | 34 ++---- pkg/defaultservice/{fulfill.go => fulfillTX.go} | 0 pkg/defaultservice/order.go | 138 ------------------------ pkg/defaultservice/{fulfill.go => orderTX.go} | 117 +++++++++----------- pkg/service/service.go | 13 +-- pkg/tendermint/tendermint.go | 3 - pkg/tendermint/websockets.go | 10 -- 7 files changed, 66 insertions(+), 249 deletions(-) diff --git a/pkg/api/client.go b/pkg/api/client.go index 198d466..86f97a7 100644 --- a/pkg/api/client.go +++ b/pkg/api/client.go @@ -35,7 +35,7 @@ var ( //ClientService - enables service to be mocked type ClientService interface { FulfillOrder(tx *BlockChainTX) (string, error) - FulfillOrderSecret(req *FulfillOrderSecretRequest) (*FulfillOrderSecretResponse, error) + FulfillOrderSecret(req *FulfillOrderSecretRequest) (string, error) Status(token string) (*StatusResponse, error) Dump(tx *BlockChainTX) error } @@ -48,18 +48,6 @@ type MilagroClientService struct { // ClientEndpoints return only the exported endpoints func ClientEndpoints() transport.HTTPEndpoints { return transport.HTTPEndpoints{ - "FulfillOrder": { - Path: "/" + apiVersion + "/fulfill/order", - Method: http.MethodPost, - NewRequest: func() interface{} { return &FulfillOrderRequest{} }, - NewResponse: func() interface{} { return &FulfillOrderResponse{} }, - }, - "FulfillOrderSecret": { - Path: "/" + apiVersion + "/fulfill/order/secret", - Method: http.MethodPost, - NewRequest: func() interface{} { return &FulfillOrderSecretRequest{} }, - NewResponse: func() interface{} { return &FulfillOrderSecretResponse{} }, - }, "Status": { Path: "/" + apiVersion + "/status", Method: http.MethodGet, @@ -75,19 +63,6 @@ func NewHTTPClient(instance string, logger *logger.Logger) (ClientService, error } -//FulfillOrderSecret - -func (c MilagroClientService) FulfillOrderSecret(req *FulfillOrderSecretRequest) (*FulfillOrderSecretResponse, error) { - endpoint := c.endpoints["FulfillOrderSecret"] - ctx := context.Background() - - d, err := endpoint(ctx, req) - if err != nil { - return nil, err - } - r := d.(*FulfillOrderSecretResponse) - return r, nil -} - //Status - Allows a client to see the status of the server that it is connecting too func (c MilagroClientService) Status(token string) (*StatusResponse, error) { endpoint := c.endpoints["Status"] @@ -102,10 +77,17 @@ func (c MilagroClientService) Status(token string) (*StatusResponse, error) { return r, nil } +//FulfillOrderSecret - +func (c MilagroClientService) FulfillOrderSecret(req *FulfillOrderSecretRequest) (string, error) { + return "", nil +} + +//FulfillOrder - func (c MilagroClientService) FulfillOrder(tx *BlockChainTX) (string, error) { return "", nil } +//Dump - send a message to self via chain for display - For Debugging/Testing/Dev only func (c MilagroClientService) Dump(tx *BlockChainTX) error { return nil } diff --git a/pkg/defaultservice/fulfill.go b/pkg/defaultservice/fulfillTX.go similarity index 100% copy from pkg/defaultservice/fulfill.go copy to pkg/defaultservice/fulfillTX.go diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go index 5f9027c..eff406a 100644 --- a/pkg/defaultservice/order.go +++ b/pkg/defaultservice/order.go @@ -18,7 +18,6 @@ package defaultservice import ( - "encoding/base64" "encoding/hex" "encoding/json" "time" @@ -164,82 +163,6 @@ func (s *Service) Order1(req *api.OrderRequest) (string, error) { return order.Reference, nil } -// Order2 - -func (s *Service) Order2(tx *api.BlockChainTX) (string, error) { - nodeID := s.NodeID() - reqPayload := tx.Payload - txHashString := hex.EncodeToString(tx.TXhash) - - remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, s.MasterFiduciaryNodeID()) - if err != nil { - return "", err - } - - //Get the updated order out of IPFS - _, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID) - if err != nil { - return "", err - } - - order := &documents.OrderDoc{} - err = documents.DecodeOrderDocument(reqPayload, txHashString, order, sikeSK, nodeID, remoteIDDoc.BLSPublicKey) - - // updatedOrder, err := common.RetrieveOrderFromIPFS(s.Ipfs, req.OrderPart2CID, sikeSK, nodeID, remoteIDDoc.BLSPublicKey) - // if err != nil { - // return "", errors.Wrap(err, "Fail to retrieve Order from IPFS") - // } - - //update OrderPartCID for order id - - commitment, extension, err := s.Plugin.PrepareOrderResponse(order) - if err != nil { - return "", errors.Wrap(err, "Generating Final Public Key") - } - - order.OrderPart2.CommitmentPublicKey = commitment - - //Populate Extension - - if order.OrderPart2.Extension == nil { - order.OrderPart2.Extension = make(map[string]string) - } - for key, value := range extension { - order.OrderPart2.Extension[key] = value - } - - // err = common.WriteOrderToStore(s.Store, order.Reference, req.OrderPart2CID) - // if err != nil { - // return "", errors.Wrap(err, "Saving new CID to Order reference") - // } - - // response := &api.OrderResponse{ - // OrderReference: order.Reference, - // Commitment: commitment, - // CreatedAt: time.Now().Unix(), - // Extension: extension, - // } - recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID, nodeID) - if err != nil { - return "", err - } - txHash, payload, err := common.CreateTX(nodeID, s.Store, nodeID, order, recipientList) - - print(hex.EncodeToString(txHash)) - txHash64 := base64.StdEncoding.EncodeToString(txHash) - - //Write the Order2 results to the chain - chainTX := &api.BlockChainTX{ - Processor: api.TXOrderResponse, - SenderID: "", //use no Sender so we can read our own Result for testing - RecipientID: []string{nodeID}, - Payload: payload, - TXhash: []byte(txHash64), - Tags: map[string]string{"reference": order.Reference, "txhash": hex.EncodeToString(txHash)}, - } - return tendermint.PostToChain(chainTX, "Order2") - -} - // OrderSecret1 - func (s *Service) OrderSecret1(req *api.OrderSecretRequest) (string, error) { orderReference := req.OrderReference @@ -328,64 +251,3 @@ func (s *Service) OrderSecret1(req *api.OrderSecretRequest) (string, error) { } return tendermint.PostToChain(chainTX, "OrderSecret1") } - -// OrderSecret2 - -func (s *Service) OrderSecret2(tx *api.BlockChainTX) (string, error) { - nodeID := s.NodeID() - reqPayload := tx.Payload - txHashString := hex.EncodeToString(tx.TXhash) - - _, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID) - if err != nil { - return "", err - } - - remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, s.MasterFiduciaryNodeID()) - if err != nil { - return "", err - } - - //Retrieve the response Order from IPFS - order := &documents.OrderDoc{} - err = documents.DecodeOrderDocument(reqPayload, txHashString, order, sikeSK, nodeID, remoteIDDoc.BLSPublicKey) - - if order.BeneficiaryCID != nodeID { - return "", errors.New("Invalid Processor") - } - - _, seed, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID) - if err != nil { - return "", err - } - - finalPrivateKey, _, extension, err := s.Plugin.ProduceFinalSecret(seed, sikeSK, order, order, nodeID) - if err != nil { - return "", err - } - - if order.OrderPart4.Extension == nil { - order.OrderPart4.Extension = make(map[string]string) - } - for key, value := range extension { - order.OrderPart4.Extension[key] = value - } - - order.OrderPart4.Extension["FinalPrivateKey"] = finalPrivateKey - - //Output Only to self for autoviewing - recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID, nodeID) - if err != nil { - return "", err - } - txHash, payload, err := common.CreateTX(nodeID, s.Store, nodeID, order, recipientList) - - //Write the requests to the chain - chainTX := &api.BlockChainTX{ - Processor: api.TXOrderSecretResponse, //NONE - SenderID: "", // so we can view it - RecipientID: []string{nodeID}, //don't send this to chain, seed compromise becomes fatal, sent just debugging - Payload: payload, - Tags: map[string]string{"reference": order.Reference, "txhash": hex.EncodeToString(txHash)}, - } - return tendermint.PostToChain(chainTX, "OrderSecret2") -} diff --git a/pkg/defaultservice/fulfill.go b/pkg/defaultservice/orderTX.go similarity index 50% rename from pkg/defaultservice/fulfill.go rename to pkg/defaultservice/orderTX.go index 37748c2..95fa883 100644 --- a/pkg/defaultservice/fulfill.go +++ b/pkg/defaultservice/orderTX.go @@ -19,104 +19,86 @@ package defaultservice import ( "encoding/hex" - "time" - "github.com/apache/incubator-milagro-dta/libs/cryptowallet" "github.com/apache/incubator-milagro-dta/libs/documents" "github.com/apache/incubator-milagro-dta/pkg/api" "github.com/apache/incubator-milagro-dta/pkg/common" "github.com/apache/incubator-milagro-dta/pkg/tendermint" + "github.com/pkg/errors" ) -func (s *Service) FulfillOrder(tx *api.BlockChainTX) (string, error) { +// Order2 - Process an incoming Blockchain Order transaction from a MasterFiduciary, to generate the final public key/address +func (s *Service) Order2(tx *api.BlockChainTX) (string, error) { nodeID := s.NodeID() reqPayload := tx.Payload txHashString := hex.EncodeToString(tx.TXhash) - //Get signer by peeking inside the document - signerID, err := documents.OrderDocumentSigner(reqPayload) + remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, s.MasterFiduciaryNodeID()) if err != nil { return "", err } - remoteIDDocCID := signerID _, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID) if err != nil { return "", err } - remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, remoteIDDocCID) - if err != nil { - return "", err - } - //Decode the Order from the supplied TX order := &documents.OrderDoc{} err = documents.DecodeOrderDocument(reqPayload, txHashString, order, sikeSK, nodeID, remoteIDDoc.BLSPublicKey) - if err != nil { - return "", err - } - //Recipient list is principal and self - recipientList, err := common.BuildRecipientList(s.Ipfs, order.PrincipalCID, nodeID) + //Generate commitment + commitment, extension, err := s.Plugin.PrepareOrderResponse(order) if err != nil { - return "", err + return "", errors.Wrap(err, "Generating Final Public Key") } - //Generate the secret and store for later redemption - seed, err := common.MakeRandomSeedAndStore(s.Store, s.Rng, order.Reference) - if err != nil { - return "", err - } + //TODO: Do something with the Commitment, which should only be visible to the Principal + //For now, we will put it in a TX and broadcast with only the Principal as Recipients + //The Processor for the TX is 'dump' - So the principal will pick up the TX and display + //its contents. - //Generate the Public Key (Commitment) from the Seed/Secret - commitmentPublicKey, err := cryptowallet.RedeemPublicKey(seed) + recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID) if err != nil { return "", err } - //Populate Order part 2 - order.OrderPart2 = &documents.OrderPart2{ - CommitmentPublicKey: commitmentPublicKey, - PreviousOrderCID: txHashString, - Timestamp: time.Now().Unix(), + //Populate extension fields + order.OrderPart2.CommitmentPublicKey = commitment + if order.OrderPart2.Extension == nil { + order.OrderPart2.Extension = make(map[string]string) + } + for key, value := range extension { + order.OrderPart2.Extension[key] = value } - //Create a new Transaction payload and TX + //Generate a transaction txHash, payload, err := common.CreateTX(nodeID, s.Store, nodeID, order, recipientList) - //Write the requests to the chain + //Write the Order2 results to the chain chainTX := &api.BlockChainTX{ - Processor: api.TXFulfillResponse, - SenderID: nodeID, - RecipientID: []string{order.PrincipalCID, nodeID}, + Processor: api.TXOrderResponse, + SenderID: "", + RecipientID: []string{nodeID}, Payload: payload, - TXhash: txHash, Tags: map[string]string{"reference": order.Reference, "txhash": hex.EncodeToString(txHash)}, } - return tendermint.PostToChain(chainTX, "FulfillOrder") + return tendermint.PostToChain(chainTX, "Order2") } -// FulfillOrderSecret - -func (s *Service) FulfillOrderSecret(tx *api.BlockChainTX) (string, error) { +// OrderSecret2 - Process an incoming Blockchain Order/Secret transaction from a MasterFiduciary, to generate the final secret +func (s *Service) OrderSecret2(tx *api.BlockChainTX) (string, error) { nodeID := s.NodeID() reqPayload := tx.Payload txHashString := hex.EncodeToString(tx.TXhash) - //Get signer by peeking inside the document - signerID, err := documents.OrderDocumentSigner(reqPayload) - if err != nil { - return "", err - } - remoteIDDocCID := signerID - _, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID) if err != nil { return "", err } - remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, remoteIDDocCID) + remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, s.MasterFiduciaryNodeID()) if err != nil { return "", err } @@ -124,45 +106,48 @@ func (s *Service) FulfillOrderSecret(tx *api.BlockChainTX) (string, error) { //Decode the Order from the supplied TX order := &documents.OrderDoc{} err = documents.DecodeOrderDocument(reqPayload, txHashString, order, sikeSK, nodeID, remoteIDDoc.BLSPublicKey) - if err != nil { - return "", err - } - //Recipient list is beneficiary and self - recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID, order.BeneficiaryCID) - if err != nil { - return "", err + if order.BeneficiaryCID != nodeID { + return "", errors.New("Invalid Processor") } - //Retrieve the Seed - seed, err := common.RetrieveSeed(s.Store, order.Reference) + _, seed, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID) if err != nil { return "", err } - //Generate the Secert from the Seed - commitmentPrivateKey, err := cryptowallet.RedeemSecret(seed) + finalPrivateKey, _, extension, err := s.Plugin.ProduceFinalSecret(seed, sikeSK, order, order, nodeID) if err != nil { return "", err } - //Populate Order part 4 - order.OrderPart4 = &documents.OrderPart4{ - Secret: commitmentPrivateKey, - PreviousOrderCID: txHashString, - Timestamp: time.Now().Unix(), + //TODO: Do something with the Final Private, which should only be visible to the Beneficiary + //For now, we will put it in a TX and broadcast with only the Beneficiary as Recipient + //The Processor for the TX is 'dump' - So the Beneficiary will pick up the TX and display + //its contents. + + if order.OrderPart4.Extension == nil { + order.OrderPart4.Extension = make(map[string]string) + } + for key, value := range extension { + order.OrderPart4.Extension[key] = value } + order.OrderPart4.Extension["FinalPrivateKey"] = finalPrivateKey - //Create a new Transaction payload and TX + //Output Only to self for autoviewing + recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID) + if err != nil { + return "", err + } txHash, payload, err := common.CreateTX(nodeID, s.Store, nodeID, order, recipientList) //Write the requests to the chain chainTX := &api.BlockChainTX{ - Processor: api.TXFulfillOrderSecretResponse, + Processor: api.TXOrderSecretResponse, //NONE SenderID: nodeID, - RecipientID: []string{s.MasterFiduciaryNodeID(), order.BeneficiaryCID}, + RecipientID: []string{nodeID}, //don't send this to chain, seed compromise becomes fatal, sent just debugging Payload: payload, Tags: map[string]string{"reference": order.Reference, "txhash": hex.EncodeToString(txHash)}, } - return tendermint.PostToChain(chainTX, "FulfillOrderSecret") + return tendermint.PostToChain(chainTX, "OrderSecret2") } diff --git a/pkg/service/service.go b/pkg/service/service.go index 8f3bb2b..b1b2d72 100644 --- a/pkg/service/service.go +++ b/pkg/service/service.go @@ -33,16 +33,12 @@ type Service interface { GetOrder(req *api.GetOrderRequest) (*api.GetOrderResponse, error) OrderList(req *api.OrderListRequest) (*api.OrderListResponse, error) - //Order processing + //Order processing - REST access to create an Order & Redeem OrderSecret1(req *api.OrderSecretRequest) (string, error) - OrderSecret2(tx *api.BlockChainTX) (string, error) - Order1(req *api.OrderRequest) (string, error) - Order2(tx *api.BlockChainTX) (string, error) //Fullfill processing FulfillOrder(tx *api.BlockChainTX) (string, error) - FulfillOrderSecret(tx *api.BlockChainTX) (string, error) NodeID() string MasterFiduciaryNodeID() string @@ -50,6 +46,11 @@ type Service interface { SetMasterFiduciaryNodeID(masterFiduciaryNodeID string) //System - Dump(tx *api.BlockChainTX) error //Decrypt and dump the order Status(apiVersion, nopdeType string) (*api.StatusResponse, error) + + //Blockchain transactions + Dump(tx *api.BlockChainTX) error //Decrypt and dump the order for debugging purposes. + OrderSecret2(tx *api.BlockChainTX) (string, error) + FulfillOrderSecret(tx *api.BlockChainTX) (string, error) + Order2(tx *api.BlockChainTX) (string, error) } diff --git a/pkg/tendermint/tendermint.go b/pkg/tendermint/tendermint.go index 84ca3e2..d732dab 100644 --- a/pkg/tendermint/tendermint.go +++ b/pkg/tendermint/tendermint.go @@ -115,9 +115,6 @@ func decodeTX(payload string) (*api.BlockChainTX, string, error) { } func callNextTX(svc service.Service, tx *api.BlockChainTX, listenPort string) error { - // recipient := tx.RecipientID - // sender := tx.SenderID - //payloadJSON := tx.Payload payloadString := string(tx.Payload) if tx.Processor == "NONE" { diff --git a/pkg/tendermint/websockets.go b/pkg/tendermint/websockets.go index 2de01bf..c55cbc9 100644 --- a/pkg/tendermint/websockets.go +++ b/pkg/tendermint/websockets.go @@ -86,16 +86,6 @@ func subscribeAndQueue(queueWaiting chan api.BlockChainTX, logger *logger.Logger queueWaiting <- payload fmt.Printf("Incoming Transaction:%d \n", len(queueWaiting)) - // //blockchainTX, txid, err := decodeTX(string(tx)) - // TXIDhex := hex.EncodeToString(payload.TXhash[:]) - // logger.Info("Incoming TXHash:%s . Processor:%s", TXIDhex, payload.Processor) - - // if payload.Processor == "NONE" { - // DumpTX(&payload) - // } else { - // callNextTX(&payload, listenPort) - // } - case <-quit: os.Exit(0) }
