You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@milagro.apache.org by sm...@apache.org on 2019/10/07 12:38:36 UTC

[incubator-milagro-dta] branch tendermint created (now 4f81f8c)

This is an automated email from the ASF dual-hosted git repository.

smihaylov pushed a change to branch tendermint
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-dta.git.


      at 4f81f8c  Refactor Tendermint package

This branch includes the following new commits:

     new a8be756  Merge the develop branch
     new 4f81f8c  Refactor Tendermint package

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-milagro-dta] 02/02: Refactor Tendermint package

Posted by sm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

smihaylov pushed a commit to branch tendermint
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-dta.git

commit 4f81f8ccf9e65e10b1d31570f5748d29032039fa
Author: Stanislav Mihaylov <sm...@gmail.com>
AuthorDate: Mon Oct 7 15:38:09 2019 +0300

    Refactor Tendermint package
---
 cmd/service/commands.go           |   1 +
 cmd/service/main.go               |  63 ++++++++--
 cmd/servicetester/tendertest1.sh  |   4 +-
 go.mod                            |   2 -
 go.sum                            |   5 +-
 libs/documents/docs.go            |   2 +-
 pkg/api/proto.go                  |  10 ++
 pkg/common/chain.go               |  14 +--
 pkg/common/common.go              |   5 +-
 pkg/defaultservice/fulfillTX.go   |  34 ++++--
 pkg/defaultservice/init.go        |  14 ++-
 pkg/defaultservice/order.go       |  35 ++++--
 pkg/defaultservice/orderTX.go     |  45 +++++--
 pkg/defaultservice/service.go     |  13 +-
 pkg/tendermint/cmd/cmd            | Bin 10230244 -> 0 bytes
 pkg/tendermint/config.go          |   6 -
 pkg/tendermint/connector.go       | 245 ++++++++++++++++++++++++++++++++++++++
 pkg/tendermint/tendermint.go      | 165 -------------------------
 pkg/tendermint/tendermint_test.go |  60 ----------
 pkg/tendermint/websockets.go      | 204 -------------------------------
 20 files changed, 424 insertions(+), 503 deletions(-)

diff --git a/cmd/service/commands.go b/cmd/service/commands.go
index d3d16bd..20a9300 100644
--- a/cmd/service/commands.go
+++ b/cmd/service/commands.go
@@ -78,6 +78,7 @@ func parseConfig(args []string) (*config.Config, error) {
 
 	fs := flag.NewFlagSet("daemon", flag.ExitOnError)
 	fs.StringVar(&(cfg.Plugins.Service), "service", cfg.Plugins.Service, "Service plugin")
+	fs.StringVar(&(cfg.Log.Level), "log-level", cfg.Log.Level, "Log level")
 
 	if err := fs.Parse(args); err != nil {
 		return nil, err
diff --git a/cmd/service/main.go b/cmd/service/main.go
index 41bb4a3..9c77efe 100644
--- a/cmd/service/main.go
+++ b/cmd/service/main.go
@@ -21,6 +21,7 @@ Package main - handles config, initialisation and starts the service daemon
 package main
 
 import (
+	"context"
 	"crypto/rand"
 	"fmt"
 	"net/http"
@@ -36,6 +37,7 @@ import (
 	"github.com/apache/incubator-milagro-dta/libs/ipfs"
 	"github.com/apache/incubator-milagro-dta/libs/logger"
 	"github.com/apache/incubator-milagro-dta/libs/transport"
+	"github.com/apache/incubator-milagro-dta/pkg/api"
 	"github.com/apache/incubator-milagro-dta/pkg/config"
 	"github.com/apache/incubator-milagro-dta/pkg/defaultservice"
 	"github.com/apache/incubator-milagro-dta/pkg/endpoints"
@@ -138,11 +140,12 @@ func startDaemon(args []string) error {
 		cfg.Log.Format,
 		cfg.Log.Level,
 	)
-
 	if err != nil {
 		return errors.Wrap(err, "init logger")
 	}
 
+	logger.Debug("Logger in DEBUG mode!")
+
 	// Create KV store
 	logger.Info("Datastore type: %s", cfg.Node.Datastore)
 	store, err := initDataStore(cfg.Node.Datastore)
@@ -187,6 +190,12 @@ func startDaemon(args []string) error {
 		}
 	}
 
+	// Init Tendermint node connector
+	tmConnector, err := tendermint.NewNodeConnector(cfg.Blockchain.BroadcastNode, cfg.Node.NodeID, store, logger)
+	if err != nil {
+		return errors.Wrap(err, "Blockchain Node connector")
+	}
+
 	//The Server must have a valid ID before starting up
 	svcPlugin := plugins.FindServicePlugin(cfg.Plugins.Service)
 	if svcPlugin == nil {
@@ -200,7 +209,7 @@ func startDaemon(args []string) error {
 		defaultservice.WithDataStore(store),
 		defaultservice.WithKeyStore(keyStore),
 		defaultservice.WithIPFS(ipfsConnector),
-		defaultservice.WithMasterFiduciary(masterFiduciaryServer),
+		defaultservice.WithTendermint(tmConnector),
 		defaultservice.WithConfig(cfg),
 	); err != nil {
 		return errors.Errorf("init service plugin %s", cfg.Plugins.Service)
@@ -223,23 +232,47 @@ func startDaemon(args []string) error {
 	}, []string{"method", "success"})
 
 	// Stop chan
+	ctx, cancelContext := context.WithCancel(context.Background())
+
 	errChan := make(chan error)
 
-	logger.Info("NODE ID (IPFS):  %v", svcPlugin.NodeID())
 	logger.Info("Node Type: %v", strings.ToLower(cfg.Node.NodeType))
-	endpoints := endpoints.Endpoints(svcPlugin, cfg.HTTP.CorsAllow, authorizer, logger, cfg.Node.NodeType, svcPlugin)
-	httpHandler := transport.NewHTTPHandler(endpoints, logger, duration)
+	logger.Info("Node ID:  %v", svcPlugin.NodeID())
+	logger.Info("Master Fiduciary: %v", svcPlugin.MasterFiduciaryNodeID())
 
 	//Connect to Blockchain - Tendermint
-	go tendermint.Subscribe(svcPlugin, store, logger, cfg.Node.NodeID, cfg.HTTP.ListenAddr)
-	if err != nil {
-		return errors.Wrap(err, "init Tendermint Blockchain")
-	}
+	go func() {
+		processFn := func(tx *api.BlockChainTX) error {
+			switch tx.Processor {
+			case "none":
+				return nil
+			case "dump":
+				svcPlugin.Dump(tx)
+			case "v1/fulfill/order":
+				svcPlugin.FulfillOrder(tx)
+			case "v1/order2":
+				svcPlugin.Order2(tx)
+			case "v1/fulfill/order/secret":
+				svcPlugin.FulfillOrderSecret(tx)
+			case "v1/order/secret2":
+				svcPlugin.OrderSecret2(tx)
+			default:
+				return errors.New("Unknown processor")
+			}
+			return nil
+		}
+
+		logger.Info("Starting Blockchain listener to node: %v", cfg.Blockchain.BroadcastNode)
+		errChan <- tmConnector.Subscribe(ctx, processFn)
+		// errChan <- tendermint.Subscribe(svcPlugin, store, logger, cfg.Node.NodeID, cfg.HTTP.ListenAddr)
+	}()
 
 	// Start the application http server
 	go func() {
-		logger.Info("starting listener on %v, custody server %v", cfg.HTTP.ListenAddr, cfg.Node.MasterFiduciaryServer)
-		// httpHandler.PathPrefix("/api/").Handler(http.St:ripPrefix("/api/", http.FileServer(http.Dir("./swagger"))))
+		httpEndpoints := endpoints.Endpoints(svcPlugin, cfg.HTTP.CorsAllow, authorizer, logger, cfg.Node.NodeType, svcPlugin)
+		httpHandler := transport.NewHTTPHandler(httpEndpoints, logger, duration)
+
+		logger.Info("Starting HTTP listener on %v", cfg.HTTP.ListenAddr)
 		errChan <- http.ListenAndServe(cfg.HTTP.ListenAddr, httpHandler)
 	}()
 
@@ -247,7 +280,7 @@ func startDaemon(args []string) error {
 		http.DefaultServeMux.Handle("/metrics", promhttp.Handler())
 		// Start the debug and metrics http server
 		go func() {
-			logger.Info("starting metrics listener on %v", cfg.HTTP.MetricsAddr)
+			logger.Info("Starting metrics listener on %v", cfg.HTTP.MetricsAddr)
 			errChan <- http.ListenAndServe(cfg.HTTP.MetricsAddr, http.DefaultServeMux)
 		}()
 	}
@@ -260,7 +293,11 @@ func startDaemon(args []string) error {
 	}()
 
 	stopErr := <-errChan
-	_ = logger.Log("exit", stopErr.Error())
+	if stopErr != nil {
+		_ = logger.Log("exit", stopErr.Error())
+	}
+
+	cancelContext()
 	return store.Close()
 }
 
diff --git a/cmd/servicetester/tendertest1.sh b/cmd/servicetester/tendertest1.sh
index 64fc139..7f91702 100755
--- a/cmd/servicetester/tendertest1.sh
+++ b/cmd/servicetester/tendertest1.sh
@@ -1,8 +1,8 @@
-ref=$(curl -s -X POST "127.0.0.1:5556/v1/order1" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}")
+ref=$(curl -s -X POST "127.0.0.1:5556/v1/order1" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"QmecffRZTSJDETCRLcjcPe7ynmYNyYpnh7WKzKTdmX1GBZ\",\"extension\":{\"coin\":\"0\"}}")
 
 #sleep long enough for blockchain to catch up
 sleep 4
 
-curl -X POST "127.0.0.1:5556/v1/order/secret1" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$ref,\"beneficiaryIDDocumentCID\":\"QmcyJqEMqNEEYHrNSyUY83CQCNwZ5yVan3SgaQ4NchsqsC\"}"
+curl -X POST "127.0.0.1:5556/v1/order/secret1" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$ref,\"beneficiaryIDDocumentCID\":\"QmecffRZTSJDETCRLcjcPe7ynmYNyYpnh7WKzKTdmX1GBZ\"}"
 
 
diff --git a/go.mod b/go.mod
index 7e0150c..860eb9c 100644
--- a/go.mod
+++ b/go.mod
@@ -2,8 +2,6 @@ module github.com/apache/incubator-milagro-dta
 
 require (
 	github.com/TylerBrock/colorjson v0.0.0-20180527164720-95ec53f28296
-	github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17
-	github.com/VividCortex/gohistogram v1.0.0 // indirect
 	github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3
 	github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d
 	github.com/coreos/go-oidc v2.0.0+incompatible
diff --git a/go.sum b/go.sum
index 1ee5995..fd46e0f 100644
--- a/go.sum
+++ b/go.sum
@@ -16,8 +16,8 @@ github.com/TylerBrock/colorjson v0.0.0-20180527164720-95ec53f28296 h1:JYWTroLXcN
 github.com/TylerBrock/colorjson v0.0.0-20180527164720-95ec53f28296/go.mod h1:VSw57q4QFiWDbRnjdX8Cb3Ow0SFncRw+bA/ofY6Q83w=
 github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE=
 github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
-github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA=
 github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
+github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA=
 github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg=
 github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -105,9 +105,9 @@ github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8
 github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
 github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA=
 github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
@@ -689,6 +689,7 @@ github.com/tendermint/go-amino v0.14.1 h1:o2WudxNfdLNBwMyl2dqOJxiro5rfrEaU0Ugs6o
 github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso=
 github.com/tendermint/tendermint v0.32.4 h1:KwZIMtT+ROvfMYO3wine6F9hak3SpngcRcAIzys1J3I=
 github.com/tendermint/tendermint v0.32.4/go.mod h1:D2+A3pNjY+Po72X0mTfaXorFhiVI8dh/Zg640FGyGtE=
+github.com/tendermint/tendermint v0.32.5 h1:2hCLwuzfCKZxXSe/+iMEl+ChJWKJx6g/Wcvq3NMxVN4=
 github.com/tendermint/tm-db v0.2.0 h1:rJxgdqn6fIiVJZy4zLpY1qVlyD0TU6vhkT4kEf71TQQ=
 github.com/tendermint/tm-db v0.2.0/go.mod h1:0cPKWu2Mou3IlxecH+MEUSYc1Ch537alLe6CpFrKzgw=
 github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g=
diff --git a/libs/documents/docs.go b/libs/documents/docs.go
index 7e9fe27..59bad92 100644
--- a/libs/documents/docs.go
+++ b/libs/documents/docs.go
@@ -93,7 +93,7 @@ func DecodeIDDocument(rawdoc []byte, tag string, idDocument *IDDoc) error {
 	return nil
 }
 
-//PeekOrderDocument - look at the header inside an order document before decryption
+//OrderDocumentSigner - look at the header inside an order document before decryption
 func OrderDocumentSigner(rawDoc []byte) (string, error) {
 	signedEnvelope := SignedEnvelope{}
 	err := proto.Unmarshal(rawDoc, &signedEnvelope)
diff --git a/pkg/api/proto.go b/pkg/api/proto.go
index aedcd2c..e3200d7 100644
--- a/pkg/api/proto.go
+++ b/pkg/api/proto.go
@@ -24,6 +24,8 @@ package api
 */
 
 import (
+	"crypto/sha256"
+	"encoding/hex"
 	"time"
 )
 
@@ -51,6 +53,14 @@ type BlockChainTX struct {
 	Tags                   map[string]string
 }
 
+// CalcHash calculates, sets the TXhash and returns the string representation
+func (tx *BlockChainTX) CalcHash() string {
+	txSha := sha256.Sum256(tx.Payload)
+	tx.TXhash = txSha[:]
+	return hex.EncodeToString(txSha[:])
+
+}
+
 //CreateIdentityRequest -
 type CreateIdentityRequest struct {
 	Name      string            `json:"name,omitempty" validate:"required,alphanum"`
diff --git a/pkg/common/chain.go b/pkg/common/chain.go
index d7a7023..a0438b5 100644
--- a/pkg/common/chain.go
+++ b/pkg/common/chain.go
@@ -10,16 +10,8 @@ import (
 )
 
 // CreateTX creates the transaction ready for write to the chain
-func CreateTX(nodeID string, store *datastore.Store, id string, order *documents.OrderDoc, recipients map[string]documents.IDDoc) ([]byte, []byte, error) {
-	secrets := &IdentitySecrets{}
-	if err := store.Get("id-doc", nodeID, secrets); err != nil {
-		return nil, nil, errors.New("load secrets from store")
-	}
-	blsSecretKey, err := hex.DecodeString(secrets.BLSSecretKey)
-	if err != nil {
-		return nil, nil, errors.Wrap(err, "Decode identity secrets")
-	}
-	rawDoc, err := documents.EncodeOrderDocument(nodeID, *order, blsSecretKey, "previousID", recipients)
+func CreateTX(nodeID string, store *datastore.Store, blsSecretKey []byte, id string, order *documents.OrderDoc, recipients map[string]*documents.IDDoc) ([]byte, []byte, error) {
+	rawDoc, err := documents.EncodeOrderDocument(nodeID, *order, blsSecretKey, recipients)
 	if err != nil {
 		return nil, nil, errors.Wrap(err, "Failed to encode IDDocument")
 	}
@@ -32,7 +24,7 @@ func CreateTX(nodeID string, store *datastore.Store, id string, order *documents
 	return TXID[:], rawDoc, nil
 }
 
-//Decode a transaction for header data but don't decrypt it
+//PeekTX Decode a transaction for header data but don't decrypt it
 func PeekTX(tx []byte) (string, error) {
 	signerCID, err := documents.OrderDocumentSigner(tx)
 	print(signerCID)
diff --git a/pkg/common/common.go b/pkg/common/common.go
index 4e8220b..cdca4fe 100644
--- a/pkg/common/common.go
+++ b/pkg/common/common.go
@@ -105,6 +105,7 @@ func RetrieveSeed(store *datastore.Store, reference string) (seedHex string, err
 	return seedHex, nil
 }
 
+//WriteOrderToStore stores an order
 func WriteOrderToStore(store *datastore.Store, orderReference string, address string) error {
 	if err := store.Set("order", orderReference, address, map[string]string{"time": time.Now().UTC().Format(time.RFC3339)}); err != nil {
 		return errors.New("Save Order to store")
@@ -113,8 +114,8 @@ func WriteOrderToStore(store *datastore.Store, orderReference string, address st
 }
 
 // BuildRecipientList builds a list of recipients who are able to decrypt the encrypted envelope
-func BuildRecipientList(ipfs ipfs.Connector, IDDocs ...string) (map[string]documents.IDDoc, error) {
-	recipients := make(map[string]documents.IDDoc)
+func BuildRecipientList(ipfs ipfs.Connector, IDDocs ...string) (map[string]*documents.IDDoc, error) {
+	recipients := make(map[string]*documents.IDDoc)
 	for _, v := range IDDocs {
 		iddoc, err := RetrieveIDDocFromIPFS(ipfs, v)
 		if err != nil {
diff --git a/pkg/defaultservice/fulfillTX.go b/pkg/defaultservice/fulfillTX.go
index b0c1025..b0527a9 100644
--- a/pkg/defaultservice/fulfillTX.go
+++ b/pkg/defaultservice/fulfillTX.go
@@ -25,9 +25,10 @@ import (
 	"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/apache/incubator-milagro-dta/pkg/identity"
 )
 
+// FulfillOrder TX
 func (s *Service) FulfillOrder(tx *api.BlockChainTX) (string, error) {
 	nodeID := s.NodeID()
 	reqPayload := tx.Payload
@@ -40,7 +41,16 @@ func (s *Service) FulfillOrder(tx *api.BlockChainTX) (string, error) {
 	}
 	remoteIDDocCID := signerID
 
-	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
+	// SIKE and BLS keys
+	keyseed, err := s.KeyStore.Get("seed")
+	if err != nil {
+		return "", err
+	}
+	_, sikeSK, err := identity.GenerateSIKEKeys(keyseed)
+	if err != nil {
+		return "", err
+	}
+	_, blsSK, err := identity.GenerateBLSKeys(keyseed)
 	if err != nil {
 		return "", err
 	}
@@ -83,7 +93,7 @@ func (s *Service) FulfillOrder(tx *api.BlockChainTX) (string, error) {
 	}
 
 	//Create a new Transaction payload and TX
-	txHash, payload, err := common.CreateTX(nodeID, s.Store, nodeID, order, recipientList)
+	txHash, payload, err := common.CreateTX(nodeID, s.Store, blsSK, nodeID, order, recipientList)
 
 	//Write the requests to the chain
 	chainTX := &api.BlockChainTX{
@@ -95,8 +105,8 @@ func (s *Service) FulfillOrder(tx *api.BlockChainTX) (string, error) {
 		TXhash:                 txHash,
 		Tags:                   map[string]string{"reference": order.Reference, "txhash": hex.EncodeToString(txHash)},
 	}
-	return tendermint.PostToChain(chainTX, "FulfillOrder")
 
+	return s.Tendermint.PostTx(chainTX, "FulfillOrder")
 }
 
 // FulfillOrderSecret -
@@ -112,7 +122,16 @@ func (s *Service) FulfillOrderSecret(tx *api.BlockChainTX) (string, error) {
 	}
 	remoteIDDocCID := signerID
 
-	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
+	// SIKE and BLS keys
+	keyseed, err := s.KeyStore.Get("seed")
+	if err != nil {
+		return "", err
+	}
+	_, sikeSK, err := identity.GenerateSIKEKeys(keyseed)
+	if err != nil {
+		return "", err
+	}
+	_, blsSK, err := identity.GenerateBLSKeys(keyseed)
 	if err != nil {
 		return "", err
 	}
@@ -155,7 +174,7 @@ func (s *Service) FulfillOrderSecret(tx *api.BlockChainTX) (string, error) {
 	}
 
 	//Create a new Transaction payload and TX
-	txHash, payload, err := common.CreateTX(nodeID, s.Store, nodeID, order, recipientList)
+	txHash, payload, err := common.CreateTX(nodeID, s.Store, blsSK, nodeID, order, recipientList)
 
 	//Write the requests to the chain
 	chainTX := &api.BlockChainTX{
@@ -167,5 +186,6 @@ func (s *Service) FulfillOrderSecret(tx *api.BlockChainTX) (string, error) {
 		Payload: payload,
 		Tags:    map[string]string{"reference": order.Reference, "txhash": hex.EncodeToString(txHash)},
 	}
-	return tendermint.PostToChain(chainTX, "FulfillOrderSecret")
+
+	return s.Tendermint.PostTx(chainTX, "FulfillOrderSecret")
 }
diff --git a/pkg/defaultservice/init.go b/pkg/defaultservice/init.go
index f0c0190..e4874ae 100644
--- a/pkg/defaultservice/init.go
+++ b/pkg/defaultservice/init.go
@@ -24,8 +24,8 @@ import (
 	"github.com/apache/incubator-milagro-dta/libs/ipfs"
 	"github.com/apache/incubator-milagro-dta/libs/keystore"
 	"github.com/apache/incubator-milagro-dta/libs/logger"
-	"github.com/apache/incubator-milagro-dta/pkg/api"
 	"github.com/apache/incubator-milagro-dta/pkg/config"
+	"github.com/apache/incubator-milagro-dta/pkg/tendermint"
 )
 
 // ServiceOption function to set Service properties
@@ -84,10 +84,18 @@ func WithIPFS(ipfsConnector ipfs.Connector) ServiceOption {
 	}
 }
 
+// WithTendermint adds tendermint node connector to the Service
+func WithTendermint(tmConnector *tendermint.NodeConnector) ServiceOption {
+	return func(s *Service) error {
+		s.Tendermint = tmConnector
+		return nil
+	}
+}
+
 // WithMasterFiduciary adds master fiduciary connector to the Service
-func WithMasterFiduciary(masterFiduciaryServer api.ClientService) ServiceOption {
+func WithMasterFiduciary(masterFiduciaryNodeID string) ServiceOption {
 	return func(s *Service) error {
-		s.MasterFiduciaryServer = masterFiduciaryServer
+		s.SetMasterFiduciaryNodeID(masterFiduciaryNodeID)
 		return nil
 	}
 }
diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go
index acc6a6d..3f60158 100644
--- a/pkg/defaultservice/order.go
+++ b/pkg/defaultservice/order.go
@@ -27,7 +27,6 @@ import (
 	"github.com/apache/incubator-milagro-dta/pkg/api"
 	"github.com/apache/incubator-milagro-dta/pkg/common"
 	"github.com/apache/incubator-milagro-dta/pkg/identity"
-	"github.com/apache/incubator-milagro-dta/pkg/tendermint"
 	"github.com/pkg/errors"
 )
 
@@ -111,8 +110,6 @@ func (s *Service) PrepareOrderPart1(order *documents.OrderDoc, reqExtension map[
 }
 
 // PrepareOrderResponse gets the updated order and returns the commitment and extension
-//func (s *Service) PrepareOrderResponse(orderPart2 *documents.OrderDoc, reqExtension, fulfillExtension map[string]string) (commitment string, extension map[string]string, err error) {
-
 func (s *Service) PrepareOrderResponse(orderPart2 *documents.OrderDoc) (commitment string, extension map[string]string, err error) {
 	return orderPart2.OrderPart2.CommitmentPublicKey, nil, nil
 }
@@ -158,8 +155,18 @@ func (s *Service) Order1(req *api.OrderRequest) (string, error) {
 		order.OrderReqExtension[key] = value
 	}
 
+	// BLS key
+	keyseed, err := s.KeyStore.Get("seed")
+	if err != nil {
+		return "", err
+	}
+	_, blsSK, err := identity.GenerateBLSKeys(keyseed)
+	if err != nil {
+		return "", err
+	}
+
 	//This is serialized and output to the chain
-	txHash, payload, err := common.CreateTX(nodeID, s.Store, nodeID, order, recipientList)
+	txHash, payload, err := common.CreateTX(nodeID, s.Store, blsSK, nodeID, order, recipientList)
 
 	//Write the requests to the chain
 	chainTX := &api.BlockChainTX{
@@ -171,7 +178,11 @@ func (s *Service) Order1(req *api.OrderRequest) (string, error) {
 		TXhash:                 txHash,
 		Tags:                   map[string]string{"reference": order.Reference, "txhash": hex.EncodeToString(txHash)},
 	}
-	tendermint.PostToChain(chainTX, "Order1")
+
+	if _, err := s.Tendermint.PostTx(chainTX, "Order1"); err != nil {
+		return "", err
+	}
+
 	return order.Reference, nil
 }
 
@@ -196,11 +207,11 @@ func (s *Service) OrderSecret1(req *api.OrderSecretRequest) (string, error) {
 	// SIKE and BLS keys
 	keyseed, err := s.KeyStore.Get("seed")
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 	_, sikeSK, err := identity.GenerateSIKEKeys(keyseed)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 	_, blsSK, err := identity.GenerateBLSKeys(keyseed)
 	if err != nil {
@@ -212,7 +223,7 @@ func (s *Service) OrderSecret1(req *api.OrderSecretRequest) (string, error) {
 		return "", err
 	}
 
-	tx, err := tendermint.TXbyHash(previousOrderHash)
+	tx, err := s.Tendermint.GetTx(previousOrderHash)
 	if err != nil {
 		return "", err
 	}
@@ -258,7 +269,7 @@ func (s *Service) OrderSecret1(req *api.OrderSecretRequest) (string, error) {
 		Timestamp:                time.Now().Unix(),
 	}
 
-	txHash, payload, err := common.CreateTX(nodeID, s.Store, nodeID, order, recipientList)
+	txHash, payload, err := common.CreateTX(nodeID, s.Store, blsSK, nodeID, order, recipientList)
 
 	//Write the requests to the chain
 	chainTX := &api.BlockChainTX{
@@ -269,6 +280,10 @@ func (s *Service) OrderSecret1(req *api.OrderSecretRequest) (string, error) {
 		Payload:                payload,
 		Tags:                   map[string]string{"reference": order.Reference, "txhash": hex.EncodeToString(txHash)},
 	}
-	tendermint.PostToChain(chainTX, "OrderSecret1")
+
+	if _, err := s.Tendermint.PostTx(chainTX, "OrderSecret1"); err != nil {
+		return "", err
+	}
+
 	return order.Reference, nil
 }
diff --git a/pkg/defaultservice/orderTX.go b/pkg/defaultservice/orderTX.go
index 4fe62f4..d6188c9 100644
--- a/pkg/defaultservice/orderTX.go
+++ b/pkg/defaultservice/orderTX.go
@@ -19,11 +19,12 @@ package defaultservice
 
 import (
 	"encoding/hex"
+	"fmt"
 
 	"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/apache/incubator-milagro-dta/pkg/identity"
 	"github.com/pkg/errors"
 )
 
@@ -38,7 +39,16 @@ func (s *Service) Order2(tx *api.BlockChainTX) (string, error) {
 		return "", err
 	}
 
-	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
+	// SIKE and BLS keys
+	keyseed, err := s.KeyStore.Get("seed")
+	if err != nil {
+		return "", err
+	}
+	_, sikeSK, err := identity.GenerateSIKEKeys(keyseed)
+	if err != nil {
+		return "", err
+	}
+	_, blsSK, err := identity.GenerateBLSKeys(keyseed)
 	if err != nil {
 		return "", err
 	}
@@ -73,7 +83,7 @@ func (s *Service) Order2(tx *api.BlockChainTX) (string, error) {
 	}
 
 	//Generate a transaction
-	txHash, payload, err := common.CreateTX(nodeID, s.Store, nodeID, order, recipientList)
+	txHash, payload, err := common.CreateTX(nodeID, s.Store, blsSK, nodeID, order, recipientList)
 
 	//Write the Order2 results to the chain
 	chainTX := &api.BlockChainTX{
@@ -84,8 +94,8 @@ func (s *Service) Order2(tx *api.BlockChainTX) (string, error) {
 		Payload:                payload,
 		Tags:                   map[string]string{"reference": order.Reference, "txhash": hex.EncodeToString(txHash)},
 	}
-	return tendermint.PostToChain(chainTX, "Order2")
 
+	return s.Tendermint.PostTx(chainTX, "Order2")
 }
 
 // OrderSecret2 - Process an incoming Blockchain Order/Secret transaction from a MasterFiduciary, to generate the final secret
@@ -94,7 +104,16 @@ func (s *Service) OrderSecret2(tx *api.BlockChainTX) (string, error) {
 	reqPayload := tx.Payload
 	txHashString := hex.EncodeToString(tx.TXhash)
 
-	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
+	// SIKE and BLS keys
+	keyseed, err := s.KeyStore.Get("seed")
+	if err != nil {
+		return "", err
+	}
+	_, sikeSK, err := identity.GenerateSIKEKeys(keyseed)
+	if err != nil {
+		return "", err
+	}
+	_, blsSK, err := identity.GenerateBLSKeys(keyseed)
 	if err != nil {
 		return "", err
 	}
@@ -107,17 +126,16 @@ func (s *Service) OrderSecret2(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 {
+		fmt.Println("ERROR DEcode Order:", err)
+		return "", err
+	}
 
 	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)
+	finalPrivateKey, _, extension, err := s.Plugin.ProduceFinalSecret(keyseed, sikeSK, order, order, nodeID)
 	if err != nil {
 		return "", err
 	}
@@ -140,7 +158,7 @@ func (s *Service) OrderSecret2(tx *api.BlockChainTX) (string, error) {
 	if err != nil {
 		return "", err
 	}
-	txHash, payload, err := common.CreateTX(nodeID, s.Store, nodeID, order, recipientList)
+	txHash, payload, err := common.CreateTX(nodeID, s.Store, blsSK, nodeID, order, recipientList)
 
 	//Write the requests to the chain
 	chainTX := &api.BlockChainTX{
@@ -151,5 +169,6 @@ func (s *Service) OrderSecret2(tx *api.BlockChainTX) (string, error) {
 		Payload:                payload,
 		Tags:                   map[string]string{"reference": order.Reference, "txhash": hex.EncodeToString(txHash)},
 	}
-	return tendermint.PostToChain(chainTX, "OrderSecret2")
+
+	return s.Tendermint.PostTx(chainTX, "OrderSecret2")
 }
diff --git a/pkg/defaultservice/service.go b/pkg/defaultservice/service.go
index 9299b92..2b9fe0d 100644
--- a/pkg/defaultservice/service.go
+++ b/pkg/defaultservice/service.go
@@ -34,7 +34,8 @@ import (
 	"github.com/apache/incubator-milagro-dta/libs/transport"
 	"github.com/apache/incubator-milagro-dta/pkg/api"
 	"github.com/apache/incubator-milagro-dta/pkg/common"
-	"github.com/apache/incubator-milagro-dta/pkg/config"
+	"github.com/apache/incubator-milagro-dta/pkg/identity"
+	"github.com/apache/incubator-milagro-dta/pkg/tendermint"
 	"github.com/hokaccha/go-prettyjson"
 )
 
@@ -52,6 +53,7 @@ type Service struct {
 	Store                 *datastore.Store
 	KeyStore              keystore.Store
 	Ipfs                  ipfs.Connector
+	Tendermint            *tendermint.NodeConnector
 	nodeID                string
 	masterFiduciaryNodeID string
 }
@@ -115,7 +117,12 @@ func (s *Service) Dump(tx *api.BlockChainTX) error {
 		return err
 	}
 
-	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
+	// SIKE and BLS keys
+	keyseed, err := s.KeyStore.Get("seed")
+	if err != nil {
+		return err
+	}
+	_, sikeSK, err := identity.GenerateSIKEKeys(keyseed)
 	if err != nil {
 		return err
 	}
@@ -127,6 +134,8 @@ func (s *Service) Dump(tx *api.BlockChainTX) error {
 	fmt.Println(string(pp))
 
 	return nil
+}
+
 // Endpoints for extending the plugin endpoints
 func (s *Service) Endpoints() (namespace string, endpoints transport.HTTPEndpoints) {
 	return s.Name(), nil
diff --git a/pkg/tendermint/cmd/cmd b/pkg/tendermint/cmd/cmd
deleted file mode 100755
index 0e07c4f..0000000
Binary files a/pkg/tendermint/cmd/cmd and /dev/null differ
diff --git a/pkg/tendermint/config.go b/pkg/tendermint/config.go
deleted file mode 100644
index 510189d..0000000
--- a/pkg/tendermint/config.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package tendermint
-
-const (
-	//node = "127.0.0.1:26657"
-	node = "34.246.173.153:26657"
-)
diff --git a/pkg/tendermint/connector.go b/pkg/tendermint/connector.go
new file mode 100644
index 0000000..0dab29e
--- /dev/null
+++ b/pkg/tendermint/connector.go
@@ -0,0 +1,245 @@
+package tendermint
+
+import (
+	"context"
+	"encoding/base64"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strconv"
+	"strings"
+	"time"
+
+	"github.com/apache/incubator-milagro-dta/libs/datastore"
+	"github.com/apache/incubator-milagro-dta/libs/logger"
+	"github.com/apache/incubator-milagro-dta/pkg/api"
+	status "github.com/apache/incubator-milagro-dta/pkg/tendermint/status"
+	"github.com/pkg/errors"
+	tmclient "github.com/tendermint/tendermint/rpc/client"
+	tmtypes "github.com/tendermint/tendermint/types"
+)
+
+const (
+	nodeConnectionTimeout = time.Second * 10
+	txChanSize            = 1000
+)
+
+// ProcessTXFunc is executed on each incoming TX
+type ProcessTXFunc func(tx *api.BlockChainTX) error
+
+// NodeConnector is using external tendermint node to post and get transactions
+type NodeConnector struct {
+	nodeID     string
+	tmNodeAddr string
+	httpClient *http.Client
+	tmClient   *tmclient.HTTP
+	log        *logger.Logger
+	store      *datastore.Store
+}
+
+// NewNodeConnector constructs a new Tendermint NodeConnector
+func NewNodeConnector(tmNodeAddr string, nodeID string, store *datastore.Store, log *logger.Logger) (conn *NodeConnector, err error) {
+	defer func() {
+		if r := recover(); r != nil {
+			err = errors.Errorf("Initialize tendermint node connector: %v", r)
+		}
+	}()
+
+	tmNodeAddr = strings.TrimRight(tmNodeAddr, "/")
+	tmClient := tmclient.NewHTTP(fmt.Sprintf("tcp://%s", tmNodeAddr), "/websocket")
+	if err := tmClient.Start(); err != nil {
+		return nil, errors.Wrap(err, "Start tendermint client")
+	}
+
+	return &NodeConnector{
+		tmNodeAddr: tmNodeAddr,
+		nodeID:     nodeID,
+		log:        log,
+		store:      store,
+		httpClient: &http.Client{
+			Timeout: nodeConnectionTimeout,
+		},
+		tmClient: tmClient,
+	}, nil
+
+}
+
+// Stop is performing clean-up
+func (nc *NodeConnector) Stop() error {
+	return nc.tmClient.Stop()
+}
+
+// GetTx retreives a transaction by hash
+func (nc *NodeConnector) GetTx(txHash string) (*api.BlockChainTX, error) {
+	query := fmt.Sprintf("tag.txhash='%s'", txHash)
+	result, err := nc.tmClient.TxSearch(query, true, 1, 1)
+	if err != nil {
+		return nil, err
+	}
+	if len(result.Txs) == 0 {
+		return nil, errors.New("Transaction not found")
+	}
+
+	payload := &api.BlockChainTX{}
+	if err := json.Unmarshal(result.Txs[0].Tx, &payload); err != nil {
+		return nil, err
+	}
+
+	return payload, nil
+}
+
+// PostTx posts a transaction to the chain and returns the transaction ID
+func (nc *NodeConnector) PostTx(tx *api.BlockChainTX, method string) (txID string, err error) {
+	txID = tx.CalcHash()
+
+	//serialize the whole transaction
+	serializedTX, err := json.Marshal(tx)
+	if err != nil {
+		return
+	}
+	base64EncodedTX := base64.StdEncoding.EncodeToString(serializedTX)
+
+	// TODO: use net/rpc
+	body := strings.NewReader(`{
+		"jsonrpc": "2.0",
+		"id": "anything",
+		"method": "broadcast_tx_commit",
+		"params": {
+			"tx": "` + base64EncodedTX + `"}
+	}`)
+	url := "http://" + nc.tmNodeAddr
+
+	req, err := http.NewRequest("POST", url, body)
+	if err != nil {
+		return "", errors.Wrap(err, "post to blockchain node")
+	}
+	req.Header.Set("Content-Type", "text/plain;")
+
+	resp, err := nc.httpClient.Do(req)
+	if err != nil {
+		return "", errors.Wrap(err, "post to blockchain node")
+	}
+	defer resp.Body.Close()
+
+	if resp.StatusCode != http.StatusOK {
+		var respErr string
+		if b, err := ioutil.ReadAll(resp.Body); err != nil {
+			respErr = resp.Status
+		} else {
+			respErr = string(b)
+		}
+
+		return "", errors.Errorf("Post to blockchain node status %v: %v", resp.StatusCode, respErr)
+	}
+
+	nc.log.Debug("POST TO CHAIN: METHOD: %s CALLS: %s  - TXID: %s", method, tx.Processor, txID)
+
+	return
+}
+
+// Subscribe connects to the Tendermint node and collect the events
+func (nc *NodeConnector) Subscribe(ctx context.Context, processFn ProcessTXFunc) error {
+	chainStatus, err := nc.getChainStatus()
+	if err != nil {
+		return err
+	}
+
+	currentBlockHeight, err := strconv.Atoi(chainStatus.Result.SyncInfo.LatestBlockHeight)
+	if err != nil {
+		return errors.Wrap(err, "Failed to obtain latest blockheight of Blockchain")
+	}
+
+	var processedToHeight int
+	if err := nc.store.Get("chain", "height", &processedToHeight); err != nil {
+		if err != datastore.ErrKeyNotFound {
+			return errors.Wrap(err, "Get last processed block height")
+		}
+	}
+
+	nc.log.Debug("Block height: Current: %v; Processed: %v", currentBlockHeight, processedToHeight)
+
+	// create the transaction queue chan
+	txQueue := make(chan *api.BlockChainTX, txChanSize)
+
+	// Collect events
+	if err := nc.subscribeAndQueue(ctx, txQueue); err != nil {
+		return err
+	}
+
+	// TODO: load historicTX
+
+	// Process events
+	return nc.processTXQueue(ctx, txQueue, processFn)
+}
+
+func (nc *NodeConnector) subscribeAndQueue(ctx context.Context, txQueue chan *api.BlockChainTX) error {
+	query := "tag.recipient='" + nc.nodeID + "'"
+
+	out, err := nc.tmClient.Subscribe(context.Background(), "test", query, 1000)
+	if err != nil {
+		return errors.Wrapf(err, "Failed to subscribe to query %s", query)
+	}
+
+	go func() {
+		for {
+			select {
+			case result := <-out:
+				tx := result.Data.(tmtypes.EventDataTx).Tx
+				payload := &api.BlockChainTX{}
+				err := json.Unmarshal(tx, payload)
+				if err != nil {
+					nc.log.Debug("IGNORED TX - Invalid!")
+					break
+				}
+
+				//check if this node is in receipient list
+				if payload.RecipientID != nc.nodeID {
+					nc.log.Debug("IGNORED TX! Recipient not match the query! (%v != %v)", payload.RecipientID, nc.nodeID)
+					break
+				}
+
+				//Add into the waitingQueue for later processing
+				txQueue <- payload
+			case <-ctx.Done():
+				return
+			}
+		}
+	}()
+
+	return nil
+}
+
+func (nc *NodeConnector) processTXQueue(ctx context.Context, txQueue chan *api.BlockChainTX, processFn ProcessTXFunc) error {
+	for {
+		select {
+		case tx := <-txQueue:
+			if err := processFn(tx); err != nil {
+				// TODO: errors block processing the queue
+				return err
+			}
+			// TODO: store the last block height
+		case <-ctx.Done():
+			return nil
+		}
+	}
+}
+
+func (nc *NodeConnector) getChainStatus() (*status.StatusResponse, error) {
+	url := fmt.Sprintf("http://%s/status", nc.tmNodeAddr)
+	resp, err := nc.httpClient.Get(url)
+	if err != nil {
+		return nil, errors.Wrap(err, "Get node status")
+	}
+	defer resp.Body.Close()
+	if resp.StatusCode != http.StatusOK {
+		return nil, errors.Errorf("Get node status status code: %v", resp.StatusCode)
+	}
+
+	status := &status.StatusResponse{}
+	if err := json.NewDecoder(resp.Body).Decode((&status)); err != nil {
+		return nil, errors.Wrap(err, "Invalid node status response")
+	}
+
+	return status, nil
+}
diff --git a/pkg/tendermint/tendermint.go b/pkg/tendermint/tendermint.go
deleted file mode 100644
index e02b3c1..0000000
--- a/pkg/tendermint/tendermint.go
+++ /dev/null
@@ -1,165 +0,0 @@
-package tendermint
-
-import (
-	"bufio"
-	"crypto/sha256"
-	"encoding/base64"
-	"encoding/hex"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"net/http"
-	"strings"
-
-	"github.com/apache/incubator-milagro-dta/pkg/api"
-	"github.com/apache/incubator-milagro-dta/pkg/service"
-)
-
-//QueryChain the blockchain for an index
-func QueryChain(index string) (string, string) {
-	url := "http://" + node + "/abci_query?data=\"" + index + "\""
-	resp, err := http.Get(url)
-	if err != nil {
-		// handle err
-	}
-	defer resp.Body.Close()
-	scanner := bufio.NewScanner(resp.Body)
-	scanner.Split(bufio.ScanBytes)
-	t := ""
-	for scanner.Scan() {
-		t += scanner.Text()
-		///fmt.Print(scanner.Text())
-	}
-
-	res, _ := UnmarshalChainQuery([]byte(t))
-
-	val := res.Result.Response.Value
-	decodeVal, _ := base64.StdEncoding.DecodeString(val)
-	return string(decodeVal), val
-}
-
-//PostToChain - send TX data to the Blockchain
-func PostToChain(tx *api.BlockChainTX, method string) (string, error) {
-	//Create TX Hash
-
-	tx.RecipientID = tx.RecipientID
-
-	TXID := sha256.Sum256(tx.Payload)
-	TXIDhex := hex.EncodeToString(TXID[:])
-	tx.TXhash = TXID[:]
-
-	//serialize the whole transaction
-	serializedTX, _ := json.Marshal(tx)
-	base64EncodedTX := base64.StdEncoding.EncodeToString(serializedTX)
-
-	body := strings.NewReader("{\"jsonrpc\":\"2.0\",\"id\":\"anything\",\"method\":\"broadcast_tx_commit\",\"params\": {\"tx\": \"" + base64EncodedTX + "\"}}")
-	url := "http://" + node + ""
-
-	req, err := http.NewRequest("POST", url, body)
-	if err != nil {
-		print("Error posting to Blockchain")
-		return "", err
-	}
-	req.Header.Set("Content-Type", "text/plain;")
-
-	resp, err := http.DefaultClient.Do(req)
-	if err != nil {
-		print("Error posting to Blockchain")
-		return "", err
-	}
-	defer resp.Body.Close()
-	fmt.Printf("POST TO CHAIN: METHOD:%s CALLS:%s  - TXID:%s\n", method, tx.Processor, TXIDhex)
-	return TXIDhex, nil
-}
-
-//HandleChainTX -
-func HandleChainTX(myID string, tx string) error {
-	blockChainTX, err := decodeChainTX(tx)
-	if err != nil {
-		return err
-	}
-	panic(nil)
-	err = callNextTX(nil, blockChainTX, "5556")
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-//DecodeChainTX - Decode the On Chain TX into a BlockChainTX object
-func decodeChainTX(payload string) (*api.BlockChainTX, error) {
-	base64DecodedTX, _ := base64.StdEncoding.DecodeString(payload)
-	tx := &api.BlockChainTX{}
-
-	err := json.Unmarshal(base64DecodedTX, tx)
-	if err != nil {
-		return &api.BlockChainTX{}, err
-	}
-	return tx, nil
-}
-
-//DecodeChainTX - Decode the On Chain TX into a BlockChainTX object
-func decodeTX(payload string) (*api.BlockChainTX, string, error) {
-	tx := &api.BlockChainTX{}
-	parts := strings.SplitN(payload, "=", 2)
-	if len(parts) != 2 {
-		return &api.BlockChainTX{}, "", errors.New("Invalid TX payload")
-	}
-	hash := string(parts[0])
-	err := json.Unmarshal([]byte(parts[1]), tx)
-	if err != nil {
-		return &api.BlockChainTX{}, "", err
-	}
-	return tx, hash, nil
-}
-
-func callNextTX(svc service.Service, tx *api.BlockChainTX, listenPort string) error {
-	switch tx.Processor {
-	case "none":
-		return nil
-	case "dump":
-		svc.Dump(tx)
-	case "v1/fulfill/order":
-		svc.FulfillOrder(tx)
-	case "v1/order2":
-		svc.Order2(tx)
-	case "v1/fulfill/order/secret":
-		svc.FulfillOrderSecret(tx)
-	case "v1/order/secret2":
-		svc.OrderSecret2(tx)
-
-	default:
-		return errors.New("Unknown processor")
-	}
-	return nil
-}
-
-//DumpTXID -
-func DumpTXID(txid string) {
-	value, raw := QueryChain(txid)
-	println(value)
-	bc, _ := decodeChainTX(raw)
-	println(string(bc.Payload))
-	println()
-}
-
-//ProcessTransactionID -
-func ProcessTransactionID(txid string) {
-	_, payload := QueryChain((txid))
-	err := HandleChainTX("", payload)
-	if err != nil {
-		panic(err)
-	}
-}
-
-func unique(stringSlice []string) []string {
-	keys := make(map[string]bool)
-	list := []string{}
-	for _, entry := range stringSlice {
-		if _, value := keys[entry]; !value {
-			keys[entry] = true
-			list = append(list, entry)
-		}
-	}
-	return list
-}
diff --git a/pkg/tendermint/tendermint_test.go b/pkg/tendermint/tendermint_test.go
deleted file mode 100644
index 495f74f..0000000
--- a/pkg/tendermint/tendermint_test.go
+++ /dev/null
@@ -1,60 +0,0 @@
-package tendermint
-
-import "testing"
-
-var (
-	nodeID = "QmT4y4MtV5mvPHkFjfUQYQ7h1WvAagMy2GTJCn2bF8DQb7"
-)
-
-func Test_Order1(t *testing.T) {
-	a := "eyJQcm9jZXNzb3IiOiJ2MS9mdWxmaWxsL29yZGVyIiwiU2VuZGVySUQiOiJRbVQ0eTRNdFY1bXZQSGtGamZVUVlRN2gxV3ZBYWdNeTJHVEpDbjJiRjhEUWI3IiwiUmVjaXBpZW50SUQiOiJRbVQ0eTRNdFY1bXZQSGtGamZVUVlRN2gxV3ZBYWdNeTJHVEpDbjJiRjhEUWI3IiwiUGF5bG9hZCI6ImV5SnZjbVJsY2xCaGNuUXhRMGxFSWpvaVVXMVpVRU5xVEVGME1tbzVVbWhxU0U1TVkwRnVObEF5WTJseVJHWjZTRlpFWTBwMFkzbGtUVFZ5VWxoM1V5SXNJbVJ2WTNWdFpXNTBRMGxFSWpvaVVXMVVOSGswVFhSV05XMTJVRWhyUm1wbVZWRlpVVGRvTVZkMlFXRm5UWGt5UjFSS1EyNHlZa1k0UkZGaU55SjkifQ=="
-	err := HandleChainTX(nodeID, a)
-	if err != nil {
-		panic(err)
-	}
-}
-
-func Test_FullFill(t *testing.T) {
-	a := "eyJQcm9jZXNzb3IiOiJPUkRFUl9SRVNQT05TRSIsIlNlbmRlcklEIjoiUW1UNHk0TXRWNW12UEhrRmpmVVFZUTdoMVd2QWFnTXkyR1RKQ24yYkY4RFFiNyIsIlJlY2lwaWVudElEIjoiUW1UNHk0TXRWNW12UEhrRmpmVVFZUTdoMVd2QWFnTXkyR1RKQ24yYkY4RFFiNyIsIlBheWxvYWQiOiJleUp2Y21SbGNsQmhjblF5UTBsRUlqb2lVVzFVZUZka1ltZEdhRGxHYWpGMlJIbFhlazVCWkROVmFuRjNlVEYyTkRsRlFtVjJhRzUyTVVWdk5HVllSaUo5In0="
-	err := HandleChainTX(nodeID, a)
-	if err != nil {
-		panic(err)
-	}
-
-}
-
-func Test_DumpTXID(t *testing.T) {
-	a := "5fe5823c0d8b6d49f2ac99c90575566962ac3a14a6b2f1e7fe7ea1099b7b3bbd"
-	value, raw := QueryChain(a)
-	println(value)
-	bc, _ := decodeChainTX(raw)
-	print(string(bc.Payload))
-}
-
-//Use this to generate Order1
-//curl -s -X POST "http://localhost:5556/v1/order1" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}"
-
-func Test_All(t *testing.T) {
-	DumpTXID("dea1396bce7890f85da7dc86b4ece5c4d372886ed08948eca6a0beee36c412e0")
-
-}
-
-func Test_1(t *testing.T) {
-	txid := "473407b069ff917b110f38c36d5b9e5246b5ace5d82df38c5a188d5ac868cfec"
-	DumpTXID(txid)
-	ProcessTransactionID(txid)
-}
-
-func Test_2(t *testing.T) {
-	txid := "586bc14b15a31999571c8188241beef046d3b78a9481ecee984e7c76a1d95112"
-	DumpTXID(txid)
-	ProcessTransactionID(txid)
-}
-
-func Test_3(t *testing.T) {
-	txid := "5a48129fd272f2a8c57fdd96716a78c3be55a3cf811b179e82e54221d95ccbc4"
-	DumpTXID(txid)
-	ProcessTransactionID(txid)
-}
-
-//curl -s -X POST "http://localhost:5556/v1/order1" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}"
diff --git a/pkg/tendermint/websockets.go b/pkg/tendermint/websockets.go
deleted file mode 100644
index 472ea95..0000000
--- a/pkg/tendermint/websockets.go
+++ /dev/null
@@ -1,204 +0,0 @@
-package tendermint
-
-import (
-	"context"
-	"encoding/json"
-	"fmt"
-	"net/http"
-	"os"
-	"os/signal"
-	"strconv"
-	"syscall"
-
-	"github.com/apache/incubator-milagro-dta/libs/datastore"
-	"github.com/apache/incubator-milagro-dta/libs/logger"
-	"github.com/apache/incubator-milagro-dta/pkg/api"
-	"github.com/apache/incubator-milagro-dta/pkg/service"
-	status "github.com/apache/incubator-milagro-dta/pkg/tendermint/status"
-	"github.com/pkg/errors"
-	tmclient "github.com/tendermint/tendermint/rpc/client"
-	ctypes "github.com/tendermint/tendermint/rpc/core/types"
-	tmtypes "github.com/tendermint/tendermint/types"
-)
-
-func catchUp(quene chan tmtypes.Tx, store *datastore.Store, logger *logger.Logger, nodeID string, listenPort string, height int) error {
-	print("catch up")
-	return nil
-}
-
-//Subscribe to Websocket and add to queue
-func subscribeAndQueue(queueWaiting chan api.BlockChainTX, logger *logger.Logger, nodeID string, listenPort string, blockchainNode string) error {
-	client := tmclient.NewHTTP("tcp://"+blockchainNode+"", "/websocket")
-	//client.SetLogger(tmlogger)
-	err := client.Start()
-	if err != nil {
-		logger.Info("Failed to start Tendermint HTTP client %s", err)
-		return err
-	}
-	defer client.Stop()
-
-	//curl "34.246.173.153:26657/tx_search?query=\"tag.part=4%20AND%20tag.reference='579a2864-e100-11e9-aaf4-acde48001122'\""
-	query := "tag.recipient='" + nodeID + "'"
-	//query := "tm.event = 'Tx'"
-
-	out, err := client.Subscribe(context.Background(), "test", query, 1000)
-	if err != nil {
-		logger.Info("Failed to subscribe to query %s %s", query, err)
-		return err
-	}
-
-	logger.Info("Tendermint: Connected")
-
-	quit := make(chan os.Signal, 1)
-	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
-	for {
-		select {
-		case result := <-out:
-			tx := result.Data.(tmtypes.EventDataTx).Tx
-			payload := api.BlockChainTX{}
-			err := json.Unmarshal(tx, &payload)
-			if err != nil {
-				logger.Info("******** Invalid TX - ignored")
-				break
-			}
-
-			//check if this node is in receipient list
-			if payload.RecipientID != nodeID {
-				logger.Info("******** Invalid Recipient - why are we receiving this TX?")
-				break
-
-			}
-
-			//Add into the waitingQueue for later processing
-			queueWaiting <- payload
-			//fmt.Printf("Incoming Transaction:%d \n", len(queueWaiting))
-
-		case <-quit:
-			os.Exit(0)
-		}
-	}
-	return nil
-}
-
-func TXbyHash(TXHash string) (api.BlockChainTX, error) {
-	client := tmclient.NewHTTP("tcp://"+node+"", "/websocket")
-	query := fmt.Sprintf("tag.txhash='%s'", TXHash)
-	result, err := client.TxSearch(query, true, 1, 1)
-
-	if len(result.Txs) == 0 {
-		return api.BlockChainTX{}, errors.New("Not found")
-	}
-
-	payload := api.BlockChainTX{}
-	err = json.Unmarshal(result.Txs[0].Tx, &payload)
-
-	_ = payload
-
-	if err != nil {
-		return payload, err
-	}
-	//
-	// res := result.Txs[0]
-	// tx := res.Tx
-	return payload, nil
-
-}
-
-//loadAllHistoricTX - load the history for this node into a queue
-func loadAllHistoricTX(start int, end int, txHistory []ctypes.ResultTx, nodeID string, listenPort string) error {
-	//cycle through the historic transactions page by page
-	//Get all transactions that claim to be from me - check signatures
-	//Get all transactions that claim to be to me -
-
-	client := tmclient.NewHTTP("tcp://"+node+"", "/websocket")
-	currentPage := 1
-	query := fmt.Sprintf("tag.recipient='%v' AND tag.sender='%v' AND tx.height>%d AND tx.height<=%d", nodeID, nodeID, start, end)
-	numPerPage := 5
-
-	for {
-		result, err := client.TxSearch(query, true, currentPage, numPerPage)
-		if err != nil {
-			return errors.New("Failed to query chain for transaction history")
-		}
-
-		for _, tx := range result.Txs {
-			txHistory = append(txHistory, *tx)
-		}
-		if currentPage*numPerPage > result.TotalCount {
-			break
-		}
-		currentPage++
-	}
-	parseHistory(txHistory)
-	return nil
-}
-
-func parseHistory(txHistory []ctypes.ResultTx) {
-	txCount := len(txHistory)
-
-	//loop backwards
-	for i := txCount - 1; i >= 0; i-- {
-		resTx := txHistory[i]
-		tx := resTx.Tx
-
-		//Decode TX into BlockchainTX Object
-		payload := api.BlockChainTX{}
-		err := json.Unmarshal(tx, &payload)
-		if err != nil {
-			msg := fmt.Sprintf("Invalid Transaction Hash:%v Height:%v Index:% \n", resTx.Hash, resTx.Height, resTx.Index)
-			print(msg)
-			continue
-		}
-		//Decode BlockchainTX.payload into Protobuffer Qredo
-		// TODO:
-		// Parse the incoming TX, check sig
-		// If from self, can assume correct
-		// builds transaction chains using previous transactionHash
-		// Ensure every
-		// Check recipient/sender in tags are correct
-		//
-		_ = payload
-	}
-	print("Finished loading - but not parsing the History\n")
-}
-
-func processTXQueue(svc service.Service, queue chan api.BlockChainTX, listenPort string) {
-	print("Processing queue\n")
-	for payload := range queue {
-		callNextTX(svc, &payload, listenPort)
-	}
-}
-
-//Subscribe - Connect to the Tendermint websocket to collect events
-func Subscribe(svc service.Service, store *datastore.Store, logger *logger.Logger, nodeID string, listenPort string) error {
-
-	latestStatus, _ := getChainStatus(node)
-	currentBlockHeight, err := strconv.Atoi(latestStatus.Result.SyncInfo.LatestBlockHeight)
-
-	if err != nil {
-		return errors.New("Failed to obtain latest blockheight of Blockchain")
-	}
-
-	var processedToHeight int
-	store.Get("chain", "height", &processedToHeight)
-
-	//first catch up to Tip of chain
-	var txHistory []ctypes.ResultTx
-	queueWaiting := make(chan api.BlockChainTX, 1000)
-
-	//while we are processessing the history save all new transactions in a queue for later
-	go subscribeAndQueue(queueWaiting, logger, nodeID, listenPort, node)
-	loadAllHistoricTX(processedToHeight, currentBlockHeight, txHistory, nodeID, listenPort)
-	processTXQueue(svc, queueWaiting, listenPort)
-	return nil
-}
-
-func getChainStatus(node string) (status.StatusResponse, error) {
-	resp, err := http.Get("http://" + node + "/status")
-	result := status.StatusResponse{}
-	if err != nil {
-		return result, err
-	}
-	json.NewDecoder(resp.Body).Decode((&result))
-	return result, nil
-}


[incubator-milagro-dta] 01/02: Merge the develop branch

Posted by sm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

smihaylov pushed a commit to branch tendermint
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-dta.git

commit a8be7565035b80d8ca9f13b3598ab17db6913d5f
Merge: eb7e448 6bc9bc4
Author: Stanislav Mihaylov <sm...@gmail.com>
AuthorDate: Thu Oct 3 17:30:09 2019 +0300

    Merge the develop branch

 .travis.yml                                     |  17 +++
 Dockerfile                                      |  17 +++
 Dockerfile-alpine                               |  17 +++
 build-static.sh                                 |  18 +++
 build.sh                                        |  19 +++
 cmd/service/commands.go                         |   1 +
 cmd/service/initnode.go                         |  50 --------
 cmd/service/main.go                             |  55 ++++-----
 cmd/servicetester/e2e_test.sh                   | 134 +++++++++++++---------
 cmd/servicetester/fulltest.sh                   |  18 +++
 cmd/servicetester/id_test.sh                    |  19 +++
 go.mod                                          |   4 +-
 go.sum                                          |  59 +++-------
 libs/crypto/bench_test.go                       |  17 +++
 libs/crypto/libpqnist/CMakeLists.txt            |  17 +++
 libs/crypto/libpqnist/CPackConfig.cmake         |  17 +++
 libs/crypto/libpqnist/cmake_uninstall.cmake.in  |  17 +++
 libs/crypto/libpqnist/examples/CMakeLists.txt   |  17 +++
 libs/crypto/libpqnist/include/CMakeLists.txt    |  17 +++
 libs/crypto/libpqnist/src/CMakeLists.txt        |  17 +++
 libs/crypto/libpqnist/test/smoke/CMakeLists.txt |  17 +++
 libs/documents/build                            |  17 +++
 libs/documents/crypto.go                        |   2 +-
 libs/documents/docs.go                          |  21 ++--
 libs/documents/docs.proto                       |  19 +++
 libs/documents/docs_test.go                     |  19 ++-
 libs/keystore/filestore.go                      | 111 ++++++++++++++++++
 libs/keystore/filestore_test.go                 |  85 ++++++++++++++
 libs/keystore/keystore.go                       |  36 ++++++
 libs/keystore/memorystore.go                    |  59 ++++++++++
 libs/keystore/memorystore_test.go               |  46 ++++++++
 libs/transport/http.go                          |  12 +-
 lint.sh                                         |  19 +++
 open-api.yaml                                   |  17 +++
 pkg/bitcoinplugin/helpers.go                    |   2 +-
 pkg/bitcoinplugin/open-api.yaml                 |  17 +++
 pkg/bitcoinplugin/service.go                    |   4 +-
 pkg/common/common.go                            |  49 +-------
 pkg/defaultservice/identity.go                  | 146 ------------------------
 pkg/defaultservice/init.go                      | 102 +++++++++++++++++
 pkg/defaultservice/order.go                     |  19 ++-
 pkg/defaultservice/service.go                   |  19 +--
 pkg/endpoints/endpoints.go                      | 122 ++++----------------
 pkg/identity/identity.go                        | 121 ++++++++++++++++++++
 pkg/identity/identity_test.go                   |  47 ++++++++
 pkg/identity/keys.go                            |  63 ++++++++++
 pkg/safeguardsecret/README.md                   |  19 +++
 pkg/service/service.go                          |  15 ++-
 plugins/plugin.go                               |   9 +-
 test.sh                                         |  17 +++
 50 files changed, 1270 insertions(+), 528 deletions(-)

diff --cc cmd/service/main.go
index 286460c,7e6a8ef..41bb4a3
--- a/cmd/service/main.go
+++ b/cmd/service/main.go
@@@ -34,9 -36,11 +36,11 @@@ import 
  	"github.com/apache/incubator-milagro-dta/libs/ipfs"
  	"github.com/apache/incubator-milagro-dta/libs/logger"
  	"github.com/apache/incubator-milagro-dta/libs/transport"
 -	"github.com/apache/incubator-milagro-dta/pkg/api"
  	"github.com/apache/incubator-milagro-dta/pkg/config"
+ 	"github.com/apache/incubator-milagro-dta/pkg/defaultservice"
  	"github.com/apache/incubator-milagro-dta/pkg/endpoints"
+ 	"github.com/apache/incubator-milagro-dta/pkg/identity"
 +	"github.com/apache/incubator-milagro-dta/pkg/tendermint"
  	"github.com/apache/incubator-milagro-dta/plugins"
  	"github.com/go-kit/kit/metrics/prometheus"
  	"github.com/pkg/errors"
@@@ -224,15 -232,8 +227,15 @@@ func startDaemon(args []string) error 
  
  	logger.Info("NODE ID (IPFS):  %v", svcPlugin.NodeID())
  	logger.Info("Node Type: %v", strings.ToLower(cfg.Node.NodeType))
- 	endpoints := endpoints.Endpoints(svcPlugin, cfg.HTTP.CorsAllow, authorizer, logger, cfg.Node.NodeType)
+ 	endpoints := endpoints.Endpoints(svcPlugin, cfg.HTTP.CorsAllow, authorizer, logger, cfg.Node.NodeType, svcPlugin)
  	httpHandler := transport.NewHTTPHandler(endpoints, logger, duration)
 +
 +	//Connect to Blockchain - Tendermint
 +	go tendermint.Subscribe(svcPlugin, store, logger, cfg.Node.NodeID, cfg.HTTP.ListenAddr)
 +	if err != nil {
 +		return errors.Wrap(err, "init Tendermint Blockchain")
 +	}
 +
  	// Start the application http server
  	go func() {
  		logger.Info("starting listener on %v, custody server %v", cfg.HTTP.ListenAddr, cfg.Node.MasterFiduciaryServer)
diff --cc go.mod
index 6225b74,b63bedf..7e0150c
--- a/go.mod
+++ b/go.mod
@@@ -1,11 -1,11 +1,13 @@@
  module github.com/apache/incubator-milagro-dta
  
  require (
 +	github.com/TylerBrock/colorjson v0.0.0-20180527164720-95ec53f28296
 +	github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17
+ 	github.com/VividCortex/gohistogram v1.0.0 // indirect
+ 	github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3
  	github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d
  	github.com/coreos/go-oidc v2.0.0+incompatible
 -	github.com/go-kit/kit v0.8.0
 +	github.com/go-kit/kit v0.9.0
  	github.com/go-playground/locales v0.12.1 // indirect
  	github.com/go-playground/universal-translator v0.16.0 // indirect
  	github.com/go-test/deep v1.0.2
diff --cc go.sum
index 58ea010,dfb1954..1ee5995
--- a/go.sum
+++ b/go.sum
@@@ -13,11 -12,8 +12,13 @@@ github.com/StackExchange/wmi v0.0.0-201
  github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e/go.mod h1:3oM7gXIttpYDAJXpVNnSCiUMYBLIZ6cb1t+Ip982MRo=
  github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo=
  github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s=
 +github.com/TylerBrock/colorjson v0.0.0-20180527164720-95ec53f28296 h1:JYWTroLXcNzSCgu66NMgdjwoMHQRbv2SoOVNFb4kRkE=
 +github.com/TylerBrock/colorjson v0.0.0-20180527164720-95ec53f28296/go.mod h1:VSw57q4QFiWDbRnjdX8Cb3Ow0SFncRw+bA/ofY6Q83w=
 +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE=
 +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
 +github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA=
+ github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
+ github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg=
  github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
  github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
  github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@@ -29,12 -25,12 +30,14 @@@ github.com/bifurcation/mint v0.0.0-2018
  github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
  github.com/bren2010/proquint v0.0.0-20160323162903-38337c27106d h1:QgeLLoPD3kRVmeu/1al9iIpIANMi9O1zXFm8BnYGCJg=
  github.com/bren2010/proquint v0.0.0-20160323162903-38337c27106d/go.mod h1:Jbj8eKecMNwf0KFI75skSUZqMB4UCRcndUScVBTWyUI=
 +github.com/btcsuite/btcd v0.0.0-20190115013929-ed77733ec07d/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0=
  github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8=
- github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17 h1:m0N5Vg5nP3zEz8TREZpwX3gt4Biw3/8fbIf4A3hO96g=
  github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
+ github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3 h1:A/EVblehb75cUgXA5njHPn0kLAsykn6mJGz7rnmW5W0=
+ github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI=
+ github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=
  github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
 +github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
  github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
  github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng=
  github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
@@@ -48,10 -48,8 +55,9 @@@ github.com/cenkalti/backoff v2.1.1+inco
  github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
  github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE=
  github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
- github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764=
  github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U=
  github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
  github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
  github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
  github.com/coreos/go-oidc v2.0.0+incompatible h1:+RStIopZ8wooMx+Vs5Bt8zMXxV1ABl5LbakNExNmZIg=
@@@ -74,36 -67,17 +80,34 @@@ github.com/davecgh/go-spew v1.1.1/go.mo
  github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018 h1:6xT9KW8zLC5IlbaIF5Q7JNieBoACT7iW0YTxQHR0in0=
  github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4=
  github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ=
- github.com/dgraph-io/badger v1.6.0-rc1 h1:JphPpoBZJ3WHha133BGYlQqltSGIhV+VsEID0++nN9A=
  github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4=
 +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
  github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
- github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
  github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
  github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
- github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
  github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
  github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE=
 +github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM=
 +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
 +github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A=
  github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg=
 +github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ=
 +github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64=
 +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A=
 +github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg=
 +github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y=
 +github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0=
  github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
  github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
  github.com/fd/go-nat v1.0.0/go.mod h1:BTBu/CKvMmOMUPkKVef1pngt2WFH/lg7E6yQnulfp6E=
 +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
 +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 +github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI=
+ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
  github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
  github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA=
  github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
@@@ -142,14 -113,9 +145,13 @@@ github.com/gobwas/glob v0.2.3/go.mod h1
  github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
  github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
  github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 +github.com/gogo/protobuf v1.3.0 h1:G8O7TerXerS4F6sx9OV7/nRfJdnXgHZu/S/7F2SN+UE=
 +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
  github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
  github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
  github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
- github.com/golang/mock v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk=
  github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
  github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
  github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
@@@ -178,14 -140,9 +180,13 @@@ github.com/golangci/misspell v0.0.0-201
  github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI=
  github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
  github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
 +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 +github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
  github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
 +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
  github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
  github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
- github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
  github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
  github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw=
  github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
@@@ -349,18 -289,17 +341,20 @@@ github.com/jbenet/go-temp-err-catcher v
  github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY=
  github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10=
  github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4=
+ github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89 h1:12K8AlpT0/6QUXSfV0yi4Q0jkbq8NDtIKFtF61AoqV0=
  github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
 +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U=
 +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ=
  github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+ github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI=
  github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
- github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE=
  github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
  github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
  github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
  github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM=
  github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+ github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE=
  github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
  github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
  github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
@@@ -659,20 -580,12 +645,16 @@@ github.com/shirou/gopsutil v0.0.0-20180
  github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
  github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
  github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
 +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
 +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
  github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
  github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
- github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
  github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
- github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa h1:E+gaaifzi2xF65PbDmuKI3PhLWY6G5opMLniFq8vmXA=
  github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU=
 +github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4=
 +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
  github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE=
- github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek=
  github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0=
- github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU=
  github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc=
  github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
  github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
@@@ -776,10 -669,7 +756,8 @@@ go.uber.org/fx v1.9.0/go.mod h1:mFdUyAU
  go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI=
  go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
  go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
  go4.org v0.0.0-20190218023631-ce4c26f7be8e/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
- go4.org v0.0.0-20190313082347-94abd6928b1d h1:JkRdGP3zvTtTbabWSAC6n67ka30y7gOzWAah4XYJSfw=
  go4.org v0.0.0-20190313082347-94abd6928b1d/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
  golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
  golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@@ -864,10 -746,8 +841,9 @@@ golang.org/x/tools v0.0.0-2019031121294
  golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
  golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
  golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
  golang.org/x/tools v0.0.0-20190909030654-5b82db07426d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
  golang.org/x/xerrors v0.0.0-20190212162355-a5947ffaace3/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
- golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522 h1:bhOzK9QyoD0ogCnFro1m2mz41+Ib0oOhfJnBp5MR4K4=
  golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
  golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc=
  golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@@ -897,11 -768,8 +870,9 @@@ gopkg.in/gemnasium/logrus-airbrake-hook
  gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
  gopkg.in/go-playground/validator.v9 v9.29.1 h1:SvGtYmN60a5CVKTOzMSyfzWDeZRxRuGvRQyEAKbw1xc=
  gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
 +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
  gopkg.in/square/go-jose.v2 v2.3.1 h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4=
  gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
- gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
  gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
  gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
  gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --cc pkg/common/common.go
index 38db9dd,03f815a..4e8220b
--- a/pkg/common/common.go
+++ b/pkg/common/common.go
@@@ -117,53 -100,98 +105,22 @@@ func RetrieveSeed(store *datastore.Stor
  	return seedHex, nil
  }
  
 -// CreateAndStoreOrderPart2 -
 -func CreateAndStoreOrderPart2(ipfs ipfs.Connector, store *datastore.Store, keyStore keystore.Store, order *documents.OrderDoc, orderPart1CID, commitmentPublicKey, nodeID string, recipients map[string]*documents.IDDoc) (orderPart2CID string, err error) {
 -	Part2 := documents.OrderPart2{
 -		CommitmentPublicKey: commitmentPublicKey,
 -		PreviousOrderCID:    orderPart1CID,
 -		Timestamp:           time.Now().Unix(),
 -	}
 -	order.OrderPart2 = &Part2
 -	//Write the updated doc back to IPFS
 -	orderPart2CID, err = WriteOrderToIPFS(nodeID, ipfs, store, keyStore, nodeID, order, recipients)
 -	if err != nil {
 -		return "", err
 -	}
 -	return orderPart2CID, nil
 -}
 -
 -// CreateAndStorePart3 adds part 3 "redemption request" to the order doc
 -func CreateAndStorePart3(ipfs ipfs.Connector, store *datastore.Store, keyStore keystore.Store, order *documents.OrderDoc, orderPart2CID, nodeID string, beneficiaryEncryptedData []byte, recipients map[string]*documents.IDDoc) (orderPart3CID string, err error) {
 -	//Add part 3 "redemption request" to the order doc
 -	redemptionRequest := documents.OrderPart3{
 -		//TODO
 -		Redemption:               "SignedReferenceNumber",
 -		PreviousOrderCID:         orderPart2CID,
 -		BeneficiaryEncryptedData: beneficiaryEncryptedData,
 -		Timestamp:                time.Now().Unix(),
 -	}
 -	order.OrderPart3 = &redemptionRequest
 -	//Write the updated doc back to IPFS
 -	orderPart3CID, err = WriteOrderToIPFS(nodeID, ipfs, store, keyStore, nodeID, order, recipients)
 -	if err != nil {
 -		return "", nil
 -	}
 -	return orderPart3CID, nil
 -}
 -
 -// CreateAndStoreOrderPart4 -
 -func CreateAndStoreOrderPart4(ipfs ipfs.Connector, store *datastore.Store, keyStore keystore.Store, order *documents.OrderDoc, commitmentPrivateKey, orderPart3CID, nodeID string, recipients map[string]*documents.IDDoc) (orderPart4CID string, err error) {
 -	Part4 := documents.OrderPart4{
 -		Secret:           commitmentPrivateKey,
 -		PreviousOrderCID: orderPart3CID,
 -		Timestamp:        time.Now().Unix(),
 -	}
 -	order.OrderPart4 = &Part4
 -	//Write the updated doc back to IPFS
 -	orderPart4CID, err = WriteOrderToIPFS(nodeID, ipfs, store, keyStore, nodeID, order, recipients)
 -	if err != nil {
 -		return "", nil
 -	}
 -	return orderPart4CID, nil
 -}
 -
 -// WriteOrderToIPFS writes the order document to IPFS network
 -func WriteOrderToIPFS(nodeID string, ipfs ipfs.Connector, store *datastore.Store, keyStore keystore.Store, id string, order *documents.OrderDoc, recipients map[string]*documents.IDDoc) (ipfsAddress string, err error) { // Get the secret keys
 -	seed, err := keyStore.Get("seed")
 -	if err != nil {
 -		return "", errors.New("load secrets")
 -	}
 -	_, blsSecretKey, err := identity.GenerateBLSKeys(seed)
 -	if err != nil {
 -		return "", err
 -	}
 -
 -	rawDoc, err := documents.EncodeOrderDocument(nodeID, *order, blsSecretKey, recipients)
 -	if err != nil {
 -		return "", errors.Wrap(err, "Failed to encode IDDocument")
 -	}
 -	ipfsAddress, err = ipfs.Add(rawDoc)
 -	if err != nil {
 -		return "", errors.Wrap(err, "Failed to Save Raw Document into IPFS")
 -	}
 -
 -	if err := store.Set("order", order.Reference, ipfsAddress, map[string]string{"time": time.Now().UTC().Format(time.RFC3339)}); err != nil {
 -		return "", errors.New("Save Order to store")
 +func WriteOrderToStore(store *datastore.Store, orderReference string, address string) error {
 +	if err := store.Set("order", orderReference, address, map[string]string{"time": time.Now().UTC().Format(time.RFC3339)}); err != nil {
 +		return errors.New("Save Order to store")
  	}
 -	return ipfsAddress, nil
 +	return nil
  }
  
- //InitECKeys - generate EC keys using BIP44 HD Wallets (as bitcoin) from seed
- func InitECKeys(seed []byte) ([]byte, error) {
- 	//EC ADD Keypair Protocol
- 	_, pubKeyECADD, _, err := cryptowallet.Bip44Address(seed, cryptowallet.CoinTypeBitcoinMain, 0, 0, 0)
- 	if err != nil {
- 		return nil, errors.Wrap(err, "Failed to derive EC HD Wallet Key")
- 	}
- 	return pubKeyECADD.SerializeCompressed(), nil
- }
- 
- // RetrieveIdentitySecrets gets the secrets for the node ID
- func RetrieveIdentitySecrets(store *datastore.Store, nodeID string) (name string, seed []byte, blsSK []byte, sikeSK []byte, err error) {
- 	var idSecrets = &IdentitySecrets{}
- 	if err := store.Get("id-doc", nodeID, idSecrets); err != nil {
- 		return "", nil, nil, nil, err
- 	}
- 	seed, err = hex.DecodeString(idSecrets.Seed)
- 	if err != nil {
- 		return "", nil, nil, nil, err
- 	}
- 	blsSK, err = hex.DecodeString(idSecrets.BLSSecretKey)
- 	if err != nil {
- 		return "", nil, nil, nil, err
- 	}
- 	sikeSK, err = hex.DecodeString(idSecrets.SikeSecretKey)
- 	if err != nil {
- 		return "", nil, nil, nil, err
- 	}
- 	return idSecrets.Name, seed, blsSK, sikeSK, nil
- }
- 
  // BuildRecipientList builds a list of recipients who are able to decrypt the encrypted envelope
 -func BuildRecipientList(ipfs ipfs.Connector, localNodeDocCID, remoteNodeDocCID string) (map[string]*documents.IDDoc, error) {
 -	remoteNodeDoc, err := RetrieveIDDocFromIPFS(ipfs, remoteNodeDocCID)
 -	if err != nil {
 -		return nil, err
 -	}
 -
 -	localNodeDoc, err := RetrieveIDDocFromIPFS(ipfs, localNodeDocCID)
 -	if err != nil {
 -		return nil, err
 -	}
 -
 -	recipients := map[string]*documents.IDDoc{
 -		remoteNodeDocCID: remoteNodeDoc,
 -		localNodeDocCID:  localNodeDoc,
 +func BuildRecipientList(ipfs ipfs.Connector, IDDocs ...string) (map[string]documents.IDDoc, error) {
 +	recipients := make(map[string]documents.IDDoc)
 +	for _, v := range IDDocs {
 +		iddoc, err := RetrieveIDDocFromIPFS(ipfs, v)
 +		if err != nil {
 +			return nil, err
 +		}
 +		recipients[v] = iddoc
  	}
  	return recipients, nil
  }
diff --cc pkg/defaultservice/order.go
index 4f9c87f,bafd24c..acc6a6d
--- a/pkg/defaultservice/order.go
+++ b/pkg/defaultservice/order.go
@@@ -26,7 -25,7 +26,8 @@@ import 
  	"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/identity"
 +	"github.com/apache/incubator-milagro-dta/pkg/tendermint"
  	"github.com/pkg/errors"
  )
  
@@@ -184,76 -217,76 +190,85 @@@ func (s *Service) OrderSecret1(req *api
  	}
  	remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, s.MasterFiduciaryNodeID())
  	if err != nil {
 -		return nil, err
 +		return "", err
  	}
  
- 	_, _, blsSK, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
+ 	// SIKE and BLS keys
+ 	keyseed, err := s.KeyStore.Get("seed")
+ 	if err != nil {
+ 		return nil, err
+ 	}
+ 	_, sikeSK, err := identity.GenerateSIKEKeys(keyseed)
+ 	if err != nil {
+ 		return nil, err
+ 	}
+ 	_, blsSK, err := identity.GenerateBLSKeys(keyseed)
  	if err != nil {
 -		return nil, err
 +		return "", err
  	}
  
 -	//Retrieve the order from IPFS
 -	order, err := common.RetrieveOrderFromIPFS(s.Ipfs, orderPart2CID, sikeSK, nodeID, remoteIDDoc.BLSPublicKey)
 +	localIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, s.NodeID())
  	if err != nil {
 -		return nil, errors.Wrap(err, "Fail to retrieve Order from IPFS")
 +		return "", err
  	}
  
 -	// TODO: Split Beneficiary and Principal
 -	beneficiariesSeed := keyseed
 -	beneficiariesSikeSK := sikeSK
 -
 -	if err := s.Plugin.ValidateOrderSecretRequest(req, *order); err != nil {
 -		return nil, err
 +	tx, err := tendermint.TXbyHash(previousOrderHash)
 +	if err != nil {
 +		return "", err
  	}
  
 -	//Create a piece of data that is destined for the beneficiary, passed via the Master Fiduciary
 +	_ = tx
  
 -	beneficiaryEncryptedData, extension, err := s.Plugin.ProduceBeneficiaryEncryptedData(blsSK, order, req)
 +	order := &documents.OrderDoc{}
 +	err = documents.DecodeOrderDocument(tx.Payload, previousOrderHash, order, sikeSK, nodeID, remoteIDDoc.BLSPublicKey)
  	if err != nil {
 -		return nil, err
 +		err = documents.DecodeOrderDocument(tx.Payload, previousOrderHash, order, sikeSK, nodeID, localIDDoc.BLSPublicKey)
 +		if err != nil {
 +			return "", errors.Wrap(err, "Fail to retrieve existing order")
 +		}
  	}
  
 -	//Create a request Object in IPFS
 -	orderPart3CID, err := common.CreateAndStorePart3(s.Ipfs, s.Store, s.KeyStore, order, orderPart2CID, nodeID, beneficiaryEncryptedData, recipientList)
 -	if err != nil {
 -		return nil, err
 +	//Populate extension fields
 +	if order.OrderSecretReqExtension == nil {
 +		order.OrderSecretReqExtension = make(map[string]string)
  	}
 -
 -	//Post the address of the updated doc to the custody node
 -	request := &api.FulfillOrderSecretRequest{
 -		SenderDocumentCID: nodeID,
 -		OrderPart3CID:     orderPart3CID,
 -		Extension:         extension,
 +	for key, value := range req.Extension {
 +		order.OrderSecretReqExtension[key] = value
  	}
 -	response, err := s.MasterFiduciaryServer.FulfillOrderSecret(request)
 -	if err != nil {
 -		return nil, err
 +
 +	if err := s.Plugin.ValidateOrderSecretRequest(req, *order); err != nil {
 +		return "", err
  	}
  
 -	//Retrieve the response Order from IPFS
 -	orderPart4, err := common.RetrieveOrderFromIPFS(s.Ipfs, response.OrderPart4CID, sikeSK, nodeID, remoteIDDoc.BLSPublicKey)
 -	if err != nil {
 -		return nil, err
 +	if req.BeneficiaryIDDocumentCID != "" {
 +		order.BeneficiaryCID = req.BeneficiaryIDDocumentCID
  	}
  
 -	finalPrivateKey, finalPublicKey, ext, err := s.Plugin.ProduceFinalSecret(beneficiariesSeed, beneficiariesSikeSK, order, orderPart4, req, response)
 +	//Create a piece of data that is destined for the beneficiary, passed via the Master Fiduciary
 +	beneficiaryEncryptedData, _, err := s.Plugin.ProduceBeneficiaryEncryptedData(blsSK, order, req)
  	if err != nil {
 -		return nil, err
 +		return "", err
  	}
  
 -	return &api.OrderSecretResponse{
 -		Secret:         finalPrivateKey,
 -		Commitment:     finalPublicKey,
 -		OrderReference: order.Reference,
 -		Extension:      ext,
 -	}, nil
 +	//Create a request Object in IPFS
 +	order.OrderPart3 = &documents.OrderPart3{
 +		Redemption:               "SignedReferenceNumber",
 +		PreviousOrderCID:         previousOrderHash,
 +		BeneficiaryEncryptedData: beneficiaryEncryptedData,
 +		Timestamp:                time.Now().Unix(),
 +	}
 +
 +	txHash, payload, err := common.CreateTX(nodeID, s.Store, nodeID, order, recipientList)
 +
 +	//Write the requests to the chain
 +	chainTX := &api.BlockChainTX{
 +		Processor:              api.TXFulfillOrderSecretRequest,
 +		SenderID:               nodeID,
 +		RecipientID:            s.MasterFiduciaryNodeID(),
 +		AdditionalRecipientIDs: []string{},
 +		Payload:                payload,
 +		Tags:                   map[string]string{"reference": order.Reference, "txhash": hex.EncodeToString(txHash)},
 +	}
 +	tendermint.PostToChain(chainTX, "OrderSecret1")
 +	return order.Reference, nil
  }
diff --cc pkg/defaultservice/service.go
index 1260a89,b1787a3..9299b92
--- a/pkg/defaultservice/service.go
+++ b/pkg/defaultservice/service.go
@@@ -27,13 -25,11 +27,15 @@@ import 
  	"time"
  
  	"github.com/apache/incubator-milagro-dta/libs/datastore"
 +	"github.com/apache/incubator-milagro-dta/libs/documents"
  	"github.com/apache/incubator-milagro-dta/libs/ipfs"
+ 	"github.com/apache/incubator-milagro-dta/libs/keystore"
  	"github.com/apache/incubator-milagro-dta/libs/logger"
+ 	"github.com/apache/incubator-milagro-dta/libs/transport"
  	"github.com/apache/incubator-milagro-dta/pkg/api"
 +	"github.com/apache/incubator-milagro-dta/pkg/common"
 +	"github.com/apache/incubator-milagro-dta/pkg/config"
 +	"github.com/hokaccha/go-prettyjson"
  )
  
  var (
@@@ -48,7 -44,9 +50,8 @@@ type Service struct 
  	Logger                *logger.Logger
  	Rng                   io.Reader
  	Store                 *datastore.Store
+ 	KeyStore              keystore.Store
  	Ipfs                  ipfs.Connector
 -	MasterFiduciaryServer api.ClientService
  	nodeID                string
  	masterFiduciaryNodeID string
  }
@@@ -115,26 -100,7 +105,29 @@@ func (s *Service) Status(apiVersion, no
  	}, nil
  }
  
 +//Dump - used for debugging purpose, print the entire Encrypted Transaction
 +func (s *Service) Dump(tx *api.BlockChainTX) error {
 +	nodeID := s.NodeID()
 +	txHashString := hex.EncodeToString(tx.TXhash)
 +
 +	localIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, nodeID)
 +	if err != nil {
 +		return err
 +	}
 +
 +	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
 +	if err != nil {
 +		return err
 +	}
 +
 +	order := &documents.OrderDoc{}
 +	err = documents.DecodeOrderDocument(tx.Payload, txHashString, order, sikeSK, nodeID, localIDDoc.BLSPublicKey)
 +
 +	pp, _ := prettyjson.Marshal(order)
 +	fmt.Println(string(pp))
 +
 +	return nil
+ // Endpoints for extending the plugin endpoints
+ func (s *Service) Endpoints() (namespace string, endpoints transport.HTTPEndpoints) {
+ 	return s.Name(), nil
  }
diff --cc pkg/endpoints/endpoints.go
index d972829,b1f7d9d..cdf530b
--- a/pkg/endpoints/endpoints.go
+++ b/pkg/endpoints/endpoints.go
@@@ -45,55 -45,12 +45,13 @@@ var 
  )
  
  // Endpoints returns all the exported endpoints
- func Endpoints(svc service.Service, corsAllow string, authorizer transport.Authorizer, logger *logger.Logger, nodeType string) transport.HTTPEndpoints {
- 	identityEndpoints := transport.HTTPEndpoints{
- 		"CreateIdentity": {
- 			Path:        "/" + apiVersion + "/identity",
- 			Method:      http.MethodPost,
- 			Endpoint:    MakeCreateIdentityEndpoint(svc),
- 			NewRequest:  func() interface{} { return &api.CreateIdentityRequest{} },
- 			NewResponse: func() interface{} { return &api.CreateIdentityResponse{} },
- 			Options: transport.ServerOptions(
- 				transport.SetCors(corsAllow),
- 				transport.AuthorizeOIDC(authorizer, false),
- 			),
- 			ErrStatus: transport.ErrorStatus{
- 				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
- 			},
- 		},
- 		"GetIdentity": {
- 			Path:        "/" + apiVersion + "/identity/{IDDocumentCID}",
- 			Method:      http.MethodGet,
- 			Endpoint:    MakeGetIdentityEndpoint(svc),
- 			NewResponse: func() interface{} { return &api.GetIdentityResponse{} },
- 			Options: transport.ServerOptions(
- 				transport.SetCors(corsAllow),
- 				transport.AuthorizeOIDC(authorizer, false),
- 			),
- 			ErrStatus: transport.ErrorStatus{
- 				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
- 			},
- 		},
- 		"IdentityList": {
- 			Path:        "/" + apiVersion + "/identity",
- 			Method:      http.MethodGet,
- 			Endpoint:    MakeIdentityListEndpoint(svc),
- 			NewResponse: func() interface{} { return &api.IdentityListResponse{} },
- 			Options: transport.ServerOptions(
- 				transport.SetCors(corsAllow),
- 				transport.AuthorizeOIDC(authorizer, false),
- 			),
- 			ErrStatus: transport.ErrorStatus{
- 				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
- 			},
- 		},
- 	}
+ func Endpoints(svc service.Service, corsAllow string, authorizer transport.Authorizer, logger *logger.Logger, nodeType string, pluginEndpoints service.Endpoints) transport.HTTPEndpoints {
  	principalEndpoints := transport.HTTPEndpoints{
 -		"Order": {
 -			Path:        "/" + apiVersion + "/order",
 +
 +		"Order1": {
 +			Path:        "/" + apiVersion + "/order1",
  			Method:      http.MethodPost,
 -			Endpoint:    MakeOrderEndpoint(svc),
 +			Endpoint:    MakeOrder1Endpoint(svc),
  			NewRequest:  func() interface{} { return &api.OrderRequest{} },
  			NewResponse: func() interface{} { return &api.OrderResponse{} },
  			Options: transport.ServerOptions(
diff --cc pkg/service/service.go
index b1b2d72,f0ed3d4..1949ed0
--- a/pkg/service/service.go
+++ b/pkg/service/service.go
@@@ -47,10 -46,9 +45,15 @@@ type Service interface 
  
  	//System
  	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)
  }
+ 
+ // Endpoints interface to register plugin specific endpoints
+ type Endpoints interface {
+ 	Endpoints() (namespace string, endpoints transport.HTTPEndpoints)
+ }