You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@milagro.apache.org by cm...@apache.org on 2019/09/25 13:03:45 UTC

[incubator-milagro-dta] branch splitroles-blockchain created (now 58ad29e)

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

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


      at 58ad29e  Remove Order, add Self to recipients

This branch includes the following new commits:

     new b9f63d3  Split Order to Async, Add websockets
     new 27d062a  Working Order
     new 29fd4b0  Added OrderSecret - beneficiary forced
     new 5113c36  Lint
     new 4dc8aa0  Add OrderBeneficaryType to order protobuffer
     new d0a78e5  Add Tendermint pusher/listener
     new d4f1756  Merge branch 'tendermint' into splitroles-blockchain
     new db3f2b0  Order working & Add Tags
     new af4d0db  Crypto De/Encapsulate Fix
     new 2209bdb  Use dup function to unchanged input params
     new 58ad29e  Remove Order, add Self to recipients

The 11 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] 11/11: Remove Order, add Self to recipients

Posted by cm...@apache.org.
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 58ad29e6b6b895d2b7860e1849739088fd393fea
Author: Christopher Morris <ch...@morris.net>
AuthorDate: Wed Sep 25 14:02:10 2019 +0100

    Remove Order, add Self to recipients
---
 pkg/defaultservice/fulfill.go |  2 +-
 pkg/defaultservice/order.go   | 77 ++-----------------------------------------
 2 files changed, 4 insertions(+), 75 deletions(-)

diff --git a/pkg/defaultservice/fulfill.go b/pkg/defaultservice/fulfill.go
index 28eb3e4..cf19ee3 100644
--- a/pkg/defaultservice/fulfill.go
+++ b/pkg/defaultservice/fulfill.go
@@ -80,7 +80,7 @@ func (s *Service) FulfillOrder(req *api.FulfillOrderRequest) (string, error) {
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXFulfillResponse,
 		SenderID:    nodeID,
-		RecipientID: []string{order.PrincipalCID},
+		RecipientID: []string{order.PrincipalCID, nodeID},
 		Payload:     marshaledRequest,
 	}
 	return tendermint.PostToChain(chainTX, "FulfillOrder")
diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go
index fbd339d..9aa2cff 100644
--- a/pkg/defaultservice/order.go
+++ b/pkg/defaultservice/order.go
@@ -108,77 +108,6 @@ func (s *Service) PrepareOrderResponse(orderPart2 *documents.OrderDoc, reqExtens
 	return orderPart2.OrderPart2.CommitmentPublicKey, nil, nil
 }
 
-// Order -
-func (s *Service) Order(req *api.OrderRequest) (*api.OrderResponse, error) {
-	if err := s.Plugin.ValidateOrderRequest(req); err != nil {
-		return nil, err
-	}
-
-	//Initialise values from Request object
-	beneficiaryIDDocumentCID := req.BeneficiaryIDDocumentCID
-	nodeID := s.NodeID()
-	recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID, s.MasterFiduciaryNodeID())
-	if err != nil {
-		return nil, err
-	}
-
-	remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, s.MasterFiduciaryNodeID())
-	if err != nil {
-		return nil, err
-	}
-
-	//Create Order
-	order, err := common.CreateNewDepositOrder(beneficiaryIDDocumentCID, nodeID)
-	if err != nil {
-		return nil, err
-	}
-
-	fulfillExtension, err := s.Plugin.PrepareOrderPart1(order, req.Extension)
-	if err != nil {
-		return nil, err
-	}
-
-	//Write Order to IPFS
-	orderPart1CID, err := common.WriteOrderToIPFS(nodeID, s.Ipfs, s.Store, nodeID, order, recipientList)
-	if err != nil {
-		return nil, err
-	}
-
-	//Fullfill the order on the remote Server
-	request := &api.FulfillOrderRequest{
-		DocumentCID:   nodeID,
-		OrderPart1CID: orderPart1CID,
-		Extension:     fulfillExtension,
-	}
-
-	response, err := s.MasterFiduciaryServer.FulfillOrder(request)
-	if err != nil {
-		return nil, errors.Wrap(err, "Contacting Fiduciary")
-	}
-
-	//Get the updated order out of IPFS
-	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
-	if err != nil {
-		return nil, err
-	}
-	updatedOrder, err := common.RetrieveOrderFromIPFS(s.Ipfs, response.OrderPart2CID, sikeSK, nodeID, remoteIDDoc.BLSPublicKey)
-	if err != nil {
-		return nil, errors.Wrap(err, "Fail to retrieve Order from IPFS")
-	}
-
-	commitment, extension, err := s.Plugin.PrepareOrderResponse(updatedOrder, req.Extension, response.Extension)
-	if err != nil {
-		return nil, errors.Wrap(err, "Generating Final Public Key")
-	}
-
-	return &api.OrderResponse{
-		OrderReference: order.Reference,
-		Commitment:     commitment,
-		CreatedAt:      time.Now().Unix(),
-		Extension:      extension,
-	}, nil
-}
-
 // ProduceBeneficiaryEncryptedData -
 func (s *Service) ProduceBeneficiaryEncryptedData(blsSK []byte, order *documents.OrderDoc, req *api.OrderSecretRequest) (encrypted []byte, extension map[string]string, err error) {
 	return nil, nil, nil
@@ -332,7 +261,7 @@ func (s *Service) Order1(req *api.OrderRequest) (string, error) {
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXFulfillRequest,
 		SenderID:    nodeID,
-		RecipientID: []string{s.MasterFiduciaryNodeID()},
+		RecipientID: []string{s.MasterFiduciaryNodeID(), nodeID},
 		Payload:     marshaledRequest,
 	}
 	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
@@ -430,7 +359,7 @@ func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXOrderSecretResponse,
 		SenderID:    nodeID,
-		RecipientID: []string{s.MasterFiduciaryNodeID()},
+		RecipientID: []string{s.MasterFiduciaryNodeID(), nodeID},
 		Payload:     marshaledRequest,
 		Tags:        map[string]string{"reference": updatedOrder.Reference},
 	}
@@ -554,7 +483,7 @@ func (s *Service) OrderSecret2(req *api.FulfillOrderSecretResponse) (string, err
 
 	//Write the requests to the chain
 	chainTX := &api.BlockChainTX{
-		Processor:   api.TXOrderSecretResponse,
+		Processor:   api.TXOrderSecretResponse, //NONE
 		SenderID:    nodeID,
 		RecipientID: []string{s.MasterFiduciaryNodeID()},
 		Payload:     marshaledRequest,


[incubator-milagro-dta] 09/11: Crypto De/Encapsulate Fix

Posted by cm...@apache.org.
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 af4d0dbc8b85183e5e2e4bbb0754c375f86dd00a
Author: Christopher Morris <ch...@morris.net>
AuthorDate: Wed Sep 25 12:48:44 2019 +0100

    Crypto De/Encapsulate Fix
---
 cmd/service/__debug_bin         | Bin 51651284 -> 51655380 bytes
 cmd/service/main.go             |   2 +-
 cmd/servicetester/block_test.sh | 249 +++++++++++++++++++++++++++++++++++++++-
 libs/documents/crypto.go        |  22 +++-
 pkg/defaultservice/fulfill.go   |   7 +-
 pkg/defaultservice/order.go     |   8 +-
 pkg/tendermint/json.go          |   5 +
 pkg/tendermint/tendermint.go    |  13 ++-
 pkg/tendermint/websockets.go    |   9 +-
 r1                              |   5 +
 r2                              |   5 +
 r3                              |   5 +
 12 files changed, 310 insertions(+), 20 deletions(-)

diff --git a/cmd/service/__debug_bin b/cmd/service/__debug_bin
index 3a3cf1b..583f2a3 100755
Binary files a/cmd/service/__debug_bin and b/cmd/service/__debug_bin differ
diff --git a/cmd/service/main.go b/cmd/service/main.go
index 920fc46..944d373 100644
--- a/cmd/service/main.go
+++ b/cmd/service/main.go
@@ -146,7 +146,7 @@ func startDaemon(args []string) error {
 		return errors.Wrap(err, "init logger")
 	}
 
-	go tendermint.Subscribe(logger, cfg.Node.NodeID)
+	go tendermint.Subscribe(logger, cfg.Node.NodeID, cfg.HTTP.ListenAddr)
 	if err != nil {
 		return errors.Wrap(err, "init Tendermint Blockchain")
 	}
diff --git a/cmd/servicetester/block_test.sh b/cmd/servicetester/block_test.sh
index 304490a..c6674e8 100755
--- a/cmd/servicetester/block_test.sh
+++ b/cmd/servicetester/block_test.sh
@@ -1 +1,248 @@
-curl -s -X POST "127.0.0.1:5556/v1/order1" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}"
\ No newline at end of file
+#!/bin/bash
+#End to End Test of Services using curl/bash
+
+apiVersion="v1"
+defaultURL="http://localhost:5556"
+apiURL="${1:-$defaultURL}"
+
+
+status () {
+  #Determine if an extension is running
+  statusOutput=$(curl -s -X GET "$apiURL/$apiVersion/status" -H "accept: */*" -H "Content-Type: application/json")
+
+echo "$apiURL/$apiVersion/status"
+
+  identity=$(echo $statusOutput | jq .nodeCID)
+  extensionVendor=$(echo $statusOutput | jq -r .extensionVendor)
+  plugin=$(echo $statusOutput | jq -r .plugin)
+  echo "Plugin $plugin"
+
+  if [ -z "${extensionVendor}" ]; then
+      echo "Server Not Running"
+      exit 1
+  fi
+}
+
+###############################################################################################################################
+
+execute_bitcoin () {
+  # #Run 4 Tests against the Bitcoin Extension
+  echo "Bitcoin Plugin Tests [4 Tests]"
+  output1=$(curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}")
+  #echo $output1
+  op1=$(echo $output1 | jq .orderReference)
+  commitment1=$(echo $output1 | jq .commitment)
+  address1=$(echo $output1 | jq .extension.address)
+  output2=$(curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op1,\"beneficiaryIDDocumentCID\":$identity}")
+  address2=$(echo $output2 | jq .extension.address)
+  commitment2=$(echo $output2 | jq .commitment)
+
+  echo "Committment1 $commitment1 $address1"
+  echo "Committment2 $commitment2 $address2"
+
+  if [ -z $commitment2 ]; then
+      echo "Failed Commitment is empty"
+      exit 1
+  fi
+
+  if [ $commitment1 == $commitment2 ]; then
+    echo "Pass - Id, Order & OrderSecret(Beneficiary)"
+  else
+    echo "Fail"
+    exit 1
+  fi
+
+
+  output3=$(curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":$identity,\"extension\":{\"coin\":\"0\"}}")
+
+  op3=$(echo $output3 | jq .orderReference)
+  commitment3=$(echo $output3 | jq .commitment)
+  address3=$(echo $output3 | jq .extension.address)
+  output4=$(curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op3}")
+  commitment4=$(echo $output4 | jq .commitment)
+  address4=$(echo $output4 | jq .extension.address)
+  orderReference=$(echo $output4 | jq .orderReference)
+  orderIndex=1
+
+  echo "Committment3 $commitment3 $address3"
+  echo "Committment4 $commitment4 $address4"
+
+  if [ -z $commitment4 ]; then
+      echo "Failed Commitment is empty"
+      exit 1
+  fi
+
+  if [ $commitment3 == $commitment4 ]; then
+    echo "Pass - Id, Order(Beneficiary) & OrderSecret"
+  else
+      echo "Fail"
+      exit 1
+  fi
+
+
+   #make another BeneficiaryID
+   output5=$(curl -s -X POST "http://localhost:5556/$apiVersion/identity" -H "accept: */*" -H       "Content-Type: application/json" -d "{\"Name\":\"AA\"}")
+   benid=$(echo $output5 | jq -r .idDocumentCID)
+
+
+
+   #Tests against the Bitcoin Extension - different befificary
+   output6=$(curl -s -X POST "http://localhost:5556/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}")
+   #echo $output6
+   op6=$(echo $output6 | jq .orderReference)
+   commitment6=$(echo $output6 | jq .commitment)
+   address6=$(echo $output6 | jq .extension.address)
+
+   output7=$(curl -s -X POST "http://localhost:5556/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op6,\"beneficiaryIDDocumentCID\":\"$benid\"}")
+   address7=$(echo $output7 | jq .extension.address)
+   commitment7=$(echo $output7 | jq .commitment)
+
+   echo "Committment5 $commitment6 $address6"
+   echo "Committment6 $commitment7 $address7"
+
+   if [ -z $commitment7 ]; then
+       echo "Failed Commitment is empty"
+       exit 1
+   fi
+
+   if [ $commitment6 == $commitment7 ]; then
+     echo "Pass - Id, Order & OrderSecret(Beneficiary)"
+   else
+     echo "Fail"
+     exit 1
+   fi
+
+  output8=$(curl -s -X POST "http://localhost:5556/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"$benid\",\"extension\":{\"coin\":\"0\"}}")
+  op8=$(echo $output8 | jq .orderReference)
+  commitment8=$(echo $output8 | jq .commitment)
+  address8=$(echo $output8 | jq .extension.address)
+
+
+  output9=$(curl -s -X POST "http://localhost:5556/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op8}")
+  commitment9=$(echo $output9 | jq .commitment)
+  address9=$(echo $output9 | jq .extension.address)
+  orderReference=$(echo $output9 | jq .orderReference)
+  orderIndex=1
+
+  echo "Committment7 $commitment8 $address8"
+  echo "Committment8 $commitment9 $address9"
+
+  if [ -z $commitment9 ]; then
+      echo "Failed Commitment is empty"
+      exit 1
+  fi
+
+  if [ $commitment8 == $commitment9 ]; then
+    echo "Pass - Id, Order(Beneficiary) & OrderSecret"
+  else
+      echo "Fail"
+      exit 1
+  fi
+
+}
+
+
+###############################################################################################################################
+
+execute_safeguardsecret () {
+  inputString="This is some random test text 1234567890!"
+  echo "Encrypt a String [1 Test]"
+  echo $output1
+  output1=$(curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":$identity,\"extension\":{\"plainText\":\"$inputString\"}}")
+  echo $output1
+  op1=$(echo $output1 | jq .orderReference)
+  cipherText=$(echo $output1 | jq .extension.cypherText)
+  tvalue=$(echo $output1 | jq .extension.t)
+  vvalue=$(echo $output1 | jq .extension.v)
+  commitment1=$(echo $output1 | jq .commitment)
+  output2=$(curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op1,\"beneficiaryIDDocumentCID\":$identity,\"extension\":{\"cypherText\":$cipherText,\"t\":$tvalue,\"v\":$vvalue}}")
+  result=$(echo $output2 | jq -r .extension.plainText)
+
+  orderReference=$(echo $output2 | jq .orderReference)
+  orderIndex=0
+
+
+  if [ "$inputString" == "$result" ]; then
+    echo "Pass"
+  else
+    echo "Fail"
+    exit 1
+  fi
+}
+
+# #############################################################################
+
+
+execute_milagro () {
+  echo "Milagro Tests [1 Test]"
+  output1=$(curl -s -X POST "$apiURL/$apiVersion/order" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":$identity}")
+  echo $output1
+  op1=$(echo $output1 | jq .orderReference)
+
+
+  commitment1=$(echo $output1 | jq .commitment)
+  output2=$(curl -s -X POST "$apiURL/$apiVersion/order/secret" -H "accept: */*" -H "Content-Type: application/json" -d "{\"orderReference\":$op1,\"beneficiaryIDDocumentCID\":$identity}")
+  commitment2=$(echo $output2 | jq .commitment)
+
+  orderReference=$(echo $output2 | jq .orderReference)
+  orderIndex=0
+
+
+  echo "Committment1 $commitment1"
+  echo "Committment2 $commitment2"
+
+  if [ -z $commitment2 ]; then
+      echo "Failed Commitment is empty"
+      exit 1
+  fi
+
+  if [ $commitment1 == $commitment2 ]; then
+    echo "Order Create/Retrieve Pass"
+  else
+    echo "Order Create/Retrieve Fail"
+    exit 1
+  fi
+}
+
+
+
+
+
+
+# #############################################################################
+
+execute_orderlist () {
+  echo "Milagro Tests [1 Test]"
+  commitment2=$(echo $output2 | jq .commitment)
+  outputList=$(curl -s -X GET "$apiURL/$apiVersion/order?page=0&perPage=2&sortBy=dateCreatedDsc" -H "accept: */*")
+  orderReference=$(echo $outputList | jq -r ".orderReference | .[$orderIndex]")
+  outputOrder=$(curl -s -X GET "$apiURL/$apiVersion/order/$orderReference" -H "accept: */*")
+
+  #A simple smoke test to ensure some sort of order is returned
+  hasSecret=`echo $outputOrder | grep "Secret"`
+
+  if [ -z $hasSecret ]; then
+      echo "Failed Order has error"
+      exit 1
+  else
+     echo "Passed orderList & get"
+  fi
+}
+
+# #############################################################################
+
+status
+
+if [ $plugin == "bitcoinwallet" ]; then
+   execute_bitcoin
+fi
+
+if [ $plugin == "milagro"  ]; then
+   execute_milagro
+fi
+
+if [ $plugin == "safeguardsecret" ]; then
+    execute_safeguardsecret
+fi
+execute_orderlist
+
diff --git a/libs/documents/crypto.go b/libs/documents/crypto.go
index f504ec0..8861e0e 100644
--- a/libs/documents/crypto.go
+++ b/libs/documents/crypto.go
@@ -48,7 +48,17 @@ func decapsulateWithRecipient(recipient Recipient, sikeSK []byte) ([]byte, error
 	encapsulatedKey := recipient.EncapsulatedKey
 	encapIV := recipient.IV
 
-	rc, recreatedAesKey := crypto.DecapsulateDecrypt(cipherText, encapIV, sikeSK, encapsulatedKey)
+	cipherTextTemp := make([]byte, len(cipherText))
+	encapIVTemp := make([]byte, len(encapIV))
+	sikeSKTemp := make([]byte, len(sikeSK))
+	encapsulatedKeyTemp := make([]byte, len(encapsulatedKey))
+
+	copy(cipherTextTemp, cipherText)
+	copy(encapIVTemp, encapIV)
+	copy(sikeSKTemp, sikeSK)
+	copy(encapsulatedKeyTemp, encapsulatedKey)
+
+	rc, recreatedAesKey := crypto.DecapsulateDecrypt(cipherTextTemp, encapIVTemp, sikeSKTemp, encapsulatedKeyTemp)
 
 	if rc != 0 {
 		return nil, errFailedDecapsulation
@@ -67,7 +77,15 @@ func encapsulateKeyForRecipient(recipientsIDDocs map[string]IDDoc, secret []byte
 		r.IV = iv
 		sikePK := idDocument.SikePublicKey
 
-		rc, cipherText, encapsulatedKey := crypto.EncapsulateEncrypt(secret, iv, sikePK)
+		//Make Copies of EncapsulateEncrypt's input params as its destructive
+		secretTemp := make([]byte, len(secret))
+		ivTemp := make([]byte, len(iv))
+		sikePKtemp := make([]byte, len(sikePK))
+		copy(secretTemp, secret)
+		copy(ivTemp, iv)
+		copy(sikePKtemp, sikePK)
+
+		rc, cipherText, encapsulatedKey := crypto.EncapsulateEncrypt(secretTemp, ivTemp, sikePKtemp)
 
 		if rc != 0 {
 			return nil, errFailedToGenerateAESKey
diff --git a/pkg/defaultservice/fulfill.go b/pkg/defaultservice/fulfill.go
index 8b1b87b..28eb3e4 100644
--- a/pkg/defaultservice/fulfill.go
+++ b/pkg/defaultservice/fulfill.go
@@ -47,7 +47,7 @@ func (s *Service) FulfillOrder(req *api.FulfillOrderRequest) (string, error) {
 		return "", err
 	}
 
-	recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID, nodeID)
+	recipientList, err := common.BuildRecipientList(s.Ipfs, order.PrincipalCID, nodeID)
 	if err != nil {
 		return "", err
 	}
@@ -80,10 +80,9 @@ func (s *Service) FulfillOrder(req *api.FulfillOrderRequest) (string, error) {
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXFulfillResponse,
 		SenderID:    nodeID,
-		RecipientID: []string{s.MasterFiduciaryNodeID()},
+		RecipientID: []string{order.PrincipalCID},
 		Payload:     marshaledRequest,
 	}
-	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
 	return tendermint.PostToChain(chainTX, "FulfillOrder")
 
 }
@@ -146,7 +145,5 @@ func (s *Service) FulfillOrderSecret(req *api.FulfillOrderSecretRequest) (string
 		RecipientID: []string{s.MasterFiduciaryNodeID()},
 		Payload:     marshaledRequest,
 	}
-	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
 	return tendermint.PostToChain(chainTX, "FulfillOrderSecret")
-
 }
diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go
index 8ab714d..fbd339d 100644
--- a/pkg/defaultservice/order.go
+++ b/pkg/defaultservice/order.go
@@ -332,7 +332,7 @@ func (s *Service) Order1(req *api.OrderRequest) (string, error) {
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXFulfillRequest,
 		SenderID:    nodeID,
-		RecipientID: []string{s.MasterFiduciaryNodeID(), nodeID},
+		RecipientID: []string{s.MasterFiduciaryNodeID()},
 		Payload:     marshaledRequest,
 	}
 	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
@@ -430,7 +430,7 @@ func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXOrderSecretResponse,
 		SenderID:    nodeID,
-		RecipientID: []string{s.MasterFiduciaryNodeID(), nodeID},
+		RecipientID: []string{s.MasterFiduciaryNodeID()},
 		Payload:     marshaledRequest,
 		Tags:        map[string]string{"reference": updatedOrder.Reference},
 	}
@@ -501,7 +501,7 @@ func (s *Service) OrderSecret1(req *api.OrderSecretRequest) (string, error) {
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXFulfillOrderSecretRequest,
 		SenderID:    nodeID,
-		RecipientID: []string{s.MasterFiduciaryNodeID(), nodeID},
+		RecipientID: []string{s.MasterFiduciaryNodeID()},
 		Payload:     marshaledRequest,
 	}
 	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
@@ -556,7 +556,7 @@ func (s *Service) OrderSecret2(req *api.FulfillOrderSecretResponse) (string, err
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXOrderSecretResponse,
 		SenderID:    nodeID,
-		RecipientID: []string{s.MasterFiduciaryNodeID(), nodeID},
+		RecipientID: []string{s.MasterFiduciaryNodeID()},
 		Payload:     marshaledRequest,
 	}
 	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
diff --git a/pkg/tendermint/json.go b/pkg/tendermint/json.go
index 8270db5..d5e56e7 100644
--- a/pkg/tendermint/json.go
+++ b/pkg/tendermint/json.go
@@ -8,26 +8,31 @@ package tendermint
 
 import "encoding/json"
 
+//UnmarshalChainQuery -
 func UnmarshalChainQuery(data []byte) (ChainQuery, error) {
 	var r ChainQuery
 	err := json.Unmarshal(data, &r)
 	return r, err
 }
 
+//Marshal -
 func (r *ChainQuery) Marshal() ([]byte, error) {
 	return json.Marshal(r)
 }
 
+//ChainQuery -
 type ChainQuery struct {
 	Jsonrpc string `json:"jsonrpc"`
 	ID      string `json:"id"`
 	Result  Result `json:"result"`
 }
 
+//Result -
 type Result struct {
 	Response Response `json:"response"`
 }
 
+//Response -
 type Response struct {
 	Log   string `json:"log"`
 	Key   string `json:"key"`
diff --git a/pkg/tendermint/tendermint.go b/pkg/tendermint/tendermint.go
index 3d34f36..ab162bf 100644
--- a/pkg/tendermint/tendermint.go
+++ b/pkg/tendermint/tendermint.go
@@ -67,7 +67,7 @@ func PostToChain(tx *api.BlockChainTX, method string) (string, error) {
 		return "", err
 	}
 	defer resp.Body.Close()
-	fmt.Printf("POST TO CHAIN: METHOD:%s CALLS:%s  - TXID:%s", method, tx.Processor, TXIDhex)
+	fmt.Printf("POST TO CHAIN: METHOD:%s CALLS:%s  - TXID:%s\n", method, tx.Processor, TXIDhex)
 	return TXIDhex, nil
 }
 
@@ -77,7 +77,8 @@ func HandleChainTX(myID string, tx string) error {
 	if err != nil {
 		return err
 	}
-	err = callNextTX(blockChainTX)
+	panic(nil)
+	err = callNextTX(blockChainTX, "5556")
 	if err != nil {
 		return err
 	}
@@ -111,7 +112,7 @@ func decodeTX(payload string) (*api.BlockChainTX, string, error) {
 	return tx, hash, nil
 }
 
-func callNextTX(tx *api.BlockChainTX) error {
+func callNextTX(tx *api.BlockChainTX, listenPort string) error {
 	// recipient := tx.RecipientID
 	// sender := tx.SenderID
 	//payloadJSON := tx.Payload
@@ -122,7 +123,7 @@ func callNextTX(tx *api.BlockChainTX) error {
 		return nil
 	}
 
-	desintationURL := fmt.Sprintf("http://localhost:5556/%s", tx.Processor)
+	desintationURL := fmt.Sprintf("http://localhost"+listenPort+"/%s", tx.Processor)
 
 	body := strings.NewReader(payloadString)
 	req, err := http.NewRequest("POST", os.ExpandEnv(desintationURL), body)
@@ -147,7 +148,7 @@ func callNextTX(tx *api.BlockChainTX) error {
 	return nil
 }
 
-//Decode the Payload into JSON and displays the entire Blockchain TX unencoded
+//DumpTX - Decode the Payload into JSON and displays the entire Blockchain TX unencoded
 func DumpTX(bctx *api.BlockChainTX) {
 	f := colorjson.NewFormatter()
 	f.Indent = 4
@@ -162,6 +163,7 @@ func DumpTX(bctx *api.BlockChainTX) {
 	fmt.Println(string(s))
 }
 
+//DumpTXID -
 func DumpTXID(txid string) {
 	value, raw := QueryChain(txid)
 	println(value)
@@ -170,6 +172,7 @@ func DumpTXID(txid string) {
 	println()
 }
 
+//ProcessTransactionID -
 func ProcessTransactionID(txid string) {
 	_, payload := QueryChain((txid))
 	err := HandleChainTX("", payload)
diff --git a/pkg/tendermint/websockets.go b/pkg/tendermint/websockets.go
index 145374e..1e21a12 100644
--- a/pkg/tendermint/websockets.go
+++ b/pkg/tendermint/websockets.go
@@ -15,7 +15,7 @@ import (
 )
 
 //Subscribe - Connect to the Tendermint websocket to collect events
-func Subscribe(logger *logger.Logger, nodeID string) error {
+func Subscribe(logger *logger.Logger, nodeID string, listenPort string) error {
 
 	//tmlogger := log2.NewTMLogger(log.NewSyncWriter(os.Stdout))
 
@@ -53,6 +53,11 @@ func Subscribe(logger *logger.Logger, nodeID string) error {
 				break
 			}
 
+			//check if this node is Sender
+			if payload.SenderID == nodeID {
+				break
+			}
+
 			//check is receipient
 			isRecipient := false
 			for _, v := range payload.RecipientID {
@@ -74,7 +79,7 @@ func Subscribe(logger *logger.Logger, nodeID string) error {
 			if payload.Processor == "NONE" {
 				DumpTX(&payload)
 			} else {
-				callNextTX(&payload)
+				callNextTX(&payload, listenPort)
 			}
 
 			//print(blockchainTX)
diff --git a/r1 b/r1
new file mode 100755
index 0000000..44fe3ff
--- /dev/null
+++ b/r1
@@ -0,0 +1,5 @@
+GO111MODULE=on go build -o target/milagro github.com/apache/incubator-milagro-dta/cmd/service
+export MILAGRO_HOME=~/.milagro1
+target/milagro daemon
+
+
diff --git a/r2 b/r2
new file mode 100755
index 0000000..a619211
--- /dev/null
+++ b/r2
@@ -0,0 +1,5 @@
+GO111MODULE=on go build -o target/milagro github.com/apache/incubator-milagro-dta/cmd/service
+export MILAGRO_HOME=~/.milagro2
+target/milagro daemon
+
+
diff --git a/r3 b/r3
new file mode 100755
index 0000000..350d822
--- /dev/null
+++ b/r3
@@ -0,0 +1,5 @@
+GO111MODULE=on go build -o target/milagro github.com/apache/incubator-milagro-dta/cmd/service
+export MILAGRO_HOME=~/.milagro3
+target/milagro daemon
+
+


[incubator-milagro-dta] 02/11: Working Order

Posted by cm...@apache.org.
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 27d062afb7fe6a046fa26f707caffb8eac09e29f
Author: Christopher Morris <ch...@morris.net>
AuthorDate: Fri Sep 6 11:08:14 2019 +0100

    Working Order
---
 cmd/service/__debug_bin           | Bin 0 -> 51482340 bytes
 cmd/service/main.go               |  48 +++------------------
 go.mod                            |   1 +
 go.sum                            |   3 ++
 pkg/defaultservice/order.go       |   2 -
 pkg/tendermint/tendermint.go      |  47 ++++++++++++++++----
 pkg/tendermint/tendermint_test.go |   3 +-
 pkg/tendermint/websockets.go      |  88 ++++++++++++++++++++++++++++++++++++++
 8 files changed, 138 insertions(+), 54 deletions(-)

diff --git a/cmd/service/__debug_bin b/cmd/service/__debug_bin
new file mode 100755
index 0000000..c1d3957
Binary files /dev/null and b/cmd/service/__debug_bin differ
diff --git a/cmd/service/main.go b/cmd/service/main.go
index e177b38..877c6c5 100644
--- a/cmd/service/main.go
+++ b/cmd/service/main.go
@@ -21,7 +21,6 @@ Package main - handles config, initialisation and starts the service daemon
 package main
 
 import (
-	"context"
 	"crypto/rand"
 	"fmt"
 	"net/http"
@@ -38,16 +37,12 @@ import (
 	"github.com/apache/incubator-milagro-dta/pkg/api"
 	"github.com/apache/incubator-milagro-dta/pkg/config"
 	"github.com/apache/incubator-milagro-dta/pkg/endpoints"
+	"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"
 	stdprometheus "github.com/prometheus/client_golang/prometheus"
 	"github.com/prometheus/client_golang/prometheus/promhttp"
-
-	log2 "github.com/tendermint/tendermint/libs/log"
-	tmclient "github.com/tendermint/tendermint/rpc/client"
-	tmtypes "github.com/tendermint/tendermint/types"
-	"github.com/tendermint/tmlibs/log"
 )
 
 func initConfig(args []string) error {
@@ -151,6 +146,11 @@ func startDaemon(args []string) error {
 		return errors.Wrap(err, "init logger")
 	}
 
+	go tendermint.Subscribe(logger)
+	if err != nil {
+		return errors.Wrap(err, "init Tendermint Blockchain")
+	}
+
 	// Create KV store
 	logger.Info("Datastore type: %s", cfg.Node.Datastore)
 	store, err := initDataStore(cfg.Node.Datastore)
@@ -284,7 +284,7 @@ func initDataStore(ds string) (*datastore.Store, error) {
 
 func main() {
 	var err error
-	go listenTendermint()
+
 	cmd, args := parseCommand()
 	switch cmd {
 	default:
@@ -300,37 +300,3 @@ func main() {
 		os.Exit(1)
 	}
 }
-
-func connectTendermintWS() {
-
-	logger := log2.NewTMLogger(log.NewSyncWriter(os.Stdout))
-
-	client := tmclient.NewHTTP("tcp://localhost:26657", "/websocket")
-	client.SetLogger(logger)
-	err := client.Start()
-	if err != nil {
-		logger.Error("Failed to start a client", "err", err)
-		os.Exit(1)
-	}
-	defer client.Stop()
-
-	query := "tm.event = 'Tx'"
-	out, err := client.Subscribe(context.Background(), "test", query, 1000)
-	if err != nil {
-		logger.Error("Failed to subscribe to query", "err", err, "query", query)
-		os.Exit(1)
-	}
-
-	quit := make(chan os.Signal, 1)
-	signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
-
-	for {
-		select {
-		case result := <-out:
-			logger.Info("got tx",
-				"index", result.Data.(tmtypes.EventDataTx).Index)
-		case <-quit:
-			os.Exit(0)
-		}
-	}
-}
diff --git a/go.mod b/go.mod
index b0e50bd..44503b6 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,7 @@
 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/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 dccddba..94d113f 100644
--- a/go.sum
+++ b/go.sum
@@ -13,6 +13,8 @@ github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrU
 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/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
 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=
@@ -72,6 +74,7 @@ github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWe
 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
 github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg=
 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.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go
index 46dfb16..8bb1488 100644
--- a/pkg/defaultservice/order.go
+++ b/pkg/defaultservice/order.go
@@ -433,7 +433,5 @@ func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
 		Payload:     marshaledRequest,
 	}
 	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
-
 	return tendermint.PostToChain(chainTX, "Order2")
-
 }
diff --git a/pkg/tendermint/tendermint.go b/pkg/tendermint/tendermint.go
index 286f1da..5427ba1 100644
--- a/pkg/tendermint/tendermint.go
+++ b/pkg/tendermint/tendermint.go
@@ -6,11 +6,13 @@ import (
 	"encoding/base64"
 	"encoding/hex"
 	"encoding/json"
+	"errors"
 	"fmt"
 	"net/http"
 	"os"
 	"strings"
 
+	"github.com/TylerBrock/colorjson"
 	"github.com/apache/incubator-milagro-dta/pkg/api"
 )
 
@@ -44,7 +46,7 @@ func PostToChain(payload *api.BlockChainTX, method string) (string, error) {
 	TXIDhex := hex.EncodeToString(TXID[:])
 	fullTx := fmt.Sprintf("%s=%s", TXIDhex, string(serializedTX))
 
-	fmt.Printf(" **** %s Block TX: %s\n", method, TXIDhex)
+	//fmt.Printf(" **** %s Block TX: %s\n", method, TXIDhex)
 	base64EncodedTX := base64.StdEncoding.EncodeToString([]byte(fullTx))
 	body := strings.NewReader("{\"jsonrpc\":\"2.0\",\"id\":\"anything\",\"method\":\"broadcast_tx_commit\",\"params\": {\"tx\": \"" + base64EncodedTX + "\"}}")
 	req, err := http.NewRequest("POST", "http://localhost:26657", body)
@@ -69,12 +71,6 @@ func HandleChainTX(myID string, tx string) error {
 	if err != nil {
 		return err
 	}
-
-	if blockChainTX.Processor == "NONE" {
-		print("Process Complete")
-		print(string(blockChainTX.Payload))
-		return nil
-	}
 	err = callNextTX(blockChainTX)
 	if err != nil {
 		return err
@@ -94,12 +90,32 @@ func decodeChainTX(payload string) (*api.BlockChainTX, error) {
 	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(tx *api.BlockChainTX) error {
 	// recipient := tx.RecipientID
 	// sender := tx.SenderID
 	//payloadJSON := tx.Payload
 	payloadString := string(tx.Payload)
 
+	if tx.Processor == "NONE" {
+		//The TX is information and doesn't require any further processing
+		return nil
+	}
+
 	desintationURL := fmt.Sprintf("http://localhost:5556/%s", tx.Processor)
 
 	body := strings.NewReader(payloadString)
@@ -122,11 +138,24 @@ func callNextTX(tx *api.BlockChainTX) error {
 		t += scanner.Text()
 		///fmt.Print(scanner.Text())
 	}
-	print(t)
-
 	return nil
 }
 
+//Decode the Payload into JSON and displays the entire Blockchain TX unencoded
+func DumpTX(bctx *api.BlockChainTX) {
+	f := colorjson.NewFormatter()
+	f.Indent = 4
+	var payloadObj map[string]interface{}
+	payload := bctx.Payload
+	json.Unmarshal([]byte(payload), &payloadObj)
+	jsonstring, _ := json.Marshal(bctx)
+	var obj map[string]interface{}
+	json.Unmarshal([]byte(jsonstring), &obj)
+	obj["Payload"] = payloadObj
+	s, _ := f.Marshal(obj)
+	fmt.Println(string(s))
+}
+
 func DumpTXID(txid string) {
 	value, raw := QueryChain(txid)
 	println(value)
diff --git a/pkg/tendermint/tendermint_test.go b/pkg/tendermint/tendermint_test.go
index 43dec6b..ebe5899 100644
--- a/pkg/tendermint/tendermint_test.go
+++ b/pkg/tendermint/tendermint_test.go
@@ -35,8 +35,7 @@ func Test_DumpTXID(t *testing.T) {
 //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("473407b069ff917b110f38c36d5b9e5246b5ace5d82df38c5a188d5ac868cfec")
-	DumpTXID("586bc14b15a31999571c8188241beef046d3b78a9481ecee984e7c76a1d95112")
+	DumpTXID("8a47801e99b29e48a38c74495573e1eb68fa675b294826ce0580dabcadce3b0e")
 
 }
 
diff --git a/pkg/tendermint/websockets.go b/pkg/tendermint/websockets.go
new file mode 100644
index 0000000..3296c78
--- /dev/null
+++ b/pkg/tendermint/websockets.go
@@ -0,0 +1,88 @@
+package tendermint
+
+import (
+	"context"
+	"os"
+	"os/signal"
+	"syscall"
+
+	"github.com/apache/incubator-milagro-dta/libs/logger"
+	tmclient "github.com/tendermint/tendermint/rpc/client"
+	tmtypes "github.com/tendermint/tendermint/types"
+)
+
+//Subscribe - Connect to the Tendermint websocket to collect events
+func Subscribe(logger *logger.Logger) error {
+
+	//tmlogger := log2.NewTMLogger(log.NewSyncWriter(os.Stdout))
+
+	client := tmclient.NewHTTP("tcp://localhost:26657", "/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()
+
+	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, os.Interrupt, syscall.SIGTERM)
+
+	for {
+		select {
+		case result := <-out:
+
+			tx := result.Data.(tmtypes.EventDataTx).Tx
+
+			blockchainTX, txid, err := decodeTX(string(tx))
+
+			logger.Info("Incoming TX %s", txid)
+
+			if err != nil {
+				logger.Info("Invalid Incoming Transaction %s - %s:", err, string(tx))
+
+			}
+
+			if blockchainTX.Processor == "NONE" {
+				DumpTX(blockchainTX)
+			} else {
+				callNextTX(blockchainTX)
+			}
+
+			//print(blockchainTX)
+			// print(txid)
+
+			// print(string(xx))
+
+			// a := result.Data.(tmtypes.EventDataTx).Index
+			// b := result.Data.(tmtypes.EventDataTx)
+			// c := b.TxResult
+			// tx := c.Tx
+			// txdata := []byte(c.Tx)
+			// print(string(txdata))
+
+			// print(a)
+			// Use(c, b, tx)
+
+			//logger.Info("got tx","index", result.Data.(tmtypes.EventDataTx).Index)
+		case <-quit:
+			os.Exit(0)
+		}
+	}
+}
+
+//Use - helper to remove warnings
+func Use(vals ...interface{}) {
+	for _, val := range vals {
+		_ = val
+	}
+}


[incubator-milagro-dta] 03/11: Added OrderSecret - beneficiary forced

Posted by cm...@apache.org.
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 29fd4b0e7475bbd47cb2eefd56093638fa2148d0
Author: Christopher Morris <ch...@morris.net>
AuthorDate: Fri Sep 6 12:38:48 2019 +0100

    Added OrderSecret - beneficiary forced
---
 cmd/service/__debug_bin           | Bin 51482340 -> 51502716 bytes
 pkg/api/proto.go                  |   5 ++
 pkg/bitcoinplugin/helpers.go      |  56 ++++++++--------
 pkg/bitcoinplugin/service.go      |   4 +-
 pkg/defaultservice/fulfill.go     |  33 ++++++---
 pkg/defaultservice/order.go       | 138 ++++++++++++++++++++++++++++++++++++--
 pkg/defaultservice/plugable.go    |   2 +-
 pkg/endpoints/endpoints.go        |  60 ++++++++++++++++-
 pkg/safeguardsecret/service.go    |   7 +-
 pkg/service/service.go            |   7 +-
 pkg/tendermint/tendermint_test.go |   2 +-
 11 files changed, 259 insertions(+), 55 deletions(-)

diff --git a/cmd/service/__debug_bin b/cmd/service/__debug_bin
index c1d3957..6c8eaf9 100755
Binary files a/cmd/service/__debug_bin and b/cmd/service/__debug_bin differ
diff --git a/pkg/api/proto.go b/pkg/api/proto.go
index 6232d21..7fabe27 100644
--- a/pkg/api/proto.go
+++ b/pkg/api/proto.go
@@ -33,6 +33,11 @@ const (
 	TXFulfillRequest  = "v1/fulfill/order"
 	TXFulfillResponse = "v1/order2"
 	TXOrderResponse   = "NONE"
+
+	TXOrderSecretRequest         = "v1/order/secret1"
+	TXFulfillOrderSecretRequest  = "v1/fulfill/order/secret"
+	TXFulfillOrderSecretResponse = "v1/order/secret2"
+	TXOrderSecretResponse        = "NONE"
 )
 
 //BlockChainTX - struct for on chain req/resp
diff --git a/pkg/bitcoinplugin/helpers.go b/pkg/bitcoinplugin/helpers.go
index eb65167..ec639e7 100644
--- a/pkg/bitcoinplugin/helpers.go
+++ b/pkg/bitcoinplugin/helpers.go
@@ -31,43 +31,43 @@ import (
 )
 
 func deriveFinalPrivateKey(s *Service, order documents.OrderDoc, beneficiariesSikeSK []byte, beneficiariesSeed []byte, beneficiaryIDDocumentCID string, nodeID string, signingBlsPK []byte) (string, error) {
-	if beneficiaryIDDocumentCID != "" {
-		//we are using the beneficiary specified in order Part 3
-		beneficiaryBlob := order.OrderPart3.BeneficiaryEncryptedData
-
-		//Decrypt the Envelope intented for the Beneficiary
-		privateKeyPart1of1, err := adhocEncryptedEnvelopeDecode(s, beneficiariesSikeSK, beneficiaryBlob, beneficiaryIDDocumentCID, signingBlsPK)
-		if err != nil {
-			return "", err
-		}
-		//Calculate the final private key by Eliptical Key addition of both parts
-		privateKeyPart2of2 := order.OrderDocument.OrderPart4.Secret
-
-		finalPrivateKey, err := addPrivateKeys(privateKeyPart1of1, privateKeyPart2of2)
-
-		if err != nil {
-			return "", err
-		}
-		return finalPrivateKey, err
-	}
+	//if beneficiaryIDDocumentCID != "" {
+	//we are using the beneficiary specified in order Part 3
+	beneficiaryBlob := order.OrderPart3.BeneficiaryEncryptedData
 
-	//we are using the beneficiary specified in the order part 1
-	privateKeyPart2of2 := order.OrderDocument.OrderPart4.Secret
-	// if order.OrderDocument.BeneficiaryCID != nodeID {
-	// 	//need to forward this data to the beneficiary to complete redemption
-	// 	return "", errors.New("Currently beneficiary must be the same as the Principal")
-	// }
-	//restore the Seed
-	_, _, ecAddPrivateKey, err := cryptowallet.Bip44Address(beneficiariesSeed, cryptowallet.CoinTypeBitcoinMain, 0, 0, 0)
+	//Decrypt the Envelope intented for the Beneficiary
+	privateKeyPart1of1, err := adhocEncryptedEnvelopeDecode(s, beneficiariesSikeSK, beneficiaryBlob, beneficiaryIDDocumentCID, signingBlsPK)
 	if err != nil {
 		return "", err
 	}
-	privateKeyPart1of1 := hex.EncodeToString(ecAddPrivateKey.Serialize())
+	//Calculate the final private key by Eliptical Key addition of both parts
+	privateKeyPart2of2 := order.OrderDocument.OrderPart4.Secret
+
 	finalPrivateKey, err := addPrivateKeys(privateKeyPart1of1, privateKeyPart2of2)
+
 	if err != nil {
 		return "", err
 	}
 	return finalPrivateKey, err
+	//}
+
+	// //we are using the beneficiary specified in the order part 1
+	// privateKeyPart2of2 := order.OrderDocument.OrderPart4.Secret
+	// // if order.OrderDocument.BeneficiaryCID != nodeID {
+	// // 	//need to forward this data to the beneficiary to complete redemption
+	// // 	return "", errors.New("Currently beneficiary must be the same as the Principal")
+	// // }
+	// //restore the Seed
+	// _, _, ecAddPrivateKey, err := cryptowallet.Bip44Address(beneficiariesSeed, cryptowallet.CoinTypeBitcoinMain, 0, 0, 0)
+	// if err != nil {
+	// 	return "", err
+	// }
+	// privateKeyPart1of1 := hex.EncodeToString(ecAddPrivateKey.Serialize())
+	// finalPrivateKey, err := addPrivateKeys(privateKeyPart1of1, privateKeyPart2of2)
+	// if err != nil {
+	// 	return "", err
+	// }
+	// return finalPrivateKey, err
 
 }
 
diff --git a/pkg/bitcoinplugin/service.go b/pkg/bitcoinplugin/service.go
index f087855..fdf3d4b 100644
--- a/pkg/bitcoinplugin/service.go
+++ b/pkg/bitcoinplugin/service.go
@@ -114,14 +114,14 @@ func (s *Service) ProduceBeneficiaryEncryptedData(blsSK []byte, order *documents
 }
 
 // ProduceFinalSecret -
-func (s *Service) ProduceFinalSecret(seed, sikeSK []byte, order, orderPart4 *documents.OrderDoc, req *api.OrderSecretRequest, fulfillSecretRespomse *api.FulfillOrderSecretResponse) (secret, commitment string, extension map[string]string, err error) {
+func (s *Service) ProduceFinalSecret(seed, sikeSK []byte, order, orderPart4 *documents.OrderDoc, beneficiaryIDDocumentCID string) (secret, commitment string, extension map[string]string, err error) {
 	//retrieve principal IDDoc
 	principalDocID, err := common.RetrieveIDDocFromIPFS(s.Ipfs, order.PrincipalCID)
 	if err != nil {
 		return "", "", nil, err
 	}
 
-	finalPrivateKey, err := deriveFinalPrivateKey(s, *orderPart4, sikeSK, seed, req.BeneficiaryIDDocumentCID, s.NodeID(), principalDocID.BLSPublicKey)
+	finalPrivateKey, err := deriveFinalPrivateKey(s, *orderPart4, sikeSK, seed, beneficiaryIDDocumentCID, s.NodeID(), principalDocID.BLSPublicKey)
 	if err != nil {
 		return "", "", nil, err
 	}
diff --git a/pkg/defaultservice/fulfill.go b/pkg/defaultservice/fulfill.go
index e3b54d6..26be911 100644
--- a/pkg/defaultservice/fulfill.go
+++ b/pkg/defaultservice/fulfill.go
@@ -89,51 +89,64 @@ func (s *Service) FulfillOrder(req *api.FulfillOrderRequest) (string, error) {
 }
 
 // FulfillOrderSecret -
-func (s *Service) FulfillOrderSecret(req *api.FulfillOrderSecretRequest) (*api.FulfillOrderSecretResponse, error) {
+func (s *Service) FulfillOrderSecret(req *api.FulfillOrderSecretRequest) (string, error) {
 	//Initialise values from Request object
 	orderPart3CID := req.OrderPart3CID
 	nodeID := s.NodeID()
 	remoteIDDocCID := req.SenderDocumentCID
 	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
 	remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, remoteIDDocCID)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
 	//Retrieve the order from IPFS
 	order, err := common.RetrieveOrderFromIPFS(s.Ipfs, orderPart3CID, sikeSK, nodeID, remoteIDDoc.BLSPublicKey)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
 	recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID, nodeID)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
 	//Retrieve the Seed
 	seed, err := common.RetrieveSeed(s.Store, order.Reference)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
 	//Generate the Secert from the Seed
 	commitmentPrivateKey, err := cryptowallet.RedeemSecret(seed)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
 	//Create an order response in IPFS
 	orderPart4ID, err := common.CreateAndStoreOrderPart4(s.Ipfs, s.Store, order, commitmentPrivateKey, orderPart3CID, nodeID, recipientList)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
-	return &api.FulfillOrderSecretResponse{
+	response := &api.FulfillOrderSecretResponse{
 		OrderPart4CID: orderPart4ID,
-	}, nil
+	}
+
+	marshaledRequest, _ := json.Marshal(response)
+
+	//Write the requests to the chain
+	chainTX := &api.BlockChainTX{
+		Processor:   api.TXFulfillOrderSecretResponse,
+		SenderID:    nodeID,
+		RecipientID: s.MasterFiduciaryNodeID(),
+		Payload:     marshaledRequest,
+	}
+	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
+	return tendermint.PostToChain(chainTX, "FulfillOrderSecret")
+
 }
diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go
index 8bb1488..b16b64b 100644
--- a/pkg/defaultservice/order.go
+++ b/pkg/defaultservice/order.go
@@ -185,7 +185,7 @@ func (s *Service) ProduceBeneficiaryEncryptedData(blsSK []byte, order *documents
 }
 
 // ProduceFinalSecret -
-func (s *Service) ProduceFinalSecret(seed, sikeSK []byte, order, orderPart4 *documents.OrderDoc, req *api.OrderSecretRequest, fulfillSecretRespomse *api.FulfillOrderSecretResponse) (secret, commitment string, extension map[string]string, err error) {
+func (s *Service) ProduceFinalSecret(seed, sikeSK []byte, order, orderPart4 *documents.OrderDoc, beneficiaryIDDocumentCID string) (secret, commitment string, extension map[string]string, err error) {
 	finalPrivateKey := orderPart4.OrderDocument.OrderPart4.Secret
 	//Derive the Public key from the supplied Private Key
 	finalPublicKey, _, err := cryptowallet.PublicKeyFromPrivate(finalPrivateKey)
@@ -269,7 +269,7 @@ func (s *Service) OrderSecret(req *api.OrderSecretRequest) (*api.OrderSecretResp
 		return nil, err
 	}
 
-	finalPrivateKey, finalPublicKey, ext, err := s.Plugin.ProduceFinalSecret(beneficiariesSeed, beneficiariesSikeSK, order, orderPart4, req, response)
+	finalPrivateKey, finalPublicKey, ext, err := s.Plugin.ProduceFinalSecret(beneficiariesSeed, beneficiariesSikeSK, order, orderPart4, beneficiaryCID)
 	if err != nil {
 		return nil, err
 	}
@@ -336,8 +336,8 @@ func (s *Service) Order1(req *api.OrderRequest) (string, error) {
 	}
 	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
 
-	return tendermint.PostToChain(chainTX, "Order1")
-
+	tendermint.PostToChain(chainTX, "Order1")
+	return order.Reference, nil
 }
 
 // Order -
@@ -427,11 +427,139 @@ func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
 
 	//Write the requests to the chain
 	chainTX := &api.BlockChainTX{
-		Processor:   api.TXOrderResponse,
+		Processor:   api.TXOrderSecretResponse,
 		SenderID:    iDDocID,
 		RecipientID: s.MasterFiduciaryNodeID(),
 		Payload:     marshaledRequest,
 	}
 	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
 	return tendermint.PostToChain(chainTX, "Order2")
+
+}
+
+// OrderSecret -
+func (s *Service) OrderSecret1(req *api.OrderSecretRequest) (string, error) {
+	orderReference := req.OrderReference
+	var orderPart2CID string
+	if err := s.Store.Get("order", orderReference, &orderPart2CID); err != nil {
+		return "", err
+	}
+
+	nodeID := s.NodeID()
+	recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID, s.MasterFiduciaryNodeID())
+	if err != nil {
+		return "", err
+	}
+	remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, s.MasterFiduciaryNodeID())
+	if err != nil {
+		return "", err
+	}
+
+	_, _, blsSK, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
+	if err != nil {
+		return "", err
+	}
+
+	//Retrieve the order from IPFS
+	order, err := common.RetrieveOrderFromIPFS(s.Ipfs, orderPart2CID, sikeSK, nodeID, remoteIDDoc.BLSPublicKey)
+	if err != nil {
+		return "", errors.Wrap(err, "Fail to retrieve Order from IPFS")
+	}
+
+	if err := s.Plugin.ValidateOrderSecretRequest(req, *order); err != nil {
+		return "", err
+	}
+
+	//Create a piece of data that is destined for the beneficiary, passed via the Master Fiduciary
+
+	beneficiaryEncryptedData, extension, err := s.Plugin.ProduceBeneficiaryEncryptedData(blsSK, order, req)
+	if err != nil {
+		return "", err
+	}
+
+	if req.BeneficiaryIDDocumentCID != "" {
+		order.BeneficiaryCID = req.BeneficiaryIDDocumentCID
+	}
+
+	//Create a request Object in IPFS
+	orderPart3CID, err := common.CreateAndStorePart3(s.Ipfs, s.Store, order, orderPart2CID, nodeID, beneficiaryEncryptedData, recipientList)
+	if err != nil {
+		return "", err
+	}
+
+	//Post the address of the updated doc to the custody node
+	request := &api.FulfillOrderSecretRequest{
+		SenderDocumentCID: nodeID,
+		OrderPart3CID:     orderPart3CID,
+		Extension:         extension,
+	}
+
+	marshaledRequest, _ := json.Marshal(request)
+
+	//Write the requests to the chain
+	chainTX := &api.BlockChainTX{
+		Processor:   api.TXFulfillOrderSecretRequest,
+		SenderID:    nodeID,
+		RecipientID: s.MasterFiduciaryNodeID(),
+		Payload:     marshaledRequest,
+	}
+	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
+
+	return tendermint.PostToChain(chainTX, "OrderSecret1")
+}
+
+// OrderSecret -
+func (s *Service) OrderSecret2(req *api.FulfillOrderSecretResponse) (string, error) {
+	nodeID := s.NodeID()
+	_, _, _, 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
+	orderPart4, err := common.RetrieveOrderFromIPFS(s.Ipfs, req.OrderPart4CID, sikeSK, nodeID, remoteIDDoc.BLSPublicKey)
+	if err != nil {
+		return "", err
+	}
+
+	var beneficiariesSikeSK []byte
+	var beneficiaryCID string
+
+	beneficiaryCID = orderPart4.BeneficiaryCID
+
+	_, beneficiariesSeed, _, beneficiariesSikeSK, err := common.RetrieveIdentitySecrets(s.Store, beneficiaryCID)
+	if err != nil {
+		return "", err
+	}
+
+	finalPrivateKey, finalPublicKey, ext, err := s.Plugin.ProduceFinalSecret(beneficiariesSeed, beneficiariesSikeSK, orderPart4, orderPart4, beneficiaryCID)
+	if err != nil {
+		return "", err
+	}
+
+	request := &api.OrderSecretResponse{
+		Secret:         finalPrivateKey,
+		Commitment:     finalPublicKey,
+		OrderReference: orderPart4.Reference,
+		Extension:      ext,
+	}
+
+	marshaledRequest, _ := json.Marshal(request)
+
+	//Write the requests to the chain
+	chainTX := &api.BlockChainTX{
+		Processor:   api.TXOrderSecretResponse,
+		SenderID:    nodeID,
+		RecipientID: s.MasterFiduciaryNodeID(),
+		Payload:     marshaledRequest,
+	}
+	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
+
+	return tendermint.PostToChain(chainTX, "OrderSecret2")
+
 }
diff --git a/pkg/defaultservice/plugable.go b/pkg/defaultservice/plugable.go
index 65014f1..9d49163 100644
--- a/pkg/defaultservice/plugable.go
+++ b/pkg/defaultservice/plugable.go
@@ -34,5 +34,5 @@ type Plugable interface {
 	PrepareOrderPart1(order *documents.OrderDoc, reqExtension map[string]string) (fulfillExtension map[string]string, err error)
 	PrepareOrderResponse(orderPart2 *documents.OrderDoc, reqExtension, fulfillExtension map[string]string) (commitment string, extension map[string]string, err error)
 	ProduceBeneficiaryEncryptedData(blsSK []byte, order *documents.OrderDoc, req *api.OrderSecretRequest) (encrypted []byte, extension map[string]string, err error)
-	ProduceFinalSecret(seed, sikeSK []byte, order, orderPart4 *documents.OrderDoc, req *api.OrderSecretRequest, fulfillSecretRespomse *api.FulfillOrderSecretResponse) (secret, commitment string, extension map[string]string, err error)
+	ProduceFinalSecret(seed, sikeSK []byte, order, orderPart4 *documents.OrderDoc, beneficiaryCID string) (secret, commitment string, extension map[string]string, err error)
 }
diff --git a/pkg/endpoints/endpoints.go b/pkg/endpoints/endpoints.go
index f42e01c..beed67b 100644
--- a/pkg/endpoints/endpoints.go
+++ b/pkg/endpoints/endpoints.go
@@ -176,6 +176,34 @@ func Endpoints(svc service.Service, corsAllow string, authorizer transport.Autho
 				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
 			},
 		},
+		"OrderSecret1": {
+			Path:        "/" + apiVersion + "/order/secret1",
+			Method:      http.MethodPost,
+			Endpoint:    MakeOrderSecret1Endpoint(svc),
+			NewRequest:  func() interface{} { return &api.OrderSecretRequest{} },
+			NewResponse: func() interface{} { return &api.OrderSecretResponse{} },
+			Options: transport.ServerOptions(
+				transport.SetCors(corsAllow),
+				transport.AuthorizeOIDC(authorizer, false),
+			),
+			ErrStatus: transport.ErrorStatus{
+				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
+			},
+		},
+		"OrderSecret2": {
+			Path:        "/" + apiVersion + "/order/secret2",
+			Method:      http.MethodPost,
+			Endpoint:    MakeOrderSecret2Endpoint(svc),
+			NewRequest:  func() interface{} { return &api.FulfillOrderSecretResponse{} },
+			NewResponse: func() interface{} { return &api.OrderSecretResponse{} },
+			Options: transport.ServerOptions(
+				transport.SetCors(corsAllow),
+				transport.AuthorizeOIDC(authorizer, false),
+			),
+			ErrStatus: transport.ErrorStatus{
+				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
+			},
+		},
 	}
 	masterFiduciaryEndpoints := transport.HTTPEndpoints{
 		"FulfillOrder": {
@@ -338,7 +366,7 @@ func MakeOrderEndpoint(m service.Service) endpoint.Endpoint {
 	}
 }
 
-//MakeOrderEndpoint -
+//MakeOrder1Endpoint -
 func MakeOrder1Endpoint(m service.Service) endpoint.Endpoint {
 	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
 		req, ok := request.(*api.OrderRequest)
@@ -352,7 +380,7 @@ func MakeOrder1Endpoint(m service.Service) endpoint.Endpoint {
 	}
 }
 
-//MakeOrderEndpoint -
+//MakeOrder2Endpoint -
 func MakeOrder2Endpoint(m service.Service) endpoint.Endpoint {
 	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
 		req, ok := request.(*api.FulfillOrderResponse)
@@ -380,6 +408,34 @@ func MakeOrderSecretEndpoint(m service.Service) endpoint.Endpoint {
 	}
 }
 
+//MakeOrderSecret1Endpoint -
+func MakeOrderSecret1Endpoint(m service.Service) endpoint.Endpoint {
+	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
+		req, ok := request.(*api.OrderSecretRequest)
+		if !ok {
+			return nil, transport.ErrInvalidRequest
+		}
+		if err := validateRequest(req); err != nil {
+			return "", err
+		}
+		return m.OrderSecret1(req)
+	}
+}
+
+//MakeOrderSecret2Endpoint -
+func MakeOrderSecret2Endpoint(m service.Service) endpoint.Endpoint {
+	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
+		req, ok := request.(*api.FulfillOrderSecretResponse)
+		if !ok {
+			return nil, transport.ErrInvalidRequest
+		}
+		if err := validateRequest(req); err != nil {
+			return "", err
+		}
+		return m.OrderSecret2(req)
+	}
+}
+
 //MakeFulfillOrderEndpoint -
 func MakeFulfillOrderEndpoint(m service.Service) endpoint.Endpoint {
 	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
diff --git a/pkg/safeguardsecret/service.go b/pkg/safeguardsecret/service.go
index 12564a9..f8c7a84 100644
--- a/pkg/safeguardsecret/service.go
+++ b/pkg/safeguardsecret/service.go
@@ -24,7 +24,6 @@ import (
 	"github.com/apache/incubator-milagro-dta/libs/crypto"
 	"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/defaultservice"
 )
 
@@ -63,7 +62,7 @@ func (s *Service) PrepareOrderResponse(orderPart2 *documents.OrderDoc, reqExtens
 }
 
 // ProduceFinalSecret -
-func (s *Service) ProduceFinalSecret(seed, sikeSK []byte, order, orderPart4 *documents.OrderDoc, req *api.OrderSecretRequest, fulfillSecretRespomse *api.FulfillOrderSecretResponse) (secret, commitment string, extension map[string]string, err error) {
+func (s *Service) ProduceFinalSecret(seed, sikeSK []byte, order, orderPart4 *documents.OrderDoc, beneficiaryCID string) (secret, commitment string, extension map[string]string, err error) {
 	finalPrivateKey := orderPart4.OrderDocument.OrderPart4.Secret
 	//Derive the Public key from the supplied Private Key
 	finalPublicKey, _, err := cryptowallet.PublicKeyFromPrivate(finalPrivateKey)
@@ -71,7 +70,9 @@ func (s *Service) ProduceFinalSecret(seed, sikeSK []byte, order, orderPart4 *doc
 		return "", "", nil, err
 	}
 
-	plainText, err := crypto.Secp256k1Decrypt(req.Extension["cypherText"], req.Extension["v"], req.Extension["t"], finalPrivateKey)
+	//HACKED TO MAKE WORKD NEED TO PASS EXTENDION CSM TODO
+	plainText, err := crypto.Secp256k1Decrypt("1", "1", "1", finalPrivateKey)
+	//plainText, err := crypto.Secp256k1Decrypt(req.Extension["cypherText"], req.Extension["v"], req.Extension["t"], finalPrivateKey)
 	if err != nil {
 		return "", "", nil, err
 	}
diff --git a/pkg/service/service.go b/pkg/service/service.go
index d53e5f2..2492dd7 100644
--- a/pkg/service/service.go
+++ b/pkg/service/service.go
@@ -35,15 +35,16 @@ type Service interface {
 
 	//Order processing
 	OrderSecret(req *api.OrderSecretRequest) (*api.OrderSecretResponse, error)
-	Order(req *api.OrderRequest) (*api.OrderResponse, error)
+	OrderSecret1(req *api.OrderSecretRequest) (string, error)
+	OrderSecret2(req *api.FulfillOrderSecretResponse) (string, error)
 
+	Order(req *api.OrderRequest) (*api.OrderResponse, error)
 	Order1(req *api.OrderRequest) (string, error)
 	Order2(req *api.FulfillOrderResponse) (string, error)
 
 	//Fullfill processing
 	FulfillOrder(req *api.FulfillOrderRequest) (string, error)
-
-	FulfillOrderSecret(req *api.FulfillOrderSecretRequest) (*api.FulfillOrderSecretResponse, error)
+	FulfillOrderSecret(req *api.FulfillOrderSecretRequest) (string, error)
 
 	NodeID() string
 	MasterFiduciaryNodeID() string
diff --git a/pkg/tendermint/tendermint_test.go b/pkg/tendermint/tendermint_test.go
index ebe5899..495f74f 100644
--- a/pkg/tendermint/tendermint_test.go
+++ b/pkg/tendermint/tendermint_test.go
@@ -35,7 +35,7 @@ func Test_DumpTXID(t *testing.T) {
 //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("8a47801e99b29e48a38c74495573e1eb68fa675b294826ce0580dabcadce3b0e")
+	DumpTXID("dea1396bce7890f85da7dc86b4ece5c4d372886ed08948eca6a0beee36c412e0")
 
 }
 


[incubator-milagro-dta] 07/11: Merge branch 'tendermint' into splitroles-blockchain

Posted by cm...@apache.org.
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 d4f1756b55461592bb74b0ab0ce8428caa984d06
Merge: d0a78e5 5113c36
Author: Christopher Morris <ch...@morris.net>
AuthorDate: Mon Sep 23 12:01:41 2019 +0100

    Merge branch 'tendermint' into splitroles-blockchain
    
    # Conflicts:
    #	cmd/service/__debug_bin
    #	go.mod
    #	go.sum
    #	pkg/bitcoinplugin/helpers.go
    #	pkg/tendermint/tendermint.go
    #	pkg/tendermint/websockets.go

 cmd/service/main.go            |   1 +
 pkg/bitcoinplugin/service.go   |   4 +-
 pkg/defaultservice/fulfill.go  |  69 +++++++---
 pkg/defaultservice/order.go    | 288 ++++++++++++++++++++++++++++++++++++++++-
 pkg/defaultservice/plugable.go |   2 +-
 pkg/endpoints/endpoints.go     | 113 ++++++++++++++++
 pkg/safeguardsecret/service.go |   7 +-
 pkg/service/service.go         |   9 +-
 8 files changed, 463 insertions(+), 30 deletions(-)



[incubator-milagro-dta] 10/11: Use dup function to unchanged input params

Posted by cm...@apache.org.
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 2209bdbae7383dfdf8365c4fea8b8f07f172a9d9
Author: Christopher Morris <ch...@morris.net>
AuthorDate: Wed Sep 25 13:08:54 2019 +0100

    Use dup function to unchanged input params
---
 .gitignore               |   1 +
 cmd/service/__debug_bin  | Bin 51655380 -> 0 bytes
 libs/documents/crypto.go |  30 ++++++++++--------------------
 3 files changed, 11 insertions(+), 20 deletions(-)

diff --git a/.gitignore b/.gitignore
index b2ed953..9d69337 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
 target/
 vendor/
 libs/crypto/libpqnist/build/
+/cmd/service/__debug_bin
diff --git a/cmd/service/__debug_bin b/cmd/service/__debug_bin
deleted file mode 100755
index 583f2a3..0000000
Binary files a/cmd/service/__debug_bin and /dev/null differ
diff --git a/libs/documents/crypto.go b/libs/documents/crypto.go
index 8861e0e..9038963 100644
--- a/libs/documents/crypto.go
+++ b/libs/documents/crypto.go
@@ -43,22 +43,19 @@ func decapsulate(recipientCID string, recipients []*Recipient, sikeSK []byte) ([
 	return nil, errRecipientNotFound
 }
 
+func dup(orig []byte) []byte {
+	dupSlice := make([]byte, len(orig))
+	copy(dupSlice, orig)
+	return dupSlice
+}
+
 func decapsulateWithRecipient(recipient Recipient, sikeSK []byte) ([]byte, error) {
 	cipherText := recipient.CipherText
 	encapsulatedKey := recipient.EncapsulatedKey
 	encapIV := recipient.IV
 
-	cipherTextTemp := make([]byte, len(cipherText))
-	encapIVTemp := make([]byte, len(encapIV))
-	sikeSKTemp := make([]byte, len(sikeSK))
-	encapsulatedKeyTemp := make([]byte, len(encapsulatedKey))
-
-	copy(cipherTextTemp, cipherText)
-	copy(encapIVTemp, encapIV)
-	copy(sikeSKTemp, sikeSK)
-	copy(encapsulatedKeyTemp, encapsulatedKey)
-
-	rc, recreatedAesKey := crypto.DecapsulateDecrypt(cipherTextTemp, encapIVTemp, sikeSKTemp, encapsulatedKeyTemp)
+	//Use duplicates of params, as DecapsulateDecrypt is destructive to inputs
+	rc, recreatedAesKey := crypto.DecapsulateDecrypt(dup(cipherText), dup(encapIV), dup(sikeSK), dup(encapsulatedKey))
 
 	if rc != 0 {
 		return nil, errFailedDecapsulation
@@ -77,15 +74,8 @@ func encapsulateKeyForRecipient(recipientsIDDocs map[string]IDDoc, secret []byte
 		r.IV = iv
 		sikePK := idDocument.SikePublicKey
 
-		//Make Copies of EncapsulateEncrypt's input params as its destructive
-		secretTemp := make([]byte, len(secret))
-		ivTemp := make([]byte, len(iv))
-		sikePKtemp := make([]byte, len(sikePK))
-		copy(secretTemp, secret)
-		copy(ivTemp, iv)
-		copy(sikePKtemp, sikePK)
-
-		rc, cipherText, encapsulatedKey := crypto.EncapsulateEncrypt(secretTemp, ivTemp, sikePKtemp)
+		//Use duplicates of params, as EncapsulateEncrypt is destructive to inputs
+		rc, cipherText, encapsulatedKey := crypto.EncapsulateEncrypt(dup(secret), dup(iv), dup(sikePK))
 
 		if rc != 0 {
 			return nil, errFailedToGenerateAESKey


[incubator-milagro-dta] 01/11: Split Order to Async, Add websockets

Posted by cm...@apache.org.
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 b9f63d36990400fbb4d40b1d3c413af3d1f71d08
Author: Christopher Morris <ch...@morris.net>
AuthorDate: Thu Sep 5 20:37:16 2019 +0100

    Split Order to Async, Add websockets
---
 cmd/service/main.go               |  41 ++++++++++
 go.mod                            |   7 +-
 go.sum                            |  40 ++++++++++
 pkg/api/proto.go                  |  16 ++++
 pkg/defaultservice/fulfill.go     |  36 ++++++---
 pkg/defaultservice/order.go       | 158 ++++++++++++++++++++++++++++++++++++++
 pkg/endpoints/endpoints.go        |  57 ++++++++++++++
 pkg/service/service.go            |   6 +-
 pkg/tendermint/json.go            |  35 +++++++++
 pkg/tendermint/tendermint.go      | 144 ++++++++++++++++++++++++++++++++++
 pkg/tendermint/tendermint_test.go |  61 +++++++++++++++
 11 files changed, 587 insertions(+), 14 deletions(-)

diff --git a/cmd/service/main.go b/cmd/service/main.go
index 4a289f5..e177b38 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"
@@ -42,6 +43,11 @@ import (
 	"github.com/pkg/errors"
 	stdprometheus "github.com/prometheus/client_golang/prometheus"
 	"github.com/prometheus/client_golang/prometheus/promhttp"
+
+	log2 "github.com/tendermint/tendermint/libs/log"
+	tmclient "github.com/tendermint/tendermint/rpc/client"
+	tmtypes "github.com/tendermint/tendermint/types"
+	"github.com/tendermint/tmlibs/log"
 )
 
 func initConfig(args []string) error {
@@ -278,6 +284,7 @@ func initDataStore(ds string) (*datastore.Store, error) {
 
 func main() {
 	var err error
+	go listenTendermint()
 	cmd, args := parseCommand()
 	switch cmd {
 	default:
@@ -293,3 +300,37 @@ func main() {
 		os.Exit(1)
 	}
 }
+
+func connectTendermintWS() {
+
+	logger := log2.NewTMLogger(log.NewSyncWriter(os.Stdout))
+
+	client := tmclient.NewHTTP("tcp://localhost:26657", "/websocket")
+	client.SetLogger(logger)
+	err := client.Start()
+	if err != nil {
+		logger.Error("Failed to start a client", "err", err)
+		os.Exit(1)
+	}
+	defer client.Stop()
+
+	query := "tm.event = 'Tx'"
+	out, err := client.Subscribe(context.Background(), "test", query, 1000)
+	if err != nil {
+		logger.Error("Failed to subscribe to query", "err", err, "query", query)
+		os.Exit(1)
+	}
+
+	quit := make(chan os.Signal, 1)
+	signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
+
+	for {
+		select {
+		case result := <-out:
+			logger.Info("got tx",
+				"index", result.Data.(tmtypes.EventDataTx).Index)
+		case <-quit:
+			os.Exit(0)
+		}
+	}
+}
diff --git a/go.mod b/go.mod
index c7b5ff0..b0e50bd 100644
--- a/go.mod
+++ b/go.mod
@@ -1,7 +1,6 @@
 module github.com/apache/incubator-milagro-dta
 
 require (
-	github.com/VividCortex/gohistogram v1.0.0 // indirect
 	github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17
 	github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d
 	github.com/coreos/go-oidc v2.0.0+incompatible
@@ -11,7 +10,7 @@ require (
 	github.com/go-test/deep v1.0.2
 	github.com/go-yaml/yaml v2.1.0+incompatible
 	github.com/gogo/protobuf v1.2.1
-	github.com/golang/protobuf v1.3.1
+	github.com/golang/protobuf v1.3.2
 	github.com/google/uuid v1.1.1
 	github.com/gorilla/mux v1.7.3
 	github.com/ipfs/go-datastore v0.0.5
@@ -30,9 +29,11 @@ require (
 	github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // indirect
 	github.com/prometheus/client_golang v0.9.3
 	github.com/stretchr/testify v1.3.0
+	github.com/tendermint/tendermint v0.32.3
+	github.com/tendermint/tmlibs v0.9.0
 	github.com/tyler-smith/go-bip39 v1.0.0
 	go.etcd.io/bbolt v1.3.3
-	google.golang.org/appengine v1.4.0 // indirect
+	golang.org/x/xerrors v0.0.0-20190528162220-0421b64034aa
 	gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
 	gopkg.in/go-playground/validator.v9 v9.29.1
 	gopkg.in/square/go-jose.v2 v2.3.1 // indirect
diff --git a/go.sum b/go.sum
index 95517ec..dccddba 100644
--- a/go.sum
+++ b/go.sum
@@ -25,10 +25,12 @@ github.com/bifurcation/mint v0.0.0-20181105073638-824af6541065/go.mod h1:zVt7zX3
 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/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=
@@ -67,14 +69,17 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn
 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/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/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
 github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5/go.mod h1:JpoxHjuQauoxiFMl1ie8Xc/7TfLuMZ5eOCONd1sUBHg=
 github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 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.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 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.0.0-20181204210945-c3db6069acc5/go.mod h1:Jc75BZJv2dNy7opKH6bF29VveDQHfGZ6Asn/3phBesg=
 github.com/go-critic/go-critic v0.0.0-20181204210945-ee9bf5809ead/go.mod h1:3MzXZKJdeXqdU9cj+rvZdNiN7SZ8V9OjybF8loZDmHU=
+github.com/go-kit/kit v0.6.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM=
@@ -111,8 +116,12 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
 github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
 github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
 github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
 github.com/golangci/errcheck v0.0.0-20181003203344-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
@@ -131,12 +140,14 @@ github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bz
 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/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 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/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=
+github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
 github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ=
@@ -280,6 +291,7 @@ github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj
 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/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
+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/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
 github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
@@ -546,6 +558,7 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM=
@@ -556,7 +569,10 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z
 github.com/prometheus/procfs v0.0.0-20190519111021-9935e8e0588d h1:Z5QMcUKnQw7ouB1wDuyZM6TL/rm+brJcNk6Ai8ut3zM=
 github.com/prometheus/procfs v0.0.0-20190519111021-9935e8e0588d/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165 h1:nkcn14uNmFEuGCb2mBZbBb24RdNRL08b/wb+xBOYpuk=
+github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI=
 github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
@@ -568,6 +584,7 @@ github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjM
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 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/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=
@@ -580,12 +597,14 @@ github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B
 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
 github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/viper v1.0.0/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
 github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
 github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -595,6 +614,16 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
 github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
+github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965 h1:1oFLiOyVl+W7bnBzGhf7BbIv9loSFQcieWWYIjLqcAw=
+github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA=
+github.com/tendermint/go-amino v0.14.1 h1:o2WudxNfdLNBwMyl2dqOJxiro5rfrEaU0Ugs6offJMk=
+github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso=
+github.com/tendermint/tendermint v0.32.3 h1:GEnWpGQ795h5oTFNbfBLsY0LW/CW2j6p6HtiYNfxsgg=
+github.com/tendermint/tendermint v0.32.3/go.mod h1:ZK2c29jl1QRYznIRyRWRDsmm1yvtPzBRT00x4t1JToY=
+github.com/tendermint/tm-db v0.1.1 h1:G3Xezy3sOk9+ekhjZ/kjArYIs1SmwV+1OUgNkj7RgV0=
+github.com/tendermint/tm-db v0.1.1/go.mod h1:0cPKWu2Mou3IlxecH+MEUSYc1Ch537alLe6CpFrKzgw=
+github.com/tendermint/tmlibs v0.9.0 h1:3aU/D2v3aecqpODOuBXCfi950bHTefD5Pps5X3XuJDc=
+github.com/tendermint/tmlibs v0.9.0/go.mod h1:4L0tAKpLTioy14VnmbXYTLIJN0pCMiehxDMdN6zZfM8=
 github.com/texttheater/golang-levenshtein v0.0.0-20180516184445-d188e65d659e/go.mod h1:XDKHRm5ThF8YJjx001LtgelzsoaEcvnA7lVWz9EeX3g=
 github.com/tyler-smith/go-bip39 v1.0.0 h1:FOHg9gaQLeBBRbHE/QrTLfEiBHy5pQ/yXzf9JG5pYFM=
 github.com/tyler-smith/go-bip39 v1.0.0/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
@@ -665,6 +694,7 @@ golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -683,6 +713,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
 golang.org/x/net v0.0.0-20190522135303-fa69b94a3b58/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -725,16 +757,23 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190420000508-685fecacd0a0/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/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-20190528162220-0421b64034aa h1:e+qzrOCx1B2Zjbv6p2uI91VZhrmjZD0Ck57LUzO5L8k=
+golang.org/x/xerrors v0.0.0-20190528162220-0421b64034aa/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19 h1:Lj2SnHtxkRGJDqnGaSjo+CCdIieEnwVazbOXILwQemk=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.22.0 h1:J0UbZOIrCAl+fpTOf8YLs4dJo8L/owV4LYVtAXQoPkw=
+google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -755,6 +794,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 gotest.tools/gotestsum v0.3.4/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
 mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
 mvdan.cc/unparam v0.0.0-20190124213536-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY=
diff --git a/pkg/api/proto.go b/pkg/api/proto.go
index 866911d..6232d21 100644
--- a/pkg/api/proto.go
+++ b/pkg/api/proto.go
@@ -27,6 +27,22 @@ import (
 	"time"
 )
 
+const (
+	//OrderIn Types for the Blockchain
+	TXOrderRequest    = "v1/order1"
+	TXFulfillRequest  = "v1/fulfill/order"
+	TXFulfillResponse = "v1/order2"
+	TXOrderResponse   = "NONE"
+)
+
+//BlockChainTX - struct for on chain req/resp
+type BlockChainTX struct {
+	Processor   string
+	SenderID    string
+	RecipientID string
+	Payload     []byte
+}
+
 //CreateIdentityRequest -
 type CreateIdentityRequest struct {
 	Name      string            `json:"name,omitempty" validate:"required,alphanum"`
diff --git a/pkg/defaultservice/fulfill.go b/pkg/defaultservice/fulfill.go
index a45eacb..e3b54d6 100644
--- a/pkg/defaultservice/fulfill.go
+++ b/pkg/defaultservice/fulfill.go
@@ -18,58 +18,74 @@
 package defaultservice
 
 import (
+	"encoding/json"
+
 	"github.com/apache/incubator-milagro-dta/libs/cryptowallet"
 	"github.com/apache/incubator-milagro-dta/pkg/api"
 	"github.com/apache/incubator-milagro-dta/pkg/common"
+	"github.com/apache/incubator-milagro-dta/pkg/tendermint"
 )
 
 // FulfillOrder -
-func (s *Service) FulfillOrder(req *api.FulfillOrderRequest) (*api.FulfillOrderResponse, error) {
+func (s *Service) FulfillOrder(req *api.FulfillOrderRequest) (string, error) {
 	orderPart1CID := req.OrderPart1CID
 	nodeID := s.NodeID()
 	remoteIDDocCID := req.DocumentCID
 	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
 	remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, remoteIDDocCID)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
 	//Retrieve the order from IPFS
 	order, err := common.RetrieveOrderFromIPFS(s.Ipfs, orderPart1CID, sikeSK, nodeID, remoteIDDoc.BLSPublicKey)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
 	recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID, nodeID)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
 	//Generate the secret and store for later redemption
 	seed, err := common.MakeRandomSeedAndStore(s.Store, s.Rng, order.Reference)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
 	//Generate the Public Key (Commitment) from the Seed/Secret
 	commitmentPublicKey, err := cryptowallet.RedeemPublicKey(seed)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
 	//Create an order response in IPFS
 	orderPart2CID, err := common.CreateAndStoreOrderPart2(s.Ipfs, s.Store, order, orderPart1CID, commitmentPublicKey, nodeID, recipientList)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 
-	return &api.FulfillOrderResponse{
+	response := &api.FulfillOrderResponse{
 		OrderPart2CID: orderPart2CID,
-	}, nil
+	}
+
+	marshaledRequest, _ := json.Marshal(response)
+
+	//Write the requests to the chain
+	chainTX := &api.BlockChainTX{
+		Processor:   api.TXFulfillResponse,
+		SenderID:    nodeID,
+		RecipientID: s.MasterFiduciaryNodeID(),
+		Payload:     marshaledRequest,
+	}
+	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
+	return tendermint.PostToChain(chainTX, "FulfillOrder")
+
 }
 
 // FulfillOrderSecret -
diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go
index 4326ba0..46dfb16 100644
--- a/pkg/defaultservice/order.go
+++ b/pkg/defaultservice/order.go
@@ -25,6 +25,7 @@ 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/pkg/errors"
 )
 
@@ -149,6 +150,7 @@ func (s *Service) Order(req *api.OrderRequest) (*api.OrderResponse, error) {
 		OrderPart1CID: orderPart1CID,
 		Extension:     fulfillExtension,
 	}
+
 	response, err := s.MasterFiduciaryServer.FulfillOrder(request)
 	if err != nil {
 		return nil, errors.Wrap(err, "Contacting Fiduciary")
@@ -279,3 +281,159 @@ func (s *Service) OrderSecret(req *api.OrderSecretRequest) (*api.OrderSecretResp
 		Extension:      ext,
 	}, nil
 }
+
+// Order -
+func (s *Service) Order1(req *api.OrderRequest) (string, error) {
+	if err := s.Plugin.ValidateOrderRequest(req); err != nil {
+		return "", err
+	}
+
+	//Initialise values from Request object
+	beneficiaryIDDocumentCID := req.BeneficiaryIDDocumentCID
+	iDDocID := s.NodeID()
+	recipientList, err := common.BuildRecipientList(s.Ipfs, iDDocID, s.MasterFiduciaryNodeID())
+	if err != nil {
+		return "", err
+	}
+
+	// remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, s.MasterFiduciaryNodeID())
+	// if err != nil {
+	// 	return "", err
+	// }
+
+	//Create Order
+	order, err := common.CreateNewDepositOrder(beneficiaryIDDocumentCID, iDDocID)
+	if err != nil {
+		return "", err
+	}
+
+	fulfillExtension, err := s.Plugin.PrepareOrderPart1(order, req.Extension)
+	if err != nil {
+		return "", err
+	}
+
+	//Write Order to IPFS
+	orderPart1CID, err := common.WriteOrderToIPFS(iDDocID, s.Ipfs, s.Store, iDDocID, order, recipientList)
+	if err != nil {
+		return "", err
+	}
+
+	//Fullfill the order on the remote Server
+	request := &api.FulfillOrderRequest{
+		DocumentCID:   iDDocID,
+		OrderPart1CID: orderPart1CID,
+		Extension:     fulfillExtension,
+	}
+
+	marshaledRequest, _ := json.Marshal(request)
+
+	//Write the requests to the chain
+	chainTX := &api.BlockChainTX{
+		Processor:   api.TXFulfillRequest,
+		SenderID:    iDDocID,
+		RecipientID: s.MasterFiduciaryNodeID(),
+		Payload:     marshaledRequest,
+	}
+	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
+
+	return tendermint.PostToChain(chainTX, "Order1")
+
+}
+
+// Order -
+func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
+	// if err := s.Plugin.ValidateOrderRequest(req); err != nil {
+	// 	return "", err
+	// }
+
+	// //Initialise values from Request object
+	// beneficiaryIDDocumentCID := req.BeneficiaryIDDocumentCID
+	iDDocID := s.NodeID()
+	// recipientList, err := common.BuildRecipientList(s.Ipfs, iDDocID, s.MasterFiduciaryNodeID())
+	// if err != nil {
+	// 	return "", err
+	// }
+
+	remoteIDDoc, err := common.RetrieveIDDocFromIPFS(s.Ipfs, s.MasterFiduciaryNodeID())
+	if err != nil {
+		return "", err
+	}
+
+	// //Create Order
+	// order, err := common.CreateNewDepositOrder(beneficiaryIDDocumentCID, iDDocID)
+	// if err != nil {
+	// 	return "", err
+	// }
+
+	// fulfillExtension, err := s.Plugin.PrepareOrderPart1(order, req.Extension)
+	// if err != nil {
+	// 	return "", err
+	// }
+
+	// //Write Order to IPFS
+	// orderPart1CID, err := common.WriteOrderToIPFS(iDDocID, s.Ipfs, s.Store, iDDocID, order, recipientList)
+	// if err != nil {
+	// 	return "", err
+	// }
+
+	// //Fullfill the order on the remote Server
+	// request := &api.FulfillOrderRequest{
+	// 	DocumentCID:   iDDocID,
+	// 	OrderPart1CID: orderPart1CID,
+	// 	Extension:     fulfillExtension,
+	// }
+
+	// marshaledRequest, _ := json.Marshal(request)
+
+	// //Write the requests to the chain
+	// chainTX := &api.BlockChainTX{
+	// 	Type:        api.TXFullfullRequest,
+	// 	SenderID:    iDDocID,
+	// 	RecipientID: s.MasterFiduciaryNodeID(),
+	// 	Payload:     marshaledRequest,
+	// }
+	// //curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
+
+	// tendermint.PostToChain(chainTX)
+
+	//  response, err := s.MasterFiduciaryServer.FulfillOrder(request)
+	//  if err != nil {
+	//  	return "", errors.Wrap(err, "Contacting Fiduciary")
+	//  }
+
+	//Get the updated order out of IPFS
+	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, iDDocID)
+	if err != nil {
+		return "", err
+	}
+	updatedOrder, err := common.RetrieveOrderFromIPFS(s.Ipfs, req.OrderPart2CID, sikeSK, iDDocID, remoteIDDoc.BLSPublicKey)
+	if err != nil {
+		return "", errors.Wrap(err, "Fail to retrieve Order from IPFS")
+	}
+
+	commitment, extension, err := s.Plugin.PrepareOrderResponse(updatedOrder, req.Extension, req.Extension)
+	if err != nil {
+		return "", errors.Wrap(err, "Generating Final Public Key")
+	}
+
+	response := &api.OrderResponse{
+		OrderReference: updatedOrder.Reference,
+		Commitment:     commitment,
+		CreatedAt:      time.Now().Unix(),
+		Extension:      extension,
+	}
+
+	marshaledRequest, _ := json.Marshal(response)
+
+	//Write the requests to the chain
+	chainTX := &api.BlockChainTX{
+		Processor:   api.TXOrderResponse,
+		SenderID:    iDDocID,
+		RecipientID: s.MasterFiduciaryNodeID(),
+		Payload:     marshaledRequest,
+	}
+	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
+
+	return tendermint.PostToChain(chainTX, "Order2")
+
+}
diff --git a/pkg/endpoints/endpoints.go b/pkg/endpoints/endpoints.go
index ae66d68..f42e01c 100644
--- a/pkg/endpoints/endpoints.go
+++ b/pkg/endpoints/endpoints.go
@@ -107,6 +107,35 @@ func Endpoints(svc service.Service, corsAllow string, authorizer transport.Autho
 			// 	ErrCreatingOrderDoc: http.StatusInternalServerError,
 			// },
 		},
+		"Order1": {
+			Path:        "/" + apiVersion + "/order1",
+			Method:      http.MethodPost,
+			Endpoint:    MakeOrder1Endpoint(svc),
+			NewRequest:  func() interface{} { return &api.OrderRequest{} },
+			NewResponse: func() interface{} { return &api.OrderResponse{} },
+			Options: transport.ServerOptions(
+				transport.SetCors(corsAllow),
+				transport.AuthorizeOIDC(authorizer, false),
+			),
+			ErrStatus: transport.ErrorStatus{
+				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
+			},
+		},
+		"Order2": {
+			Path:        "/" + apiVersion + "/order2",
+			Method:      http.MethodPost,
+			Endpoint:    MakeOrder2Endpoint(svc),
+			NewRequest:  func() interface{} { return &api.FulfillOrderResponse{} },
+			NewResponse: func() interface{} { return &api.OrderResponse{} },
+			Options: transport.ServerOptions(
+				transport.SetCors(corsAllow),
+				transport.AuthorizeOIDC(authorizer, false),
+			),
+			ErrStatus: transport.ErrorStatus{
+				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
+			},
+		},
+
 		"GetOrder": {
 			Path:        "/" + apiVersion + "/order/{OrderReference}",
 			Method:      http.MethodGet,
@@ -309,6 +338,34 @@ func MakeOrderEndpoint(m service.Service) endpoint.Endpoint {
 	}
 }
 
+//MakeOrderEndpoint -
+func MakeOrder1Endpoint(m service.Service) endpoint.Endpoint {
+	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
+		req, ok := request.(*api.OrderRequest)
+		if !ok {
+			return nil, transport.ErrInvalidRequest
+		}
+		if err := validateRequest(req); err != nil {
+			return "", err
+		}
+		return m.Order1(req)
+	}
+}
+
+//MakeOrderEndpoint -
+func MakeOrder2Endpoint(m service.Service) endpoint.Endpoint {
+	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
+		req, ok := request.(*api.FulfillOrderResponse)
+		if !ok {
+			return nil, transport.ErrInvalidRequest
+		}
+		if err := validateRequest(req); err != nil {
+			return "", err
+		}
+		return m.Order2(req)
+	}
+}
+
 //MakeOrderSecretEndpoint -
 func MakeOrderSecretEndpoint(m service.Service) endpoint.Endpoint {
 	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
diff --git a/pkg/service/service.go b/pkg/service/service.go
index 9ec4093..d53e5f2 100644
--- a/pkg/service/service.go
+++ b/pkg/service/service.go
@@ -37,8 +37,12 @@ type Service interface {
 	OrderSecret(req *api.OrderSecretRequest) (*api.OrderSecretResponse, error)
 	Order(req *api.OrderRequest) (*api.OrderResponse, error)
 
+	Order1(req *api.OrderRequest) (string, error)
+	Order2(req *api.FulfillOrderResponse) (string, error)
+
 	//Fullfill processing
-	FulfillOrder(req *api.FulfillOrderRequest) (*api.FulfillOrderResponse, error)
+	FulfillOrder(req *api.FulfillOrderRequest) (string, error)
+
 	FulfillOrderSecret(req *api.FulfillOrderSecretRequest) (*api.FulfillOrderSecretResponse, error)
 
 	NodeID() string
diff --git a/pkg/tendermint/json.go b/pkg/tendermint/json.go
new file mode 100644
index 0000000..8270db5
--- /dev/null
+++ b/pkg/tendermint/json.go
@@ -0,0 +1,35 @@
+// This file was generated from JSON Schema using quicktype, do not modify it directly.
+// To parse and unparse this JSON data, add this code to your project and do:
+//
+//    fetchTxResponse, err := UnmarshalFetchTxResponse(bytes)
+//    bytes, err = fetchTxResponse.Marshal()
+
+package tendermint
+
+import "encoding/json"
+
+func UnmarshalChainQuery(data []byte) (ChainQuery, error) {
+	var r ChainQuery
+	err := json.Unmarshal(data, &r)
+	return r, err
+}
+
+func (r *ChainQuery) Marshal() ([]byte, error) {
+	return json.Marshal(r)
+}
+
+type ChainQuery struct {
+	Jsonrpc string `json:"jsonrpc"`
+	ID      string `json:"id"`
+	Result  Result `json:"result"`
+}
+
+type Result struct {
+	Response Response `json:"response"`
+}
+
+type Response struct {
+	Log   string `json:"log"`
+	Key   string `json:"key"`
+	Value string `json:"value"`
+}
diff --git a/pkg/tendermint/tendermint.go b/pkg/tendermint/tendermint.go
new file mode 100644
index 0000000..286f1da
--- /dev/null
+++ b/pkg/tendermint/tendermint.go
@@ -0,0 +1,144 @@
+package tendermint
+
+import (
+	"bufio"
+	"crypto/sha256"
+	"encoding/base64"
+	"encoding/hex"
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"os"
+	"strings"
+
+	"github.com/apache/incubator-milagro-dta/pkg/api"
+)
+
+//QueryChain the blockchain for an index
+func QueryChain(index string) (string, string) {
+	url := "http://localhost:26657/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(payload *api.BlockChainTX, method string) (string, error) {
+	serializedTX, _ := json.Marshal(payload)
+	TXID := sha256.Sum256(serializedTX)
+	TXIDhex := hex.EncodeToString(TXID[:])
+	fullTx := fmt.Sprintf("%s=%s", TXIDhex, string(serializedTX))
+
+	fmt.Printf(" **** %s Block TX: %s\n", method, TXIDhex)
+	base64EncodedTX := base64.StdEncoding.EncodeToString([]byte(fullTx))
+	body := strings.NewReader("{\"jsonrpc\":\"2.0\",\"id\":\"anything\",\"method\":\"broadcast_tx_commit\",\"params\": {\"tx\": \"" + base64EncodedTX + "\"}}")
+	req, err := http.NewRequest("POST", "http://localhost:26657", 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()
+	return TXIDhex, nil
+}
+
+//HandleChainTX -
+func HandleChainTX(myID string, tx string) error {
+	blockChainTX, err := decodeChainTX(tx)
+	if err != nil {
+		return err
+	}
+
+	if blockChainTX.Processor == "NONE" {
+		print("Process Complete")
+		print(string(blockChainTX.Payload))
+		return nil
+	}
+	err = callNextTX(blockChainTX)
+	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
+}
+
+func callNextTX(tx *api.BlockChainTX) error {
+	// recipient := tx.RecipientID
+	// sender := tx.SenderID
+	//payloadJSON := tx.Payload
+	payloadString := string(tx.Payload)
+
+	desintationURL := fmt.Sprintf("http://localhost:5556/%s", tx.Processor)
+
+	body := strings.NewReader(payloadString)
+	req, err := http.NewRequest("POST", os.ExpandEnv(desintationURL), body)
+	if err != nil {
+		return err
+	}
+	req.Header.Set("Accept", "*/*")
+	req.Header.Set("Content-Type", "application/json")
+
+	resp, err := http.DefaultClient.Do(req)
+	if err != nil {
+		return 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())
+	}
+	print(t)
+
+	return nil
+}
+
+func DumpTXID(txid string) {
+	value, raw := QueryChain(txid)
+	println(value)
+	bc, _ := decodeChainTX(raw)
+	println(string(bc.Payload))
+	println()
+}
+
+func ProcessTransactionID(txid string) {
+	_, payload := QueryChain((txid))
+	err := HandleChainTX("", payload)
+	if err != nil {
+		panic(err)
+	}
+}
diff --git a/pkg/tendermint/tendermint_test.go b/pkg/tendermint/tendermint_test.go
new file mode 100644
index 0000000..43dec6b
--- /dev/null
+++ b/pkg/tendermint/tendermint_test.go
@@ -0,0 +1,61 @@
+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("473407b069ff917b110f38c36d5b9e5246b5ace5d82df38c5a188d5ac868cfec")
+	DumpTXID("586bc14b15a31999571c8188241beef046d3b78a9481ecee984e7c76a1d95112")
+
+}
+
+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\"}}"


[incubator-milagro-dta] 04/11: Lint

Posted by cm...@apache.org.
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 5113c360e778ffa6248a57f814debab62d73ef04
Author: Christopher Morris <ch...@morris.net>
AuthorDate: Wed Sep 11 14:48:11 2019 +0100

    Lint
---
 pkg/defaultservice/order.go | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go
index b16b64b..a8e93a7 100644
--- a/pkg/defaultservice/order.go
+++ b/pkg/defaultservice/order.go
@@ -282,7 +282,7 @@ func (s *Service) OrderSecret(req *api.OrderSecretRequest) (*api.OrderSecretResp
 	}, nil
 }
 
-// Order -
+// Order1 -
 func (s *Service) Order1(req *api.OrderRequest) (string, error) {
 	if err := s.Plugin.ValidateOrderRequest(req); err != nil {
 		return "", err
@@ -340,7 +340,7 @@ func (s *Service) Order1(req *api.OrderRequest) (string, error) {
 	return order.Reference, nil
 }
 
-// Order -
+// Order2 -
 func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
 	// if err := s.Plugin.ValidateOrderRequest(req); err != nil {
 	// 	return "", err
@@ -437,7 +437,7 @@ func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
 
 }
 
-// OrderSecret -
+// OrderSecret1 -
 func (s *Service) OrderSecret1(req *api.OrderSecretRequest) (string, error) {
 	orderReference := req.OrderReference
 	var orderPart2CID string
@@ -508,7 +508,7 @@ func (s *Service) OrderSecret1(req *api.OrderSecretRequest) (string, error) {
 	return tendermint.PostToChain(chainTX, "OrderSecret1")
 }
 
-// OrderSecret -
+// OrderSecret2 -
 func (s *Service) OrderSecret2(req *api.FulfillOrderSecretResponse) (string, error) {
 	nodeID := s.NodeID()
 	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)


[incubator-milagro-dta] 06/11: Add Tendermint pusher/listener

Posted by cm...@apache.org.
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 d0a78e56685e06e6af0fa78e9fd697c67f31fdf0
Author: Christopher Morris <ch...@morris.net>
AuthorDate: Mon Sep 23 11:08:09 2019 +0100

    Add Tendermint pusher/listener
---
 cmd/service/__debug_bin           | Bin 42684380 -> 51604364 bytes
 cmd/service/main.go               |   6 ++
 go.mod                            |  11 +--
 go.sum                            |  71 ++++++++++++++++
 pkg/api/proto.go                  |  21 +++++
 pkg/tendermint/config.go          |   7 ++
 pkg/tendermint/json.go            |  35 ++++++++
 pkg/tendermint/tendermint.go      | 173 ++++++++++++++++++++++++++++++++++++++
 pkg/tendermint/tendermint_test.go |  60 +++++++++++++
 pkg/tendermint/websockets.go      |  83 ++++++++++++++++++
 10 files changed, 462 insertions(+), 5 deletions(-)

diff --git a/cmd/service/__debug_bin b/cmd/service/__debug_bin
index e894d4c..4309b69 100755
Binary files a/cmd/service/__debug_bin and b/cmd/service/__debug_bin differ
diff --git a/cmd/service/main.go b/cmd/service/main.go
index e788374..1c267cd 100644
--- a/cmd/service/main.go
+++ b/cmd/service/main.go
@@ -37,6 +37,7 @@ import (
 	"github.com/apache/incubator-milagro-dta/pkg/api"
 	"github.com/apache/incubator-milagro-dta/pkg/config"
 	"github.com/apache/incubator-milagro-dta/pkg/endpoints"
+	"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"
@@ -145,6 +146,11 @@ func startDaemon(args []string) error {
 		return errors.Wrap(err, "init logger")
 	}
 
+	go tendermint.Subscribe(logger)
+	if err != nil {
+		return errors.Wrap(err, "init Tendermint Blockchain")
+	}
+
 	// Create KV store
 	logger.Info("Datastore type: %s", cfg.Node.Datastore)
 	store, err := initDataStore(cfg.Node.Datastore)
diff --git a/go.mod b/go.mod
index 5fc13eb..a7bbca8 100644
--- a/go.mod
+++ b/go.mod
@@ -1,17 +1,17 @@
 module github.com/apache/incubator-milagro-dta
 
 require (
-	github.com/VividCortex/gohistogram v1.0.0 // indirect
+	github.com/TylerBrock/colorjson v0.0.0-20180527164720-95ec53f28296
 	github.com/btcsuite/btcd v0.0.0-20190427004231-96897255fd17
 	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
 	github.com/go-yaml/yaml v2.1.0+incompatible
-	github.com/gogo/protobuf v1.2.1
-	github.com/golang/protobuf v1.3.1
+	github.com/gogo/protobuf v1.3.0
+	github.com/golang/protobuf v1.3.2
 	github.com/google/uuid v1.1.1
 	github.com/gorilla/mux v1.7.3
 	github.com/ipfs/go-datastore v0.0.5
@@ -29,7 +29,8 @@ require (
 	github.com/pkg/errors v0.8.1
 	github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // indirect
 	github.com/prometheus/client_golang v0.9.3
-	github.com/stretchr/testify v1.3.0
+	github.com/stretchr/testify v1.4.0
+	github.com/tendermint/tendermint v0.32.4
 	github.com/tyler-smith/go-bip39 v1.0.0
 	go.etcd.io/bbolt v1.3.3
 	gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
diff --git a/go.sum b/go.sum
index d5792b8..0aab82b 100644
--- a/go.sum
+++ b/go.sum
@@ -14,8 +14,11 @@ github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrU
 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/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=
@@ -27,10 +30,12 @@ github.com/bifurcation/mint v0.0.0-20181105073638-824af6541065/go.mod h1:zVt7zX3
 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/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=
@@ -47,6 +52,7 @@ github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wX
 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=
@@ -54,6 +60,8 @@ github.com/coreos/go-oidc v2.0.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHo
 github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a h1:U0BbGfKnviqVBJQB4etvm+mKx53KfkumNLBt6YeF/0Q=
 github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
 github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0=
 github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis=
@@ -66,6 +74,7 @@ github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQY
 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=
@@ -73,13 +82,17 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8
 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/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/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/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/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
 github.com/go-critic/go-critic v0.3.5-0.20190210220443-ee9bf5809ead/go.mod h1:3MzXZKJdeXqdU9cj+rvZdNiN7SZ8V9OjybF8loZDmHU=
@@ -87,6 +100,7 @@ github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+s
 github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA=
@@ -123,7 +137,10 @@ github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJA
 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/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=
@@ -132,8 +149,12 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
 github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
 github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
 github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
 github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
@@ -154,8 +175,10 @@ github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlS
 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/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=
@@ -164,7 +187,12 @@ github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw=
 github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
 github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
 github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
+github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/gxed/go-shellwords v1.0.3/go.mod h1:N7paucT91ByIjmVJHhvoarjoQnmsi3Jd3vH7VqgtMxQ=
 github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU=
 github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48=
@@ -316,12 +344,14 @@ github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj
 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/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
+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/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/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
@@ -502,6 +532,7 @@ github.com/lucas-clemente/quic-go v0.11.1/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdf
 github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58=
 github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/marten-seemann/qtls v0.2.3 h1:0yWJ43C62LsZt08vuQJDK1uC1czUc3FJeCLPoNAI4vA=
 github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
@@ -604,8 +635,13 @@ github.com/prometheus/procfs v0.0.0-20190519111021-9935e8e0588d h1:Z5QMcUKnQw7ou
 github.com/prometheus/procfs v0.0.0-20190519111021-9935e8e0588d/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
+github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165 h1:nkcn14uNmFEuGCb2mBZbBb24RdNRL08b/wb+xBOYpuk=
+github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
+github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
+github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
 github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
@@ -618,6 +654,8 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykE
 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=
@@ -630,6 +668,7 @@ github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B
 github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
 github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
 github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
@@ -638,17 +677,30 @@ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
 github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
+github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
 github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
+github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965 h1:1oFLiOyVl+W7bnBzGhf7BbIv9loSFQcieWWYIjLqcAw=
+github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA=
+github.com/tendermint/go-amino v0.14.1 h1:o2WudxNfdLNBwMyl2dqOJxiro5rfrEaU0Ugs6offJMk=
+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/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=
 github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tyler-smith/go-bip39 v1.0.0 h1:FOHg9gaQLeBBRbHE/QrTLfEiBHy5pQ/yXzf9JG5pYFM=
 github.com/tyler-smith/go-bip39 v1.0.0/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs=
+github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
 github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
@@ -691,7 +743,9 @@ github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee h1:lYbXeSv
 github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1:m2aV4LZI4Aez7dP5PMyVKEHhUyEJ/RjmPEDOpDvudHg=
 github.com/whyrusleeping/yamux v1.1.5/go.mod h1:E8LnQQ8HKx5KD29HZFUwM1PxCOdPRzGwur1mcYhXcD8=
 github.com/whyrusleeping/yamux v1.2.0/go.mod h1:Cgw3gpb4DrDZ1FrP/5pxg/cpiY54Gr5uCXwUylwi2GE=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
+go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
 go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=
@@ -706,6 +760,7 @@ go.uber.org/goleak v0.10.0 h1:G3eWbSNIskeRqtsN/1uI5B+eP73y3JUuBsv9AZjehb4=
 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=
@@ -724,6 +779,7 @@ golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -734,6 +790,7 @@ golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73r
 golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190310074541-c10a0554eabf/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -741,8 +798,11 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
 golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190522135303-fa69b94a3b58/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -774,9 +834,11 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181205014116-22934f0fdb62/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -788,6 +850,7 @@ golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3
 golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190420000508-685fecacd0a0/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=
@@ -799,8 +862,14 @@ google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO50
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19 h1:Lj2SnHtxkRGJDqnGaSjo+CCdIieEnwVazbOXILwQemk=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.1 h1:q4XQuHFC6I28BKZpo6IYyb3mNO+l7lSOxRuYTCiDfXk=
+google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -815,6 +884,7 @@ gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXa
 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=
@@ -826,6 +896,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 gotest.tools/gotestsum v0.3.4/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
 mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
 mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY=
diff --git a/pkg/api/proto.go b/pkg/api/proto.go
index d0ca577..3107b12 100644
--- a/pkg/api/proto.go
+++ b/pkg/api/proto.go
@@ -27,6 +27,27 @@ import (
 	"time"
 )
 
+const (
+	//OrderIn Types for the Blockchain
+	TXOrderRequest    = "v1/order1"
+	TXFulfillRequest  = "v1/fulfill/order"
+	TXFulfillResponse = "v1/order2"
+	TXOrderResponse   = "NONE"
+
+	TXOrderSecretRequest         = "v1/order/secret1"
+	TXFulfillOrderSecretRequest  = "v1/fulfill/order/secret"
+	TXFulfillOrderSecretResponse = "v1/order/secret2"
+	TXOrderSecretResponse        = "NONE"
+)
+
+//BlockChainTX - struct for on chain req/resp
+type BlockChainTX struct {
+	Processor   string
+	SenderID    string
+	RecipientID string
+	Payload     []byte
+}
+
 //CreateIdentityRequest -
 type CreateIdentityRequest struct {
 	Name      string            `json:"name,omitempty" validate:"required,alphanum"`
diff --git a/pkg/tendermint/config.go b/pkg/tendermint/config.go
new file mode 100644
index 0000000..a113a5f
--- /dev/null
+++ b/pkg/tendermint/config.go
@@ -0,0 +1,7 @@
+
+package tendermint
+
+
+const (
+	node = "3.248.201.10:26657"
+)
\ No newline at end of file
diff --git a/pkg/tendermint/json.go b/pkg/tendermint/json.go
new file mode 100644
index 0000000..8270db5
--- /dev/null
+++ b/pkg/tendermint/json.go
@@ -0,0 +1,35 @@
+// This file was generated from JSON Schema using quicktype, do not modify it directly.
+// To parse and unparse this JSON data, add this code to your project and do:
+//
+//    fetchTxResponse, err := UnmarshalFetchTxResponse(bytes)
+//    bytes, err = fetchTxResponse.Marshal()
+
+package tendermint
+
+import "encoding/json"
+
+func UnmarshalChainQuery(data []byte) (ChainQuery, error) {
+	var r ChainQuery
+	err := json.Unmarshal(data, &r)
+	return r, err
+}
+
+func (r *ChainQuery) Marshal() ([]byte, error) {
+	return json.Marshal(r)
+}
+
+type ChainQuery struct {
+	Jsonrpc string `json:"jsonrpc"`
+	ID      string `json:"id"`
+	Result  Result `json:"result"`
+}
+
+type Result struct {
+	Response Response `json:"response"`
+}
+
+type Response struct {
+	Log   string `json:"log"`
+	Key   string `json:"key"`
+	Value string `json:"value"`
+}
diff --git a/pkg/tendermint/tendermint.go b/pkg/tendermint/tendermint.go
new file mode 100644
index 0000000..cd4447f
--- /dev/null
+++ b/pkg/tendermint/tendermint.go
@@ -0,0 +1,173 @@
+package tendermint
+
+import (
+	"bufio"
+	"crypto/sha256"
+	"encoding/base64"
+	"encoding/hex"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"net/http"
+	"os"
+	"strings"
+
+	"github.com/TylerBrock/colorjson"
+	"github.com/apache/incubator-milagro-dta/pkg/api"
+)
+
+//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(payload *api.BlockChainTX, method string) (string, error) {
+	serializedTX, _ := json.Marshal(payload)
+	TXID := sha256.Sum256(serializedTX)
+	TXIDhex := hex.EncodeToString(TXID[:])
+	fullTx := fmt.Sprintf("%s=%s", TXIDhex, string(serializedTX))
+
+	//fmt.Printf(" **** %s Block TX: %s\n", method, TXIDhex)
+	base64EncodedTX := base64.StdEncoding.EncodeToString([]byte(fullTx))
+	body := strings.NewReader("{\"jsonrpc\":\"2.0\",\"id\":\"anything\",\"method\":\"broadcast_tx_commit\",\"params\": {\"tx\": \"" + base64EncodedTX + "\"}}")
+	req, err := http.NewRequest("POST", "http://"+node+"", 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()
+	return TXIDhex, nil
+}
+
+//HandleChainTX -
+func HandleChainTX(myID string, tx string) error {
+	blockChainTX, err := decodeChainTX(tx)
+	if err != nil {
+		return err
+	}
+	err = callNextTX(blockChainTX)
+	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(tx *api.BlockChainTX) error {
+	// recipient := tx.RecipientID
+	// sender := tx.SenderID
+	//payloadJSON := tx.Payload
+	payloadString := string(tx.Payload)
+
+	if tx.Processor == "NONE" {
+		//The TX is information and doesn't require any further processing
+		return nil
+	}
+
+	desintationURL := fmt.Sprintf("http://localhost:5556/%s", tx.Processor)
+
+	body := strings.NewReader(payloadString)
+	req, err := http.NewRequest("POST", os.ExpandEnv(desintationURL), body)
+	if err != nil {
+		return err
+	}
+	req.Header.Set("Accept", "*/*")
+	req.Header.Set("Content-Type", "application/json")
+
+	resp, err := http.DefaultClient.Do(req)
+	if err != nil {
+		return 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())
+	}
+	return nil
+}
+
+//Decode the Payload into JSON and displays the entire Blockchain TX unencoded
+func DumpTX(bctx *api.BlockChainTX) {
+	f := colorjson.NewFormatter()
+	f.Indent = 4
+	var payloadObj map[string]interface{}
+	payload := bctx.Payload
+	json.Unmarshal([]byte(payload), &payloadObj)
+	jsonstring, _ := json.Marshal(bctx)
+	var obj map[string]interface{}
+	json.Unmarshal([]byte(jsonstring), &obj)
+	obj["Payload"] = payloadObj
+	s, _ := f.Marshal(obj)
+	fmt.Println(string(s))
+}
+
+func DumpTXID(txid string) {
+	value, raw := QueryChain(txid)
+	println(value)
+	bc, _ := decodeChainTX(raw)
+	println(string(bc.Payload))
+	println()
+}
+
+func ProcessTransactionID(txid string) {
+	_, payload := QueryChain((txid))
+	err := HandleChainTX("", payload)
+	if err != nil {
+		panic(err)
+	}
+}
diff --git a/pkg/tendermint/tendermint_test.go b/pkg/tendermint/tendermint_test.go
new file mode 100644
index 0000000..495f74f
--- /dev/null
+++ b/pkg/tendermint/tendermint_test.go
@@ -0,0 +1,60 @@
+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
new file mode 100644
index 0000000..ddc9722
--- /dev/null
+++ b/pkg/tendermint/websockets.go
@@ -0,0 +1,83 @@
+package tendermint
+
+import (
+	"context"
+	"os"
+	"os/signal"
+	"syscall"
+
+	"github.com/apache/incubator-milagro-dta/libs/logger"
+	tmclient "github.com/tendermint/tendermint/rpc/client"
+	tmtypes "github.com/tendermint/tendermint/types"
+)
+
+//Subscribe - Connect to the Tendermint websocket to collect events
+func Subscribe(logger *logger.Logger) error {
+
+	//tmlogger := log2.NewTMLogger(log.NewSyncWriter(os.Stdout))
+
+	client := tmclient.NewHTTP("tcp://"+node+"", "/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()
+
+	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, os.Interrupt, syscall.SIGTERM)
+
+	for {
+		select {
+		case result := <-out:
+			tx := result.Data.(tmtypes.EventDataTx).Tx
+			blockchainTX, txid, err := decodeTX(string(tx))
+			logger.Info("Incoming TX %s", txid)
+			if err != nil {
+				logger.Info("Invalid Incoming Transaction %s - %s:", err, string(tx))
+
+			}
+			if blockchainTX.Processor == "NONE" {
+				DumpTX(blockchainTX)
+			} else {
+				callNextTX(blockchainTX)
+			}
+
+			//print(blockchainTX)
+			// print(txid)
+
+			// print(string(xx))
+
+			// a := result.Data.(tmtypes.EventDataTx).Index
+			// b := result.Data.(tmtypes.EventDataTx)
+			// c := b.TxResult
+			// tx := c.Tx
+			// txdata := []byte(c.Tx)
+			// print(string(txdata))
+
+			// print(a)
+			// Use(c, b, tx)
+
+			//logger.Info("got tx","index", result.Data.(tmtypes.EventDataTx).Index)
+		case <-quit:
+			os.Exit(0)
+		}
+	}
+}
+
+//Use - helper to remove warnings
+func Use(vals ...interface{}) {
+	for _, val := range vals {
+		_ = val
+	}
+}


[incubator-milagro-dta] 08/11: Order working & Add Tags

Posted by cm...@apache.org.
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 db3f2b0d9e08cb5a70e74652db109d5f935ab2a1
Author: Christopher Morris <ch...@morris.net>
AuthorDate: Tue Sep 24 16:41:37 2019 +0100

    Order working & Add Tags
---
 cmd/service/__debug_bin            | Bin 51604364 -> 51651284 bytes
 cmd/service/main.go                |   2 +-
 cmd/servicetester/block_test.sh    |   1 +
 go.mod                             |   3 +
 go.sum                             |  38 +++++++++----
 pkg/api/proto.go                   |   4 +-
 pkg/defaultservice/fulfill.go      |   4 +-
 pkg/defaultservice/order.go        |  54 +++++++++---------
 pkg/endpoints/endpoints.go         |  61 +-------------------
 pkg/service/service.go             |   2 -
 pkg/tendermint/cmd/cmd             | Bin 0 -> 10230244 bytes
 pkg/tendermint/cmd/tmget.go        | 110 +++++++++++++++++++++++++++++++++++++
 pkg/tendermint/cmd/transactions.go |  60 ++++++++++++++++++++
 pkg/tendermint/config.go           |   6 +-
 pkg/tendermint/tendermint.go       |  30 ++++++++--
 pkg/tendermint/websockets.go       |  40 +++++++++++---
 16 files changed, 292 insertions(+), 123 deletions(-)

diff --git a/cmd/service/__debug_bin b/cmd/service/__debug_bin
index 4309b69..3a3cf1b 100755
Binary files a/cmd/service/__debug_bin and b/cmd/service/__debug_bin differ
diff --git a/cmd/service/main.go b/cmd/service/main.go
index 239c5e2..920fc46 100644
--- a/cmd/service/main.go
+++ b/cmd/service/main.go
@@ -146,7 +146,7 @@ func startDaemon(args []string) error {
 		return errors.Wrap(err, "init logger")
 	}
 
-	go tendermint.Subscribe(logger)
+	go tendermint.Subscribe(logger, cfg.Node.NodeID)
 	if err != nil {
 		return errors.Wrap(err, "init Tendermint Blockchain")
 	}
diff --git a/cmd/servicetester/block_test.sh b/cmd/servicetester/block_test.sh
new file mode 100755
index 0000000..304490a
--- /dev/null
+++ b/cmd/servicetester/block_test.sh
@@ -0,0 +1 @@
+curl -s -X POST "127.0.0.1:5556/v1/order1" -H "accept: */*" -H "Content-Type: application/json" -d "{\"beneficiaryIDDocumentCID\":\"\",\"extension\":{\"coin\":\"0\"}}"
\ No newline at end of file
diff --git a/go.mod b/go.mod
index a7bbca8..a526712 100644
--- a/go.mod
+++ b/go.mod
@@ -14,6 +14,7 @@ require (
 	github.com/golang/protobuf v1.3.2
 	github.com/google/uuid v1.1.1
 	github.com/gorilla/mux v1.7.3
+	github.com/hokaccha/go-prettyjson v0.0.0-20190818114111-108c894c2c0e // indirect
 	github.com/ipfs/go-datastore v0.0.5
 	github.com/ipfs/go-ds-leveldb v0.0.2
 	github.com/ipfs/go-ipfs v0.4.22
@@ -30,8 +31,10 @@ require (
 	github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // indirect
 	github.com/prometheus/client_golang v0.9.3
 	github.com/stretchr/testify v1.4.0
+	github.com/stumble/gorocksdb v0.0.3 // indirect
 	github.com/tendermint/tendermint v0.32.4
 	github.com/tyler-smith/go-bip39 v1.0.0
+	github.com/urfave/cli v1.22.1
 	go.etcd.io/bbolt v1.3.3
 	gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
 	gopkg.in/go-playground/validator.v9 v9.29.1
diff --git a/go.sum b/go.sum
index 0aab82b..58ea010 100644
--- a/go.sum
+++ b/go.sum
@@ -8,7 +8,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
 github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y=
 github.com/Kubuxu/gocovmerge v0.0.0-20161216165753-7ecaa51963cd/go.mod h1:bqoB8kInrTeEtYAwaIXoSRqdwnjQmFhsfusnzyui6yY=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/OpenPeeDeeP/depguard v0.0.0-20180806142446-a69c782687b2/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o=
 github.com/OpenPeeDeeP/depguard v1.0.0/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o=
 github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
 github.com/Stebalien/go-bitfield v0.0.0-20180330043415-076a62f9ce6e/go.mod h1:3oM7gXIttpYDAJXpVNnSCiUMYBLIZ6cb1t+Ip982MRo=
@@ -62,7 +61,10 @@ github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a h1:U0BbGfKnviqV
 github.com/coreos/go-semver v0.2.1-0.20180108230905-e214231b295a/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk=
 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/cskr/pubsub v1.0.2 h1:vlOzMhl6PFn60gRlTQQsIfVwaPB/B/8MziK8FhEPt/0=
 github.com/cskr/pubsub v1.0.2/go.mod h1:/8MzYXk/NJAz782G8RPkFzXTZVu63VotefPnR9TIRis=
 github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -82,20 +84,27 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8
 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/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98=
-github.com/go-critic/go-critic v0.3.5-0.20190210220443-ee9bf5809ead/go.mod h1:3MzXZKJdeXqdU9cj+rvZdNiN7SZ8V9OjybF8loZDmHU=
 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=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
@@ -114,9 +123,7 @@ github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw=
 github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
-github.com/go-toolsmith/astcast v0.0.0-20181028201508-b7a89ed70af1/go.mod h1:TEo3Ghaj7PsZawQHxT/oBvo4HK/sl1RcuUHDKTTju+o=
 github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4=
-github.com/go-toolsmith/astcopy v0.0.0-20180903214859-79b422d080c4/go.mod h1:c9CPdq2AzM8oPomdlPniEfPAC6g1s7NqZzODt8y6ib8=
 github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ=
 github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
 github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
@@ -127,9 +134,7 @@ github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur9
 github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
 github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks=
 github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc=
-github.com/go-toolsmith/strparse v0.0.0-20180903215201-830b6daa1241/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
 github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
-github.com/go-toolsmith/typep v0.0.0-20181030061450-d63dc7650676/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
 github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
 github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o=
 github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=
@@ -139,6 +144,7 @@ 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=
@@ -160,14 +166,11 @@ github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9
 github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
 github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8=
 github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM=
-github.com/golangci/go-tools v0.0.0-20190318060251-af6baa5dc196/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM=
 github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o=
 github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
 github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
-github.com/golangci/golangci-lint v1.16.1-0.20190425135923-692dacb773b7/go.mod h1:kSe2pu2LlcsMT5Dr95yNKUT5RNfMkwif9MZqtOW5NEs=
 github.com/golangci/golangci-lint v1.18.0/go.mod h1:kaqo8l0OZKYPtjNmG4z4HrWLgcYNIJ9B9q3LWri9uLg=
 github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU=
-github.com/golangci/ineffassign v0.0.0-20180808204949-2ee8f2867dde/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU=
 github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU=
 github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg=
 github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
@@ -178,6 +181,7 @@ github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg
 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=
@@ -206,6 +210,8 @@ github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/hokaccha/go-prettyjson v0.0.0-20190818114111-108c894c2c0e h1:0aewS5NTyxftZHSnFaJmWE5oCCrj4DyEXkAiMa1iZJM=
+github.com/hokaccha/go-prettyjson v0.0.0-20190818114111-108c894c2c0e/go.mod h1:pFlLw2CfqZiIBOx6BuCeRLCrfxBJipTY0nIOF/VbGcI=
 github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/hsanjuan/go-libp2p-gostream v0.0.31/go.mod h1:cWvV5/NQ5XWi0eQZnX/svsAk6NLc4U26pItvj0eDeRk=
@@ -344,6 +350,7 @@ github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsj
 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/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/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
@@ -532,6 +539,7 @@ github.com/lucas-clemente/quic-go v0.11.1/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdf
 github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58=
 github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
 github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/marten-seemann/qtls v0.2.3 h1:0yWJ43C62LsZt08vuQJDK1uC1czUc3FJeCLPoNAI4vA=
 github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk=
@@ -642,12 +650,17 @@ github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
 github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
 github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
 github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
+github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
+github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
 github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 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=
@@ -685,6 +698,8 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stumble/gorocksdb v0.0.3 h1:9UU+QA1pqFYJuf9+5p7z1IqdE5k0mma4UAeu2wmX8kA=
+github.com/stumble/gorocksdb v0.0.3/go.mod h1:v6IHdFBXk5DJ1K4FZ0xi+eY737quiiBxYtSWXadLybY=
 github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
 github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
 github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965 h1:1oFLiOyVl+W7bnBzGhf7BbIv9loSFQcieWWYIjLqcAw=
@@ -704,6 +719,8 @@ github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGr
 github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
 github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s=
 github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4=
@@ -795,7 +812,6 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r
 golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190310074541-c10a0554eabf/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190522135303-fa69b94a3b58/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
@@ -840,7 +856,6 @@ golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGm
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181205014116-22934f0fdb62/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -848,7 +863,6 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 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-20190420000508-685fecacd0a0/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=
diff --git a/pkg/api/proto.go b/pkg/api/proto.go
index 3107b12..a4a7eea 100644
--- a/pkg/api/proto.go
+++ b/pkg/api/proto.go
@@ -44,8 +44,10 @@ const (
 type BlockChainTX struct {
 	Processor   string
 	SenderID    string
-	RecipientID string
+	RecipientID []string
 	Payload     []byte
+	TXhash      []byte
+	Tags        map[string]string
 }
 
 //CreateIdentityRequest -
diff --git a/pkg/defaultservice/fulfill.go b/pkg/defaultservice/fulfill.go
index 26be911..8b1b87b 100644
--- a/pkg/defaultservice/fulfill.go
+++ b/pkg/defaultservice/fulfill.go
@@ -80,7 +80,7 @@ func (s *Service) FulfillOrder(req *api.FulfillOrderRequest) (string, error) {
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXFulfillResponse,
 		SenderID:    nodeID,
-		RecipientID: s.MasterFiduciaryNodeID(),
+		RecipientID: []string{s.MasterFiduciaryNodeID()},
 		Payload:     marshaledRequest,
 	}
 	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
@@ -143,7 +143,7 @@ func (s *Service) FulfillOrderSecret(req *api.FulfillOrderSecretRequest) (string
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXFulfillOrderSecretResponse,
 		SenderID:    nodeID,
-		RecipientID: s.MasterFiduciaryNodeID(),
+		RecipientID: []string{s.MasterFiduciaryNodeID()},
 		Payload:     marshaledRequest,
 	}
 	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go
index faa9ccb..8ab714d 100644
--- a/pkg/defaultservice/order.go
+++ b/pkg/defaultservice/order.go
@@ -116,8 +116,8 @@ func (s *Service) Order(req *api.OrderRequest) (*api.OrderResponse, error) {
 
 	//Initialise values from Request object
 	beneficiaryIDDocumentCID := req.BeneficiaryIDDocumentCID
-	iDDocID := s.NodeID()
-	recipientList, err := common.BuildRecipientList(s.Ipfs, iDDocID, s.MasterFiduciaryNodeID())
+	nodeID := s.NodeID()
+	recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID, s.MasterFiduciaryNodeID())
 	if err != nil {
 		return nil, err
 	}
@@ -128,7 +128,7 @@ func (s *Service) Order(req *api.OrderRequest) (*api.OrderResponse, error) {
 	}
 
 	//Create Order
-	order, err := common.CreateNewDepositOrder(beneficiaryIDDocumentCID, iDDocID)
+	order, err := common.CreateNewDepositOrder(beneficiaryIDDocumentCID, nodeID)
 	if err != nil {
 		return nil, err
 	}
@@ -139,14 +139,14 @@ func (s *Service) Order(req *api.OrderRequest) (*api.OrderResponse, error) {
 	}
 
 	//Write Order to IPFS
-	orderPart1CID, err := common.WriteOrderToIPFS(iDDocID, s.Ipfs, s.Store, iDDocID, order, recipientList)
+	orderPart1CID, err := common.WriteOrderToIPFS(nodeID, s.Ipfs, s.Store, nodeID, order, recipientList)
 	if err != nil {
 		return nil, err
 	}
 
 	//Fullfill the order on the remote Server
 	request := &api.FulfillOrderRequest{
-		DocumentCID:   iDDocID,
+		DocumentCID:   nodeID,
 		OrderPart1CID: orderPart1CID,
 		Extension:     fulfillExtension,
 	}
@@ -157,11 +157,11 @@ func (s *Service) Order(req *api.OrderRequest) (*api.OrderResponse, error) {
 	}
 
 	//Get the updated order out of IPFS
-	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, iDDocID)
+	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
 	if err != nil {
 		return nil, err
 	}
-	updatedOrder, err := common.RetrieveOrderFromIPFS(s.Ipfs, response.OrderPart2CID, sikeSK, iDDocID, remoteIDDoc.BLSPublicKey)
+	updatedOrder, err := common.RetrieveOrderFromIPFS(s.Ipfs, response.OrderPart2CID, sikeSK, nodeID, remoteIDDoc.BLSPublicKey)
 	if err != nil {
 		return nil, errors.Wrap(err, "Fail to retrieve Order from IPFS")
 	}
@@ -291,8 +291,8 @@ func (s *Service) Order1(req *api.OrderRequest) (string, error) {
 
 	//Initialise values from Request object
 	beneficiaryIDDocumentCID := req.BeneficiaryIDDocumentCID
-	iDDocID := s.NodeID()
-	recipientList, err := common.BuildRecipientList(s.Ipfs, iDDocID, s.MasterFiduciaryNodeID())
+	nodeID := s.NodeID()
+	recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID, s.MasterFiduciaryNodeID())
 	if err != nil {
 		return "", err
 	}
@@ -303,7 +303,7 @@ func (s *Service) Order1(req *api.OrderRequest) (string, error) {
 	// }
 
 	//Create Order
-	order, err := common.CreateNewDepositOrder(beneficiaryIDDocumentCID, iDDocID)
+	order, err := common.CreateNewDepositOrder(beneficiaryIDDocumentCID, nodeID)
 	if err != nil {
 		return "", err
 	}
@@ -314,14 +314,14 @@ func (s *Service) Order1(req *api.OrderRequest) (string, error) {
 	}
 
 	//Write Order to IPFS
-	orderPart1CID, err := common.WriteOrderToIPFS(iDDocID, s.Ipfs, s.Store, iDDocID, order, recipientList)
+	orderPart1CID, err := common.WriteOrderToIPFS(nodeID, s.Ipfs, s.Store, nodeID, order, recipientList)
 	if err != nil {
 		return "", err
 	}
 
 	//Fullfill the order on the remote Server
 	request := &api.FulfillOrderRequest{
-		DocumentCID:   iDDocID,
+		DocumentCID:   nodeID,
 		OrderPart1CID: orderPart1CID,
 		Extension:     fulfillExtension,
 	}
@@ -331,8 +331,8 @@ func (s *Service) Order1(req *api.OrderRequest) (string, error) {
 	//Write the requests to the chain
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXFulfillRequest,
-		SenderID:    iDDocID,
-		RecipientID: s.MasterFiduciaryNodeID(),
+		SenderID:    nodeID,
+		RecipientID: []string{s.MasterFiduciaryNodeID(), nodeID},
 		Payload:     marshaledRequest,
 	}
 	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
@@ -349,8 +349,8 @@ func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
 
 	// //Initialise values from Request object
 	// beneficiaryIDDocumentCID := req.BeneficiaryIDDocumentCID
-	iDDocID := s.NodeID()
-	// recipientList, err := common.BuildRecipientList(s.Ipfs, iDDocID, s.MasterFiduciaryNodeID())
+	nodeID := s.NodeID()
+	// recipientList, err := common.BuildRecipientList(s.Ipfs, nodeID, s.MasterFiduciaryNodeID())
 	// if err != nil {
 	// 	return "", err
 	// }
@@ -361,7 +361,7 @@ func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
 	}
 
 	// //Create Order
-	// order, err := common.CreateNewDepositOrder(beneficiaryIDDocumentCID, iDDocID)
+	// order, err := common.CreateNewDepositOrder(beneficiaryIDDocumentCID, nodeID)
 	// if err != nil {
 	// 	return "", err
 	// }
@@ -372,14 +372,14 @@ func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
 	// }
 
 	// //Write Order to IPFS
-	// orderPart1CID, err := common.WriteOrderToIPFS(iDDocID, s.Ipfs, s.Store, iDDocID, order, recipientList)
+	// orderPart1CID, err := common.WriteOrderToIPFS(nodeID, s.Ipfs, s.Store, nodeID, order, recipientList)
 	// if err != nil {
 	// 	return "", err
 	// }
 
 	// //Fullfill the order on the remote Server
 	// request := &api.FulfillOrderRequest{
-	// 	DocumentCID:   iDDocID,
+	// 	DocumentCID:   nodeID,
 	// 	OrderPart1CID: orderPart1CID,
 	// 	Extension:     fulfillExtension,
 	// }
@@ -389,7 +389,7 @@ func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
 	// //Write the requests to the chain
 	// chainTX := &api.BlockChainTX{
 	// 	Type:        api.TXFullfullRequest,
-	// 	SenderID:    iDDocID,
+	// 	SenderID:    nodeID,
 	// 	RecipientID: s.MasterFiduciaryNodeID(),
 	// 	Payload:     marshaledRequest,
 	// }
@@ -403,11 +403,11 @@ func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
 	//  }
 
 	//Get the updated order out of IPFS
-	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, iDDocID)
+	_, _, _, sikeSK, err := common.RetrieveIdentitySecrets(s.Store, nodeID)
 	if err != nil {
 		return "", err
 	}
-	updatedOrder, err := common.RetrieveOrderFromIPFS(s.Ipfs, req.OrderPart2CID, sikeSK, iDDocID, 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")
 	}
@@ -429,11 +429,11 @@ func (s *Service) Order2(req *api.FulfillOrderResponse) (string, error) {
 	//Write the requests to the chain
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXOrderSecretResponse,
-		SenderID:    iDDocID,
-		RecipientID: s.MasterFiduciaryNodeID(),
+		SenderID:    nodeID,
+		RecipientID: []string{s.MasterFiduciaryNodeID(), nodeID},
 		Payload:     marshaledRequest,
+		Tags:        map[string]string{"reference": updatedOrder.Reference},
 	}
-	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
 	return tendermint.PostToChain(chainTX, "Order2")
 
 }
@@ -501,7 +501,7 @@ func (s *Service) OrderSecret1(req *api.OrderSecretRequest) (string, error) {
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXFulfillOrderSecretRequest,
 		SenderID:    nodeID,
-		RecipientID: s.MasterFiduciaryNodeID(),
+		RecipientID: []string{s.MasterFiduciaryNodeID(), nodeID},
 		Payload:     marshaledRequest,
 	}
 	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
@@ -556,7 +556,7 @@ func (s *Service) OrderSecret2(req *api.FulfillOrderSecretResponse) (string, err
 	chainTX := &api.BlockChainTX{
 		Processor:   api.TXOrderSecretResponse,
 		SenderID:    nodeID,
-		RecipientID: s.MasterFiduciaryNodeID(),
+		RecipientID: []string{s.MasterFiduciaryNodeID(), nodeID},
 		Payload:     marshaledRequest,
 	}
 	//curl --data-binary '{"jsonrpc":"2.0","id":"anything","method":"broadcast_tx_commit","params": {"tx": "YWFhcT1hYWFxCg=="}}' -H 'content-type:text/plain;' http://localhost:26657
diff --git a/pkg/endpoints/endpoints.go b/pkg/endpoints/endpoints.go
index d0c7b93..11c246b 100644
--- a/pkg/endpoints/endpoints.go
+++ b/pkg/endpoints/endpoints.go
@@ -89,24 +89,7 @@ func Endpoints(svc service.Service, corsAllow string, authorizer transport.Autho
 		},
 	}
 	principalEndpoints := transport.HTTPEndpoints{
-		"Order": {
-			Path:        "/" + apiVersion + "/order",
-			Method:      http.MethodPost,
-			Endpoint:    MakeOrderEndpoint(svc),
-			NewRequest:  func() interface{} { return &api.OrderRequest{} },
-			NewResponse: func() interface{} { return &api.OrderResponse{} },
-			Options: transport.ServerOptions(
-				transport.SetCors(corsAllow),
-				transport.AuthorizeOIDC(authorizer, false),
-			),
-			ErrStatus: transport.ErrorStatus{
-				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
-			},
-			// ErrStatus: transport.ErrorStatus{
-			// 	transport.ErrInvalidRequest:        http.StatusUnprocessableEntity,
-			// 	ErrCreatingOrderDoc: http.StatusInternalServerError,
-			// },
-		},
+
 		"Order1": {
 			Path:        "/" + apiVersion + "/order1",
 			Method:      http.MethodPost,
@@ -162,20 +145,6 @@ func Endpoints(svc service.Service, corsAllow string, authorizer transport.Autho
 				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
 			},
 		},
-		"OrderSecret": {
-			Path:        "/" + apiVersion + "/order/secret",
-			Method:      http.MethodPost,
-			Endpoint:    MakeOrderSecretEndpoint(svc),
-			NewRequest:  func() interface{} { return &api.OrderSecretRequest{} },
-			NewResponse: func() interface{} { return &api.OrderSecretResponse{} },
-			Options: transport.ServerOptions(
-				transport.SetCors(corsAllow),
-				transport.AuthorizeOIDC(authorizer, false),
-			),
-			ErrStatus: transport.ErrorStatus{
-				transport.ErrInvalidRequest: http.StatusUnprocessableEntity,
-			},
-		},
 		"OrderSecret1": {
 			Path:        "/" + apiVersion + "/order/secret1",
 			Method:      http.MethodPost,
@@ -355,20 +324,6 @@ func MakeGetOrderEndpoint(m service.Service) endpoint.Endpoint {
 	}
 }
 
-//MakeOrderEndpoint -
-func MakeOrderEndpoint(m service.Service) endpoint.Endpoint {
-	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
-		req, ok := request.(*api.OrderRequest)
-		if !ok {
-			return nil, transport.ErrInvalidRequest
-		}
-		if err := validateRequest(req); err != nil {
-			return "", err
-		}
-		return m.Order(req)
-	}
-}
-
 //MakeOrder1Endpoint -
 func MakeOrder1Endpoint(m service.Service) endpoint.Endpoint {
 	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
@@ -397,20 +352,6 @@ func MakeOrder2Endpoint(m service.Service) endpoint.Endpoint {
 	}
 }
 
-//MakeOrderSecretEndpoint -
-func MakeOrderSecretEndpoint(m service.Service) endpoint.Endpoint {
-	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
-		req, ok := request.(*api.OrderSecretRequest)
-		if !ok {
-			return nil, transport.ErrInvalidRequest
-		}
-		if err := validateRequest(req); err != nil {
-			return "", err
-		}
-		return m.OrderSecret(req)
-	}
-}
-
 //MakeOrderSecret1Endpoint -
 func MakeOrderSecret1Endpoint(m service.Service) endpoint.Endpoint {
 	return func(ctx context.Context, request interface{}) (response interface{}, err error) {
diff --git a/pkg/service/service.go b/pkg/service/service.go
index fafbff7..7dbb7c6 100644
--- a/pkg/service/service.go
+++ b/pkg/service/service.go
@@ -34,11 +34,9 @@ type Service interface {
 	OrderList(req *api.OrderListRequest) (*api.OrderListResponse, error)
 
 	//Order processing
-	OrderSecret(req *api.OrderSecretRequest) (*api.OrderSecretResponse, error)
 	OrderSecret1(req *api.OrderSecretRequest) (string, error)
 	OrderSecret2(req *api.FulfillOrderSecretResponse) (string, error)
 
-	Order(req *api.OrderRequest) (*api.OrderResponse, error)
 	Order1(req *api.OrderRequest) (string, error)
 	Order2(req *api.FulfillOrderResponse) (string, error)
 
diff --git a/pkg/tendermint/cmd/cmd b/pkg/tendermint/cmd/cmd
new file mode 100755
index 0000000..0e07c4f
Binary files /dev/null and b/pkg/tendermint/cmd/cmd differ
diff --git a/pkg/tendermint/cmd/tmget.go b/pkg/tendermint/cmd/tmget.go
new file mode 100644
index 0000000..7971666
--- /dev/null
+++ b/pkg/tendermint/cmd/tmget.go
@@ -0,0 +1,110 @@
+package main
+
+import (
+	"encoding/base64"
+	"encoding/hex"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"log"
+	"net/http"
+	"os"
+	"time"
+
+	"github.com/TylerBrock/colorjson"
+	"github.com/urfave/cli"
+)
+
+func main() {
+	app := cli.NewApp()
+	app.Name = "tmget"
+	app.Version = "0.1.0"
+	app.Compiled = time.Now()
+	app.Authors = []cli.Author{
+		cli.Author{
+			Name:  "Chris Morris",
+			Email: "chris@morris.net",
+		},
+	}
+	app.Copyright = "(c) 2019 Chris Morris"
+	app.UsageText = `tmget tag search [url]
+eg. tmget tag.recipient=Nzw3127EaxPiiZahOH592sGhPnCPaYkzOSqEk 127.0.0.1:5556
+    tmget tx Nzw3127EaxPiiZahOH592sGhPnCPaYkzOSqEk`
+
+	app.Usage = `retrieve and parse a transaction in the Qredo DT-A Format from a Tendermint Blockchain
+Note tags are case sensistive
+Qredo DT-A uses:
+  tag.recipient
+  tag.senderid
+  tag.reference
+  tx
+
+`
+
+	app.ArgsUsage = "tx"
+
+	app.Action = func(c *cli.Context) error {
+		tag := c.Args().Get(0)
+		lookup := "'" + c.Args().Get(1) + "'"
+
+		url := c.Args().Get(2)
+		//curl "localhost:26657/tx_search?query=\"tag.name='matts'\"&prove=true"
+		if url == "" {
+			url = "localhost:26657"
+		}
+		if len(c.Args()) == 0 {
+			print(app.UsageText)
+			return nil
+		}
+
+		fullUrl := "http://" + url + "/tx_search?query=\"" + tag + "=" + lookup + "\""
+		print(fullUrl)
+
+		resp, err := http.Get(fullUrl)
+		if err != nil {
+			// handle error
+		}
+		defer resp.Body.Close()
+		body, err := ioutil.ReadAll(resp.Body)
+
+		txResponse, err := UnmarshalFetchTxResponse([]byte(body))
+
+		txs := txResponse.Result.Txs
+		for r1, v := range txs {
+			for r2, v1 := range v.TxResult.Events {
+				for r3, v2 := range v1.Attributes {
+					newkey, _ := base64.StdEncoding.DecodeString(v2.Key)
+					txResponse.Result.Txs[r1].TxResult.Events[r2].Attributes[r3].Key = string(newkey)
+					newval, _ := base64.StdEncoding.DecodeString(v2.Value)
+					txResponse.Result.Txs[r1].TxResult.Events[r2].Attributes[r3].Value = string(newval)
+
+					if string(newkey) == "key" {
+						txResponse.Result.Txs[r1].TxResult.Events[r2].Attributes[r3].Value = hex.EncodeToString(newval)
+					}
+				}
+			}
+		}
+
+		x, err := txResponse.Marshal()
+
+		var obj map[string]interface{}
+		json.Unmarshal(x, &obj)
+
+		//print(string(x))
+
+		// Make a custom formatter with indent set
+		f := colorjson.NewFormatter()
+		f.Indent = 4
+
+		// Marshall the Colorized JSON
+		s, _ := f.Marshal(obj)
+		fmt.Println(string(s))
+
+		return nil
+	}
+
+	err := app.Run(os.Args)
+	if err != nil {
+		log.Fatal(err)
+	}
+}
diff --git a/pkg/tendermint/cmd/transactions.go b/pkg/tendermint/cmd/transactions.go
new file mode 100644
index 0000000..2b68658
--- /dev/null
+++ b/pkg/tendermint/cmd/transactions.go
@@ -0,0 +1,60 @@
+package main
+
+import "encoding/json"
+
+func UnmarshalFetchTxResponse(data []byte) (FetchTxResponse, error) {
+	var r FetchTxResponse
+	err := json.Unmarshal(data, &r)
+	return r, err
+}
+
+func (r *FetchTxResponse) Marshal() ([]byte, error) {
+	return json.Marshal(r)
+}
+
+func UnmarshalAttribute(data []byte) (Attribute, error) {
+	var r Attribute
+	print("hello")
+	err := json.Unmarshal(data, &r)
+	return r, err
+}
+
+type FetchTxResponse struct {
+	ID      string `json:"id"`
+	Jsonrpc string `json:"jsonrpc"`
+	Result  Result `json:"result"`
+}
+
+type Result struct {
+	TotalCount string `json:"total_count"`
+	Txs        []Tx   `json:"txs"`
+}
+
+type Tx struct {
+	Hash     string   `json:"hash"`
+	Height   string   `json:"height"`
+	Index    int64    `json:"index"`
+	Tx       string   `json:"tx"`
+	TxResult TxResult `json:"tx_result"`
+}
+
+type TxResult struct {
+	Code      int64       `json:"code"`
+	Codespace string      `json:"codespace"`
+	Data      interface{} `json:"data"`
+	Events    []Event     `json:"events"`
+	GasUsed   string      `json:"gasUsed"`
+	GasWanted string      `json:"gasWanted"`
+	Info      string      `json:"info"`
+	Log       string      `json:"log"`
+}
+
+type Event struct {
+	Attributes []Attribute `json:"attributes"`
+	Type       string      `json:"type"`
+}
+
+type Attribute struct {
+	Key   string `json:"key"`
+	Value string `json:"value"`
+}
diff --git a/pkg/tendermint/config.go b/pkg/tendermint/config.go
index a113a5f..6d20001 100644
--- a/pkg/tendermint/config.go
+++ b/pkg/tendermint/config.go
@@ -1,7 +1,5 @@
-
 package tendermint
 
-
 const (
-	node = "3.248.201.10:26657"
-)
\ No newline at end of file
+	node = "127.0.0.1:26657"
+)
diff --git a/pkg/tendermint/tendermint.go b/pkg/tendermint/tendermint.go
index cd4447f..3d34f36 100644
--- a/pkg/tendermint/tendermint.go
+++ b/pkg/tendermint/tendermint.go
@@ -40,14 +40,19 @@ func QueryChain(index string) (string, string) {
 }
 
 //PostToChain - send TX data to the Blockchain
-func PostToChain(payload *api.BlockChainTX, method string) (string, error) {
-	serializedTX, _ := json.Marshal(payload)
-	TXID := sha256.Sum256(serializedTX)
+func PostToChain(tx *api.BlockChainTX, method string) (string, error) {
+	//Create TX Hash
+
+	tx.RecipientID = unique(tx.RecipientID)
+
+	TXID := sha256.Sum256(tx.Payload)
 	TXIDhex := hex.EncodeToString(TXID[:])
-	fullTx := fmt.Sprintf("%s=%s", TXIDhex, string(serializedTX))
+	tx.TXhash = TXID[:]
+
+	//serialize the whole transaction
+	serializedTX, _ := json.Marshal(tx)
+	base64EncodedTX := base64.StdEncoding.EncodeToString(serializedTX)
 
-	//fmt.Printf(" **** %s Block TX: %s\n", method, TXIDhex)
-	base64EncodedTX := base64.StdEncoding.EncodeToString([]byte(fullTx))
 	body := strings.NewReader("{\"jsonrpc\":\"2.0\",\"id\":\"anything\",\"method\":\"broadcast_tx_commit\",\"params\": {\"tx\": \"" + base64EncodedTX + "\"}}")
 	req, err := http.NewRequest("POST", "http://"+node+"", body)
 	if err != nil {
@@ -62,6 +67,7 @@ func PostToChain(payload *api.BlockChainTX, method string) (string, error) {
 		return "", err
 	}
 	defer resp.Body.Close()
+	fmt.Printf("POST TO CHAIN: METHOD:%s CALLS:%s  - TXID:%s", method, tx.Processor, TXIDhex)
 	return TXIDhex, nil
 }
 
@@ -171,3 +177,15 @@ func ProcessTransactionID(txid string) {
 		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/websockets.go b/pkg/tendermint/websockets.go
index ddc9722..145374e 100644
--- a/pkg/tendermint/websockets.go
+++ b/pkg/tendermint/websockets.go
@@ -2,17 +2,20 @@ package tendermint
 
 import (
 	"context"
+	"encoding/hex"
+	"encoding/json"
 	"os"
 	"os/signal"
 	"syscall"
 
 	"github.com/apache/incubator-milagro-dta/libs/logger"
+	"github.com/apache/incubator-milagro-dta/pkg/api"
 	tmclient "github.com/tendermint/tendermint/rpc/client"
 	tmtypes "github.com/tendermint/tendermint/types"
 )
 
 //Subscribe - Connect to the Tendermint websocket to collect events
-func Subscribe(logger *logger.Logger) error {
+func Subscribe(logger *logger.Logger, nodeID string) error {
 
 	//tmlogger := log2.NewTMLogger(log.NewSyncWriter(os.Stdout))
 
@@ -25,7 +28,9 @@ func Subscribe(logger *logger.Logger) error {
 	}
 	defer client.Stop()
 
-	query := "tm.event = 'Tx'"
+	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)
@@ -41,16 +46,35 @@ func Subscribe(logger *logger.Logger) error {
 		select {
 		case result := <-out:
 			tx := result.Data.(tmtypes.EventDataTx).Tx
-			blockchainTX, txid, err := decodeTX(string(tx))
-			logger.Info("Incoming TX %s", txid)
+			payload := api.BlockChainTX{}
+			err := json.Unmarshal(tx, &payload)
 			if err != nil {
-				logger.Info("Invalid Incoming Transaction %s - %s:", err, string(tx))
+				logger.Info("******** Invalid TX - ignored")
+				break
+			}
+
+			//check is receipient
+			isRecipient := false
+			for _, v := range payload.RecipientID {
+				if v == nodeID {
+					isRecipient = true
+					break
+				}
+			}
 
+			if isRecipient == false {
+				logger.Info("******** Invalid Recipient - why are we receiving this TX?")
+				break
 			}
-			if blockchainTX.Processor == "NONE" {
-				DumpTX(blockchainTX)
+
+			//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(blockchainTX)
+				callNextTX(&payload)
 			}
 
 			//print(blockchainTX)


[incubator-milagro-dta] 05/11: Add OrderBeneficaryType to order protobuffer

Posted by cm...@apache.org.
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 4dc8aa0692bac2973a5c3d50a09a2fc735790db0
Author: Christopher Morris <ch...@morris.net>
AuthorDate: Mon Sep 23 09:49:51 2019 +0100

    Add OrderBeneficaryType to order protobuffer
---
 cmd/service/__debug_bin             | Bin 0 -> 42684380 bytes
 cmd/servicetester/e2e_test.sh       |   3 +
 cmd/servicetester/fulltest.sh       |   3 +-
 libs/documents/docs.pb.go           | 188 ++++++++++++++++++++++--------------
 libs/documents/docs.proto           |  26 +++--
 libs/documents/docs.validator.pb.go |   6 +-
 pkg/bitcoinplugin/helpers.go        |  42 ++++----
 pkg/bitcoinplugin/service.go        |   2 +-
 pkg/common/common.go                |   7 ++
 pkg/defaultservice/order.go         |   9 +-
 10 files changed, 176 insertions(+), 110 deletions(-)

diff --git a/cmd/service/__debug_bin b/cmd/service/__debug_bin
new file mode 100755
index 0000000..e894d4c
Binary files /dev/null and b/cmd/service/__debug_bin differ
diff --git a/cmd/servicetester/e2e_test.sh b/cmd/servicetester/e2e_test.sh
index 8ed21f3..678b364 100755
--- a/cmd/servicetester/e2e_test.sh
+++ b/cmd/servicetester/e2e_test.sh
@@ -9,6 +9,9 @@ apiURL="${1:-$defaultURL}"
 status () {
   #Determine if an extension is running
   statusOutput=$(curl -s -X GET "$apiURL/$apiVersion/status" -H "accept: */*" -H "Content-Type: application/json")
+
+echo "$apiURL/$apiVersion/status"
+
   identity=$(echo $statusOutput | jq .nodeCID)
   extensionVendor=$(echo $statusOutput | jq -r .extensionVendor)
   plugin=$(echo $statusOutput | jq -r .plugin)
diff --git a/cmd/servicetester/fulltest.sh b/cmd/servicetester/fulltest.sh
index fb75a10..9096052 100755
--- a/cmd/servicetester/fulltest.sh
+++ b/cmd/servicetester/fulltest.sh
@@ -28,9 +28,10 @@ test_plugin () {
     cd ../..
     start_server $1
     popd 
-    ./e2e_test.sh > /dev/null
+    ./e2e_test.sh #> /dev/null
     res=$?
     report "$1" $res 
+    
     kill -s int $pid
 }
 
diff --git a/libs/documents/docs.pb.go b/libs/documents/docs.pb.go
index bb74de9..9d1de4d 100644
--- a/libs/documents/docs.pb.go
+++ b/libs/documents/docs.pb.go
@@ -22,6 +22,34 @@ var _ = math.Inf
 // proto package needs to be updated.
 const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 
+type OrderDocument_OrderBeneficiaryType int32
+
+const (
+	OrderDocument_Unspecified                  OrderDocument_OrderBeneficiaryType = 0
+	OrderDocument_Beneficiary_Known_at_start   OrderDocument_OrderBeneficiaryType = 1
+	OrderDocument_Beneficiary_Unknown_at_Start OrderDocument_OrderBeneficiaryType = 2
+)
+
+var OrderDocument_OrderBeneficiaryType_name = map[int32]string{
+	0: "Unspecified",
+	1: "Beneficiary_Known_at_start",
+	2: "Beneficiary_Unknown_at_Start",
+}
+
+var OrderDocument_OrderBeneficiaryType_value = map[string]int32{
+	"Unspecified":                  0,
+	"Beneficiary_Known_at_start":   1,
+	"Beneficiary_Unknown_at_Start": 2,
+}
+
+func (x OrderDocument_OrderBeneficiaryType) String() string {
+	return proto.EnumName(OrderDocument_OrderBeneficiaryType_name, int32(x))
+}
+
+func (OrderDocument_OrderBeneficiaryType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_2a25dace11219bce, []int{5, 0}
+}
+
 type SignedEnvelope struct {
 	Signature            []byte   `protobuf:"bytes,1,opt,name=Signature,proto3" json:"Signature,omitempty"`
 	SignerCID            string   `protobuf:"bytes,2,opt,name=SignerCID,proto3" json:"SignerCID,omitempty"`
@@ -386,18 +414,19 @@ func (m *IDDocument) GetTimestamp() int64 {
 }
 
 type OrderDocument struct {
-	Type                 string      `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"`
-	Coin                 int64       `protobuf:"varint,2,opt,name=Coin,proto3" json:"Coin,omitempty"`
-	PrincipalCID         string      `protobuf:"bytes,3,opt,name=PrincipalCID,proto3" json:"PrincipalCID,omitempty"`
-	BeneficiaryCID       string      `protobuf:"bytes,4,opt,name=BeneficiaryCID,proto3" json:"BeneficiaryCID,omitempty"`
-	Reference            string      `protobuf:"bytes,5,opt,name=Reference,proto3" json:"Reference,omitempty"`
-	Timestamp            int64       `protobuf:"varint,6,opt,name=Timestamp,proto3" json:"Timestamp,omitempty"`
-	OrderPart2           *OrderPart2 `protobuf:"bytes,7,opt,name=OrderPart2,proto3" json:"OrderPart2,omitempty"`
-	OrderPart3           *OrderPart3 `protobuf:"bytes,8,opt,name=OrderPart3,proto3" json:"OrderPart3,omitempty"`
-	OrderPart4           *OrderPart4 `protobuf:"bytes,9,opt,name=OrderPart4,proto3" json:"OrderPart4,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
-	XXX_unrecognized     []byte      `json:"-"`
-	XXX_sizecache        int32       `json:"-"`
+	Type                 string                             `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"`
+	BeneficiaryType      OrderDocument_OrderBeneficiaryType `protobuf:"varint,2,opt,name=BeneficiaryType,proto3,enum=documents.OrderDocument_OrderBeneficiaryType" json:"BeneficiaryType,omitempty"`
+	Coin                 int64                              `protobuf:"varint,3,opt,name=Coin,proto3" json:"Coin,omitempty"`
+	PrincipalCID         string                             `protobuf:"bytes,4,opt,name=PrincipalCID,proto3" json:"PrincipalCID,omitempty"`
+	BeneficiaryCID       string                             `protobuf:"bytes,5,opt,name=BeneficiaryCID,proto3" json:"BeneficiaryCID,omitempty"`
+	Reference            string                             `protobuf:"bytes,6,opt,name=Reference,proto3" json:"Reference,omitempty"`
+	Timestamp            int64                              `protobuf:"varint,7,opt,name=Timestamp,proto3" json:"Timestamp,omitempty"`
+	OrderPart2           *OrderPart2                        `protobuf:"bytes,8,opt,name=OrderPart2,proto3" json:"OrderPart2,omitempty"`
+	OrderPart3           *OrderPart3                        `protobuf:"bytes,9,opt,name=OrderPart3,proto3" json:"OrderPart3,omitempty"`
+	OrderPart4           *OrderPart4                        `protobuf:"bytes,10,opt,name=OrderPart4,proto3" json:"OrderPart4,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
+	XXX_unrecognized     []byte                             `json:"-"`
+	XXX_sizecache        int32                              `json:"-"`
 }
 
 func (m *OrderDocument) Reset()         { *m = OrderDocument{} }
@@ -432,6 +461,13 @@ func (m *OrderDocument) GetType() string {
 	return ""
 }
 
+func (m *OrderDocument) GetBeneficiaryType() OrderDocument_OrderBeneficiaryType {
+	if m != nil {
+		return m.BeneficiaryType
+	}
+	return OrderDocument_Unspecified
+}
+
 func (m *OrderDocument) GetCoin() int64 {
 	if m != nil {
 		return m.Coin
@@ -826,6 +862,7 @@ func (m *SimpleString) GetContent() string {
 }
 
 func init() {
+	proto.RegisterEnum("documents.OrderDocument_OrderBeneficiaryType", OrderDocument_OrderBeneficiaryType_name, OrderDocument_OrderBeneficiaryType_value)
 	proto.RegisterType((*SignedEnvelope)(nil), "documents.SignedEnvelope")
 	proto.RegisterType((*Envelope)(nil), "documents.Envelope")
 	proto.RegisterType((*Header)(nil), "documents.Header")
@@ -844,65 +881,70 @@ func init() {
 func init() { proto.RegisterFile("docs.proto", fileDescriptor_2a25dace11219bce) }
 
 var fileDescriptor_2a25dace11219bce = []byte{
-	// 956 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0x4f, 0x6f, 0x1b, 0x45,
-	0x14, 0xd7, 0xda, 0x8e, 0x13, 0xbf, 0xb8, 0x21, 0x9d, 0x26, 0xed, 0xaa, 0x20, 0x12, 0xad, 0x22,
-	0x64, 0x24, 0xe2, 0x10, 0xdb, 0x8d, 0x20, 0x42, 0x42, 0xd8, 0x0e, 0x60, 0xf1, 0xcf, 0x8c, 0xa3,
-	0x08, 0xa9, 0x6a, 0xa5, 0xc9, 0xee, 0x8b, 0x33, 0xaa, 0x77, 0x67, 0xb5, 0x3b, 0x4e, 0xb1, 0x80,
-	0x33, 0x07, 0x8e, 0x9c, 0xb9, 0x20, 0xf5, 0xca, 0x11, 0xbe, 0x00, 0x47, 0xbe, 0x43, 0x44, 0x0e,
-	0x20, 0xbe, 0x01, 0x37, 0xd0, 0xcc, 0xfe, 0x0f, 0x71, 0x93, 0x03, 0x52, 0x7d, 0x9a, 0xf7, 0x7e,
-	0xef, 0xf7, 0xe6, 0xfd, 0x1d, 0x2f, 0x80, 0x23, 0xec, 0xb0, 0xe9, 0x07, 0x42, 0x0a, 0x52, 0x73,
-	0x84, 0x3d, 0x75, 0xd1, 0x93, 0xe1, 0xfd, 0xbd, 0x31, 0x97, 0xa7, 0xd3, 0xe3, 0xa6, 0x2d, 0xdc,
-	0x1d, 0xf7, 0x29, 0x97, 0x4f, 0xc4, 0xd3, 0x9d, 0xb1, 0xd8, 0xd6, 0x76, 0xdb, 0x67, 0x6c, 0xc2,
-	0x1d, 0x26, 0x45, 0x10, 0xee, 0xa4, 0xc7, 0xc8, 0xc5, 0xfd, 0xed, 0x1c, 0x6f, 0x2c, 0xc6, 0x62,
-	0x47, 0xab, 0x8f, 0xa7, 0x27, 0x5a, 0xd2, 0x82, 0x3e, 0x45, 0xe6, 0xd6, 0x77, 0x06, 0xac, 0x8c,
-	0xf8, 0xd8, 0x43, 0xe7, 0xc0, 0x3b, 0xc3, 0x89, 0xf0, 0x91, 0x6c, 0x41, 0x4d, 0x69, 0x98, 0x9c,
-	0x06, 0x68, 0x1a, 0x9b, 0x46, 0xa3, 0xde, 0xad, 0x5e, 0x9c, 0x6f, 0x94, 0xfc, 0x35, 0x9a, 0x01,
-	0xe4, 0xed, 0xc8, 0x0a, 0x83, 0xde, 0xa0, 0x6f, 0x96, 0x36, 0x8d, 0x46, 0xad, 0xfb, 0xf2, 0xc5,
-	0xf9, 0xc6, 0x3d, 0x58, 0x7f, 0xfc, 0xf9, 0xc3, 0x87, 0xfb, 0x6c, 0xe2, 0x4d, 0xdd, 0xfd, 0x47,
-	0x8f, 0xbe, 0xea, 0x3c, 0xf8, 0x66, 0xeb, 0xeb, 0xc7, 0x5b, 0x34, 0xb3, 0x26, 0x26, 0x2c, 0x7e,
-	0x82, 0x61, 0xc8, 0xc6, 0x68, 0x96, 0x95, 0x7b, 0x9a, 0x88, 0x96, 0x80, 0xa5, 0x34, 0x8c, 0xd7,
-	0xa1, 0xfa, 0x21, 0x32, 0x07, 0x03, 0x1d, 0xc3, 0x72, 0xeb, 0x76, 0x33, 0x2d, 0x4e, 0x33, 0x02,
-	0x68, 0x6c, 0x40, 0x08, 0x54, 0xba, 0xc2, 0x99, 0xe9, 0x30, 0xea, 0x54, 0x9f, 0xc9, 0x16, 0xdc,
-	0x3a, 0xf0, 0xec, 0x60, 0xe6, 0x4b, 0x74, 0x34, 0x18, 0x5d, 0x55, 0x54, 0x5a, 0x3f, 0x96, 0x93,
-	0x5b, 0xc8, 0x5d, 0xa8, 0x0e, 0x86, 0xef, 0x8f, 0x06, 0x7d, 0x7d, 0x5f, 0x8d, 0xc6, 0x92, 0x8a,
-	0xf6, 0x08, 0x83, 0x90, 0x0b, 0x4f, 0xfb, 0x2f, 0xd1, 0x44, 0x24, 0x6f, 0xc0, 0x52, 0x9f, 0x49,
-	0x3c, 0xe4, 0x6e, 0x94, 0x48, 0xb9, 0xbb, 0x7a, 0x71, 0xbe, 0x51, 0x5f, 0x7d, 0xf6, 0xed, 0x1f,
-	0x7f, 0x2d, 0x98, 0xcf, 0x7e, 0xfd, 0xf9, 0xfb, 0x19, 0x4d, 0x2d, 0xc8, 0x26, 0x2c, 0x0f, 0x03,
-	0x3c, 0xe3, 0x62, 0x1a, 0xaa, 0x92, 0x55, 0xf4, 0x25, 0x79, 0x15, 0xb1, 0xa0, 0xae, 0x82, 0x3a,
-	0x9c, 0xf9, 0xd8, 0x13, 0x0e, 0x9a, 0x0b, 0xfa, 0xba, 0x82, 0x4e, 0x79, 0x51, 0x72, 0x12, 0x51,
-	0x55, 0x9b, 0xe4, 0x55, 0xa4, 0x03, 0xeb, 0x85, 0x1c, 0x53, 0x77, 0x8b, 0xda, 0xf6, 0x6a, 0x90,
-	0xb4, 0x60, 0xad, 0x00, 0x24, 0x17, 0x2c, 0x69, 0xd2, 0x95, 0x18, 0x69, 0xc0, 0x4b, 0x05, 0xfd,
-	0xe0, 0xc8, 0xac, 0xe9, 0x22, 0x5f, 0x56, 0x93, 0x77, 0x00, 0x28, 0xda, 0xdc, 0xe7, 0xaa, 0x7b,
-	0x26, 0x6c, 0x96, 0x1b, 0xcb, 0xad, 0xb5, 0x5c, 0x3f, 0x53, 0x30, 0x9a, 0xb4, 0xd3, 0x35, 0x9a,
-	0xb3, 0xb7, 0x7e, 0x32, 0xa0, 0x96, 0x8a, 0xf9, 0x7e, 0x18, 0xc5, 0x7e, 0x6c, 0x43, 0xf9, 0x86,
-	0xc3, 0xa8, 0xec, 0xe2, 0xf0, 0x99, 0x1f, 0x4e, 0x27, 0x4c, 0xa2, 0xf3, 0x11, 0x26, 0x33, 0x72,
-	0x59, 0x4d, 0x5e, 0x05, 0xe8, 0x71, 0xff, 0x14, 0x83, 0x43, 0xfc, 0x52, 0xea, 0xce, 0xd5, 0x69,
-	0x4e, 0x43, 0x56, 0xa0, 0x34, 0x38, 0xd2, 0xed, 0xaa, 0xd3, 0xd2, 0xe0, 0xc8, 0xfa, 0xdb, 0x00,
-	0x18, 0xf4, 0xfb, 0x71, 0x7a, 0xe4, 0x2d, 0xb8, 0xf7, 0xde, 0x54, 0x9e, 0xa2, 0x27, 0xb9, 0xcd,
-	0x24, 0x17, 0x1e, 0xc5, 0x13, 0x0c, 0xd0, 0xb3, 0x31, 0x1e, 0xb5, 0x79, 0x30, 0xd9, 0x83, 0xbb,
-	0x5d, 0xf4, 0xf0, 0x84, 0xdb, 0x9c, 0x05, 0xb3, 0x83, 0xde, 0x70, 0x7a, 0x3c, 0xe1, 0xb6, 0x8a,
-	0x34, 0x1a, 0xf5, 0x39, 0xa8, 0x1a, 0xfe, 0x11, 0x7f, 0x82, 0x99, 0x79, 0x3c, 0xfc, 0x05, 0xa5,
-	0x9e, 0xb7, 0x8f, 0x47, 0x99, 0x51, 0x94, 0x58, 0x41, 0x47, 0x9a, 0x50, 0x53, 0xd3, 0x1b, 0x4a,
-	0xe6, 0xfa, 0x3a, 0xc3, 0xab, 0x86, 0x3c, 0x33, 0xb1, 0x7e, 0x2b, 0xc3, 0xad, 0xcf, 0x02, 0x07,
-	0x83, 0x34, 0x7b, 0x02, 0x15, 0x35, 0x65, 0x71, 0xaa, 0xfa, 0x4c, 0x5e, 0x83, 0x4a, 0x4f, 0xf0,
-	0x68, 0xa1, 0xca, 0x5d, 0x72, 0x71, 0xbe, 0xb1, 0xb2, 0xfa, 0x4f, 0xf2, 0x33, 0xcc, 0x3f, 0x17,
-	0xa9, 0xc6, 0xc9, 0xbb, 0x50, 0x1f, 0x06, 0xdc, 0xb3, 0xb9, 0xcf, 0x26, 0xaa, 0xb5, 0xe5, 0xeb,
-	0x5b, 0x5b, 0x20, 0x90, 0x1e, 0xac, 0xe4, 0x4a, 0x94, 0xee, 0xdd, 0xf3, 0x5d, 0x5c, 0xa2, 0xa8,
-	0x07, 0x31, 0xeb, 0xd8, 0x82, 0xe6, 0xeb, 0x31, 0xfd, 0xc2, 0xa0, 0x19, 0x50, 0xac, 0x54, 0xf5,
-	0xda, 0x4a, 0x91, 0x07, 0x00, 0xba, 0x50, 0x43, 0x16, 0xc8, 0x96, 0x5e, 0xce, 0xe5, 0xd6, 0x7a,
-	0x6e, 0x27, 0x32, 0x90, 0xe6, 0x0c, 0x0b, 0xb4, 0xb6, 0x5e, 0xcf, 0x39, 0xb4, 0x76, 0x8e, 0xd6,
-	0x2e, 0xd0, 0x3a, 0x7a, 0x4d, 0xe7, 0xd0, 0x3a, 0x39, 0x5a, 0xc7, 0xfa, 0xc5, 0xc8, 0x47, 0x49,
-	0xde, 0x84, 0x3b, 0x3d, 0xe1, 0xba, 0x5c, 0x2a, 0x52, 0x36, 0x38, 0x51, 0x6b, 0xaf, 0x82, 0xc8,
-	0x07, 0xb0, 0x9a, 0x3c, 0x71, 0xda, 0xcf, 0x0d, 0x17, 0xf4, 0x3f, 0xa4, 0x62, 0x79, 0xcb, 0xd7,
-	0x0f, 0xe2, 0xef, 0xf9, 0xc8, 0xdb, 0x6a, 0x85, 0x29, 0x3a, 0xe8, 0xfa, 0x32, 0x79, 0x38, 0x6a,
-	0x34, 0xa7, 0xf9, 0xff, 0xe2, 0xdc, 0x07, 0x33, 0xbf, 0x94, 0xc9, 0x43, 0xd8, 0x67, 0x92, 0xc5,
-	0x5b, 0x38, 0x17, 0x2f, 0xe6, 0x58, 0xb9, 0x3e, 0xc7, 0x1f, 0xf2, 0x39, 0x76, 0xd4, 0x3f, 0xd8,
-	0x08, 0xed, 0x00, 0x65, 0xf2, 0x0f, 0x16, 0x49, 0x2f, 0xae, 0x07, 0x7b, 0x50, 0x1d, 0x8a, 0x09,
-	0xb7, 0x67, 0xcf, 0x79, 0xb4, 0x09, 0x54, 0x3e, 0x65, 0x2e, 0x46, 0x01, 0x51, 0x7d, 0xb6, 0x76,
-	0xe1, 0xf6, 0x70, 0xc2, 0xb8, 0x77, 0x88, 0xa1, 0x8c, 0x3f, 0x0d, 0x76, 0xc9, 0x2b, 0x50, 0x53,
-	0xa0, 0xc4, 0x50, 0xee, 0xc6, 0x09, 0x66, 0x0a, 0xab, 0x0d, 0x77, 0xe2, 0x5a, 0xce, 0x23, 0xb5,
-	0x2e, 0x93, 0x5a, 0x56, 0x03, 0xea, 0x23, 0xee, 0xfa, 0x13, 0x1c, 0xc9, 0x80, 0x7b, 0x63, 0x15,
-	0x65, 0x4f, 0x78, 0x12, 0xbd, 0xa4, 0x82, 0x89, 0x78, 0x5c, 0xd5, 0x5f, 0x4b, 0xed, 0x7f, 0x03,
-	0x00, 0x00, 0xff, 0xff, 0x54, 0x80, 0x91, 0x77, 0xad, 0x09, 0x00, 0x00,
+	// 1035 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0xcf, 0x6e, 0x23, 0xc5,
+	0x13, 0xfe, 0x8d, 0xed, 0x38, 0x71, 0xc5, 0x9b, 0x78, 0x7b, 0x93, 0xdd, 0x51, 0x7e, 0xab, 0x4d,
+	0x34, 0x8a, 0x50, 0x90, 0x48, 0x42, 0x6c, 0x6f, 0x04, 0x11, 0x12, 0x22, 0x76, 0x00, 0x6b, 0xf9,
+	0x63, 0xc6, 0xd9, 0x80, 0xb4, 0xda, 0x8d, 0x26, 0x33, 0x15, 0xa7, 0x15, 0x4f, 0xf7, 0x68, 0xa6,
+	0x9d, 0x60, 0x01, 0x67, 0x0e, 0x5c, 0x90, 0x38, 0x73, 0x41, 0xda, 0x2b, 0x47, 0x78, 0x01, 0xde,
+	0x23, 0x22, 0x07, 0x10, 0x6f, 0xc0, 0x0d, 0xd4, 0x3d, 0x33, 0x76, 0x8f, 0xb1, 0x37, 0x7b, 0x40,
+	0xc2, 0xa7, 0xae, 0xfa, 0xbe, 0xaa, 0xae, 0xea, 0xfa, 0xba, 0xc7, 0x00, 0x1e, 0x77, 0xa3, 0xad,
+	0x20, 0xe4, 0x82, 0x93, 0x92, 0xc7, 0xdd, 0xbe, 0x8f, 0x4c, 0x44, 0x2b, 0xbb, 0x5d, 0x2a, 0xce,
+	0xfa, 0x27, 0x5b, 0x2e, 0xf7, 0xb7, 0xfd, 0x4b, 0x2a, 0xce, 0xf9, 0xe5, 0x76, 0x97, 0x6f, 0x2a,
+	0xde, 0xe6, 0x85, 0xd3, 0xa3, 0x9e, 0x23, 0x78, 0x18, 0x6d, 0x0f, 0x97, 0x71, 0x8a, 0x95, 0x4d,
+	0x2d, 0xae, 0xcb, 0xbb, 0x7c, 0x5b, 0xb9, 0x4f, 0xfa, 0xa7, 0xca, 0x52, 0x86, 0x5a, 0xc5, 0x74,
+	0xeb, 0x1b, 0x03, 0x16, 0x3a, 0xb4, 0xcb, 0xd0, 0x3b, 0x60, 0x17, 0xd8, 0xe3, 0x01, 0x92, 0x75,
+	0x28, 0x49, 0x8f, 0x23, 0xfa, 0x21, 0x9a, 0xc6, 0x9a, 0xb1, 0x51, 0xde, 0x2f, 0x5e, 0x5f, 0xad,
+	0xe6, 0x82, 0x25, 0x7b, 0x04, 0x90, 0x37, 0x63, 0x16, 0x86, 0x8d, 0x56, 0xd3, 0xcc, 0xad, 0x19,
+	0x1b, 0xa5, 0xfd, 0xff, 0x5f, 0x5f, 0xad, 0xde, 0x83, 0xe5, 0x67, 0x9f, 0x3c, 0x79, 0xb2, 0xe7,
+	0xf4, 0x58, 0xdf, 0xdf, 0x7b, 0xfa, 0xf4, 0x8b, 0xfa, 0xc3, 0xaf, 0xd6, 0xbf, 0x7c, 0xb6, 0x6e,
+	0x8f, 0xd8, 0xc4, 0x84, 0xd9, 0x0f, 0x31, 0x8a, 0x9c, 0x2e, 0x9a, 0x79, 0x99, 0xde, 0x4e, 0x4d,
+	0x8b, 0xc3, 0xdc, 0xb0, 0x8c, 0x57, 0xa1, 0xf8, 0x3e, 0x3a, 0x1e, 0x86, 0xaa, 0x86, 0xf9, 0xea,
+	0xed, 0xad, 0xe1, 0xe1, 0x6c, 0xc5, 0x80, 0x9d, 0x10, 0x08, 0x81, 0xc2, 0x3e, 0xf7, 0x06, 0xaa,
+	0x8c, 0xb2, 0xad, 0xd6, 0x64, 0x1d, 0x6e, 0x1d, 0x30, 0x37, 0x1c, 0x04, 0x02, 0x3d, 0x05, 0xc6,
+	0x5b, 0x65, 0x9d, 0xd6, 0x0f, 0xf9, 0x74, 0x17, 0x72, 0x17, 0x8a, 0xad, 0xf6, 0xbb, 0x9d, 0x56,
+	0x53, 0xed, 0x57, 0xb2, 0x13, 0x4b, 0x56, 0x7b, 0x84, 0x61, 0x44, 0x39, 0x53, 0xf9, 0x73, 0x76,
+	0x6a, 0x92, 0xd7, 0x60, 0xae, 0xe9, 0x08, 0x3c, 0xa4, 0x7e, 0xdc, 0x48, 0x7e, 0xbf, 0x72, 0x7d,
+	0xb5, 0x5a, 0xae, 0x3c, 0xff, 0xfa, 0xb7, 0x3f, 0x66, 0xcc, 0xe7, 0xbf, 0xfc, 0xf4, 0xdd, 0xc0,
+	0x1e, 0x32, 0xc8, 0x1a, 0xcc, 0xb7, 0x43, 0xbc, 0xa0, 0xbc, 0x1f, 0xc9, 0x23, 0x2b, 0xa8, 0x4d,
+	0x74, 0x17, 0xb1, 0xa0, 0x2c, 0x8b, 0x3a, 0x1c, 0x04, 0xd8, 0xe0, 0x1e, 0x9a, 0x33, 0x6a, 0xbb,
+	0x8c, 0x4f, 0x66, 0x91, 0x76, 0x5a, 0x51, 0x51, 0x51, 0x74, 0x17, 0xa9, 0xc3, 0x72, 0xa6, 0xc7,
+	0x61, 0xba, 0x59, 0xc5, 0x9d, 0x0c, 0x92, 0x2a, 0x2c, 0x65, 0x80, 0x74, 0x83, 0x39, 0x15, 0x34,
+	0x11, 0x23, 0x1b, 0xb0, 0x98, 0xf1, 0xb7, 0x8e, 0xcc, 0x92, 0x3a, 0xe4, 0x71, 0x37, 0x79, 0x0b,
+	0xc0, 0x46, 0x97, 0x06, 0x54, 0x4e, 0xcf, 0x84, 0xb5, 0xfc, 0xc6, 0x7c, 0x75, 0x49, 0x9b, 0xe7,
+	0x10, 0x8c, 0x95, 0x76, 0xb6, 0x64, 0x6b, 0x7c, 0xeb, 0x47, 0x03, 0x4a, 0x43, 0x53, 0x9f, 0x87,
+	0x91, 0x9d, 0xc7, 0x26, 0xe4, 0x5f, 0x52, 0x8c, 0x92, 0x97, 0x94, 0xef, 0x04, 0x51, 0xbf, 0xe7,
+	0x08, 0xf4, 0x1e, 0x61, 0xaa, 0x91, 0x71, 0x37, 0x79, 0x00, 0xd0, 0xa0, 0xc1, 0x19, 0x86, 0x87,
+	0xf8, 0xb9, 0x50, 0x93, 0x2b, 0xdb, 0x9a, 0x87, 0x2c, 0x40, 0xae, 0x75, 0xa4, 0xc6, 0x55, 0xb6,
+	0x73, 0xad, 0x23, 0xeb, 0x4f, 0x03, 0xa0, 0xd5, 0x6c, 0x26, 0xed, 0x91, 0x37, 0xe0, 0xde, 0x3b,
+	0x7d, 0x71, 0x86, 0x4c, 0x50, 0xd7, 0x11, 0x94, 0x33, 0x1b, 0x4f, 0x31, 0x44, 0xe6, 0x62, 0x22,
+	0xb5, 0x69, 0x30, 0xd9, 0x85, 0xbb, 0xfb, 0xc8, 0xf0, 0x94, 0xba, 0xd4, 0x09, 0x07, 0x07, 0x8d,
+	0x76, 0xff, 0xa4, 0x47, 0x5d, 0x59, 0x69, 0x2c, 0xf5, 0x29, 0xa8, 0x14, 0x7f, 0x87, 0x9e, 0xe3,
+	0x88, 0x9e, 0x88, 0x3f, 0xe3, 0x54, 0x7a, 0xfb, 0xa0, 0x33, 0x22, 0xc5, 0x8d, 0x65, 0x7c, 0x64,
+	0x0b, 0x4a, 0x52, 0xbd, 0x91, 0x70, 0xfc, 0x40, 0x75, 0x38, 0x49, 0xe4, 0x23, 0x8a, 0xf5, 0xed,
+	0x0c, 0xdc, 0xfa, 0x38, 0xf4, 0x30, 0x1c, 0x76, 0x4f, 0xa0, 0x20, 0x55, 0x96, 0xb4, 0xaa, 0xd6,
+	0xe4, 0x53, 0x58, 0xd4, 0x2a, 0x57, 0xb0, 0x6c, 0x68, 0xa1, 0xba, 0xa9, 0x89, 0x22, 0x93, 0x26,
+	0xb6, 0xc6, 0x82, 0xec, 0xf1, 0x2c, 0xe4, 0x15, 0x28, 0x34, 0x38, 0x65, 0xc9, 0x75, 0x24, 0xd7,
+	0x57, 0xab, 0x0b, 0x95, 0xbf, 0xd2, 0x9f, 0x61, 0xfe, 0x3e, 0x6b, 0x2b, 0x9c, 0xbc, 0x0d, 0xe5,
+	0x76, 0x48, 0x99, 0x4b, 0x03, 0xa7, 0x37, 0xbc, 0x8d, 0x2f, 0xd6, 0x4c, 0x26, 0x80, 0x34, 0x60,
+	0x41, 0xdb, 0x5b, 0xa6, 0x98, 0xb9, 0x39, 0xc5, 0x58, 0x88, 0x7c, 0x69, 0x47, 0x52, 0x28, 0xaa,
+	0x78, 0xa5, 0xff, 0xcf, 0x0c, 0x7b, 0x04, 0x64, 0x47, 0x30, 0x7b, 0xe3, 0x08, 0xc8, 0x43, 0x00,
+	0x75, 0x58, 0x6d, 0x27, 0x14, 0x55, 0x75, 0x81, 0xe7, 0xab, 0xcb, 0xe3, 0xe7, 0xaa, 0x40, 0x5b,
+	0x23, 0x66, 0xc2, 0x6a, 0xea, 0x22, 0x4f, 0x09, 0xab, 0x69, 0x61, 0xb5, 0x4c, 0x58, 0xdd, 0x84,
+	0xe9, 0x61, 0x75, 0x2d, 0xac, 0x6e, 0x51, 0x58, 0x9a, 0x34, 0x51, 0xb2, 0x08, 0xf3, 0x8f, 0x59,
+	0x14, 0xa0, 0x4b, 0x4f, 0x29, 0x7a, 0x95, 0xff, 0x91, 0x07, 0xb0, 0xa2, 0x71, 0x8e, 0x1f, 0x31,
+	0x7e, 0xc9, 0x8e, 0x1d, 0x71, 0x1c, 0x09, 0x27, 0x14, 0x15, 0x83, 0xac, 0xc1, 0x7d, 0x1d, 0x7f,
+	0xcc, 0xce, 0x53, 0x46, 0x47, 0x31, 0x72, 0xd6, 0xcf, 0x86, 0x7e, 0x20, 0xe4, 0x75, 0xb8, 0xd3,
+	0xe0, 0xbe, 0x4f, 0x85, 0xac, 0x6f, 0x24, 0xfe, 0x58, 0x9e, 0x93, 0x20, 0xf2, 0x1e, 0x54, 0xd2,
+	0x67, 0x5a, 0xe5, 0x79, 0xc9, 0x47, 0xe6, 0x1f, 0x41, 0xd9, 0x49, 0xe6, 0x6f, 0xbe, 0x4c, 0xbf,
+	0xea, 0x95, 0xd7, 0xe4, 0x33, 0x64, 0xa3, 0x87, 0x7e, 0x20, 0xd2, 0xc7, 0xaf, 0x64, 0x6b, 0x9e,
+	0x7f, 0xaf, 0xce, 0x3d, 0x30, 0xf5, 0x87, 0x25, 0x7d, 0xcc, 0x9b, 0x8e, 0x70, 0x92, 0x97, 0x64,
+	0x2a, 0x9e, 0xed, 0xb1, 0x70, 0x73, 0x8f, 0xdf, 0xeb, 0x3d, 0xd6, 0xe5, 0x57, 0xb8, 0x83, 0x6e,
+	0x88, 0x22, 0xfd, 0x0a, 0xc7, 0xd6, 0x7f, 0x37, 0x83, 0x5d, 0x28, 0xb6, 0x79, 0x8f, 0xba, 0x83,
+	0x17, 0x7c, 0x78, 0x08, 0x14, 0x3e, 0x72, 0xfc, 0xf8, 0x0d, 0x2b, 0xd9, 0x6a, 0x6d, 0xed, 0xc0,
+	0xed, 0x76, 0xcf, 0xa1, 0xec, 0x10, 0x23, 0x91, 0xfc, 0xbd, 0xd9, 0x21, 0xf7, 0xa1, 0x24, 0x41,
+	0x81, 0x91, 0xd8, 0x49, 0x1a, 0x1c, 0x39, 0xac, 0x1a, 0xdc, 0x49, 0xce, 0x72, 0x5a, 0x50, 0x75,
+	0x3c, 0xa8, 0x6a, 0x6d, 0x40, 0xb9, 0x43, 0xfd, 0xa0, 0x87, 0x1d, 0x11, 0x52, 0xd6, 0x95, 0x55,
+	0x36, 0x38, 0x13, 0xc8, 0xd2, 0x13, 0x4c, 0xcd, 0x93, 0xa2, 0xfa, 0xc7, 0x57, 0xfb, 0x3b, 0x00,
+	0x00, 0xff, 0xff, 0x32, 0xfe, 0x78, 0x15, 0x71, 0x0a, 0x00, 0x00,
 }
diff --git a/libs/documents/docs.proto b/libs/documents/docs.proto
index 737d112..509a1b9 100644
--- a/libs/documents/docs.proto
+++ b/libs/documents/docs.proto
@@ -76,15 +76,23 @@ message IDDocument {
 
 
 message OrderDocument {
-    string Type              = 1; //This can be used to extend the types of things that an order can do.
-    int64 Coin               = 2 [(validator.field) = {int_gt: -1, int_lt: 999}];
-    string PrincipalCID      = 3 [(validator.field) = {regex: "^Q[[:alnum:]]{45}$|^$"}];  //empty if ok
-    string BeneficiaryCID    = 4 [(validator.field) = {regex: "^Q[[:alnum:]]{45}$|^$"}];  //empty if ok
-    string Reference         = 5 [(validator.field) = {string_not_empty:true}]; //an id for this order e.g. walletID
-    int64 Timestamp          = 6 [(validator.field) = {int_gt:1564050341,int_lt:32521429541}];
-    OrderPart2 OrderPart2    = 7;
-    OrderPart3 OrderPart3    = 8;
-    OrderPart4 OrderPart4    = 9;
+    enum OrderBeneficiaryType {
+        Unspecified = 0;
+        Beneficiary_Known_at_start = 1;
+        Beneficiary_Unknown_at_Start = 2;
+    }
+
+
+    string Type           = 1; //This can be used to extend the types of things that an order can do.
+    OrderBeneficiaryType BeneficiaryType = 2;
+    int64 Coin               = 3 [(validator.field) = {int_gt: -1, int_lt: 999}];
+    string PrincipalCID      = 4 [(validator.field) = {regex: "^Q[[:alnum:]]{45}$|^$"}];  //empty if ok
+    string BeneficiaryCID    = 5 [(validator.field) = {regex: "^Q[[:alnum:]]{45}$|^$"}];  //empty if ok
+    string Reference         = 6 [(validator.field) = {string_not_empty:true}]; //an id for this order e.g. walletID
+    int64 Timestamp          = 7 [(validator.field) = {int_gt:1564050341,int_lt:32521429541}];
+    OrderPart2 OrderPart2    = 8;
+    OrderPart3 OrderPart3    = 9;
+    OrderPart4 OrderPart4    = 10;
 }
 
 message OrderPart2 {
diff --git a/libs/documents/docs.validator.pb.go b/libs/documents/docs.validator.pb.go
index 905146b..c7b2cf8 100644
--- a/libs/documents/docs.validator.pb.go
+++ b/libs/documents/docs.validator.pb.go
@@ -5,12 +5,12 @@ package documents
 
 import (
 	fmt "fmt"
-	_ "github.com/gogo/protobuf/gogoproto"
+	math "math"
 	proto "github.com/golang/protobuf/proto"
 	_ "github.com/mwitkow/go-proto-validators"
-	github_com_mwitkow_go_proto_validators "github.com/mwitkow/go-proto-validators"
-	math "math"
+	_ "github.com/gogo/protobuf/gogoproto"
 	regexp "regexp"
+	github_com_mwitkow_go_proto_validators "github.com/mwitkow/go-proto-validators"
 )
 
 // Reference imports to suppress errors if they are not otherwise used.
diff --git a/pkg/bitcoinplugin/helpers.go b/pkg/bitcoinplugin/helpers.go
index eb65167..42ed32f 100644
--- a/pkg/bitcoinplugin/helpers.go
+++ b/pkg/bitcoinplugin/helpers.go
@@ -31,7 +31,9 @@ import (
 )
 
 func deriveFinalPrivateKey(s *Service, order documents.OrderDoc, beneficiariesSikeSK []byte, beneficiariesSeed []byte, beneficiaryIDDocumentCID string, nodeID string, signingBlsPK []byte) (string, error) {
-	if beneficiaryIDDocumentCID != "" {
+
+	switch order.BeneficiaryType {
+	case documents.OrderDocument_Beneficiary_Unknown_at_Start:
 		//we are using the beneficiary specified in order Part 3
 		beneficiaryBlob := order.OrderPart3.BeneficiaryEncryptedData
 
@@ -49,26 +51,28 @@ func deriveFinalPrivateKey(s *Service, order documents.OrderDoc, beneficiariesSi
 			return "", err
 		}
 		return finalPrivateKey, err
-	}
 
-	//we are using the beneficiary specified in the order part 1
-	privateKeyPart2of2 := order.OrderDocument.OrderPart4.Secret
-	// if order.OrderDocument.BeneficiaryCID != nodeID {
-	// 	//need to forward this data to the beneficiary to complete redemption
-	// 	return "", errors.New("Currently beneficiary must be the same as the Principal")
-	// }
-	//restore the Seed
-	_, _, ecAddPrivateKey, err := cryptowallet.Bip44Address(beneficiariesSeed, cryptowallet.CoinTypeBitcoinMain, 0, 0, 0)
-	if err != nil {
-		return "", err
-	}
-	privateKeyPart1of1 := hex.EncodeToString(ecAddPrivateKey.Serialize())
-	finalPrivateKey, err := addPrivateKeys(privateKeyPart1of1, privateKeyPart2of2)
-	if err != nil {
-		return "", err
+	case documents.OrderDocument_Beneficiary_Known_at_start:
+		//we are using the beneficiary specified in the order part 1
+		privateKeyPart2of2 := order.OrderDocument.OrderPart4.Secret
+		// if order.OrderDocument.BeneficiaryCID != nodeID {
+		// 	//need to forward this data to the beneficiary to complete redemption
+		// 	return "", errors.New("Currently beneficiary must be the same as the Principal")
+		// }
+		//restore the Seed
+		_, _, ecAddPrivateKey, err := cryptowallet.Bip44Address(beneficiariesSeed, cryptowallet.CoinTypeBitcoinMain, 0, 0, 0)
+		if err != nil {
+			return "", err
+		}
+		privateKeyPart1of1 := hex.EncodeToString(ecAddPrivateKey.Serialize())
+		finalPrivateKey, err := addPrivateKeys(privateKeyPart1of1, privateKeyPart2of2)
+		if err != nil {
+			return "", err
+		}
+		return finalPrivateKey, err
+	default:
+		return "", errors.New("Critical Error Unknown Beneficiary Type")
 	}
-	return finalPrivateKey, err
-
 }
 
 func adhocEncryptedEnvelopeEncode(s *Service, nodeID string, beneficiaryIDDocumentCID string, order documents.OrderDoc, blsSK []byte) ([]byte, error) {
diff --git a/pkg/bitcoinplugin/service.go b/pkg/bitcoinplugin/service.go
index f087855..2071fc7 100644
--- a/pkg/bitcoinplugin/service.go
+++ b/pkg/bitcoinplugin/service.go
@@ -71,7 +71,7 @@ func (s *Service) ValidateOrderSecretRequest(req *api.OrderSecretRequest, order
 	//These are deliberately overly long winded, but it makes the case I'm trapping more obvious to the reader
 
 	//There is no beneficiary supplided in either the Deposit or Redemption
-	if order.BeneficiaryCID == "" && req.BeneficiaryIDDocumentCID == "" {
+	if order.BeneficiaryType == documents.OrderDocument_Unspecified && req.BeneficiaryIDDocumentCID == "" {
 		return errors.New("Beneficiary must be supplied")
 	}
 
diff --git a/pkg/common/common.go b/pkg/common/common.go
index b8b6b0c..9b306a8 100644
--- a/pkg/common/common.go
+++ b/pkg/common/common.go
@@ -53,6 +53,13 @@ func CreateNewDepositOrder(BeneficiaryIDDocumentCID string, nodeID string) (*doc
 		return nil, err
 	}
 	order := documents.NewOrderDoc()
+
+	if BeneficiaryIDDocumentCID == "" {
+		order.BeneficiaryType = documents.OrderDocument_Beneficiary_Unknown_at_Start
+	} else {
+		order.BeneficiaryType = documents.OrderDocument_Beneficiary_Known_at_start
+	}
+
 	//oder.Type will be used to extend the things that an order can do.
 	order.Type = "Safeguard_Secret"
 	order.PrincipalCID = nodeID
diff --git a/pkg/defaultservice/order.go b/pkg/defaultservice/order.go
index 4326ba0..0ee77f9 100644
--- a/pkg/defaultservice/order.go
+++ b/pkg/defaultservice/order.go
@@ -214,11 +214,16 @@ func (s *Service) OrderSecret(req *api.OrderSecretRequest) (*api.OrderSecretResp
 	}
 
 	//Retrieve the order from IPFS
+
 	order, err := common.RetrieveOrderFromIPFS(s.Ipfs, orderPart2CID, sikeSK, nodeID, remoteIDDoc.BLSPublicKey)
 	if err != nil {
 		return nil, errors.Wrap(err, "Fail to retrieve Order from IPFS")
 	}
 
+	if err := s.Plugin.ValidateOrderSecretRequest(req, *order); err != nil {
+		return nil, err
+	}
+
 	var beneficiariesSikeSK []byte
 	var beneficiaryCID string
 
@@ -233,10 +238,6 @@ func (s *Service) OrderSecret(req *api.OrderSecretRequest) (*api.OrderSecretResp
 		return nil, err
 	}
 
-	if err := s.Plugin.ValidateOrderSecretRequest(req, *order); err != nil {
-		return nil, err
-	}
-
 	//Create a piece of data that is destined for the beneficiary, passed via the Master Fiduciary
 
 	beneficiaryEncryptedData, extension, err := s.Plugin.ProduceBeneficiaryEncryptedData(blsSK, order, req)