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 <[email protected]>
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: "[email protected]",
+               },
+       }
+       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)

Reply via email to