From a0724296592f63c0b7fdbc4eec1a7e53b6f4eb55 Mon Sep 17 00:00:00 2001 From: Peng Zhong Date: Thu, 7 Sep 2017 13:32:56 +0800 Subject: [PATCH 01/15] Fix blog post link for ABCI We moved our blog to Medium. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f2a8c05..56d1ce29 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ glide install go install ./cmd/... ``` -For more information on ABCI, motivations, and tutorials, please visit [our blog post](https://tendermint.com/blog/abci-the-application-blockchain-interface), +For more information on ABCI, motivations, and tutorials, please visit [our blog post](https://blog.cosmos.network/abci-the-application-blockchain-interface-f1bd8278cdd7), and the more detailed [application developer's guide](https://tendermint.com/docs/guides/app-development). Previously, the ABCI was referred to as TMSP. From f279171a2888adf20293d3c6e8ff4f4bf2c80655 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 18 Sep 2017 15:51:48 -0400 Subject: [PATCH 02/15] use request structs for InitChain and BeginBlock --- client/client.go | 12 ++++++------ client/grpc_client.go | 16 ++++++++-------- client/local_client.go | 20 ++++++++++---------- client/socket_client.go | 16 ++++++++-------- example/block_aware/block_aware_app.go | 2 +- example/block_aware/block_aware_test.go | 2 +- example/dummy/persistent_dummy.go | 8 ++++---- server/socket_server.go | 4 ++-- types/application.go | 17 +++++++++-------- types/base_app.go | 4 ++-- types/messages.go | 8 ++++---- types/result.go | 1 + 12 files changed, 56 insertions(+), 54 deletions(-) diff --git a/client/client.go b/client/client.go index c911dd87..3cc5df36 100644 --- a/client/client.go +++ b/client/client.go @@ -20,7 +20,7 @@ type Client interface { SetOptionAsync(key string, value string) *ReqRes DeliverTxAsync(tx []byte) *ReqRes CheckTxAsync(tx []byte) *ReqRes - QueryAsync(reqQuery types.RequestQuery) *ReqRes + QueryAsync(types.RequestQuery) *ReqRes CommitAsync() *ReqRes FlushSync() error @@ -29,15 +29,15 @@ type Client interface { SetOptionSync(key string, value string) (res types.Result) DeliverTxSync(tx []byte) (res types.Result) CheckTxSync(tx []byte) (res types.Result) - QuerySync(reqQuery types.RequestQuery) (resQuery types.ResponseQuery, err error) + QuerySync(types.RequestQuery) (resQuery types.ResponseQuery, err error) CommitSync() (res types.Result) - InitChainAsync(validators []*types.Validator) *ReqRes - BeginBlockAsync(hash []byte, header *types.Header) *ReqRes + InitChainAsync(types.RequestInitChain) *ReqRes + BeginBlockAsync(types.RequestBeginBlock) *ReqRes EndBlockAsync(height uint64) *ReqRes - InitChainSync(validators []*types.Validator) (err error) - BeginBlockSync(hash []byte, header *types.Header) (err error) + InitChainSync(types.RequestInitChain) (err error) + BeginBlockSync(types.RequestBeginBlock) (err error) EndBlockSync(height uint64) (resEndBlock types.ResponseEndBlock, err error) } diff --git a/client/grpc_client.go b/client/grpc_client.go index 9743cdf6..a990455f 100644 --- a/client/grpc_client.go +++ b/client/grpc_client.go @@ -190,8 +190,8 @@ func (cli *grpcClient) CommitAsync() *ReqRes { return cli.finishAsyncCall(req, &types.Response{&types.Response_Commit{res}}) } -func (cli *grpcClient) InitChainAsync(validators []*types.Validator) *ReqRes { - req := types.ToRequestInitChain(validators) +func (cli *grpcClient) InitChainAsync(params types.RequestInitChain) *ReqRes { + req := types.ToRequestInitChain(params) res, err := cli.client.InitChain(context.Background(), req.GetInitChain(), grpc.FailFast(true)) if err != nil { cli.StopForError(err) @@ -199,8 +199,8 @@ func (cli *grpcClient) InitChainAsync(validators []*types.Validator) *ReqRes { return cli.finishAsyncCall(req, &types.Response{&types.Response_InitChain{res}}) } -func (cli *grpcClient) BeginBlockAsync(hash []byte, header *types.Header) *ReqRes { - req := types.ToRequestBeginBlock(hash, header) +func (cli *grpcClient) BeginBlockAsync(params types.RequestBeginBlock) *ReqRes { + req := types.ToRequestBeginBlock(params) res, err := cli.client.BeginBlock(context.Background(), req.GetBeginBlock(), grpc.FailFast(true)) if err != nil { cli.StopForError(err) @@ -319,13 +319,13 @@ func (cli *grpcClient) CommitSync() (res types.Result) { return types.Result{Code: resp.Code, Data: resp.Data, Log: resp.Log} } -func (cli *grpcClient) InitChainSync(validators []*types.Validator) (err error) { - cli.InitChainAsync(validators) +func (cli *grpcClient) InitChainSync(params types.RequestInitChain) (err error) { + cli.InitChainAsync(params) return cli.Error() } -func (cli *grpcClient) BeginBlockSync(hash []byte, header *types.Header) (err error) { - cli.BeginBlockAsync(hash, header) +func (cli *grpcClient) BeginBlockSync(params types.RequestBeginBlock) (err error) { + cli.BeginBlockAsync(params) return cli.Error() } diff --git a/client/local_client.go b/client/local_client.go index 37f76abb..6bf455c6 100644 --- a/client/local_client.go +++ b/client/local_client.go @@ -109,23 +109,23 @@ func (app *localClient) CommitAsync() *ReqRes { ) } -func (app *localClient) InitChainAsync(validators []*types.Validator) *ReqRes { +func (app *localClient) InitChainAsync(params types.RequestInitChain) *ReqRes { app.mtx.Lock() - app.Application.InitChain(validators) + app.Application.InitChain(params) reqRes := app.callback( - types.ToRequestInitChain(validators), + types.ToRequestInitChain(params), types.ToResponseInitChain(), ) app.mtx.Unlock() return reqRes } -func (app *localClient) BeginBlockAsync(hash []byte, header *types.Header) *ReqRes { +func (app *localClient) BeginBlockAsync(params types.RequestBeginBlock) *ReqRes { app.mtx.Lock() - app.Application.BeginBlock(hash, header) + app.Application.BeginBlock(params) app.mtx.Unlock() return app.callback( - types.ToRequestBeginBlock(hash, header), + types.ToRequestBeginBlock(params), types.ToResponseBeginBlock(), ) } @@ -192,16 +192,16 @@ func (app *localClient) CommitSync() (res types.Result) { return res } -func (app *localClient) InitChainSync(validators []*types.Validator) (err error) { +func (app *localClient) InitChainSync(params types.RequestInitChain) (err error) { app.mtx.Lock() - app.Application.InitChain(validators) + app.Application.InitChain(params) app.mtx.Unlock() return nil } -func (app *localClient) BeginBlockSync(hash []byte, header *types.Header) (err error) { +func (app *localClient) BeginBlockSync(params types.RequestBeginBlock) (err error) { app.mtx.Lock() - app.Application.BeginBlock(hash, header) + app.Application.BeginBlock(params) app.mtx.Unlock() return nil } diff --git a/client/socket_client.go b/client/socket_client.go index f95eac5c..1da93494 100644 --- a/client/socket_client.go +++ b/client/socket_client.go @@ -255,12 +255,12 @@ func (cli *socketClient) CommitAsync() *ReqRes { return cli.queueRequest(types.ToRequestCommit()) } -func (cli *socketClient) InitChainAsync(validators []*types.Validator) *ReqRes { - return cli.queueRequest(types.ToRequestInitChain(validators)) +func (cli *socketClient) InitChainAsync(params types.RequestInitChain) *ReqRes { + return cli.queueRequest(types.ToRequestInitChain(params)) } -func (cli *socketClient) BeginBlockAsync(hash []byte, header *types.Header) *ReqRes { - return cli.queueRequest(types.ToRequestBeginBlock(hash, header)) +func (cli *socketClient) BeginBlockAsync(params types.RequestBeginBlock) *ReqRes { + return cli.queueRequest(types.ToRequestBeginBlock(params)) } func (cli *socketClient) EndBlockAsync(height uint64) *ReqRes { @@ -352,8 +352,8 @@ func (cli *socketClient) CommitSync() (res types.Result) { return types.Result{Code: resp.Code, Data: resp.Data, Log: resp.Log} } -func (cli *socketClient) InitChainSync(validators []*types.Validator) (err error) { - cli.queueRequest(types.ToRequestInitChain(validators)) +func (cli *socketClient) InitChainSync(params types.RequestInitChain) (err error) { + cli.queueRequest(types.ToRequestInitChain(params)) cli.FlushSync() if err := cli.Error(); err != nil { return err @@ -361,8 +361,8 @@ func (cli *socketClient) InitChainSync(validators []*types.Validator) (err error return nil } -func (cli *socketClient) BeginBlockSync(hash []byte, header *types.Header) (err error) { - cli.queueRequest(types.ToRequestBeginBlock(hash, header)) +func (cli *socketClient) BeginBlockSync(params types.RequestBeginBlock) (err error) { + cli.queueRequest(types.ToRequestBeginBlock(params)) cli.FlushSync() if err := cli.Error(); err != nil { return err diff --git a/example/block_aware/block_aware_app.go b/example/block_aware/block_aware_app.go index 8bacecd1..c88f2289 100644 --- a/example/block_aware/block_aware_app.go +++ b/example/block_aware/block_aware_app.go @@ -55,7 +55,7 @@ func (app *ChainAwareApplication) Query(reqQuery types.RequestQuery) (resQuery t } } -func (app *ChainAwareApplication) BeginBlock(hash []byte, header *types.Header) { +func (app *ChainAwareApplication) BeginBlock(reqBeginBlock types.RequestBeginBlock) { app.beginCount++ return } diff --git a/example/block_aware/block_aware_test.go b/example/block_aware/block_aware_test.go index 05a5c05c..64b6755e 100644 --- a/example/block_aware/block_aware_test.go +++ b/example/block_aware/block_aware_test.go @@ -37,7 +37,7 @@ func TestChainAware(t *testing.T) { hash := []byte("fake block hash") header := &types.Header{} for i := uint64(0); i < n; i++ { - client.BeginBlockSync(hash, header) + client.BeginBlockSync(&types.RequestBeginBlock{hash, header}) client.EndBlockSync(i) client.CommitSync() } diff --git a/example/dummy/persistent_dummy.go b/example/dummy/persistent_dummy.go index fb59a272..303876e8 100644 --- a/example/dummy/persistent_dummy.go +++ b/example/dummy/persistent_dummy.go @@ -106,8 +106,8 @@ func (app *PersistentDummyApplication) Query(reqQuery types.RequestQuery) types. } // Save the validators in the merkle tree -func (app *PersistentDummyApplication) InitChain(validators []*types.Validator) { - for _, v := range validators { +func (app *PersistentDummyApplication) InitChain(params types.RequestInitChain) { + for _, v := range params.Validators { r := app.updateValidator(v) if r.IsErr() { app.logger.Error("Error updating validators", "r", r) @@ -116,9 +116,9 @@ func (app *PersistentDummyApplication) InitChain(validators []*types.Validator) } // Track the block hash and header information -func (app *PersistentDummyApplication) BeginBlock(hash []byte, header *types.Header) { +func (app *PersistentDummyApplication) BeginBlock(params types.RequestBeginBlock) { // update latest block info - app.blockHeader = header + app.blockHeader = params.Header // reset valset changes app.changes = make([]*types.Validator, 0) diff --git a/server/socket_server.go b/server/socket_server.go index 2b01dbd7..88011a05 100644 --- a/server/socket_server.go +++ b/server/socket_server.go @@ -186,10 +186,10 @@ func (s *SocketServer) handleRequest(req *types.Request, responses chan<- *types resQuery := s.app.Query(*r.Query) responses <- types.ToResponseQuery(resQuery) case *types.Request_InitChain: - s.app.InitChain(r.InitChain.Validators) + s.app.InitChain(*r.InitChain) responses <- types.ToResponseInitChain() case *types.Request_BeginBlock: - s.app.BeginBlock(r.BeginBlock.Hash, r.BeginBlock.Header) + s.app.BeginBlock(*r.BeginBlock) responses <- types.ToResponseBeginBlock() case *types.Request_EndBlock: resEndBlock := s.app.EndBlock(r.EndBlock.Height) diff --git a/types/application.go b/types/application.go index b45305f8..8f17bf50 100644 --- a/types/application.go +++ b/types/application.go @@ -4,27 +4,28 @@ import ( context "golang.org/x/net/context" ) -// Applications +// Application is an interface that enables any finite, deterministic state machine +// to be driven by a blockchain-based replication engine via the ABCI type Application interface { // Info/Query Connection Info() ResponseInfo // Return application info SetOption(key string, value string) (log string) // Set application option - Query(reqQuery RequestQuery) ResponseQuery // Query for state + Query(RequestQuery) ResponseQuery // Query for state // Mempool Connection CheckTx(tx []byte) Result // Validate a tx for the mempool // Consensus Connection - InitChain(validators []*Validator) // Initialize blockchain with validators from TendermintCore - BeginBlock(hash []byte, header *Header) // Signals the beginning of a block - DeliverTx(tx []byte) Result // Deliver a tx for full processing + InitChain(RequestInitChain) // Initialize blockchain with validators and other info from TendermintCore + BeginBlock(RequestBeginBlock) // Signals the beginning of a block + DeliverTx(tx []byte) Result // Deliver a tx for full processing EndBlock(height uint64) ResponseEndBlock // Signals the end of a block, returns changes to the validator set Commit() Result // Commit the state and return the application Merkle root hash } //------------------------------------ -// GRPC wrapper for application +// GRPCApplication is a GRPC wrapper for Application type GRPCApplication struct { app Application } @@ -71,12 +72,12 @@ func (app *GRPCApplication) Commit(ctx context.Context, req *RequestCommit) (*Re } func (app *GRPCApplication) InitChain(ctx context.Context, req *RequestInitChain) (*ResponseInitChain, error) { - app.app.InitChain(req.Validators) + app.app.InitChain(*req) return &ResponseInitChain{}, nil // NOTE: empty return } func (app *GRPCApplication) BeginBlock(ctx context.Context, req *RequestBeginBlock) (*ResponseBeginBlock, error) { - app.app.BeginBlock(req.Hash, req.Header) + app.app.BeginBlock(*req) return &ResponseBeginBlock{}, nil // NOTE: empty return } diff --git a/types/base_app.go b/types/base_app.go index 1d4f84b8..71c99cc2 100644 --- a/types/base_app.go +++ b/types/base_app.go @@ -31,10 +31,10 @@ func (app *BaseApplication) Query(reqQuery RequestQuery) (resQuery ResponseQuery return } -func (app *BaseApplication) InitChain(validators []*Validator) { +func (app *BaseApplication) InitChain(reqInitChain RequestInitChain) { } -func (app *BaseApplication) BeginBlock(hash []byte, header *Header) { +func (app *BaseApplication) BeginBlock(reqBeginBlock RequestBeginBlock) { } func (app *BaseApplication) EndBlock(height uint64) (resEndBlock ResponseEndBlock) { diff --git a/types/messages.go b/types/messages.go index fe2d310a..c7f24a13 100644 --- a/types/messages.go +++ b/types/messages.go @@ -55,15 +55,15 @@ func ToRequestQuery(reqQuery RequestQuery) *Request { } } -func ToRequestInitChain(validators []*Validator) *Request { +func ToRequestInitChain(reqInitChain RequestInitChain) *Request { return &Request{ - Value: &Request_InitChain{&RequestInitChain{validators}}, + Value: &Request_InitChain{&reqInitChain}, } } -func ToRequestBeginBlock(hash []byte, header *Header) *Request { +func ToRequestBeginBlock(reqBeginBlock RequestBeginBlock) *Request { return &Request{ - Value: &Request_BeginBlock{&RequestBeginBlock{hash, header}}, + Value: &Request_BeginBlock{&reqBeginBlock}, } } diff --git a/types/result.go b/types/result.go index 7bf52c90..abf1e964 100644 --- a/types/result.go +++ b/types/result.go @@ -6,6 +6,7 @@ import ( "github.com/tendermint/go-wire/data" ) +// Result is a common result object for ABCI calls. // CONTRACT: a zero Result is OK. type Result struct { Code CodeType `json:"code"` From 318345f9969ac28e3a2006182bc0e3b6462ba66e Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Fri, 22 Sep 2017 00:10:13 -0400 Subject: [PATCH 03/15] fix tests --- example/block_aware/block_aware_test.go | 2 +- example/dummy/dummy_test.go | 6 +++--- types/messages.go | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/example/block_aware/block_aware_test.go b/example/block_aware/block_aware_test.go index 64b6755e..2777ce1a 100644 --- a/example/block_aware/block_aware_test.go +++ b/example/block_aware/block_aware_test.go @@ -37,7 +37,7 @@ func TestChainAware(t *testing.T) { hash := []byte("fake block hash") header := &types.Header{} for i := uint64(0); i < n; i++ { - client.BeginBlockSync(&types.RequestBeginBlock{hash, header}) + client.BeginBlockSync(types.RequestBeginBlock{hash, header}) client.EndBlockSync(i) client.CommitSync() } diff --git a/example/dummy/dummy_test.go b/example/dummy/dummy_test.go index e180af3e..495e7858 100644 --- a/example/dummy/dummy_test.go +++ b/example/dummy/dummy_test.go @@ -91,7 +91,7 @@ func TestPersistentDummyInfo(t *testing.T) { header := &types.Header{ Height: uint64(height), } - dummy.BeginBlock(hash, header) + dummy.BeginBlock(types.RequestBeginBlock{hash, header}) dummy.EndBlock(height) dummy.Commit() @@ -120,7 +120,7 @@ func TestValSetChanges(t *testing.T) { vals[i] = &types.Validator{pubkey, uint64(power)} } // iniitalize with the first nInit - dummy.InitChain(vals[:nInit]) + dummy.InitChain(types.RequestInitChain{vals[:nInit]}) vals1, vals2 := vals[:nInit], dummy.Validators() valsEqual(t, vals1, vals2) @@ -180,7 +180,7 @@ func makeApplyBlock(t *testing.T, dummy types.Application, heightInt int, diff [ Height: height, } - dummy.BeginBlock(hash, header) + dummy.BeginBlock(types.RequestBeginBlock{hash, header}) for _, tx := range txs { if r := dummy.DeliverTx(tx); r.IsErr() { t.Fatal(r) diff --git a/types/messages.go b/types/messages.go index c7f24a13..7918e0ef 100644 --- a/types/messages.go +++ b/types/messages.go @@ -49,21 +49,21 @@ func ToRequestCommit() *Request { } } -func ToRequestQuery(reqQuery RequestQuery) *Request { +func ToRequestQuery(req RequestQuery) *Request { return &Request{ - Value: &Request_Query{&reqQuery}, + Value: &Request_Query{&req}, } } -func ToRequestInitChain(reqInitChain RequestInitChain) *Request { +func ToRequestInitChain(req RequestInitChain) *Request { return &Request{ - Value: &Request_InitChain{&reqInitChain}, + Value: &Request_InitChain{&req}, } } -func ToRequestBeginBlock(reqBeginBlock RequestBeginBlock) *Request { +func ToRequestBeginBlock(req RequestBeginBlock) *Request { return &Request{ - Value: &Request_BeginBlock{&reqBeginBlock}, + Value: &Request_BeginBlock{&req}, } } From bd9f1d0d4c9ae1ceb689581c8c10ea4995e4cfc7 Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Thu, 21 Sep 2017 15:21:08 -0400 Subject: [PATCH 04/15] metalinter: add linter to Makefile like tendermint --- Makefile | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9c9a7c57..cbdc66e1 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ GOTOOLS = \ github.com/mitchellh/gox \ - github.com/Masterminds/glide + github.com/Masterminds/glide \ + github.com/alecthomas/gometalinter all: protoc install test @@ -50,4 +51,38 @@ get_vendor_deps: @ go get github.com/Masterminds/glide @ glide install +metalinter: tools + @gometalinter --install + gometalinter --vendor --deadline=600s --enable-all --disable=lll ./... + +metalinter_test: tools + @gometalinter --install + gometalinter --vendor --deadline=600s --disable-all \ + --enable=deadcode \ + --enable=gas \ + --enable=goimports \ + --enable=gosimple \ + --enable=gotype \ + --enable=ineffassign \ + --enable=misspell \ + --enable=safesql \ + --enable=structcheck \ + --enable=varcheck \ + ./... + + #--enable=aligncheck \ + #--enable=dupl \ + #--enable=errcheck \ + #--enable=goconst \ + #--enable=gocyclo \ + #--enable=golint \ <== comments on anything exported + #--enable=interfacer \ + #--enable=megacheck \ + #--enable=staticcheck \ + #--enable=unconvert \ + #--enable=unparam \ + #--enable=unused \ + #--enable=vet \ + #--enable=vetshadow \ + .PHONY: all build test fmt lint get_deps tools From 6a378d30f3d1eb962144a5b585d177335b0f4868 Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Thu, 21 Sep 2017 15:26:43 -0400 Subject: [PATCH 05/15] linting: cover the basics --- client/grpc_client.go | 2 +- client/socket_client.go | 16 +++++----------- cmd/abci-cli/abci-cli.go | 4 ++-- example/block_aware/block_aware_app.go | 1 - example/dummy/dummy_test.go | 2 +- example/dummy/persistent_dummy.go | 7 ++----- tests/test_app/app.go | 4 ++-- 7 files changed, 13 insertions(+), 23 deletions(-) diff --git a/client/grpc_client.go b/client/grpc_client.go index a990455f..e9a74026 100644 --- a/client/grpc_client.go +++ b/client/grpc_client.go @@ -113,7 +113,7 @@ func (cli *grpcClient) SetResponseCallback(resCb Callback) { //---------------------------------------- // GRPC calls are synchronous, but some callbacks expect to be called asynchronously // (eg. the mempool expects to be able to lock to remove bad txs from cache). -// To accomodate, we finish each call in its own go-routine, +// To accommodate, we finish each call in its own go-routine, // which is expensive, but easy - if you want something better, use the socket protocol! // maybe one day, if people really want it, we use grpc streams, // but hopefully not :D diff --git a/client/socket_client.go b/client/socket_client.go index 1da93494..74df9326 100644 --- a/client/socket_client.go +++ b/client/socket_client.go @@ -19,9 +19,9 @@ const ( LOG = "" ) -const reqQueueSize = 256 // TODO make configurable -const maxResponseSize = 1048576 // 1MB TODO make configurable -const flushThrottleMS = 20 // Don't wait longer than... +const reqQueueSize = 256 // TODO make configurable +// const maxResponseSize = 1048576 // 1MB TODO make configurable +const flushThrottleMS = 20 // Don't wait longer than... // This is goroutine-safe, but users should beware that // the application in general is not meant to be interfaced @@ -355,19 +355,13 @@ func (cli *socketClient) CommitSync() (res types.Result) { func (cli *socketClient) InitChainSync(params types.RequestInitChain) (err error) { cli.queueRequest(types.ToRequestInitChain(params)) cli.FlushSync() - if err := cli.Error(); err != nil { - return err - } - return nil + return cli.Error() } func (cli *socketClient) BeginBlockSync(params types.RequestBeginBlock) (err error) { cli.queueRequest(types.ToRequestBeginBlock(params)) cli.FlushSync() - if err := cli.Error(); err != nil { - return err - } - return nil + return cli.Error() } func (cli *socketClient) EndBlockSync(height uint64) (resEndBlock types.ResponseEndBlock, err error) { diff --git a/cmd/abci-cli/abci-cli.go b/cmd/abci-cli/abci-cli.go index 0f1dd82d..b96c0346 100644 --- a/cmd/abci-cli/abci-cli.go +++ b/cmd/abci-cli/abci-cli.go @@ -183,12 +183,12 @@ func badCmd(c *cli.Context, cmd string) { //Generates new Args array based off of previous call args to maintain flag persistence func persistentArgs(line []byte) []string { - //generate the arguments to run from orginal os.Args + // generate the arguments to run from original os.Args // to maintain flag arguments args := os.Args args = args[:len(args)-1] // remove the previous command argument - if len(line) > 0 { //prevents introduction of extra space leading to argument parse errors + if len(line) > 0 { // prevents introduction of extra space leading to argument parse errors args = append(args, strings.Split(string(line), " ")...) } return args diff --git a/example/block_aware/block_aware_app.go b/example/block_aware/block_aware_app.go index c88f2289..8a031da2 100644 --- a/example/block_aware/block_aware_app.go +++ b/example/block_aware/block_aware_app.go @@ -57,7 +57,6 @@ func (app *ChainAwareApplication) Query(reqQuery types.RequestQuery) (resQuery t func (app *ChainAwareApplication) BeginBlock(reqBeginBlock types.RequestBeginBlock) { app.beginCount++ - return } func (app *ChainAwareApplication) EndBlock(height uint64) (resEndBlock types.ResponseEndBlock) { diff --git a/example/dummy/dummy_test.go b/example/dummy/dummy_test.go index 495e7858..a616025e 100644 --- a/example/dummy/dummy_test.go +++ b/example/dummy/dummy_test.go @@ -166,7 +166,7 @@ func TestValSetChanges(t *testing.T) { makeApplyBlock(t, dummy, 3, diff, tx1) - vals1 = append([]*types.Validator{v1}, vals1[1:len(vals1)]...) + vals1 = append([]*types.Validator{v1}, vals1[1:]...) vals2 = dummy.Validators() valsEqual(t, vals1, vals2) diff --git a/example/dummy/persistent_dummy.go b/example/dummy/persistent_dummy.go index 303876e8..371cf4ce 100644 --- a/example/dummy/persistent_dummy.go +++ b/example/dummy/persistent_dummy.go @@ -187,10 +187,7 @@ func MakeValSetChangeTx(pubkey []byte, power uint64) []byte { } func isValidatorTx(tx []byte) bool { - if strings.HasPrefix(string(tx), ValidatorSetChangePrefix) { - return true - } - return false + return strings.HasPrefix(string(tx), ValidatorSetChangePrefix) } // format is "val:pubkey1/power1,addr2/power2,addr3/power3"tx @@ -232,7 +229,7 @@ func (app *PersistentDummyApplication) updateValidator(v *types.Validator) types app.app.state.Set(key, value.Bytes()) } - // we only update the changes array if we succesfully updated the tree + // we only update the changes array if we successfully updated the tree app.changes = append(app.changes, v) return types.OK diff --git a/tests/test_app/app.go b/tests/test_app/app.go index 281c9dcb..30202b6a 100644 --- a/tests/test_app/app.go +++ b/tests/test_app/app.go @@ -80,7 +80,7 @@ func deliverTx(client abcicli.Client, txBytes []byte, codeExp types.CodeType, da } } -func checkTx(client abcicli.Client, txBytes []byte, codeExp types.CodeType, dataExp []byte) { +/*func checkTx(client abcicli.Client, txBytes []byte, codeExp types.CodeType, dataExp []byte) { res := client.CheckTxSync(txBytes) code, data, log := res.Code, res.Data, res.Log if res.IsErr() { @@ -94,4 +94,4 @@ func checkTx(client abcicli.Client, txBytes []byte, codeExp types.CodeType, data panic(fmt.Sprintf("CheckTx response data was unexpected. Got %X expected %X", data, dataExp)) } -} +}*/ From 36e96c5bf1b104650bd2a43c7e7d7995964df933 Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Thu, 21 Sep 2017 15:32:06 -0400 Subject: [PATCH 06/15] linting: catch some errors --- Makefile | 2 +- client/grpc_client.go | 4 +++- client/socket_client.go | 4 +++- server/grpc_server.go | 4 +++- server/socket_server.go | 4 +++- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index cbdc66e1..13f5dae7 100644 --- a/Makefile +++ b/Makefile @@ -58,6 +58,7 @@ metalinter: tools metalinter_test: tools @gometalinter --install gometalinter --vendor --deadline=600s --disable-all \ + --enable=aligncheck \ --enable=deadcode \ --enable=gas \ --enable=goimports \ @@ -70,7 +71,6 @@ metalinter_test: tools --enable=varcheck \ ./... - #--enable=aligncheck \ #--enable=dupl \ #--enable=errcheck \ #--enable=goconst \ diff --git a/client/grpc_client.go b/client/grpc_client.go index e9a74026..31ca3db2 100644 --- a/client/grpc_client.go +++ b/client/grpc_client.go @@ -41,7 +41,9 @@ func dialerFunc(addr string, timeout time.Duration) (net.Conn, error) { } func (cli *grpcClient) OnStart() error { - cli.BaseService.OnStart() + if err := cli.BaseService.OnStart(); err != nil { + return err + } RETRY_LOOP: for { diff --git a/client/socket_client.go b/client/socket_client.go index 74df9326..4c7265cd 100644 --- a/client/socket_client.go +++ b/client/socket_client.go @@ -57,7 +57,9 @@ func NewSocketClient(addr string, mustConnect bool) *socketClient { } func (cli *socketClient) OnStart() error { - cli.BaseService.OnStart() + if err := cli.BaseService.OnStart(); err != nil { + return err + } var err error var conn net.Conn diff --git a/server/grpc_server.go b/server/grpc_server.go index 90346d69..ac3d728a 100644 --- a/server/grpc_server.go +++ b/server/grpc_server.go @@ -37,7 +37,9 @@ func NewGRPCServer(protoAddr string, app types.ABCIApplicationServer) cmn.Servic // OnStart starts the gRPC service func (s *GRPCServer) OnStart() error { - s.BaseService.OnStart() + if err := s.BaseService.OnStart(); err != nil { + return err + } ln, err := net.Listen(s.proto, s.addr) if err != nil { return err diff --git a/server/socket_server.go b/server/socket_server.go index 88011a05..4b64a5f0 100644 --- a/server/socket_server.go +++ b/server/socket_server.go @@ -44,7 +44,9 @@ func NewSocketServer(protoAddr string, app types.Application) cmn.Service { } func (s *SocketServer) OnStart() error { - s.BaseService.OnStart() + if err := s.BaseService.OnStart(); err != nil { + return err + } ln, err := net.Listen(s.proto, s.addr) if err != nil { return err From 65eb7e89745205aa30c3bba38c377fea0f233056 Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Thu, 21 Sep 2017 15:46:51 -0400 Subject: [PATCH 07/15] linted, somewhat --- Makefile | 12 ++++++------ circle.yml | 1 + tests/test_app/app.go | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 13f5dae7..418ba3ee 100644 --- a/Makefile +++ b/Makefile @@ -61,28 +61,28 @@ metalinter_test: tools --enable=aligncheck \ --enable=deadcode \ --enable=gas \ + --enable=goconst \ --enable=goimports \ --enable=gosimple \ --enable=gotype \ --enable=ineffassign \ + --enable=megacheck \ --enable=misspell \ + --enable=staticcheck \ --enable=safesql \ --enable=structcheck \ + --enable=unconvert \ + --enable=unused \ --enable=varcheck \ + --enable=vetshadow \ ./... #--enable=dupl \ #--enable=errcheck \ - #--enable=goconst \ #--enable=gocyclo \ #--enable=golint \ <== comments on anything exported #--enable=interfacer \ - #--enable=megacheck \ - #--enable=staticcheck \ - #--enable=unconvert \ #--enable=unparam \ - #--enable=unused \ #--enable=vet \ - #--enable=vetshadow \ .PHONY: all build test fmt lint get_deps tools diff --git a/circle.yml b/circle.yml index 6355bc04..ab89e13d 100644 --- a/circle.yml +++ b/circle.yml @@ -18,4 +18,5 @@ checkout: test: override: - "go version" + - "cd $REPO && make metalinter_test" - "cd $REPO && make test_integrations" diff --git a/tests/test_app/app.go b/tests/test_app/app.go index 30202b6a..11ade88c 100644 --- a/tests/test_app/app.go +++ b/tests/test_app/app.go @@ -59,7 +59,7 @@ func commit(client abcicli.Client, hashExp []byte) { res := client.CommitSync() _, data, log := res.Code, res.Data, res.Log if res.IsErr() { - panic(fmt.Sprintf("committing %v\nlog: %v", log)) + panic(fmt.Sprintf("committing %v\nlog: %v", log, res.Log)) } if !bytes.Equal(res.Data, hashExp) { panic(fmt.Sprintf("Commit hash was unexpected. Got %X expected %X", From 0e7d974410cbb67eefa227de0fc3be8cc7ff604a Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Thu, 21 Sep 2017 16:02:01 -0400 Subject: [PATCH 08/15] install --- circle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/circle.yml b/circle.yml index ab89e13d..daa4218e 100644 --- a/circle.yml +++ b/circle.yml @@ -18,5 +18,5 @@ checkout: test: override: - "go version" - - "cd $REPO && make metalinter_test" + - "cd $REPO && make get_vendor_deps && make metalinter_test" - "cd $REPO && make test_integrations" From a3ac8254900d7ab7a36ae38f30b8d113e485f106 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Fri, 22 Sep 2017 09:14:20 -0400 Subject: [PATCH 09/15] small fix --- tests/test_app/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_app/app.go b/tests/test_app/app.go index 11ade88c..ab794769 100644 --- a/tests/test_app/app.go +++ b/tests/test_app/app.go @@ -59,7 +59,7 @@ func commit(client abcicli.Client, hashExp []byte) { res := client.CommitSync() _, data, log := res.Code, res.Data, res.Log if res.IsErr() { - panic(fmt.Sprintf("committing %v\nlog: %v", log, res.Log)) + panic(fmt.Sprintf("committing err %v\n", res)) } if !bytes.Equal(res.Data, hashExp) { panic(fmt.Sprintf("Commit hash was unexpected. Got %X expected %X", From fe426de5d47af1593448fded9f8e9ef07ead7762 Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Fri, 22 Sep 2017 09:45:50 -0400 Subject: [PATCH 10/15] lint: couple more fixes --- tests/test_app/app.go | 2 +- types/application.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_app/app.go b/tests/test_app/app.go index ab794769..7fc3ace0 100644 --- a/tests/test_app/app.go +++ b/tests/test_app/app.go @@ -57,7 +57,7 @@ func setOption(client abcicli.Client, key, value string) { func commit(client abcicli.Client, hashExp []byte) { res := client.CommitSync() - _, data, log := res.Code, res.Data, res.Log + _, data, _ := res.Code, res.Data, res.Log if res.IsErr() { panic(fmt.Sprintf("committing err %v\n", res)) } diff --git a/types/application.go b/types/application.go index 8f17bf50..b596685c 100644 --- a/types/application.go +++ b/types/application.go @@ -1,4 +1,4 @@ -package types +package types // nolint: goimports import ( context "golang.org/x/net/context" @@ -18,7 +18,7 @@ type Application interface { // Consensus Connection InitChain(RequestInitChain) // Initialize blockchain with validators and other info from TendermintCore BeginBlock(RequestBeginBlock) // Signals the beginning of a block - DeliverTx(tx []byte) Result // Deliver a tx for full processing + DeliverTx(tx []byte) Result // Deliver a tx for full processing EndBlock(height uint64) ResponseEndBlock // Signals the end of a block, returns changes to the validator set Commit() Result // Commit the state and return the application Merkle root hash } From 96d2a2c92fef7acc5b8bbd7fddd72e4234f6c461 Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Fri, 22 Sep 2017 09:38:14 -0400 Subject: [PATCH 11/15] readme: re-organize & update docs links --- README.md | 99 ++++++++++++++++++++++++++----------------------------- 1 file changed, 46 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 56d1ce29..f1b2ebb3 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ and the state machine (the application). By using a socket protocol, we enable a consensus engine running in one process to manage an application state running in another. -# Install +## Install ``` go get github.com/tendermint/abci @@ -17,18 +17,54 @@ glide install go install ./cmd/... ``` -For more information on ABCI, motivations, and tutorials, please visit [our blog post](https://blog.cosmos.network/abci-the-application-blockchain-interface-f1bd8278cdd7), -and the more detailed [application developer's guide](https://tendermint.com/docs/guides/app-development). +For background information on ABCI, motivations, and tendermint, please visit [the documentation](http://tendermint.readthedocs.io/en/master/). +The two guides to focus on are the `Application Development Guide` and `Using ABCI-CLI`. Previously, the ABCI was referred to as TMSP. -Other implementations: -* C++ [cpp-tmsp](https://github.com/mdyring/cpp-tmsp) by Martin Dyring-Andersen -* JavaScript [js-abci](https://github.com/tendermint/js-abci) -* Java [jABCI](https://github.com/jTendermint/jabci) -* Erlang [abci_server](https://github.com/KrzysiekJ/abci_server) by Krzysztof Jurewicz +The community has provided a number of addtional implementations, see the `Tendermint Ecosystem` in [the documentation](http://tendermint.readthedocs.io/en/master/). -# Specification +## Implementation + +We provide three implementations of the ABCI in Go: + +- ABCI-socket +- GRPC +- Golang in-process + +### Socket + +ABCI is best implemented as a streaming protocol. +The socket implementation provides for asynchronous, ordered message passing over unix or tcp. +Messages are serialized using Protobuf3 and length-prefixed. +Protobuf3 doesn't have an official length-prefix standard, so we use our own. The first byte represents the length of the big-endian encoded length. + +For example, if the Protobuf3 encoded ABCI message is `0xDEADBEEF` (4 bytes), the length-prefixed message is `0x0104DEADBEEF`. If the Protobuf3 encoded ABCI message is 65535 bytes long, the length-prefixed message would be like `0x02FFFF...`. + +### GRPC + +GRPC is an rpc framework native to Protocol Buffers with support in many languages. +Implementing the ABCI using GRPC can allow for faster prototyping, but is expected to be much slower than +the ordered, asynchronous socket protocol. + +Note the length-prefixing used in the socket implementation does not apply for GRPC. + +### In Process + +The simplest implementation just uses function calls within Go. +This means ABCI applications written in Golang can be compiled with TendermintCore and run as a single binary. + +## Example Apps + +The `abci-cli` tool wraps any ABCI client and can be used for probing/testing an ABCI application. +See [the documentation](http://tendermint.readthedocs.io/en/master/) for more details. + +Multiple example apps are included: +- the `counter` application, which illustrates nonce checking in txs +- the `dummy` application, which illustrates a simple key-value merkle tree +- the `dummy --persistent` application, which augments the dummy with persistence and validator set changes + +## Specification The [primary specification](https://github.com/tendermint/abci/blob/master/types/types.proto) is made using Protocol Buffers. To build it, run @@ -42,7 +78,7 @@ Note we also include a [GRPC](http://www.grpc.io/docs) service definition. For the specification as an interface in Go, see the [types/application.go file](https://github.com/tendermint/abci/blob/master/types/application.go). -## Message Types +### Message Types ABCI requests/responses are defined as simple Protobuf messages in [this schema file](https://github.com/tendermint/abci/blob/master/types/types.proto). TendermintCore sends the requests, and the ABCI application sends the responses. @@ -148,49 +184,6 @@ Here, we describe the requests and responses as function arguments and return va * __Usage__:
* Echo a string to test an abci client/server implementation - #### Flush * __Usage__:
* Signals that messages queued on the client should be flushed to the server. It is called periodically by the client implementation to ensure asynchronous requests are actually sent, and is called immediately to make a synchronous request, which returns when the Flush response comes back. - - -# Implementation - -We provide three implementations of the ABCI in Go: - -1. ABCI-socket -2. GRPC -3. Golang in-process - -## Socket - -ABCI is best implemented as a streaming protocol. -The socket implementation provides for asynchronous, ordered message passing over unix or tcp. -Messages are serialized using Protobuf3 and length-prefixed. -Protobuf3 doesn't have an official length-prefix standard, so we use our own. The first byte represents the length of the big-endian encoded length. - -For example, if the Protobuf3 encoded ABCI message is `0xDEADBEEF` (4 bytes), the length-prefixed message is `0x0104DEADBEEF`. If the Protobuf3 encoded ABCI message is 65535 bytes long, the length-prefixed message would be like `0x02FFFF...`. - -## GRPC - -GRPC is an rpc framework native to Protocol Buffers with support in many languages. -Implementing the ABCI using GRPC can allow for faster prototyping, but is expected to be much slower than -the ordered, asynchronous socket protocol. - -Note the length-prefixing used in the socket implementation does not apply for GRPC. - -## In Process - -The simplest implementation just uses function calls within Go. -This means ABCI applications written in Golang can be compiled with TendermintCore and run as a single binary. - - -# Tools and Apps - -The `abci-cli` tool wraps any ABCI client and can be used for probing/testing an ABCI application. -See the [guide](https://tendermint.com/docs/guides/abci-cli) for more details. - -Multiple example apps are included: -- the `counter` application, which illustrates nonce checking in txs -- the `dummy` application, which illustrates a simple key-value merkle tree -- the `dummy --persistent` application, which augments the dummy with persistence and validator set changes From 47d6f71e5a7c7adad77c15783e0ea127f5a81df6 Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Fri, 22 Sep 2017 10:09:05 -0400 Subject: [PATCH 12/15] Makefile: remove redundant lint --- Makefile | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 418ba3ee..d097ae72 100644 --- a/Makefile +++ b/Makefile @@ -33,12 +33,6 @@ test: install fmt: @ go fmt ./... -lint: - @ go get -u github.com/golang/lint/golint - @ for file in $$(find "." -name '*.go' | grep -v '/vendor/' | grep -v '\.pb\.go'); do \ - golint -set_exit_status $${file}; \ - done; - test_integrations: get_vendor_deps install test get_deps: @@ -85,4 +79,4 @@ metalinter_test: tools #--enable=unparam \ #--enable=vet \ -.PHONY: all build test fmt lint get_deps tools +.PHONY: all build test fmt get_deps tools From 39b206f2c13dcc8423f4fb18c930c3b455a51eaa Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Fri, 22 Sep 2017 10:38:45 -0400 Subject: [PATCH 13/15] version bump, changelog, glide --- CHANGELOG.md | 11 +++++++++++ glide.lock | 27 ++++++++++++++------------- version/version.go | 4 ++-- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09d7bf5e..fa9236db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## 0.6.0 (September 22, 2017) + +BREAKING CHANGES: + +- [types/client] app.BeginBlock takes RequestBeginBlock +- [types/client] app.InitChain takes RequestInitChain + +IMPROVEMENTS: + +- various linting + ## 0.5.0 (May 18, 2017) BREAKING CHANGES: diff --git a/glide.lock b/glide.lock index 55c5cdb3..7b79f0e5 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ hash: f9c2ddad16bf8652076a93bd9f398bb498eefb2f5bd2c89a77d966ebd12feec8 -updated: 2017-05-15T10:11:42.094564957-04:00 +updated: 2017-09-22T10:34:17.228026799-04:00 imports: - name: github.com/btcsuite/btcd version: b8df516b4b267acf2de46be593a9d948d1d2c420 @@ -7,8 +7,6 @@ imports: - btcec - name: github.com/btcsuite/fastsha256 version: 637e656429416087660c84436a2a035d69d54e2e -- name: github.com/clipperhouse/typewriter - version: c1a48da378ebb7db1db9f35981b5cc24bf2e5b85 - name: github.com/go-kit/kit version: d67bb4c202e3b91377d1079b110a6c9ce23ab2f8 subpackages: @@ -17,6 +15,12 @@ imports: - log/term - name: github.com/go-logfmt/logfmt version: 390ab7935ee28ec6b286364bba9b4dd6410cb3d5 +- name: github.com/go-playground/locales + version: 1e5f1161c6416a5ff48840eb8724a394e48cc534 + subpackages: + - currency +- name: github.com/go-playground/universal-translator + version: 71201497bace774495daed26a3874fd339e0b538 - name: github.com/go-stack/stack version: 100eb0c0a9c5b306ca2fb4f165df21d80ada4b82 - name: github.com/golang/protobuf @@ -31,7 +35,7 @@ imports: - name: github.com/kr/logfmt version: b84e30acd515aadc4b783ad4ff83aff3299bdfe0 - name: github.com/pkg/errors - version: ff09b135c25aae272398c51a07235b90a75aa4f0 + version: 645ef00459ed84a119197bfb8d8205042c6df63d - name: github.com/syndtr/goleveldb version: 8c81ea47d4c41a385645e133e15510fc6a2a74b4 subpackages: @@ -53,17 +57,17 @@ imports: - edwards25519 - extra25519 - name: github.com/tendermint/go-crypto - version: a42b10e0feb465eb56fbc6bb5b71d57ef646ec57 + version: e6ea9499ff958479e4a921850d2382eb599f204c - name: github.com/tendermint/go-wire - version: 301a758c9d28e9f3900ff5d545403cf4e5f6e73f + version: 5f88da3dbc1a72844e6dfaf274ce87f851d488eb subpackages: - data - name: github.com/tendermint/merkleeyes - version: c722818b460381bc5b82e38c73ff6e22a9df624d + version: 2f6e5d31e7a35045d8d0a5895cb1fec33dd4d32b subpackages: - iavl - name: github.com/tendermint/tmlibs - version: 812d9f9b84d1dfe4cb46ce021b3a2d97b48d1292 + version: bffe6744ec277d60f707ab442e25513617842f8e subpackages: - common - db @@ -98,11 +102,6 @@ imports: - transform - unicode/bidi - unicode/norm -- name: golang.org/x/tools - version: 144c6642b5d832d6c44a53dad6ee61665dd432ce - subpackages: - - go/ast/astutil - - imports - name: google.golang.org/genproto version: 411e09b969b1170a9f0c467558eb4c4c110d9c77 subpackages: @@ -123,6 +122,8 @@ imports: - status - tap - transport +- name: gopkg.in/go-playground/validator.v9 + version: d529ee1b0f30352444f507cc6cdac96bfd12decc testImports: - name: github.com/davecgh/go-spew version: 6d212800a42e8ab5c146b8ace3490ee17e5225f9 diff --git a/version/version.go b/version/version.go index 6687721f..34b1230e 100644 --- a/version/version.go +++ b/version/version.go @@ -3,7 +3,7 @@ package version // NOTE: we should probably be versioning the ABCI and the abci-cli separately const Maj = "0" -const Min = "5" +const Min = "6" const Fix = "0" -const Version = "0.5.0" +const Version = "0.6.0" From 667c2543eaf634792155bf29b829fdee3a6d0e1f Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Fri, 22 Sep 2017 11:10:39 -0400 Subject: [PATCH 14/15] use request struct for Info --- client/client.go | 4 +- client/grpc_client.go | 12 +- client/local_client.go | 10 +- client/socket_client.go | 8 +- cmd/abci-cli/abci-cli.go | 7 +- example/counter/counter.go | 2 +- example/dummy/dummy.go | 2 +- example/dummy/dummy_test.go | 4 +- example/dummy/persistent_dummy.go | 4 +- server/socket_server.go | 2 +- types/application.go | 4 +- types/base_app.go | 8 +- types/messages.go | 4 +- types/types.pb.go | 282 ++++++++++++------------------ types/types.proto | 1 + 15 files changed, 152 insertions(+), 202 deletions(-) diff --git a/client/client.go b/client/client.go index 3cc5df36..51d04124 100644 --- a/client/client.go +++ b/client/client.go @@ -16,7 +16,7 @@ type Client interface { FlushAsync() *ReqRes EchoAsync(msg string) *ReqRes - InfoAsync() *ReqRes + InfoAsync(types.RequestInfo) *ReqRes SetOptionAsync(key string, value string) *ReqRes DeliverTxAsync(tx []byte) *ReqRes CheckTxAsync(tx []byte) *ReqRes @@ -25,7 +25,7 @@ type Client interface { FlushSync() error EchoSync(msg string) (res types.Result) - InfoSync() (resInfo types.ResponseInfo, err error) + InfoSync(types.RequestInfo) (resInfo types.ResponseInfo, err error) SetOptionSync(key string, value string) (res types.Result) DeliverTxSync(tx []byte) (res types.Result) CheckTxSync(tx []byte) (res types.Result) diff --git a/client/grpc_client.go b/client/grpc_client.go index 31ca3db2..30f5d088 100644 --- a/client/grpc_client.go +++ b/client/grpc_client.go @@ -138,8 +138,8 @@ func (cli *grpcClient) FlushAsync() *ReqRes { return cli.finishAsyncCall(req, &types.Response{&types.Response_Flush{res}}) } -func (cli *grpcClient) InfoAsync() *ReqRes { - req := types.ToRequestInfo() +func (cli *grpcClient) InfoAsync(params types.RequestInfo) *ReqRes { + req := types.ToRequestInfo(params) res, err := cli.client.Info(context.Background(), req.GetInfo(), grpc.FailFast(true)) if err != nil { cli.StopForError(err) @@ -174,8 +174,8 @@ func (cli *grpcClient) CheckTxAsync(tx []byte) *ReqRes { return cli.finishAsyncCall(req, &types.Response{&types.Response_CheckTx{res}}) } -func (cli *grpcClient) QueryAsync(reqQuery types.RequestQuery) *ReqRes { - req := types.ToRequestQuery(reqQuery) +func (cli *grpcClient) QueryAsync(params types.RequestQuery) *ReqRes { + req := types.ToRequestQuery(params) res, err := cli.client.Query(context.Background(), req.GetQuery(), grpc.FailFast(true)) if err != nil { cli.StopForError(err) @@ -263,8 +263,8 @@ func (cli *grpcClient) FlushSync() error { return nil } -func (cli *grpcClient) InfoSync() (resInfo types.ResponseInfo, err error) { - reqres := cli.InfoAsync() +func (cli *grpcClient) InfoSync(req types.RequestInfo) (resInfo types.ResponseInfo, err error) { + reqres := cli.InfoAsync(req) if err = cli.Error(); err != nil { return resInfo, err } diff --git a/client/local_client.go b/client/local_client.go index 6bf455c6..8494a468 100644 --- a/client/local_client.go +++ b/client/local_client.go @@ -49,12 +49,12 @@ func (app *localClient) EchoAsync(msg string) *ReqRes { ) } -func (app *localClient) InfoAsync() *ReqRes { +func (app *localClient) InfoAsync(req types.RequestInfo) *ReqRes { app.mtx.Lock() - resInfo := app.Application.Info() + resInfo := app.Application.Info(req) app.mtx.Unlock() return app.callback( - types.ToRequestInfo(), + types.ToRequestInfo(req), types.ToResponseInfo(resInfo), ) } @@ -150,10 +150,10 @@ func (app *localClient) EchoSync(msg string) (res types.Result) { return types.OK.SetData([]byte(msg)) } -func (app *localClient) InfoSync() (resInfo types.ResponseInfo, err error) { +func (app *localClient) InfoSync(req types.RequestInfo) (resInfo types.ResponseInfo, err error) { app.mtx.Lock() defer app.mtx.Unlock() - resInfo = app.Application.Info() + resInfo = app.Application.Info(req) return resInfo, nil } diff --git a/client/socket_client.go b/client/socket_client.go index 4c7265cd..fd9d0ae9 100644 --- a/client/socket_client.go +++ b/client/socket_client.go @@ -233,8 +233,8 @@ func (cli *socketClient) FlushAsync() *ReqRes { return cli.queueRequest(types.ToRequestFlush()) } -func (cli *socketClient) InfoAsync() *ReqRes { - return cli.queueRequest(types.ToRequestInfo()) +func (cli *socketClient) InfoAsync(req types.RequestInfo) *ReqRes { + return cli.queueRequest(types.ToRequestInfo(req)) } func (cli *socketClient) SetOptionAsync(key string, value string) *ReqRes { @@ -290,8 +290,8 @@ func (cli *socketClient) FlushSync() error { return cli.Error() } -func (cli *socketClient) InfoSync() (resInfo types.ResponseInfo, err error) { - reqres := cli.queueRequest(types.ToRequestInfo()) +func (cli *socketClient) InfoSync(req types.RequestInfo) (resInfo types.ResponseInfo, err error) { + reqres := cli.queueRequest(types.ToRequestInfo(req)) cli.FlushSync() if err := cli.Error(); err != nil { return resInfo, err diff --git a/cmd/abci-cli/abci-cli.go b/cmd/abci-cli/abci-cli.go index b96c0346..c7316949 100644 --- a/cmd/abci-cli/abci-cli.go +++ b/cmd/abci-cli/abci-cli.go @@ -250,7 +250,12 @@ func cmdEcho(c *cli.Context) error { // Get some info from the application func cmdInfo(c *cli.Context) error { - resInfo, err := client.InfoSync() + args := c.Args() + var version string + if len(args) == 1 { + version = args[0] + } + resInfo, err := client.InfoSync(types.RequestInfo{version}) if err != nil { return err } diff --git a/example/counter/counter.go b/example/counter/counter.go index c4e4e267..d2478ae2 100644 --- a/example/counter/counter.go +++ b/example/counter/counter.go @@ -19,7 +19,7 @@ func NewCounterApplication(serial bool) *CounterApplication { return &CounterApplication{serial: serial} } -func (app *CounterApplication) Info() types.ResponseInfo { +func (app *CounterApplication) Info(req types.RequestInfo) types.ResponseInfo { return types.ResponseInfo{Data: cmn.Fmt("{\"hashes\":%v,\"txs\":%v}", app.hashCount, app.txCount)} } diff --git a/example/dummy/dummy.go b/example/dummy/dummy.go index 4485deac..5db71f96 100644 --- a/example/dummy/dummy.go +++ b/example/dummy/dummy.go @@ -20,7 +20,7 @@ func NewDummyApplication() *DummyApplication { return &DummyApplication{state: state} } -func (app *DummyApplication) Info() (resInfo types.ResponseInfo) { +func (app *DummyApplication) Info(req types.RequestInfo) (resInfo types.ResponseInfo) { return types.ResponseInfo{Data: cmn.Fmt("{\"size\":%v}", app.state.Size())} } diff --git a/example/dummy/dummy_test.go b/example/dummy/dummy_test.go index a616025e..fa9d531b 100644 --- a/example/dummy/dummy_test.go +++ b/example/dummy/dummy_test.go @@ -80,7 +80,7 @@ func TestPersistentDummyInfo(t *testing.T) { dummy := NewPersistentDummyApplication(dir) height := uint64(0) - resInfo := dummy.Info() + resInfo := dummy.Info(types.RequestInfo{}) if resInfo.LastBlockHeight != height { t.Fatalf("expected height of %d, got %d", height, resInfo.LastBlockHeight) } @@ -95,7 +95,7 @@ func TestPersistentDummyInfo(t *testing.T) { dummy.EndBlock(height) dummy.Commit() - resInfo = dummy.Info() + resInfo = dummy.Info(types.RequestInfo{}) if resInfo.LastBlockHeight != height { t.Fatalf("expected height of %d, got %d", height, resInfo.LastBlockHeight) } diff --git a/example/dummy/persistent_dummy.go b/example/dummy/persistent_dummy.go index 371cf4ce..d392be53 100644 --- a/example/dummy/persistent_dummy.go +++ b/example/dummy/persistent_dummy.go @@ -55,8 +55,8 @@ func (app *PersistentDummyApplication) SetLogger(l log.Logger) { app.logger = l } -func (app *PersistentDummyApplication) Info() (resInfo types.ResponseInfo) { - resInfo = app.app.Info() +func (app *PersistentDummyApplication) Info(req types.RequestInfo) (resInfo types.ResponseInfo) { + resInfo = app.app.Info(req) lastBlock := LoadLastBlock(app.db) resInfo.LastBlockHeight = lastBlock.Height resInfo.LastBlockAppHash = lastBlock.AppHash diff --git a/server/socket_server.go b/server/socket_server.go index 4b64a5f0..304a2c7f 100644 --- a/server/socket_server.go +++ b/server/socket_server.go @@ -169,7 +169,7 @@ func (s *SocketServer) handleRequest(req *types.Request, responses chan<- *types case *types.Request_Flush: responses <- types.ToResponseFlush() case *types.Request_Info: - resInfo := s.app.Info() + resInfo := s.app.Info(*r.Info) responses <- types.ToResponseInfo(resInfo) case *types.Request_SetOption: so := r.SetOption diff --git a/types/application.go b/types/application.go index b596685c..3d9716b7 100644 --- a/types/application.go +++ b/types/application.go @@ -8,7 +8,7 @@ import ( // to be driven by a blockchain-based replication engine via the ABCI type Application interface { // Info/Query Connection - Info() ResponseInfo // Return application info + Info(RequestInfo) ResponseInfo // Return application info SetOption(key string, value string) (log string) // Set application option Query(RequestQuery) ResponseQuery // Query for state @@ -43,7 +43,7 @@ func (app *GRPCApplication) Flush(ctx context.Context, req *RequestFlush) (*Resp } func (app *GRPCApplication) Info(ctx context.Context, req *RequestInfo) (*ResponseInfo, error) { - resInfo := app.app.Info() + resInfo := app.app.Info(*req) return &resInfo, nil } diff --git a/types/base_app.go b/types/base_app.go index 71c99cc2..94607e9a 100644 --- a/types/base_app.go +++ b/types/base_app.go @@ -7,7 +7,7 @@ func NewBaseApplication() *BaseApplication { return &BaseApplication{} } -func (app *BaseApplication) Info() (resInfo ResponseInfo) { +func (app *BaseApplication) Info(req RequestInfo) (resInfo ResponseInfo) { return } @@ -27,14 +27,14 @@ func (app *BaseApplication) Commit() Result { return NewResultOK([]byte("nil"), "") } -func (app *BaseApplication) Query(reqQuery RequestQuery) (resQuery ResponseQuery) { +func (app *BaseApplication) Query(req RequestQuery) (resQuery ResponseQuery) { return } -func (app *BaseApplication) InitChain(reqInitChain RequestInitChain) { +func (app *BaseApplication) InitChain(req RequestInitChain) { } -func (app *BaseApplication) BeginBlock(reqBeginBlock RequestBeginBlock) { +func (app *BaseApplication) BeginBlock(req RequestBeginBlock) { } func (app *BaseApplication) EndBlock(height uint64) (resEndBlock ResponseEndBlock) { diff --git a/types/messages.go b/types/messages.go index 7918e0ef..be272c38 100644 --- a/types/messages.go +++ b/types/messages.go @@ -19,9 +19,9 @@ func ToRequestFlush() *Request { } } -func ToRequestInfo() *Request { +func ToRequestInfo(req RequestInfo) *Request { return &Request{ - Value: &Request_Info{&RequestInfo{}}, + Value: &Request_Info{&req}, } } diff --git a/types/types.pb.go b/types/types.pb.go index f5966453..4ca304ac 100644 --- a/types/types.pb.go +++ b/types/types.pb.go @@ -61,64 +61,6 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package -// Not being used -// Could be added to request/response -// so we don't have to type switch -// (would be twice as fast, but we're talking about 15ns) -type MessageType int32 - -const ( - MessageType_NullMessage MessageType = 0 - MessageType_Echo MessageType = 1 - MessageType_Flush MessageType = 2 - MessageType_Info MessageType = 3 - MessageType_SetOption MessageType = 4 - MessageType_Exception MessageType = 5 - MessageType_DeliverTx MessageType = 17 - MessageType_CheckTx MessageType = 18 - MessageType_Commit MessageType = 19 - MessageType_Query MessageType = 20 - MessageType_InitChain MessageType = 21 - MessageType_BeginBlock MessageType = 22 - MessageType_EndBlock MessageType = 23 -) - -var MessageType_name = map[int32]string{ - 0: "NullMessage", - 1: "Echo", - 2: "Flush", - 3: "Info", - 4: "SetOption", - 5: "Exception", - 17: "DeliverTx", - 18: "CheckTx", - 19: "Commit", - 20: "Query", - 21: "InitChain", - 22: "BeginBlock", - 23: "EndBlock", -} -var MessageType_value = map[string]int32{ - "NullMessage": 0, - "Echo": 1, - "Flush": 2, - "Info": 3, - "SetOption": 4, - "Exception": 5, - "DeliverTx": 17, - "CheckTx": 18, - "Commit": 19, - "Query": 20, - "InitChain": 21, - "BeginBlock": 22, - "EndBlock": 23, -} - -func (x MessageType) String() string { - return proto.EnumName(MessageType_name, int32(x)) -} -func (MessageType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - type CodeType int32 const ( @@ -225,7 +167,7 @@ var CodeType_value = map[string]int32{ func (x CodeType) String() string { return proto.EnumName(CodeType_name, int32(x)) } -func (CodeType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } +func (CodeType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } type Request struct { // Types that are valid to be assigned to Value: @@ -652,6 +594,7 @@ func (*RequestFlush) ProtoMessage() {} func (*RequestFlush) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } type RequestInfo struct { + Version string `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` } func (m *RequestInfo) Reset() { *m = RequestInfo{} } @@ -659,6 +602,13 @@ func (m *RequestInfo) String() string { return proto.CompactTextStrin func (*RequestInfo) ProtoMessage() {} func (*RequestInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } +func (m *RequestInfo) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + type RequestSetOption struct { Key string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` @@ -1523,7 +1473,7 @@ func (*ResponseBeginBlock) ProtoMessage() {} func (*ResponseBeginBlock) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } type ResponseEndBlock struct { - Diffs []*Validator `protobuf:"bytes,4,rep,name=diffs" json:"diffs,omitempty"` + Diffs []*Validator `protobuf:"bytes,1,rep,name=diffs" json:"diffs,omitempty"` } func (m *ResponseEndBlock) Reset() { *m = ResponseEndBlock{} } @@ -1720,7 +1670,6 @@ func init() { proto.RegisterType((*BlockID)(nil), "types.BlockID") proto.RegisterType((*PartSetHeader)(nil), "types.PartSetHeader") proto.RegisterType((*Validator)(nil), "types.Validator") - proto.RegisterEnum("types.MessageType", MessageType_name, MessageType_value) proto.RegisterEnum("types.CodeType", CodeType_name, CodeType_value) } @@ -2129,112 +2078,107 @@ var _ABCIApplication_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("types/types.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1697 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x58, 0x4b, 0x6f, 0x1b, 0x47, - 0x12, 0xf6, 0xf0, 0xcd, 0xa6, 0x44, 0xb6, 0x5a, 0x92, 0x4d, 0x73, 0xf7, 0x60, 0xcc, 0xc2, 0x6b, - 0x49, 0xeb, 0xb5, 0x17, 0x32, 0x76, 0xb1, 0x5a, 0x2f, 0x02, 0x48, 0xb2, 0x6c, 0x13, 0x86, 0x6d, - 0x65, 0xfc, 0xb8, 0x24, 0x08, 0x31, 0xe2, 0x34, 0xc5, 0x89, 0xa8, 0x99, 0xf1, 0x3c, 0x64, 0x29, - 0xbf, 0x21, 0xf7, 0xfc, 0x84, 0xdc, 0x03, 0xe4, 0x94, 0x7b, 0x80, 0xbc, 0x1f, 0xbf, 0x28, 0x55, - 0xdd, 0x3d, 0x4f, 0xcd, 0x18, 0x39, 0xf8, 0x42, 0x4c, 0x3d, 0xbb, 0xab, 0xab, 0xea, 0xeb, 0x6a, - 0x92, 0x95, 0xf0, 0xc2, 0xe3, 0xc1, 0x5d, 0xf1, 0x7b, 0xc7, 0xf3, 0xdd, 0xd0, 0x65, 0x4d, 0x41, - 0xe8, 0xdf, 0x36, 0x48, 0xdb, 0xe0, 0x6f, 0x22, 0x1e, 0x84, 0x6c, 0x83, 0x34, 0xf8, 0x74, 0xee, - 0x0e, 0xb5, 0x1b, 0xda, 0x46, 0x6f, 0x9b, 0xdd, 0x91, 0xea, 0x4a, 0x7a, 0x00, 0x92, 0xc7, 0x57, - 0x0c, 0xa1, 0xc1, 0xfe, 0x41, 0x9a, 0xb3, 0x45, 0x14, 0xcc, 0x87, 0x35, 0xa1, 0xba, 0x9a, 0x57, - 0x7d, 0x88, 0x22, 0xd0, 0x95, 0x3a, 0xe8, 0xd6, 0x76, 0x66, 0xee, 0xb0, 0x5e, 0xe6, 0x76, 0x0c, - 0x12, 0x74, 0x8b, 0x1a, 0xec, 0xbf, 0x84, 0x04, 0x3c, 0x9c, 0xb8, 0x5e, 0x68, 0xbb, 0xce, 0xb0, - 0x21, 0xf4, 0xaf, 0xe5, 0xf5, 0x5f, 0xf0, 0xf0, 0xb9, 0x10, 0x83, 0x51, 0x37, 0x88, 0x09, 0xb4, - 0xb4, 0xf8, 0xc2, 0x3e, 0xe3, 0xfe, 0x24, 0x3c, 0x1f, 0x36, 0xcb, 0x2c, 0x1f, 0x48, 0xf9, 0xcb, - 0x73, 0xb4, 0xb4, 0x62, 0x82, 0x6d, 0x93, 0xce, 0x74, 0xce, 0xa7, 0x27, 0x68, 0xd7, 0x12, 0x76, - 0xeb, 0x79, 0xbb, 0x7d, 0x94, 0x0a, 0xab, 0xf6, 0x54, 0x7e, 0xb2, 0x3b, 0xa4, 0x35, 0x75, 0x4f, - 0x4f, 0xed, 0x70, 0xd8, 0x16, 0x16, 0x6b, 0x05, 0x0b, 0x21, 0x03, 0x03, 0xa5, 0x85, 0xc7, 0x05, - 0x02, 0xff, 0x62, 0xd8, 0x29, 0x3b, 0xae, 0x0f, 0x51, 0x84, 0xc7, 0x25, 0x74, 0x30, 0x14, 0xdb, - 0xb1, 0xc3, 0xc9, 0x74, 0x6e, 0xda, 0xce, 0xb0, 0x5b, 0x16, 0xca, 0x18, 0xe4, 0xfb, 0x28, 0xc6, - 0x50, 0xec, 0x98, 0x60, 0xf7, 0x49, 0xef, 0x88, 0x1f, 0xdb, 0xce, 0xe4, 0x68, 0xe1, 0x4e, 0x4f, - 0x86, 0x44, 0x98, 0x0e, 0xf3, 0xa6, 0x7b, 0xa8, 0xb0, 0x87, 0x72, 0xb0, 0x25, 0x47, 0x09, 0xc5, - 0xfe, 0x4d, 0xba, 0xdc, 0xb1, 0x94, 0x69, 0x4f, 0x98, 0x5e, 0x2d, 0x54, 0x80, 0x63, 0xc5, 0x86, - 0x1d, 0xae, 0xbe, 0xf7, 0xda, 0xa4, 0x79, 0x66, 0x2e, 0x22, 0xae, 0xdf, 0x22, 0xbd, 0x4c, 0xa5, - 0xb0, 0x21, 0x69, 0x9f, 0xf2, 0x20, 0x30, 0x8f, 0xb9, 0x28, 0xa7, 0xae, 0x11, 0x93, 0x7a, 0x9f, - 0x2c, 0x65, 0xeb, 0x44, 0x5f, 0x4e, 0x0c, 0xb1, 0x16, 0xf4, 0xff, 0x11, 0x5a, 0x4c, 0x35, 0xa3, - 0xa4, 0x7e, 0xc2, 0x2f, 0x94, 0x23, 0xfc, 0x64, 0x6b, 0x6a, 0x59, 0x51, 0x80, 0x5d, 0x43, 0xed, - 0x41, 0x4f, 0x6c, 0x93, 0x64, 0xb3, 0x3e, 0xa9, 0x41, 0x66, 0xd1, 0x74, 0xc9, 0x80, 0x2f, 0xfd, - 0x06, 0xe9, 0xe7, 0x13, 0x7b, 0x49, 0xc3, 0x4a, 0x36, 0x28, 0x32, 0xc3, 0x18, 0x69, 0x58, 0x66, - 0x68, 0x2a, 0x0d, 0xf1, 0x8d, 0x3c, 0xcf, 0x0c, 0xe7, 0x6a, 0x79, 0xf1, 0xcd, 0xae, 0x92, 0xd6, - 0x9c, 0xdb, 0xc7, 0xf3, 0x50, 0x54, 0x7a, 0xc3, 0x50, 0x14, 0xee, 0x15, 0x5a, 0xee, 0x8c, 0x8b, - 0x82, 0xee, 0x18, 0x92, 0xd0, 0x07, 0x64, 0x39, 0x57, 0x2e, 0xfa, 0x83, 0x64, 0xf3, 0x49, 0x7a, - 0xd9, 0xbf, 0x08, 0x81, 0xc8, 0x6c, 0x58, 0xd2, 0xf5, 0x03, 0xd8, 0x40, 0x1d, 0xb2, 0x42, 0x55, - 0x56, 0x5e, 0xc7, 0x02, 0x23, 0xa3, 0xa3, 0x3f, 0x23, 0x2b, 0x97, 0x32, 0x8d, 0xbb, 0x9d, 0x9b, - 0xd0, 0xad, 0x2a, 0x02, 0xfc, 0x66, 0x37, 0x71, 0xb7, 0xa6, 0xc5, 0x7d, 0xd5, 0xc3, 0xcb, 0xca, - 0xed, 0x63, 0xc1, 0x34, 0x94, 0x50, 0xdf, 0x24, 0x83, 0x42, 0xfa, 0x33, 0x71, 0x6a, 0xd9, 0x38, - 0xf5, 0xcf, 0x9b, 0xa4, 0x63, 0xf0, 0xc0, 0x73, 0x9d, 0x80, 0x43, 0x15, 0x77, 0xf9, 0xf9, 0x94, - 0xcb, 0x4e, 0xd6, 0x0a, 0x95, 0x28, 0x75, 0x0e, 0x62, 0x39, 0x56, 0x71, 0xa2, 0xcc, 0x36, 0x15, - 0x0a, 0x15, 0xa1, 0x45, 0x19, 0x65, 0x61, 0xe8, 0x76, 0x0c, 0x43, 0xf5, 0x42, 0x1b, 0x4a, 0xdd, - 0x02, 0x0e, 0x6d, 0x2a, 0x1c, 0x6a, 0x94, 0x3a, 0xce, 0x01, 0xd1, 0x4e, 0x0e, 0x88, 0x9a, 0xa5, - 0xdb, 0xaf, 0x40, 0xa2, 0x9d, 0x1c, 0x12, 0xb5, 0x4a, 0x4d, 0x2b, 0xa0, 0xe8, 0x5e, 0x06, 0x8a, - 0xda, 0x85, 0x0e, 0x94, 0x86, 0x25, 0x58, 0x74, 0x37, 0xc1, 0xa2, 0x4e, 0x01, 0xbd, 0x94, 0x49, - 0x11, 0x8c, 0x6e, 0xc7, 0x60, 0xd4, 0x2d, 0x3d, 0xb4, 0x02, 0x1a, 0xed, 0xe4, 0xd0, 0x88, 0x94, - 0x86, 0x53, 0x01, 0x47, 0xff, 0xcf, 0xc3, 0x91, 0xc4, 0x94, 0xeb, 0x05, 0xdb, 0x4a, 0x3c, 0xfa, - 0x4f, 0x16, 0x8f, 0x96, 0x0a, 0x28, 0xa8, 0x6a, 0xe1, 0x9d, 0x80, 0xb4, 0x89, 0x9d, 0x50, 0xa8, - 0x34, 0xec, 0x45, 0xee, 0xfb, 0xae, 0xaf, 0xb0, 0x44, 0x12, 0xfa, 0x06, 0x76, 0x7c, 0x5a, 0x5f, - 0xef, 0x00, 0x2f, 0xd1, 0xb5, 0x99, 0xea, 0xd2, 0xbf, 0xd0, 0x52, 0x5b, 0x2c, 0xa1, 0x1c, 0x5a, - 0x74, 0x15, 0x5a, 0x80, 0x3f, 0xc8, 0x70, 0x80, 0xb5, 0x24, 0x01, 0x23, 0x26, 0xd9, 0x16, 0x59, - 0x59, 0x98, 0x41, 0x28, 0xc3, 0x9c, 0xe4, 0xe0, 0x63, 0x80, 0x02, 0x19, 0x9f, 0xc4, 0x91, 0x7f, - 0x92, 0xd5, 0x8c, 0xae, 0xe9, 0x79, 0x13, 0xd1, 0xd4, 0x0d, 0xd1, 0xd4, 0x34, 0xd1, 0xde, 0xf5, - 0xbc, 0xc7, 0xc0, 0xd7, 0x6f, 0xa6, 0xf1, 0xe7, 0x90, 0x74, 0xe1, 0x1e, 0xc7, 0x48, 0x0a, 0x9f, - 0xfa, 0x27, 0xa9, 0x5a, 0x0a, 0x9a, 0x7f, 0x23, 0x8d, 0xa9, 0x6b, 0xc9, 0xe8, 0xfb, 0xdb, 0x03, - 0x75, 0xee, 0xfb, 0xc0, 0x7a, 0x09, 0x5f, 0x86, 0x10, 0x26, 0x91, 0xd6, 0x32, 0xb8, 0xa8, 0xfc, - 0xd7, 0x53, 0xff, 0x1f, 0x23, 0x80, 0xe4, 0xaa, 0xf7, 0x7d, 0x7a, 0xff, 0x4a, 0x4b, 0x13, 0x22, - 0xd1, 0xfa, 0x4f, 0x39, 0x87, 0x32, 0xb0, 0x1d, 0x8b, 0x9f, 0x0b, 0xef, 0x75, 0x43, 0x12, 0xf1, - 0x35, 0x53, 0x17, 0x2b, 0xe6, 0xaf, 0x19, 0x79, 0xc8, 0x92, 0x50, 0x80, 0xee, 0xce, 0x04, 0x30, - 0x2c, 0x19, 0x92, 0xc8, 0xc0, 0x62, 0x2b, 0x07, 0xff, 0x6a, 0xd3, 0xed, 0x74, 0xd3, 0x1f, 0xe1, - 0x15, 0x94, 0xed, 0xce, 0xf7, 0x79, 0x22, 0xab, 0x69, 0x3e, 0x93, 0xbe, 0xd4, 0xd7, 0x08, 0xbb, - 0xdc, 0x70, 0xf2, 0xaa, 0xcd, 0xb7, 0x12, 0xfb, 0x3b, 0x69, 0x5a, 0xf6, 0x6c, 0x16, 0x40, 0xc4, - 0xe5, 0x97, 0x8d, 0x14, 0xeb, 0x5f, 0xd6, 0x48, 0x4b, 0x5e, 0x15, 0xec, 0x3a, 0xc2, 0x16, 0xac, - 0x32, 0xb1, 0xad, 0xb8, 0x5d, 0x04, 0x3d, 0xb6, 0x32, 0x67, 0x52, 0xcb, 0x9d, 0x09, 0x84, 0x12, - 0xda, 0xa7, 0x5c, 0x55, 0xba, 0xf8, 0x66, 0xd7, 0x48, 0xdb, 0x89, 0x4e, 0x01, 0xfb, 0x02, 0x71, - 0xda, 0xa0, 0x0c, 0xe4, 0xcb, 0xf3, 0x00, 0x26, 0xb4, 0xe5, 0x4c, 0xdd, 0xc3, 0x22, 0x12, 0x8f, - 0xfb, 0x6a, 0x6b, 0x62, 0xdf, 0xe3, 0x07, 0x46, 0x2f, 0xe9, 0x00, 0x58, 0x78, 0x83, 0x88, 0x86, - 0x98, 0x48, 0xcc, 0x93, 0x8d, 0xd2, 0x12, 0xe7, 0xd6, 0x47, 0xbe, 0x02, 0x45, 0xbc, 0x07, 0xff, - 0x42, 0xba, 0x78, 0x92, 0x52, 0xa5, 0x2d, 0x54, 0x3a, 0xc8, 0x10, 0xc2, 0x5b, 0x64, 0x90, 0xde, - 0xad, 0x52, 0xa5, 0x23, 0xbd, 0xa4, 0x6c, 0xa1, 0x08, 0x67, 0x90, 0x34, 0x64, 0x57, 0x68, 0xb4, - 0x4d, 0xd5, 0x87, 0x63, 0xd2, 0x56, 0x5b, 0x2c, 0xbd, 0x87, 0xb7, 0xa0, 0x98, 0x4c, 0x3f, 0x0c, - 0xd4, 0x7d, 0x17, 0xc3, 0xf1, 0x21, 0xf0, 0xa0, 0x6d, 0xd5, 0x6d, 0x2c, 0x55, 0xf4, 0x1d, 0xb2, - 0x9c, 0xe3, 0x63, 0x25, 0x86, 0x6e, 0x68, 0x2e, 0xd4, 0x4d, 0x2c, 0x89, 0x64, 0x99, 0x5a, 0xba, - 0x0c, 0x98, 0x76, 0x93, 0x1c, 0x62, 0x5a, 0xbc, 0xe8, 0xe8, 0x89, 0x1a, 0xa9, 0x96, 0x0c, 0x45, - 0x89, 0xc2, 0x76, 0xdf, 0xaa, 0x91, 0x00, 0xdc, 0x09, 0x62, 0xeb, 0x1b, 0x8d, 0xf4, 0x9e, 0x4a, - 0xfc, 0xc3, 0x6a, 0x64, 0x03, 0xd2, 0x7b, 0x16, 0x2d, 0x16, 0x8a, 0x45, 0xaf, 0xb0, 0x0e, 0x69, - 0x20, 0x6c, 0x52, 0x8d, 0x75, 0x49, 0x53, 0xc0, 0x22, 0xad, 0x21, 0x13, 0xf1, 0x90, 0xd6, 0xd9, - 0x32, 0xe9, 0x26, 0x00, 0x44, 0x1b, 0x48, 0x26, 0x78, 0x4c, 0x9b, 0x48, 0x26, 0xb8, 0x43, 0x57, - 0x58, 0x8f, 0xb4, 0x15, 0x4c, 0x50, 0x88, 0x83, 0xb4, 0x64, 0xa6, 0xe8, 0x2a, 0xba, 0x16, 0x0d, - 0x4e, 0xd7, 0xd0, 0x24, 0x29, 0x6d, 0xba, 0x0e, 0xf3, 0x1b, 0x49, 0x8b, 0x9a, 0x5e, 0x65, 0x4b, - 0xa4, 0x13, 0x97, 0x33, 0xbd, 0xb6, 0xf5, 0x35, 0x4c, 0x25, 0x71, 0x23, 0xb1, 0x16, 0xa9, 0x3d, - 0x7f, 0x02, 0x3b, 0x5e, 0x21, 0xcb, 0x63, 0x27, 0xe4, 0xbe, 0x63, 0x2e, 0x0e, 0xf0, 0x06, 0x80, - 0xad, 0x03, 0xeb, 0xc0, 0x81, 0x3e, 0xb3, 0x9d, 0x63, 0xc9, 0xaa, 0xa1, 0xa3, 0x3d, 0xd3, 0x7a, - 0xe6, 0x3a, 0x53, 0x0e, 0x61, 0x50, 0xb2, 0xf4, 0xca, 0x31, 0xa3, 0x70, 0xee, 0xfa, 0xf6, 0x67, - 0xdc, 0x82, 0x48, 0xd6, 0xc9, 0xca, 0xd8, 0x09, 0xa2, 0xd9, 0xcc, 0x9e, 0xda, 0xdc, 0x09, 0x1f, - 0x46, 0x8e, 0x15, 0x40, 0x44, 0x8c, 0xf4, 0x5f, 0x39, 0x27, 0x8e, 0xfb, 0xd6, 0x51, 0x93, 0x13, - 0x6d, 0xc1, 0x0d, 0xb0, 0xb6, 0x67, 0x02, 0xc2, 0x46, 0xde, 0xc2, 0x9e, 0x9a, 0x21, 0xdf, 0xb5, - 0x2c, 0x1f, 0xce, 0x8f, 0x72, 0x74, 0x82, 0x92, 0xfc, 0xda, 0xb3, 0xd8, 0x20, 0xe7, 0x9f, 0xf3, - 0x80, 0x1e, 0x43, 0xa9, 0xad, 0x5f, 0x92, 0x88, 0x95, 0xe7, 0xec, 0xaf, 0x64, 0x58, 0x14, 0x3d, - 0x32, 0x83, 0x43, 0xdf, 0x86, 0x00, 0x6c, 0xc8, 0x2e, 0x95, 0x52, 0x51, 0xbb, 0x63, 0xc7, 0x8b, - 0x42, 0xfa, 0x69, 0xbc, 0xbe, 0xe2, 0x3e, 0x8f, 0x42, 0x64, 0x9f, 0x14, 0xd8, 0x87, 0xa2, 0x3e, - 0xe8, 0x02, 0x9a, 0x74, 0x35, 0xc3, 0x7e, 0x81, 0xf1, 0xe1, 0xe9, 0x9c, 0xa6, 0xfb, 0x95, 0x02, - 0xfb, 0xd8, 0x31, 0xc3, 0xc8, 0xe7, 0xd4, 0x81, 0x62, 0x63, 0x28, 0x51, 0x47, 0x12, 0x07, 0xee, - 0xc6, 0x2b, 0x28, 0xbe, 0x5a, 0xc1, 0x2b, 0xb2, 0x17, 0x11, 0x64, 0x96, 0xbe, 0x01, 0x36, 0x7d, - 0xe4, 0x9e, 0x29, 0xee, 0x81, 0x13, 0xda, 0xe1, 0x05, 0xfd, 0x4e, 0x83, 0x98, 0x06, 0x29, 0xfb, - 0x91, 0xef, 0x46, 0x1e, 0xfd, 0x5e, 0x83, 0x5d, 0xb2, 0x94, 0x7b, 0xe8, 0xbb, 0x9e, 0x1b, 0x98, - 0x0b, 0xfa, 0x83, 0x06, 0x7b, 0x59, 0x01, 0x41, 0x92, 0x05, 0x69, 0xf0, 0x63, 0x6c, 0x90, 0xf0, - 0x9f, 0xf2, 0xd3, 0x23, 0xee, 0xd3, 0x9f, 0x34, 0x38, 0xec, 0xb5, 0xac, 0x20, 0xf1, 0xf5, 0xb3, - 0xa6, 0x76, 0x94, 0x88, 0x5e, 0xbb, 0x21, 0xa7, 0xbf, 0xc4, 0x6c, 0x75, 0x0e, 0xca, 0xd1, 0xaf, - 0x1a, 0x5b, 0x25, 0xfd, 0x94, 0x2d, 0x74, 0x7f, 0xd3, 0xd8, 0x88, 0xac, 0xe7, 0x98, 0x90, 0xff, - 0x43, 0x6c, 0x39, 0xfa, 0xbb, 0xb6, 0x0d, 0xd3, 0xf4, 0x60, 0x77, 0x6f, 0x7f, 0x0c, 0xd7, 0xb9, - 0x58, 0x00, 0x6f, 0xef, 0xbb, 0xb2, 0xd1, 0x58, 0xc9, 0xd3, 0x7c, 0x54, 0x36, 0x28, 0x03, 0x74, - 0xca, 0x7e, 0x64, 0x65, 0x2f, 0xf4, 0x51, 0xe9, 0xbc, 0x8c, 0x8b, 0xc8, 0x41, 0xe6, 0xf2, 0x43, - 0x7d, 0x54, 0x36, 0x34, 0xb3, 0x0f, 0x32, 0xfd, 0xcd, 0xaa, 0x9e, 0xeb, 0xa3, 0xca, 0xf1, 0x19, - 0xed, 0xd3, 0xc9, 0xa3, 0xea, 0xd1, 0x3e, 0xaa, 0x9c, 0xa1, 0xe1, 0xa9, 0x11, 0x43, 0x06, 0x2b, - 0x7f, 0xba, 0x8f, 0x2a, 0xc6, 0x68, 0x3c, 0x1e, 0x39, 0x34, 0x94, 0xbd, 0xc8, 0x47, 0xa5, 0x93, - 0x31, 0xbc, 0x93, 0x15, 0x26, 0xb1, 0xd2, 0x57, 0xff, 0xa8, 0x7c, 0xfe, 0xc6, 0x20, 0xd3, 0x67, - 0x5d, 0xd5, 0x73, 0x7e, 0x54, 0x39, 0x59, 0xb3, 0xdd, 0x2c, 0xc8, 0xb1, 0xca, 0x47, 0xfd, 0xa8, - 0x7a, 0xbe, 0x66, 0xf7, 0x53, 0x5c, 0x64, 0x15, 0x4f, 0xfb, 0x51, 0xd5, 0x88, 0x7d, 0xd4, 0x12, - 0xff, 0x1a, 0xdd, 0xfb, 0x23, 0x00, 0x00, 0xff, 0xff, 0x73, 0x34, 0x90, 0x2d, 0x4a, 0x12, 0x00, - 0x00, + // 1625 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0x59, 0x6f, 0xdb, 0xc6, + 0x16, 0x36, 0xb5, 0xeb, 0xd8, 0x96, 0xe9, 0xb1, 0x6c, 0xcb, 0xba, 0xf7, 0x21, 0xe0, 0x45, 0x6e, + 0xec, 0xdc, 0xdc, 0xa4, 0x70, 0x90, 0x22, 0x6e, 0x8a, 0x02, 0xde, 0x62, 0x0b, 0x41, 0x13, 0x97, + 0x59, 0x5e, 0x5a, 0x54, 0xa0, 0xc9, 0x91, 0xc4, 0x5a, 0x9a, 0x61, 0xc8, 0xa1, 0x23, 0xf7, 0x37, + 0xe4, 0xbd, 0x3f, 0xa1, 0xef, 0x05, 0xfa, 0x17, 0x0a, 0x74, 0x5f, 0x7e, 0x51, 0x31, 0x0b, 0x57, + 0x93, 0x41, 0x1f, 0xf2, 0x22, 0xf0, 0x6c, 0x33, 0x73, 0xce, 0x9c, 0xf3, 0x9d, 0x33, 0x82, 0x55, + 0x76, 0xe5, 0xe1, 0xe0, 0x9e, 0xf8, 0xbd, 0xeb, 0xf9, 0x94, 0x51, 0x54, 0x17, 0x84, 0xf1, 0x43, + 0x0d, 0x9a, 0x26, 0x7e, 0x1d, 0xe2, 0x80, 0xa1, 0x6d, 0xa8, 0x61, 0x7b, 0x42, 0x7b, 0xda, 0x0d, + 0x6d, 0x7b, 0x71, 0x17, 0xdd, 0x95, 0xea, 0x4a, 0x7a, 0x6c, 0x4f, 0xe8, 0xe9, 0x82, 0x29, 0x34, + 0xd0, 0xff, 0xa0, 0x3e, 0x9a, 0x86, 0xc1, 0xa4, 0x57, 0x11, 0xaa, 0x6b, 0x59, 0xd5, 0xc7, 0x5c, + 0x74, 0xba, 0x60, 0x4a, 0x1d, 0xbe, 0xac, 0x4b, 0x46, 0xb4, 0x57, 0x2d, 0x5a, 0x76, 0x40, 0x46, + 0x62, 0x59, 0xae, 0x81, 0x1e, 0x02, 0x04, 0x98, 0x0d, 0xa9, 0xc7, 0x5c, 0x4a, 0x7a, 0x35, 0xa1, + 0xbf, 0x99, 0xd5, 0x7f, 0x8e, 0xd9, 0x33, 0x21, 0x3e, 0x5d, 0x30, 0xdb, 0x41, 0x44, 0x70, 0x4b, + 0x07, 0x4f, 0xdd, 0x4b, 0xec, 0x0f, 0xd9, 0xbc, 0x57, 0x2f, 0xb2, 0x3c, 0x92, 0xf2, 0x17, 0x73, + 0x6e, 0xe9, 0x44, 0x04, 0xda, 0x85, 0x96, 0x3d, 0xc1, 0xf6, 0x05, 0xb7, 0x6b, 0x08, 0xbb, 0xf5, + 0xac, 0xdd, 0x21, 0x97, 0x0a, 0xab, 0xa6, 0x2d, 0x3f, 0xd1, 0x5d, 0x68, 0xd8, 0x74, 0x36, 0x73, + 0x59, 0xaf, 0x29, 0x2c, 0xba, 0x39, 0x0b, 0x21, 0x3b, 0x5d, 0x30, 0x95, 0x16, 0x0f, 0xd7, 0xeb, + 0x10, 0xfb, 0x57, 0xbd, 0x56, 0x51, 0xb8, 0x3e, 0xe3, 0x22, 0x1e, 0x2e, 0xa1, 0xc3, 0x5d, 0x71, + 0x89, 0xcb, 0x86, 0xf6, 0xc4, 0x72, 0x49, 0xaf, 0x5d, 0xe4, 0xca, 0x80, 0xb8, 0xec, 0x90, 0x8b, + 0xb9, 0x2b, 0x6e, 0x44, 0xa0, 0x47, 0xb0, 0x78, 0x8e, 0xc7, 0x2e, 0x19, 0x9e, 0x4f, 0xa9, 0x7d, + 0xd1, 0x03, 0x61, 0xda, 0xcb, 0x9a, 0x1e, 0x70, 0x85, 0x03, 0x2e, 0x3f, 0x5d, 0x30, 0xe1, 0x3c, + 0xa6, 0xd0, 0x03, 0x68, 0x63, 0xe2, 0x28, 0xd3, 0x45, 0x61, 0xba, 0x91, 0xcb, 0x00, 0xe2, 0x44, + 0x86, 0x2d, 0xac, 0xbe, 0x0f, 0x9a, 0x50, 0xbf, 0xb4, 0xa6, 0x21, 0x36, 0x6e, 0xc1, 0x62, 0x2a, + 0x53, 0x50, 0x0f, 0x9a, 0x33, 0x1c, 0x04, 0xd6, 0x18, 0x8b, 0x74, 0x6a, 0x9b, 0x11, 0x69, 0x74, + 0x60, 0x29, 0x9d, 0x27, 0x29, 0x43, 0x9e, 0x0b, 0xdc, 0xf0, 0x12, 0xfb, 0x01, 0x4f, 0x00, 0x65, + 0xa8, 0x48, 0xe3, 0x23, 0xd0, 0xf3, 0x49, 0x80, 0x74, 0xa8, 0x5e, 0xe0, 0x2b, 0xa5, 0xc9, 0x3f, + 0x51, 0x57, 0x1d, 0x48, 0xa4, 0x66, 0xdb, 0x54, 0xa7, 0x33, 0x62, 0xdb, 0x38, 0x0d, 0x50, 0x07, + 0x2a, 0x6c, 0x2e, 0x4c, 0x97, 0xcc, 0x0a, 0x9b, 0x1b, 0x37, 0xa0, 0x93, 0xbd, 0xf2, 0x6b, 0x1a, + 0x4e, 0x7c, 0x74, 0x71, 0x67, 0x08, 0x41, 0xcd, 0xb1, 0x98, 0xa5, 0x34, 0xc4, 0x37, 0xe7, 0x79, + 0x16, 0x9b, 0xa8, 0xed, 0xc5, 0x37, 0xda, 0x80, 0xc6, 0x04, 0xbb, 0xe3, 0x09, 0x13, 0x35, 0x50, + 0x33, 0x15, 0xc5, 0xcf, 0xea, 0xf9, 0xf4, 0x12, 0x8b, 0x54, 0x6f, 0x99, 0x92, 0x30, 0x56, 0x60, + 0x39, 0x93, 0x48, 0xc6, 0x51, 0x7c, 0xf8, 0xf8, 0xe2, 0xd1, 0x07, 0x00, 0x97, 0xd6, 0xd4, 0x75, + 0x2c, 0x46, 0xfd, 0xa0, 0xa7, 0xdd, 0xa8, 0x6e, 0x2f, 0xee, 0xea, 0xea, 0xbe, 0x5e, 0x45, 0x02, + 0x33, 0xa5, 0x63, 0x3c, 0x85, 0xd5, 0x6b, 0x39, 0xc0, 0x4f, 0x3b, 0xb1, 0x82, 0x49, 0xe4, 0x01, + 0xff, 0x46, 0x37, 0xf9, 0x69, 0x2d, 0x07, 0xfb, 0xaa, 0xba, 0x97, 0xd5, 0xb2, 0xa7, 0x82, 0x69, + 0x2a, 0xa1, 0xb1, 0x03, 0x2b, 0xb9, 0xc4, 0x48, 0xf9, 0xa9, 0xa5, 0xfd, 0x34, 0xde, 0xd6, 0xa1, + 0x65, 0xe2, 0xc0, 0xa3, 0x24, 0xc0, 0xe8, 0x21, 0xb4, 0xf1, 0xdc, 0xc6, 0xb2, 0xc6, 0xb5, 0x5c, + 0x8e, 0x4a, 0x9d, 0xe3, 0x48, 0xce, 0xf3, 0x3b, 0x56, 0x46, 0x3b, 0x0a, 0x9f, 0xf2, 0xa0, 0xa3, + 0x8c, 0xd2, 0x00, 0x75, 0x27, 0x02, 0xa8, 0x6a, 0xae, 0x40, 0xa5, 0x6e, 0x0e, 0xa1, 0x76, 0x14, + 0x42, 0xd5, 0x0a, 0x17, 0xce, 0x40, 0xd4, 0x5e, 0x06, 0xa2, 0xea, 0x85, 0xc7, 0x2f, 0xc1, 0xa8, + 0xbd, 0x0c, 0x46, 0x35, 0x0a, 0x4d, 0x4b, 0x40, 0xea, 0x7e, 0x0a, 0xa4, 0x9a, 0xb9, 0xda, 0x94, + 0x86, 0x05, 0x28, 0x75, 0x2f, 0x46, 0xa9, 0x56, 0x0e, 0xd7, 0x94, 0x49, 0x1e, 0xa6, 0xee, 0x44, + 0x30, 0xd5, 0x2e, 0x0c, 0x5a, 0x0e, 0xa7, 0xf6, 0x32, 0x38, 0x05, 0x85, 0xee, 0x94, 0x00, 0xd5, + 0xc7, 0x59, 0xa0, 0x92, 0x68, 0xb3, 0x95, 0xb3, 0x2d, 0x45, 0xaa, 0x0f, 0xd3, 0x48, 0xb5, 0x94, + 0xc3, 0x47, 0x95, 0x0b, 0xef, 0x84, 0xaa, 0x1d, 0x5e, 0x09, 0xb9, 0x4c, 0xe3, 0xb5, 0x88, 0x7d, + 0x9f, 0xfa, 0x0a, 0x4b, 0x24, 0x61, 0x6c, 0xf3, 0x8a, 0x4f, 0xf2, 0xeb, 0x1d, 0xb0, 0x26, 0xaa, + 0x36, 0x95, 0x5d, 0xc6, 0x37, 0x5a, 0x62, 0x2b, 0x90, 0x2d, 0x8d, 0x16, 0x6d, 0x85, 0x16, 0x29, + 0xb4, 0xab, 0x64, 0xd0, 0x0e, 0xdd, 0x86, 0xd5, 0xa9, 0x15, 0x30, 0xe9, 0xe6, 0x30, 0x03, 0x1f, + 0x2b, 0x5c, 0x20, 0xfd, 0x93, 0x38, 0xf2, 0x7f, 0x58, 0x4b, 0xe9, 0x5a, 0x9e, 0x37, 0x14, 0x45, + 0x5d, 0x13, 0x45, 0xad, 0xc7, 0xda, 0xfb, 0x9e, 0x77, 0x6a, 0x05, 0x13, 0xe3, 0x66, 0xe2, 0x7f, + 0x06, 0x49, 0xa7, 0x74, 0x1c, 0x21, 0xe9, 0x94, 0x8e, 0x8d, 0x2f, 0x13, 0xb5, 0x04, 0x34, 0xff, + 0x03, 0x35, 0x9b, 0x3a, 0xd2, 0xfb, 0xce, 0xee, 0x8a, 0x8a, 0xfb, 0x21, 0x75, 0xf0, 0x8b, 0x2b, + 0x0f, 0x9b, 0x42, 0x18, 0x7b, 0x5a, 0x49, 0xe1, 0xa2, 0x5a, 0xbf, 0x9a, 0xac, 0xff, 0x05, 0x07, + 0x90, 0x4c, 0xf6, 0xbe, 0xcf, 0xd5, 0xbf, 0xd3, 0x92, 0x0b, 0x91, 0x68, 0xfd, 0x8f, 0x16, 0xef, + 0x42, 0xdd, 0x25, 0x0e, 0x9e, 0x8b, 0xd5, 0xab, 0xa6, 0x24, 0xa2, 0x36, 0x53, 0x15, 0x3b, 0x66, + 0xdb, 0x8c, 0x0c, 0xb2, 0x24, 0x14, 0xa0, 0xd3, 0x91, 0x00, 0x86, 0x25, 0x53, 0x12, 0x29, 0x58, + 0x6c, 0x64, 0xe0, 0x5f, 0x1d, 0xba, 0x99, 0x1c, 0xfa, 0x73, 0xde, 0x82, 0xd2, 0xd5, 0xf9, 0x3e, + 0x23, 0xb2, 0x96, 0xdc, 0x67, 0x5c, 0x97, 0x46, 0x17, 0xd0, 0xf5, 0x82, 0x93, 0xad, 0x36, 0x5b, + 0x4a, 0xe8, 0xbf, 0x50, 0x77, 0xdc, 0xd1, 0xa8, 0xbc, 0xd9, 0x48, 0xb1, 0xf1, 0x6d, 0x05, 0x1a, + 0xb2, 0x55, 0xa0, 0x2d, 0x0e, 0x5b, 0x96, 0x4b, 0x86, 0xae, 0x13, 0x95, 0x8b, 0xa0, 0x07, 0x4e, + 0x2a, 0x26, 0x95, 0x4c, 0x4c, 0x10, 0xd4, 0x98, 0x3b, 0xc3, 0x2a, 0xd3, 0xc5, 0x37, 0xda, 0x84, + 0x26, 0x09, 0x67, 0x43, 0x36, 0x0f, 0x44, 0xb4, 0x6b, 0x66, 0x83, 0x84, 0xb3, 0x17, 0xf3, 0x00, + 0xed, 0xc2, 0x72, 0x2a, 0xef, 0x5d, 0x47, 0xe1, 0x71, 0x47, 0x1d, 0x4d, 0x9c, 0x7b, 0x70, 0x64, + 0x2e, 0xc6, 0x15, 0x30, 0x70, 0xd0, 0x36, 0x88, 0x82, 0x18, 0x4a, 0xcc, 0x93, 0x85, 0xd2, 0x10, + 0x71, 0xeb, 0x70, 0xbe, 0x02, 0x45, 0xde, 0x07, 0xff, 0x05, 0x6d, 0x1e, 0x49, 0xa9, 0xd2, 0x14, + 0x2a, 0x2d, 0xce, 0x10, 0xc2, 0x5b, 0xb0, 0x92, 0xf4, 0x56, 0xa9, 0xd2, 0x92, 0xab, 0x24, 0x6c, + 0xa1, 0xb8, 0x05, 0xad, 0xb8, 0x20, 0xdb, 0x42, 0xa3, 0x69, 0xa9, 0x3a, 0x1c, 0x40, 0x53, 0x1d, + 0xb1, 0xb0, 0x0f, 0xdf, 0x86, 0xba, 0x67, 0xf9, 0x2c, 0x50, 0xfd, 0x2e, 0x82, 0xe3, 0x33, 0xcb, + 0xe7, 0x03, 0x90, 0xea, 0xc6, 0x52, 0xc5, 0xd8, 0x83, 0xe5, 0x0c, 0x9f, 0x67, 0x22, 0xa3, 0xcc, + 0x9a, 0xaa, 0x4e, 0x2c, 0x89, 0x78, 0x9b, 0x4a, 0xb2, 0x8d, 0xb1, 0x07, 0xed, 0xf8, 0x0e, 0xf9, + 0xb5, 0x78, 0xe1, 0xf9, 0x13, 0x35, 0x52, 0x2d, 0x99, 0x8a, 0x12, 0x89, 0x4d, 0xdf, 0xa8, 0x91, + 0xa0, 0x66, 0x4a, 0xe2, 0xf6, 0xf7, 0x75, 0x68, 0x45, 0xa9, 0x88, 0x1a, 0x50, 0x79, 0xf6, 0x44, + 0x5f, 0x40, 0xab, 0xb0, 0x3c, 0x20, 0x0c, 0xfb, 0xc4, 0x9a, 0x1e, 0x73, 0x0c, 0xd5, 0x35, 0xce, + 0x3a, 0x26, 0x36, 0x75, 0x5c, 0x32, 0x96, 0xac, 0x0a, 0x5a, 0x82, 0xd6, 0x81, 0xe5, 0x3c, 0xa5, + 0xc4, 0xc6, 0x7a, 0x15, 0xe9, 0xb0, 0xf4, 0x92, 0x58, 0x21, 0x9b, 0x50, 0xdf, 0xfd, 0x1a, 0x3b, + 0x7a, 0x0d, 0xad, 0xc3, 0xea, 0x80, 0x04, 0xe1, 0x68, 0xe4, 0xda, 0x2e, 0x26, 0xec, 0x71, 0x48, + 0x9c, 0x40, 0xaf, 0x23, 0x04, 0x9d, 0x97, 0xe4, 0x82, 0xd0, 0x37, 0x44, 0xcd, 0x1e, 0x7a, 0x03, + 0xf5, 0xa0, 0x7b, 0x60, 0x05, 0xf8, 0x28, 0xf4, 0xa6, 0xae, 0x6d, 0x31, 0xbc, 0xef, 0x38, 0x3e, + 0x0e, 0x02, 0x1d, 0xf3, 0x45, 0xb8, 0x24, 0xbb, 0xf7, 0x28, 0x32, 0xc8, 0xac, 0x8f, 0x71, 0xa0, + 0x8f, 0xd1, 0x16, 0xac, 0x5f, 0x93, 0x88, 0x9d, 0x27, 0xe8, 0xdf, 0xd0, 0xcb, 0x8b, 0x4e, 0xac, + 0xe0, 0xcc, 0x77, 0x6d, 0xac, 0xbb, 0xa8, 0x0b, 0xba, 0x94, 0x8a, 0xdb, 0x1f, 0x10, 0x2f, 0x64, + 0xfa, 0x57, 0xd1, 0xfe, 0x8a, 0xfb, 0x2c, 0x64, 0x9c, 0x7d, 0x91, 0x63, 0x9f, 0x89, 0x08, 0xeb, + 0x53, 0xb4, 0x09, 0x6b, 0x29, 0xf6, 0x73, 0xee, 0x1f, 0x8f, 0xce, 0x2c, 0x39, 0xaf, 0x14, 0xb8, + 0x63, 0x62, 0xb1, 0xd0, 0xc7, 0x3a, 0x41, 0x1b, 0x80, 0xb8, 0x44, 0x85, 0x24, 0x72, 0x9c, 0x46, + 0x3b, 0x28, 0xbe, 0xda, 0xc1, 0xcb, 0xb3, 0xa7, 0xe1, 0xd8, 0x25, 0xfa, 0x6b, 0xb4, 0x0e, 0xfa, + 0x09, 0xbd, 0x54, 0xdc, 0x63, 0xc2, 0x5c, 0x76, 0xa5, 0xff, 0xa8, 0xa1, 0x2e, 0xac, 0x24, 0xec, + 0x13, 0x9f, 0x86, 0x9e, 0xfe, 0x93, 0x86, 0x36, 0x01, 0x25, 0xdc, 0x33, 0x9f, 0x7a, 0x34, 0xb0, + 0xa6, 0xfa, 0xcf, 0x1a, 0xda, 0x80, 0xd5, 0x13, 0x7a, 0x19, 0xdf, 0x82, 0x34, 0xf8, 0x25, 0x32, + 0x88, 0xf9, 0x9f, 0xe2, 0xd9, 0x39, 0xf6, 0xf5, 0x5f, 0x35, 0xb4, 0x05, 0xdd, 0xb4, 0x20, 0x5e, + 0xeb, 0x37, 0x4d, 0x9d, 0x28, 0x16, 0xbd, 0xa2, 0x0c, 0xeb, 0xbf, 0x47, 0x6c, 0x15, 0x07, 0xb5, + 0xd0, 0x1f, 0x1a, 0x5a, 0x83, 0x4e, 0xc2, 0x16, 0xba, 0x7f, 0x6a, 0xa8, 0x0f, 0xeb, 0x19, 0xa6, + 0x4b, 0xc6, 0x67, 0x3c, 0x69, 0xf5, 0xbf, 0xb4, 0xdd, 0xb7, 0x75, 0x58, 0xd9, 0x3f, 0x38, 0x1c, + 0xec, 0x7b, 0x72, 0x03, 0xde, 0xff, 0xee, 0x41, 0x4d, 0x74, 0xf8, 0x82, 0x67, 0x6f, 0xbf, 0x68, + 0xd4, 0x44, 0xbb, 0x50, 0x17, 0x8d, 0x1e, 0x15, 0xbd, 0x7e, 0xfb, 0x85, 0x13, 0x27, 0xdf, 0x44, + 0x8e, 0x02, 0xd7, 0x1f, 0xc1, 0xfd, 0xa2, 0xb1, 0x13, 0x7d, 0x02, 0xed, 0xa4, 0x45, 0x97, 0x3d, + 0x85, 0xfb, 0xa5, 0x03, 0x28, 0xb7, 0x4f, 0x7a, 0x77, 0xd9, 0x83, 0xb8, 0x5f, 0x3a, 0x85, 0xa2, + 0x87, 0xd0, 0x8c, 0x7a, 0x73, 0xf1, 0xb3, 0xb8, 0x5f, 0x32, 0x88, 0xf2, 0xf0, 0xc8, 0xb6, 0x5b, + 0xf4, 0xda, 0xed, 0x17, 0xce, 0x96, 0xe8, 0x01, 0x34, 0x54, 0xdb, 0x2b, 0x7c, 0x51, 0xf7, 0x8b, + 0x27, 0x58, 0xee, 0x64, 0xf2, 0x30, 0x2a, 0x7b, 0x2a, 0xf7, 0x4b, 0x67, 0x53, 0xb4, 0x0f, 0x90, + 0x7a, 0x12, 0x95, 0x3e, 0x98, 0xfb, 0xe5, 0x13, 0x2a, 0x7a, 0x04, 0xad, 0xe4, 0x15, 0x54, 0xfc, + 0x6c, 0xee, 0x97, 0x0d, 0xa9, 0xe7, 0x0d, 0xf1, 0x8f, 0xcc, 0xfd, 0xbf, 0x03, 0x00, 0x00, 0xff, + 0xff, 0xbd, 0xb6, 0xa5, 0xad, 0xa6, 0x11, 0x00, 0x00, } diff --git a/types/types.proto b/types/types.proto index 7abc354d..802d8fc5 100644 --- a/types/types.proto +++ b/types/types.proto @@ -73,6 +73,7 @@ message RequestFlush { } message RequestInfo { + string version = 1; } message RequestSetOption{ From 88cb73d95a1df0cfdacb352f9c7a911ab5bd22c0 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Fri, 22 Sep 2017 11:16:09 -0400 Subject: [PATCH 15/15] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa9236db..91bd0649 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ BREAKING CHANGES: - [types/client] app.BeginBlock takes RequestBeginBlock - [types/client] app.InitChain takes RequestInitChain +- [types/client] app.Info takes RequestInfo IMPROVEMENTS: