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)
                }

Reply via email to