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 <[email protected]> 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\"}}"
