From 480e4e4444842a4709c38e80729afe96f47df1ac Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 9 Nov 2017 16:19:59 -0500 Subject: [PATCH 01/42] install protoc --- Makefile | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 6c99e3639..b9ef0b334 100644 --- a/Makefile +++ b/Makefile @@ -7,12 +7,22 @@ all: protoc install test PACKAGES=$(shell go list ./... | grep -v '/vendor/') -install-protoc: - # Download: https://github.com/google/protobuf/releases +install_protoc: + # https://github.com/google/protobuf/releases + curl -L https://github.com/google/protobuf/releases/download/v3.4.1/protobuf-cpp-3.4.1.tar.gz | tar xvz && \ + cd protobuf-cpp-3.4.1 && \ + DIST_LANG=cpp ./configure && \ + make && \ + make install && \ + cd .. && \ + rm -rf protobuf-cpp-3.4.1 go get github.com/golang/protobuf/protoc-gen-go protoc: - @ protoc --go_out=plugins=grpc:. types/*.proto + ## On "error while loading shared libraries: libprotobuf.so.14: cannot open shared object file: No such file or directory" + ## ldconfig (may require sudo) + ## https://stackoverflow.com/a/25518702 + protoc --go_out=plugins=grpc:. types/*.proto install: @ go install ./cmd/... @@ -79,4 +89,4 @@ metalinter_test: tools #--enable=unparam \ #--enable=vet \ -.PHONY: all build test fmt get_deps tools +.PHONY: all build test fmt get_deps tools protoc install_protoc From 87072d3810e2c69588ff646746654d3161656dde Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 9 Nov 2017 16:19:29 -0500 Subject: [PATCH 02/42] add Dockerfile for development --- Dockerfile.develop | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Dockerfile.develop diff --git a/Dockerfile.develop b/Dockerfile.develop new file mode 100644 index 000000000..daf6cb617 --- /dev/null +++ b/Dockerfile.develop @@ -0,0 +1,15 @@ +FROM golang:latest + +RUN mkdir -p /go/src/github.com/tendermint/abci +WORKDIR /go/src/github.com/tendermint/abci + +COPY Makefile /go/src/github.com/tendermint/abci/ + +RUN make install_protoc + +COPY glide.yaml /go/src/github.com/tendermint/abci/ +COPY glide.lock /go/src/github.com/tendermint/abci/ + +RUN make get_vendor_deps + +COPY . /go/src/github.com/tendermint/abci From f07c300c148ddad93a541e7b753b094ee26614e9 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 9 Nov 2017 16:49:06 -0500 Subject: [PATCH 03/42] add proto section to .editorconfig --- .editorconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.editorconfig b/.editorconfig index d587999e1..82f774362 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,3 +13,7 @@ indent_style = tab [*.sh] indent_style = tab + +[*.proto] +indent_style = space +indent_size = 2 From bb0d7e95261243336cb2114dcf447d307a2edfb8 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 9 Nov 2017 16:52:52 -0500 Subject: [PATCH 04/42] add tags field to DeliverTx and CheckTx --- client/local_client.go | 4 +- server/socket_server.go | 4 +- types/application.go | 4 +- types/messages.go | 10 +- types/result.go | 3 + types/types.pb.go | 275 ++++++++++++++++++++++++---------------- types/types.proto | 17 ++- 7 files changed, 192 insertions(+), 125 deletions(-) diff --git a/client/local_client.go b/client/local_client.go index 8494a468f..13ebc0909 100644 --- a/client/local_client.go +++ b/client/local_client.go @@ -75,7 +75,7 @@ func (app *localClient) DeliverTxAsync(tx []byte) *ReqRes { app.mtx.Unlock() return app.callback( types.ToRequestDeliverTx(tx), - types.ToResponseDeliverTx(res.Code, res.Data, res.Log), + types.ToResponseDeliverTx(res.Code, res.Data, res.Log, res.Tags), ) } @@ -85,7 +85,7 @@ func (app *localClient) CheckTxAsync(tx []byte) *ReqRes { app.mtx.Unlock() return app.callback( types.ToRequestCheckTx(tx), - types.ToResponseCheckTx(res.Code, res.Data, res.Log), + types.ToResponseCheckTx(res.Code, res.Data, res.Log, res.Tags), ) } diff --git a/server/socket_server.go b/server/socket_server.go index 2396c556d..3e8ef942d 100644 --- a/server/socket_server.go +++ b/server/socket_server.go @@ -176,10 +176,10 @@ func (s *SocketServer) handleRequest(req *types.Request, responses chan<- *types responses <- types.ToResponseSetOption(logStr) case *types.Request_DeliverTx: res := s.app.DeliverTx(r.DeliverTx.Tx) - responses <- types.ToResponseDeliverTx(res.Code, res.Data, res.Log) + responses <- types.ToResponseDeliverTx(res.Code, res.Data, res.Log, res.Tags) case *types.Request_CheckTx: res := s.app.CheckTx(r.CheckTx.Tx) - responses <- types.ToResponseCheckTx(res.Code, res.Data, res.Log) + responses <- types.ToResponseCheckTx(res.Code, res.Data, res.Log, res.Tags) case *types.Request_Commit: res := s.app.Commit() responses <- types.ToResponseCommit(res.Code, res.Data, res.Log) diff --git a/types/application.go b/types/application.go index 3d9716b74..fcda5d95b 100644 --- a/types/application.go +++ b/types/application.go @@ -53,12 +53,12 @@ func (app *GRPCApplication) SetOption(ctx context.Context, req *RequestSetOption func (app *GRPCApplication) DeliverTx(ctx context.Context, req *RequestDeliverTx) (*ResponseDeliverTx, error) { r := app.app.DeliverTx(req.Tx) - return &ResponseDeliverTx{r.Code, r.Data, r.Log}, nil + return &ResponseDeliverTx{r.Code, r.Data, r.Log, r.Tags}, nil } func (app *GRPCApplication) CheckTx(ctx context.Context, req *RequestCheckTx) (*ResponseCheckTx, error) { r := app.app.CheckTx(req.Tx) - return &ResponseCheckTx{r.Code, r.Data, r.Log}, nil + return &ResponseCheckTx{r.Code, r.Data, r.Log, r.Tags}, nil } func (app *GRPCApplication) Query(ctx context.Context, req *RequestQuery) (*ResponseQuery, error) { diff --git a/types/messages.go b/types/messages.go index be272c387..d4a582964 100644 --- a/types/messages.go +++ b/types/messages.go @@ -4,7 +4,7 @@ import ( "io" "github.com/golang/protobuf/proto" - "github.com/tendermint/go-wire" + wire "github.com/tendermint/go-wire" ) func ToRequestEcho(message string) *Request { @@ -105,15 +105,15 @@ func ToResponseSetOption(log string) *Response { } } -func ToResponseDeliverTx(code CodeType, data []byte, log string) *Response { +func ToResponseDeliverTx(code CodeType, data []byte, log string, tags []*KVPair) *Response { return &Response{ - Value: &Response_DeliverTx{&ResponseDeliverTx{code, data, log}}, + Value: &Response_DeliverTx{&ResponseDeliverTx{code, data, log, tags}}, } } -func ToResponseCheckTx(code CodeType, data []byte, log string) *Response { +func ToResponseCheckTx(code CodeType, data []byte, log string, tags []*KVPair) *Response { return &Response{ - Value: &Response_CheckTx{&ResponseCheckTx{code, data, log}}, + Value: &Response_CheckTx{&ResponseCheckTx{code, data, log, tags}}, } } diff --git a/types/result.go b/types/result.go index abf1e964c..84f877dc8 100644 --- a/types/result.go +++ b/types/result.go @@ -12,6 +12,7 @@ type Result struct { Code CodeType `json:"code"` Data data.Bytes `json:"data"` Log string `json:"log"` // Can be non-deterministic + Tags []*KVPair `json:"tags"` } func NewResult(code CodeType, data []byte, log string) Result { @@ -102,6 +103,7 @@ func (r *ResponseCheckTx) Result() Result { Code: r.Code, Data: r.Data, Log: r.Log, + Tags: r.Tags, } } @@ -111,6 +113,7 @@ func (r *ResponseDeliverTx) Result() Result { Code: r.Code, Data: r.Data, Log: r.Log, + Tags: r.Tags, } } diff --git a/types/types.pb.go b/types/types.pb.go index 4ca304ac7..99396259b 100644 --- a/types/types.pb.go +++ b/types/types.pb.go @@ -1,6 +1,5 @@ -// Code generated by protoc-gen-go. +// Code generated by protoc-gen-go. DO NOT EDIT. // source: types/types.proto -// DO NOT EDIT! /* Package types is a generated protocol buffer package. @@ -38,6 +37,7 @@ It has these top-level messages: BlockID PartSetHeader Validator + KVPair */ package types @@ -1297,9 +1297,10 @@ func (m *ResponseSetOption) GetLog() string { } type ResponseDeliverTx struct { - Code CodeType `protobuf:"varint,1,opt,name=code,enum=types.CodeType" json:"code,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` - Log string `protobuf:"bytes,3,opt,name=log" json:"log,omitempty"` + Code CodeType `protobuf:"varint,1,opt,name=code,enum=types.CodeType" json:"code,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + Log string `protobuf:"bytes,3,opt,name=log" json:"log,omitempty"` + Tags []*KVPair `protobuf:"bytes,4,rep,name=tags" json:"tags,omitempty"` } func (m *ResponseDeliverTx) Reset() { *m = ResponseDeliverTx{} } @@ -1328,10 +1329,18 @@ func (m *ResponseDeliverTx) GetLog() string { return "" } +func (m *ResponseDeliverTx) GetTags() []*KVPair { + if m != nil { + return m.Tags + } + return nil +} + type ResponseCheckTx struct { - Code CodeType `protobuf:"varint,1,opt,name=code,enum=types.CodeType" json:"code,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` - Log string `protobuf:"bytes,3,opt,name=log" json:"log,omitempty"` + Code CodeType `protobuf:"varint,1,opt,name=code,enum=types.CodeType" json:"code,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + Log string `protobuf:"bytes,3,opt,name=log" json:"log,omitempty"` + Tags []*KVPair `protobuf:"bytes,4,rep,name=tags" json:"tags,omitempty"` } func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } @@ -1360,6 +1369,13 @@ func (m *ResponseCheckTx) GetLog() string { return "" } +func (m *ResponseCheckTx) GetTags() []*KVPair { + if m != nil { + return m.Tags + } + return nil +} + type ResponseQuery struct { Code CodeType `protobuf:"varint,1,opt,name=code,enum=types.CodeType" json:"code,omitempty"` Index int64 `protobuf:"varint,2,opt,name=index" json:"index,omitempty"` @@ -1640,6 +1656,38 @@ func (m *Validator) GetPower() uint64 { return 0 } +type KVPair struct { + Key string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` + ValueString string `protobuf:"bytes,2,opt,name=value_string,json=valueString" json:"value_string,omitempty"` + ValueInt int64 `protobuf:"varint,3,opt,name=value_int,json=valueInt" json:"value_int,omitempty"` +} + +func (m *KVPair) Reset() { *m = KVPair{} } +func (m *KVPair) String() string { return proto.CompactTextString(m) } +func (*KVPair) ProtoMessage() {} +func (*KVPair) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } + +func (m *KVPair) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *KVPair) GetValueString() string { + if m != nil { + return m.ValueString + } + return "" +} + +func (m *KVPair) GetValueInt() int64 { + if m != nil { + return m.ValueInt + } + return 0 +} + func init() { proto.RegisterType((*Request)(nil), "types.Request") proto.RegisterType((*RequestEcho)(nil), "types.RequestEcho") @@ -1670,6 +1718,7 @@ func init() { proto.RegisterType((*BlockID)(nil), "types.BlockID") proto.RegisterType((*PartSetHeader)(nil), "types.PartSetHeader") proto.RegisterType((*Validator)(nil), "types.Validator") + proto.RegisterType((*KVPair)(nil), "types.KVPair") proto.RegisterEnum("types.CodeType", CodeType_name, CodeType_value) } @@ -2078,107 +2127,111 @@ var _ABCIApplication_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("types/types.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 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, + // 1691 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x49, 0x6f, 0x1b, 0xc9, + 0x15, 0x56, 0x73, 0xe7, 0x13, 0x45, 0xb5, 0x4a, 0x94, 0x44, 0x31, 0x39, 0xd8, 0x1d, 0x38, 0x96, + 0x1c, 0xc7, 0x0e, 0x64, 0x38, 0xb0, 0xe2, 0x20, 0x80, 0x36, 0x4b, 0x84, 0x11, 0x5b, 0x69, 0x2f, + 0x87, 0xe4, 0x40, 0xb4, 0xd8, 0x45, 0xb2, 0x22, 0xb2, 0xaa, 0xdd, 0x5d, 0x2d, 0x53, 0xb9, 0x04, + 0xb9, 0xfb, 0x9e, 0x9f, 0x30, 0xf7, 0x01, 0xe6, 0x2f, 0x0c, 0x30, 0xfb, 0xf2, 0x8b, 0x06, 0xb5, + 0xf4, 0xaa, 0xa6, 0x31, 0x87, 0xc1, 0x5c, 0x88, 0x7e, 0x5b, 0x55, 0xbd, 0x57, 0xef, 0x7d, 0xef, + 0x15, 0x61, 0x8d, 0x5f, 0x7b, 0x38, 0x78, 0x28, 0x7f, 0x1f, 0x78, 0x3e, 0xe3, 0x0c, 0x55, 0x25, + 0x61, 0x7d, 0x5e, 0x81, 0xba, 0x8d, 0xdf, 0x85, 0x38, 0xe0, 0x68, 0x07, 0x2a, 0x78, 0x38, 0x61, + 0x5d, 0xe3, 0x96, 0xb1, 0xb3, 0xbc, 0x87, 0x1e, 0x28, 0x75, 0x2d, 0x3d, 0x19, 0x4e, 0xd8, 0xd9, + 0x92, 0x2d, 0x35, 0xd0, 0x1f, 0xa0, 0x3a, 0x9a, 0x86, 0xc1, 0xa4, 0x5b, 0x92, 0xaa, 0xeb, 0x59, + 0xd5, 0x67, 0x42, 0x74, 0xb6, 0x64, 0x2b, 0x1d, 0xb1, 0x2c, 0xa1, 0x23, 0xd6, 0x2d, 0x17, 0x2d, + 0xdb, 0xa7, 0x23, 0xb9, 0xac, 0xd0, 0x40, 0x4f, 0x00, 0x02, 0xcc, 0x07, 0xcc, 0xe3, 0x84, 0xd1, + 0x6e, 0x45, 0xea, 0x6f, 0x65, 0xf5, 0x5f, 0x61, 0xfe, 0x52, 0x8a, 0xcf, 0x96, 0xec, 0x66, 0x10, + 0x11, 0xc2, 0xd2, 0xc5, 0x53, 0x72, 0x85, 0xfd, 0x01, 0x9f, 0x77, 0xab, 0x45, 0x96, 0xc7, 0x4a, + 0xfe, 0x7a, 0x2e, 0x2c, 0xdd, 0x88, 0x40, 0x7b, 0xd0, 0x18, 0x4e, 0xf0, 0xf0, 0x52, 0xd8, 0xd5, + 0xa4, 0xdd, 0x46, 0xd6, 0xee, 0x48, 0x48, 0xa5, 0x55, 0x7d, 0xa8, 0x3e, 0xd1, 0x03, 0xa8, 0x0d, + 0xd9, 0x6c, 0x46, 0x78, 0xb7, 0x2e, 0x2d, 0x3a, 0x39, 0x0b, 0x29, 0x3b, 0x5b, 0xb2, 0xb5, 0x96, + 0x08, 0xd7, 0xbb, 0x10, 0xfb, 0xd7, 0xdd, 0x46, 0x51, 0xb8, 0xfe, 0x21, 0x44, 0x22, 0x5c, 0x52, + 0x47, 0xb8, 0x42, 0x28, 0xe1, 0x83, 0xe1, 0xc4, 0x21, 0xb4, 0xdb, 0x2c, 0x72, 0xa5, 0x4f, 0x09, + 0x3f, 0x12, 0x62, 0xe1, 0x0a, 0x89, 0x08, 0xf4, 0x14, 0x96, 0x2f, 0xf0, 0x98, 0xd0, 0xc1, 0xc5, + 0x94, 0x0d, 0x2f, 0xbb, 0x20, 0x4d, 0xbb, 0x59, 0xd3, 0x43, 0xa1, 0x70, 0x28, 0xe4, 0x67, 0x4b, + 0x36, 0x5c, 0xc4, 0x14, 0x7a, 0x0c, 0x4d, 0x4c, 0x5d, 0x6d, 0xba, 0x2c, 0x4d, 0x37, 0x73, 0x19, + 0x40, 0xdd, 0xc8, 0xb0, 0x81, 0xf5, 0xf7, 0x61, 0x1d, 0xaa, 0x57, 0xce, 0x34, 0xc4, 0xd6, 0x5d, + 0x58, 0x4e, 0x65, 0x0a, 0xea, 0x42, 0x7d, 0x86, 0x83, 0xc0, 0x19, 0x63, 0x99, 0x4e, 0x4d, 0x3b, + 0x22, 0xad, 0x36, 0xb4, 0xd2, 0x79, 0x92, 0x32, 0x14, 0xb9, 0x20, 0x0c, 0xaf, 0xb0, 0x1f, 0x88, + 0x04, 0xd0, 0x86, 0x9a, 0xb4, 0xfe, 0x02, 0x66, 0x3e, 0x09, 0x90, 0x09, 0xe5, 0x4b, 0x7c, 0xad, + 0x35, 0xc5, 0x27, 0xea, 0xe8, 0x03, 0xc9, 0xd4, 0x6c, 0xda, 0xfa, 0x74, 0x56, 0x6c, 0x1b, 0xa7, + 0x01, 0x6a, 0x43, 0x89, 0xcf, 0xa5, 0x69, 0xcb, 0x2e, 0xf1, 0xb9, 0x75, 0x0b, 0xda, 0xd9, 0x2b, + 0xbf, 0xa1, 0xe1, 0xc6, 0x47, 0x97, 0x77, 0x86, 0x10, 0x54, 0x5c, 0x87, 0x3b, 0x5a, 0x43, 0x7e, + 0x0b, 0x9e, 0xe7, 0xf0, 0x89, 0xde, 0x5e, 0x7e, 0xa3, 0x4d, 0xa8, 0x4d, 0x30, 0x19, 0x4f, 0xb8, + 0xac, 0x81, 0x8a, 0xad, 0x29, 0x71, 0x56, 0xcf, 0x67, 0x57, 0x58, 0xa6, 0x7a, 0xc3, 0x56, 0x84, + 0xb5, 0x0a, 0x2b, 0x99, 0x44, 0xb2, 0x8e, 0xe3, 0xc3, 0xc7, 0x17, 0x8f, 0xfe, 0x04, 0x70, 0xe5, + 0x4c, 0x89, 0xeb, 0x70, 0xe6, 0x07, 0x5d, 0xe3, 0x56, 0x79, 0x67, 0x79, 0xcf, 0xd4, 0xf7, 0xf5, + 0x36, 0x12, 0xd8, 0x29, 0x1d, 0xeb, 0x05, 0xac, 0xdd, 0xc8, 0x01, 0x71, 0xda, 0x89, 0x13, 0x4c, + 0x22, 0x0f, 0xc4, 0x37, 0xba, 0x23, 0x4e, 0xeb, 0xb8, 0xd8, 0xd7, 0xd5, 0xbd, 0xa2, 0x97, 0x3d, + 0x93, 0x4c, 0x5b, 0x0b, 0xad, 0x5d, 0x58, 0xcd, 0x25, 0x46, 0xca, 0x4f, 0x23, 0xed, 0xa7, 0xf5, + 0xa1, 0x0a, 0x0d, 0x1b, 0x07, 0x1e, 0xa3, 0x01, 0x46, 0x4f, 0xa0, 0x89, 0xe7, 0x43, 0xac, 0x6a, + 0xdc, 0xc8, 0xe5, 0xa8, 0xd2, 0x39, 0x89, 0xe4, 0x22, 0xbf, 0x63, 0x65, 0xb4, 0xab, 0xf1, 0x29, + 0x0f, 0x3a, 0xda, 0x28, 0x0d, 0x50, 0xf7, 0x23, 0x80, 0x2a, 0xe7, 0x0a, 0x54, 0xe9, 0xe6, 0x10, + 0x6a, 0x57, 0x23, 0x54, 0xa5, 0x70, 0xe1, 0x0c, 0x44, 0xed, 0x67, 0x20, 0xaa, 0x5a, 0x78, 0xfc, + 0x05, 0x18, 0xb5, 0x9f, 0xc1, 0xa8, 0x5a, 0xa1, 0xe9, 0x02, 0x90, 0x7a, 0x94, 0x02, 0xa9, 0x7a, + 0xae, 0x36, 0x95, 0x61, 0x01, 0x4a, 0x3d, 0x8c, 0x51, 0xaa, 0x91, 0xc3, 0x35, 0x6d, 0x92, 0x87, + 0xa9, 0xfb, 0x11, 0x4c, 0x35, 0x0b, 0x83, 0x96, 0xc3, 0xa9, 0xfd, 0x0c, 0x4e, 0x41, 0xa1, 0x3b, + 0x0b, 0x80, 0xea, 0xaf, 0x59, 0xa0, 0x52, 0x68, 0xb3, 0x9d, 0xb3, 0x5d, 0x88, 0x54, 0x7f, 0x4e, + 0x23, 0x55, 0x2b, 0x87, 0x8f, 0x3a, 0x17, 0x3e, 0x0a, 0x55, 0xbb, 0xa2, 0x12, 0x72, 0x99, 0x26, + 0x6a, 0x11, 0xfb, 0x3e, 0xf3, 0x35, 0x96, 0x28, 0xc2, 0xda, 0x11, 0x15, 0x9f, 0xe4, 0xd7, 0x47, + 0x60, 0x4d, 0x56, 0x6d, 0x2a, 0xbb, 0xac, 0xff, 0x1b, 0x89, 0xad, 0x44, 0xb6, 0x34, 0x5a, 0x34, + 0x35, 0x5a, 0xa4, 0xd0, 0xae, 0x94, 0x41, 0x3b, 0x74, 0x0f, 0xd6, 0xa6, 0x4e, 0xc0, 0x95, 0x9b, + 0x83, 0x0c, 0x7c, 0xac, 0x0a, 0x81, 0xf2, 0x4f, 0xe1, 0xc8, 0x1f, 0x61, 0x3d, 0xa5, 0xeb, 0x78, + 0xde, 0x40, 0x16, 0x75, 0x45, 0x16, 0xb5, 0x19, 0x6b, 0x1f, 0x78, 0xde, 0x99, 0x13, 0x4c, 0xac, + 0x3b, 0x89, 0xff, 0x19, 0x24, 0x9d, 0xb2, 0x71, 0x84, 0xa4, 0x53, 0x36, 0xb6, 0xfe, 0x67, 0x24, + 0x7a, 0x09, 0x6a, 0xfe, 0x0e, 0x2a, 0x43, 0xe6, 0x2a, 0xf7, 0xdb, 0x7b, 0xab, 0x3a, 0xf0, 0x47, + 0xcc, 0xc5, 0xaf, 0xaf, 0x3d, 0x6c, 0x4b, 0x61, 0xec, 0x6a, 0x29, 0x05, 0x8c, 0x7a, 0x83, 0x72, + 0xbc, 0x01, 0xba, 0x0d, 0x15, 0xee, 0x8c, 0x83, 0x6e, 0x45, 0xa2, 0x57, 0x04, 0x33, 0xcf, 0xdf, + 0x9e, 0x3b, 0xc4, 0xb7, 0xa5, 0xc8, 0xfa, 0xaf, 0x00, 0x99, 0x4c, 0x86, 0xff, 0xca, 0x07, 0xf8, + 0xd4, 0x48, 0xee, 0x55, 0x81, 0xfe, 0xcf, 0xda, 0xbf, 0x03, 0x55, 0x42, 0x5d, 0x3c, 0x97, 0x07, + 0x28, 0xdb, 0x8a, 0x88, 0xba, 0x55, 0x59, 0x1e, 0x2a, 0xdb, 0xad, 0xd4, 0x5d, 0x29, 0x42, 0xf7, + 0x05, 0x36, 0x92, 0xf8, 0xd2, 0xb2, 0x15, 0x91, 0x42, 0xd7, 0x5a, 0xa6, 0x8b, 0x68, 0xbf, 0xea, + 0xc9, 0xcd, 0xfd, 0x4b, 0x74, 0xb2, 0x74, 0x91, 0xff, 0x82, 0x41, 0xb3, 0xd6, 0x93, 0xac, 0x88, + 0xcb, 0xdb, 0xea, 0x00, 0xba, 0x59, 0xb7, 0xaa, 0x63, 0x67, 0x2b, 0x12, 0xfd, 0x1e, 0xaa, 0x2e, + 0x19, 0x8d, 0x16, 0xf7, 0x2c, 0x25, 0xb6, 0x3e, 0x29, 0x41, 0x4d, 0x75, 0x1c, 0xb4, 0x2d, 0xd0, + 0xcf, 0x21, 0x74, 0x40, 0xdc, 0xa8, 0xea, 0x24, 0xdd, 0x77, 0x53, 0x31, 0x29, 0x65, 0x62, 0x82, + 0xa0, 0xc2, 0xc9, 0x0c, 0xeb, 0x82, 0x91, 0xdf, 0x68, 0x0b, 0xea, 0x34, 0x9c, 0x0d, 0xf8, 0x3c, + 0x90, 0xd1, 0xae, 0xd8, 0x35, 0x1a, 0xce, 0x5e, 0xcf, 0x03, 0xb4, 0x07, 0x2b, 0xa9, 0xf2, 0x21, + 0xae, 0x86, 0xf5, 0xb6, 0x3e, 0x9a, 0x3c, 0x77, 0xff, 0xd8, 0x5e, 0x8e, 0x0b, 0xa9, 0xef, 0xa2, + 0x1d, 0x90, 0x75, 0x35, 0x50, 0xd0, 0xa9, 0xea, 0xad, 0x26, 0xe3, 0xd6, 0x16, 0x7c, 0x8d, 0xad, + 0xa2, 0x9d, 0xfe, 0x06, 0x9a, 0x22, 0x92, 0x4a, 0xa5, 0x2e, 0x55, 0x1a, 0x82, 0x21, 0x85, 0x77, + 0x61, 0x35, 0x69, 0xd1, 0x4a, 0xa5, 0xa1, 0x56, 0x49, 0xd8, 0x52, 0x71, 0x1b, 0x1a, 0x71, 0x5d, + 0x37, 0xa5, 0x46, 0xdd, 0xd1, 0xe5, 0xdc, 0x87, 0xba, 0x3e, 0x62, 0x61, 0x3b, 0xbf, 0x07, 0x55, + 0xcf, 0xf1, 0x79, 0xa0, 0xdb, 0x66, 0x84, 0xea, 0xe7, 0x8e, 0x2f, 0xe6, 0x28, 0xdd, 0xd4, 0x95, + 0x8a, 0xb5, 0x0f, 0x2b, 0x19, 0xbe, 0xc8, 0x44, 0xce, 0xb8, 0x33, 0xd5, 0x0d, 0x5d, 0x11, 0xf1, + 0x36, 0xa5, 0x64, 0x1b, 0x6b, 0x1f, 0x9a, 0xf1, 0x1d, 0x8a, 0x6b, 0xf1, 0xc2, 0x8b, 0xe7, 0x7a, + 0x32, 0x6b, 0xd9, 0x9a, 0x92, 0x89, 0xcd, 0xde, 0xeb, 0xc9, 0xa2, 0x62, 0x2b, 0xc2, 0xfa, 0x27, + 0xd4, 0x54, 0xcd, 0x15, 0x8c, 0x73, 0xb7, 0xa1, 0x25, 0x6b, 0x62, 0x10, 0x70, 0x9f, 0xd0, 0xb1, + 0x46, 0xc9, 0x65, 0xc9, 0x7b, 0x25, 0x59, 0x22, 0xc0, 0x4a, 0x85, 0x50, 0x85, 0x90, 0x65, 0xbb, + 0x21, 0x19, 0x7d, 0xca, 0xef, 0x7d, 0x56, 0x85, 0x46, 0x94, 0xe6, 0xa8, 0x06, 0xa5, 0x97, 0xcf, + 0xcd, 0x25, 0xb4, 0x06, 0x2b, 0x7d, 0xca, 0xb1, 0x4f, 0x9d, 0xe9, 0x89, 0x80, 0x79, 0xd3, 0x10, + 0xac, 0x13, 0x3a, 0x64, 0x2e, 0xa1, 0x63, 0xc5, 0x2a, 0xa1, 0x16, 0x34, 0x0e, 0x1d, 0xf7, 0x05, + 0xa3, 0x43, 0x6c, 0x96, 0x91, 0x09, 0xad, 0x37, 0xd4, 0x09, 0xf9, 0x84, 0xf9, 0xe4, 0x3f, 0xd8, + 0x35, 0x2b, 0x68, 0x03, 0xd6, 0xfa, 0x34, 0x08, 0x47, 0x23, 0x32, 0x24, 0x98, 0xf2, 0x67, 0x21, + 0x75, 0x03, 0xb3, 0x8a, 0x10, 0xb4, 0xdf, 0xd0, 0x4b, 0xca, 0xde, 0x53, 0x3d, 0x1e, 0x99, 0x35, + 0xd4, 0x85, 0xce, 0xa1, 0x13, 0xe0, 0xe3, 0xd0, 0x9b, 0x92, 0xa1, 0xc3, 0xf1, 0x81, 0xeb, 0xfa, + 0x38, 0x08, 0x4c, 0x2c, 0x16, 0x11, 0x92, 0xec, 0xde, 0xa3, 0xc8, 0x20, 0xb3, 0x3e, 0xc6, 0x81, + 0x39, 0x46, 0xdb, 0xb0, 0x71, 0x43, 0x22, 0x77, 0x9e, 0xa0, 0xdf, 0x42, 0x37, 0x2f, 0x3a, 0x75, + 0x82, 0x73, 0x9f, 0x0c, 0xb1, 0x49, 0x50, 0x07, 0x4c, 0x25, 0x95, 0x99, 0xd5, 0xa7, 0x5e, 0xc8, + 0xcd, 0x7f, 0x47, 0xfb, 0x6b, 0xee, 0xcb, 0x90, 0x0b, 0xf6, 0x65, 0x8e, 0x7d, 0x2e, 0x6f, 0xcf, + 0x9c, 0xa2, 0x2d, 0x58, 0x4f, 0xb1, 0x5f, 0x09, 0xff, 0x44, 0x74, 0x66, 0xc9, 0x79, 0x95, 0x80, + 0x8c, 0xa9, 0xc3, 0x43, 0x1f, 0x9b, 0x14, 0x6d, 0x02, 0x12, 0x12, 0x1d, 0x92, 0xc8, 0x71, 0x16, + 0xed, 0xa0, 0xf9, 0x7a, 0x07, 0x2f, 0xcf, 0x9e, 0x86, 0x63, 0x42, 0xcd, 0x77, 0x68, 0x03, 0xcc, + 0x53, 0x76, 0xa5, 0xb9, 0x27, 0x94, 0x13, 0x7e, 0x6d, 0x7e, 0x61, 0xa0, 0x0e, 0xac, 0x26, 0xec, + 0x53, 0x9f, 0x85, 0x9e, 0xf9, 0xa5, 0x81, 0xb6, 0x00, 0x25, 0xdc, 0x73, 0x9f, 0x79, 0x2c, 0x70, + 0xa6, 0xe6, 0x57, 0x06, 0xda, 0x84, 0xb5, 0x53, 0x76, 0x15, 0xdf, 0x82, 0x32, 0xf8, 0x3a, 0x32, + 0x88, 0xf9, 0x7f, 0xc7, 0xb3, 0x0b, 0xec, 0x9b, 0xdf, 0x18, 0x68, 0x1b, 0x3a, 0x69, 0x41, 0xbc, + 0xd6, 0xb7, 0x86, 0x3e, 0x51, 0x2c, 0x7a, 0xcb, 0x38, 0x36, 0xbf, 0x8b, 0xd8, 0x3a, 0x0e, 0x7a, + 0xa1, 0xef, 0x0d, 0xb4, 0x0e, 0xed, 0x84, 0x2d, 0x75, 0x7f, 0x30, 0x50, 0x0f, 0x36, 0x32, 0x4c, + 0x42, 0xc7, 0xe7, 0xa2, 0x20, 0xcc, 0x1f, 0x8d, 0xbd, 0x0f, 0x55, 0x58, 0x3d, 0x38, 0x3c, 0xea, + 0x1f, 0x78, 0x6a, 0x03, 0xd1, 0xa2, 0x1f, 0x42, 0x45, 0x0e, 0x21, 0x05, 0x2f, 0xf3, 0x5e, 0xd1, + 0x34, 0x8c, 0xf6, 0xa0, 0x2a, 0x67, 0x11, 0x54, 0xf4, 0x40, 0xef, 0x15, 0x0e, 0xc5, 0x62, 0x13, + 0x35, 0xad, 0xdc, 0x7c, 0xa7, 0xf7, 0x8a, 0x26, 0x63, 0xf4, 0x37, 0x68, 0x26, 0x53, 0xc4, 0xa2, + 0xd7, 0x7a, 0x6f, 0xe1, 0x8c, 0x2c, 0xec, 0x93, 0xe9, 0x62, 0xd1, 0x9b, 0xbd, 0xb7, 0x70, 0x50, + 0x46, 0x4f, 0xa0, 0x1e, 0x8d, 0x06, 0xc5, 0x2f, 0xf7, 0xde, 0x82, 0x59, 0x59, 0x84, 0x47, 0xb5, + 0xf4, 0xa2, 0x07, 0x79, 0xaf, 0x70, 0xfc, 0x45, 0x8f, 0xa1, 0xa6, 0x5b, 0x6a, 0xe1, 0xa3, 0xbf, + 0x57, 0x3c, 0x64, 0x0b, 0x27, 0x93, 0xb7, 0xdb, 0xa2, 0xd7, 0x7c, 0x6f, 0xe1, 0xf8, 0x8c, 0x0e, + 0x00, 0x52, 0xaf, 0xb6, 0x85, 0x6f, 0xfa, 0xde, 0xe2, 0x21, 0x1a, 0x3d, 0x85, 0x46, 0xf2, 0x50, + 0x2b, 0x7e, 0xd9, 0xf7, 0x16, 0xcd, 0xd1, 0x17, 0x35, 0xf9, 0xa7, 0xd1, 0xa3, 0x9f, 0x02, 0x00, + 0x00, 0xff, 0xff, 0x37, 0x8d, 0xa7, 0x8f, 0x49, 0x12, 0x00, 0x00, } diff --git a/types/types.proto b/types/types.proto index 802d8fc5c..6d19a8ed4 100644 --- a/types/types.proto +++ b/types/types.proto @@ -156,15 +156,17 @@ message ResponseSetOption{ } message ResponseDeliverTx{ - CodeType code = 1; - bytes data = 2; - string log = 3; + CodeType code = 1; + bytes data = 2; + string log = 3; + repeated KVPair tags = 4; } message ResponseCheckTx{ CodeType code = 1; bytes data = 2; string log = 3; + repeated KVPair tags = 4; } message ResponseQuery{ @@ -224,6 +226,15 @@ message Validator { uint64 power = 2; } +//---------------------------------------- +// Abstract types + +message KVPair { + string key = 1; + string value_string = 2; + int64 value_int = 3; +} + //---------------------------------------- // Service Definition From 33b51378f27c4aa8015c960f109295cd286f28a8 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 9 Nov 2017 16:56:24 -0500 Subject: [PATCH 05/42] reformat types.proto --- types/types.proto | 242 +++++++++++++++++++++++----------------------- 1 file changed, 121 insertions(+), 121 deletions(-) diff --git a/types/types.proto b/types/types.proto index 6d19a8ed4..09dcb1bd8 100644 --- a/types/types.proto +++ b/types/types.proto @@ -7,42 +7,42 @@ package types; // Code types enum CodeType { - OK = 0; + OK = 0; - // General response codes, 0 ~ 99 - InternalError = 1; - EncodingError = 2; - BadNonce = 3; - Unauthorized = 4; - InsufficientFunds = 5; - UnknownRequest = 6; + // General response codes, 0 ~ 99 + InternalError = 1; + EncodingError = 2; + BadNonce = 3; + Unauthorized = 4; + InsufficientFunds = 5; + UnknownRequest = 6; - // Reserved for basecoin, 100 ~ 199 - BaseDuplicateAddress = 101; - BaseEncodingError = 102; - BaseInsufficientFees = 103; - BaseInsufficientFunds = 104; - BaseInsufficientGasPrice = 105; - BaseInvalidInput = 106; - BaseInvalidOutput = 107; - BaseInvalidPubKey = 108; - BaseInvalidSequence = 109; - BaseInvalidSignature = 110; - BaseUnknownAddress = 111; - BaseUnknownPubKey = 112; - BaseUnknownPlugin = 113; + // Reserved for basecoin, 100 ~ 199 + BaseDuplicateAddress = 101; + BaseEncodingError = 102; + BaseInsufficientFees = 103; + BaseInsufficientFunds = 104; + BaseInsufficientGasPrice = 105; + BaseInvalidInput = 106; + BaseInvalidOutput = 107; + BaseInvalidPubKey = 108; + BaseInvalidSequence = 109; + BaseInvalidSignature = 110; + BaseUnknownAddress = 111; + BaseUnknownPubKey = 112; + BaseUnknownPlugin = 113; - // Reserved for governance, 200 ~ 299 - GovUnknownEntity = 201; - GovUnknownGroup = 202; - GovUnknownProposal = 203; - GovDuplicateGroup = 204; - GovDuplicateMember = 205; - GovDuplicateProposal = 206; - GovDuplicateVote = 207; - GovInvalidMember = 208; - GovInvalidVote = 209; - GovInvalidVotingPower = 210; + // Reserved for governance, 200 ~ 299 + GovUnknownEntity = 201; + GovUnknownGroup = 202; + GovUnknownProposal = 203; + GovDuplicateGroup = 204; + GovDuplicateMember = 205; + GovDuplicateProposal = 206; + GovDuplicateVote = 207; + GovInvalidMember = 208; + GovInvalidVote = 209; + GovInvalidVotingPower = 210; } @@ -50,66 +50,66 @@ enum CodeType { // Request types message Request { - oneof value{ - RequestEcho echo = 1; - RequestFlush flush = 2; - RequestInfo info = 3; - RequestSetOption set_option = 4; - RequestDeliverTx deliver_tx = 5; - RequestCheckTx check_tx = 6; - RequestCommit commit = 7; - RequestQuery query = 8; - RequestInitChain init_chain = 9; - RequestBeginBlock begin_block = 10; - RequestEndBlock end_block = 11; - } + oneof value{ + RequestEcho echo = 1; + RequestFlush flush = 2; + RequestInfo info = 3; + RequestSetOption set_option = 4; + RequestDeliverTx deliver_tx = 5; + RequestCheckTx check_tx = 6; + RequestCommit commit = 7; + RequestQuery query = 8; + RequestInitChain init_chain = 9; + RequestBeginBlock begin_block = 10; + RequestEndBlock end_block = 11; + } } message RequestEcho { - string message = 1; + string message = 1; } message RequestFlush { } message RequestInfo { - string version = 1; + string version = 1; } message RequestSetOption{ - string key = 1; - string value = 2; + string key = 1; + string value = 2; } message RequestDeliverTx{ - bytes tx = 1; + bytes tx = 1; } message RequestCheckTx{ - bytes tx = 1; + bytes tx = 1; } message RequestQuery{ - bytes data = 1; - string path = 2; - uint64 height = 3; - bool prove = 4; + bytes data = 1; + string path = 2; + uint64 height = 3; + bool prove = 4; } message RequestCommit{ } message RequestInitChain{ - repeated Validator validators = 1; + repeated Validator validators = 1; } message RequestBeginBlock{ - bytes hash = 1; - Header header = 2; + bytes hash = 1; + Header header = 2; } message RequestEndBlock{ - uint64 height = 1; + uint64 height = 1; } //---------------------------------------- @@ -117,42 +117,42 @@ message RequestEndBlock{ message Response { - oneof value{ - ResponseException exception = 1; - ResponseEcho echo = 2; - ResponseFlush flush = 3; - ResponseInfo info = 4; - ResponseSetOption set_option = 5; - ResponseDeliverTx deliver_tx = 6; - ResponseCheckTx check_tx = 7; - ResponseCommit commit = 8; - ResponseQuery query = 9; - ResponseInitChain init_chain = 10; - ResponseBeginBlock begin_block = 11; - ResponseEndBlock end_block = 12; - } + oneof value{ + ResponseException exception = 1; + ResponseEcho echo = 2; + ResponseFlush flush = 3; + ResponseInfo info = 4; + ResponseSetOption set_option = 5; + ResponseDeliverTx deliver_tx = 6; + ResponseCheckTx check_tx = 7; + ResponseCommit commit = 8; + ResponseQuery query = 9; + ResponseInitChain init_chain = 10; + ResponseBeginBlock begin_block = 11; + ResponseEndBlock end_block = 12; + } } message ResponseException{ - string error = 1; + string error = 1; } message ResponseEcho { - string message = 1; + string message = 1; } message ResponseFlush{ } message ResponseInfo { - string data = 1; - string version = 2; - uint64 last_block_height = 3; - bytes last_block_app_hash = 4; + string data = 1; + string version = 2; + uint64 last_block_height = 3; + bytes last_block_app_hash = 4; } message ResponseSetOption{ - string log = 1; + string log = 1; } message ResponseDeliverTx{ @@ -163,26 +163,26 @@ message ResponseDeliverTx{ } message ResponseCheckTx{ - CodeType code = 1; - bytes data = 2; - string log = 3; + CodeType code = 1; + bytes data = 2; + string log = 3; repeated KVPair tags = 4; } message ResponseQuery{ - CodeType code = 1; - int64 index = 2; - bytes key = 3; - bytes value = 4; - bytes proof = 5; - uint64 height = 6; - string log = 7; + CodeType code = 1; + int64 index = 2; + bytes key = 3; + bytes value = 4; + bytes proof = 5; + uint64 height = 6; + string log = 7; } message ResponseCommit{ - CodeType code = 1; - bytes data = 2; - string log = 3; + CodeType code = 1; + bytes data = 2; + string log = 3; } @@ -193,37 +193,37 @@ message ResponseBeginBlock{ } message ResponseEndBlock{ - repeated Validator diffs = 1; + repeated Validator diffs = 1; } //---------------------------------------- // Blockchain Types message Header { - string chain_id = 1; - uint64 height = 2; - uint64 time = 3; - uint64 num_txs = 4; - BlockID last_block_id = 5; - bytes last_commit_hash = 6; - bytes data_hash = 7; - bytes validators_hash = 8; - bytes app_hash = 9; + string chain_id = 1; + uint64 height = 2; + uint64 time = 3; + uint64 num_txs = 4; + BlockID last_block_id = 5; + bytes last_commit_hash = 6; + bytes data_hash = 7; + bytes validators_hash = 8; + bytes app_hash = 9; } message BlockID { - bytes hash = 1; - PartSetHeader parts = 2; + bytes hash = 1; + PartSetHeader parts = 2; } message PartSetHeader { - uint64 total = 1; - bytes hash = 2; + uint64 total = 1; + bytes hash = 2; } message Validator { - bytes pubKey = 1; - uint64 power = 2; + bytes pubKey = 1; + uint64 power = 2; } //---------------------------------------- @@ -239,15 +239,15 @@ message KVPair { // Service Definition service ABCIApplication { - rpc Echo(RequestEcho) returns (ResponseEcho) ; - rpc Flush(RequestFlush) returns (ResponseFlush); - rpc Info(RequestInfo) returns (ResponseInfo); - rpc SetOption(RequestSetOption) returns (ResponseSetOption); - rpc DeliverTx(RequestDeliverTx) returns (ResponseDeliverTx); - rpc CheckTx(RequestCheckTx) returns (ResponseCheckTx); - rpc Query(RequestQuery) returns (ResponseQuery); - rpc Commit(RequestCommit) returns (ResponseCommit); - rpc InitChain(RequestInitChain) returns (ResponseInitChain); - rpc BeginBlock(RequestBeginBlock) returns (ResponseBeginBlock); - rpc EndBlock(RequestEndBlock) returns (ResponseEndBlock); + rpc Echo(RequestEcho) returns (ResponseEcho) ; + rpc Flush(RequestFlush) returns (ResponseFlush); + rpc Info(RequestInfo) returns (ResponseInfo); + rpc SetOption(RequestSetOption) returns (ResponseSetOption); + rpc DeliverTx(RequestDeliverTx) returns (ResponseDeliverTx); + rpc CheckTx(RequestCheckTx) returns (ResponseCheckTx); + rpc Query(RequestQuery) returns (ResponseQuery); + rpc Commit(RequestCommit) returns (ResponseCommit); + rpc InitChain(RequestInitChain) returns (ResponseInitChain); + rpc BeginBlock(RequestBeginBlock) returns (ResponseBeginBlock); + rpc EndBlock(RequestEndBlock) returns (ResponseEndBlock); } From 76bd68f881af267ed31c85e6df8bea9575b4d2f9 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 9 Nov 2017 16:59:09 -0500 Subject: [PATCH 06/42] add docker commands to Makefile --- Makefile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b9ef0b334..33553a286 100644 --- a/Makefile +++ b/Makefile @@ -89,4 +89,10 @@ metalinter_test: tools #--enable=unparam \ #--enable=vet \ -.PHONY: all build test fmt get_deps tools protoc install_protoc +build-docker: + docker build -t "tendermint/abci-dev" -f Dockerfile.develop . + +run-docker: + docker run -it --rm -v "$PWD:/go/src/github.com/tendermint/abci" -w "/go/src/github.com/tendermint/abci" "tendermint/abci-dev" /bin/bash + +.PHONY: all build test fmt get_deps tools protoc install_protoc build-docker run-docker From 8b71e47002311241b6a47b9680d573d1bec63d6b Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 9 Nov 2017 17:15:09 -0500 Subject: [PATCH 07/42] add linter for proto files (Fixes #128) --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 33553a286..c82e88540 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ GOTOOLS = \ github.com/mitchellh/gox \ github.com/Masterminds/glide \ - github.com/alecthomas/gometalinter + github.com/alecthomas/gometalinter \ + github.com/ckaznocha/protoc-gen-lint all: protoc install test @@ -57,10 +58,12 @@ get_vendor_deps: metalinter: tools @gometalinter --install + protoc --lint_out=. types/*.proto gometalinter --vendor --deadline=600s --enable-all --disable=lll ./... metalinter_test: tools @gometalinter --install + # protoc --lint_out=. types/*.proto gometalinter --vendor --deadline=600s --disable-all \ --enable=maligned \ --enable=deadcode \ From 3cbf44058db3a6f74b01db217937edd9a18c884f Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 9 Nov 2017 17:16:06 -0500 Subject: [PATCH 08/42] no need for protoc in make all since we have types.pb.go generated --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c82e88540..06efbf344 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ GOTOOLS = \ github.com/alecthomas/gometalinter \ github.com/ckaznocha/protoc-gen-lint -all: protoc install test +all: install test PACKAGES=$(shell go list ./... | grep -v '/vendor/') From 29c1cd03ea5402d3515d302b867b0e2b5d92d714 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 20 Nov 2017 17:09:18 -0600 Subject: [PATCH 09/42] [make install_protoc] fix folder name --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 06efbf344..aeb6d7160 100644 --- a/Makefile +++ b/Makefile @@ -11,12 +11,12 @@ PACKAGES=$(shell go list ./... | grep -v '/vendor/') install_protoc: # https://github.com/google/protobuf/releases curl -L https://github.com/google/protobuf/releases/download/v3.4.1/protobuf-cpp-3.4.1.tar.gz | tar xvz && \ - cd protobuf-cpp-3.4.1 && \ + cd protobuf-3.4.1 && \ DIST_LANG=cpp ./configure && \ make && \ make install && \ cd .. && \ - rm -rf protobuf-cpp-3.4.1 + rm -rf protobuf-3.4.1 go get github.com/golang/protobuf/protoc-gen-go protoc: From 02399071ff8fa443a600c75b36baa5ef8b517282 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 20 Nov 2017 18:17:56 -0600 Subject: [PATCH 10/42] add ldconfig cmd to Dockerfile --- Dockerfile.develop | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile.develop b/Dockerfile.develop index daf6cb617..e21350ce7 100644 --- a/Dockerfile.develop +++ b/Dockerfile.develop @@ -6,6 +6,8 @@ WORKDIR /go/src/github.com/tendermint/abci COPY Makefile /go/src/github.com/tendermint/abci/ RUN make install_protoc +# see make protoc for details +RUN ldconfig COPY glide.yaml /go/src/github.com/tendermint/abci/ COPY glide.lock /go/src/github.com/tendermint/abci/ From fc7db13fa8cf929a277843f7868089ea2237b0fe Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 20 Nov 2017 18:21:59 -0600 Subject: [PATCH 11/42] remove tags from CheckTx add value_type field to KVPair --- client/local_client.go | 2 +- server/socket_server.go | 2 +- types/application.go | 2 +- types/base_app.go | 24 ++-- types/messages.go | 4 +- types/result.go | 1 - types/types.pb.go | 267 ++++++++++++++++++++++------------------ types/types.proto | 10 +- 8 files changed, 170 insertions(+), 142 deletions(-) diff --git a/client/local_client.go b/client/local_client.go index 13ebc0909..539c1eef0 100644 --- a/client/local_client.go +++ b/client/local_client.go @@ -85,7 +85,7 @@ func (app *localClient) CheckTxAsync(tx []byte) *ReqRes { app.mtx.Unlock() return app.callback( types.ToRequestCheckTx(tx), - types.ToResponseCheckTx(res.Code, res.Data, res.Log, res.Tags), + types.ToResponseCheckTx(res.Code, res.Data, res.Log), ) } diff --git a/server/socket_server.go b/server/socket_server.go index 3e8ef942d..68a213225 100644 --- a/server/socket_server.go +++ b/server/socket_server.go @@ -179,7 +179,7 @@ func (s *SocketServer) handleRequest(req *types.Request, responses chan<- *types responses <- types.ToResponseDeliverTx(res.Code, res.Data, res.Log, res.Tags) case *types.Request_CheckTx: res := s.app.CheckTx(r.CheckTx.Tx) - responses <- types.ToResponseCheckTx(res.Code, res.Data, res.Log, res.Tags) + responses <- types.ToResponseCheckTx(res.Code, res.Data, res.Log) case *types.Request_Commit: res := s.app.Commit() responses <- types.ToResponseCommit(res.Code, res.Data, res.Log) diff --git a/types/application.go b/types/application.go index fcda5d95b..51a1869b0 100644 --- a/types/application.go +++ b/types/application.go @@ -58,7 +58,7 @@ func (app *GRPCApplication) DeliverTx(ctx context.Context, req *RequestDeliverTx func (app *GRPCApplication) CheckTx(ctx context.Context, req *RequestCheckTx) (*ResponseCheckTx, error) { r := app.app.CheckTx(req.Tx) - return &ResponseCheckTx{r.Code, r.Data, r.Log, r.Tags}, nil + return &ResponseCheckTx{r.Code, r.Data, r.Log}, nil } func (app *GRPCApplication) Query(ctx context.Context, req *RequestQuery) (*ResponseQuery, error) { diff --git a/types/base_app.go b/types/base_app.go index 94607e9ab..60bf43880 100644 --- a/types/base_app.go +++ b/types/base_app.go @@ -7,36 +7,36 @@ func NewBaseApplication() *BaseApplication { return &BaseApplication{} } -func (app *BaseApplication) Info(req RequestInfo) (resInfo ResponseInfo) { - return +func (BaseApplication) Info(req RequestInfo) ResponseInfo { + return ResponseInfo{} } -func (app *BaseApplication) SetOption(key string, value string) (log string) { +func (BaseApplication) SetOption(key string, value string) (log string) { return "" } -func (app *BaseApplication) DeliverTx(tx []byte) Result { +func (BaseApplication) DeliverTx(tx []byte) Result { return NewResultOK(nil, "") } -func (app *BaseApplication) CheckTx(tx []byte) Result { +func (BaseApplication) CheckTx(tx []byte) Result { return NewResultOK(nil, "") } -func (app *BaseApplication) Commit() Result { +func (BaseApplication) Commit() Result { return NewResultOK([]byte("nil"), "") } -func (app *BaseApplication) Query(req RequestQuery) (resQuery ResponseQuery) { - return +func (BaseApplication) Query(req RequestQuery) ResponseQuery { + return ResponseQuery{} } -func (app *BaseApplication) InitChain(req RequestInitChain) { +func (BaseApplication) InitChain(req RequestInitChain) { } -func (app *BaseApplication) BeginBlock(req RequestBeginBlock) { +func (BaseApplication) BeginBlock(req RequestBeginBlock) { } -func (app *BaseApplication) EndBlock(height uint64) (resEndBlock ResponseEndBlock) { - return +func (BaseApplication) EndBlock(height uint64) ResponseEndBlock { + return ResponseEndBlock{} } diff --git a/types/messages.go b/types/messages.go index d4a582964..298f17ba2 100644 --- a/types/messages.go +++ b/types/messages.go @@ -111,9 +111,9 @@ func ToResponseDeliverTx(code CodeType, data []byte, log string, tags []*KVPair) } } -func ToResponseCheckTx(code CodeType, data []byte, log string, tags []*KVPair) *Response { +func ToResponseCheckTx(code CodeType, data []byte, log string) *Response { return &Response{ - Value: &Response_CheckTx{&ResponseCheckTx{code, data, log, tags}}, + Value: &Response_CheckTx{&ResponseCheckTx{code, data, log}}, } } diff --git a/types/result.go b/types/result.go index 84f877dc8..96dd4e795 100644 --- a/types/result.go +++ b/types/result.go @@ -103,7 +103,6 @@ func (r *ResponseCheckTx) Result() Result { Code: r.Code, Data: r.Data, Log: r.Log, - Tags: r.Tags, } } diff --git a/types/types.pb.go b/types/types.pb.go index 99396259b..0cd976796 100644 --- a/types/types.pb.go +++ b/types/types.pb.go @@ -169,6 +169,27 @@ func (x CodeType) String() string { } func (CodeType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +type KVPair_Type int32 + +const ( + KVPair_STRING KVPair_Type = 0 + KVPair_INT KVPair_Type = 1 +) + +var KVPair_Type_name = map[int32]string{ + 0: "STRING", + 1: "INT", +} +var KVPair_Type_value = map[string]int32{ + "STRING": 0, + "INT": 1, +} + +func (x KVPair_Type) String() string { + return proto.EnumName(KVPair_Type_name, int32(x)) +} +func (KVPair_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{29, 0} } + type Request struct { // Types that are valid to be assigned to Value: // *Request_Echo @@ -1337,10 +1358,9 @@ func (m *ResponseDeliverTx) GetTags() []*KVPair { } type ResponseCheckTx struct { - Code CodeType `protobuf:"varint,1,opt,name=code,enum=types.CodeType" json:"code,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` - Log string `protobuf:"bytes,3,opt,name=log" json:"log,omitempty"` - Tags []*KVPair `protobuf:"bytes,4,rep,name=tags" json:"tags,omitempty"` + Code CodeType `protobuf:"varint,1,opt,name=code,enum=types.CodeType" json:"code,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + Log string `protobuf:"bytes,3,opt,name=log" json:"log,omitempty"` } func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } @@ -1369,13 +1389,6 @@ func (m *ResponseCheckTx) GetLog() string { return "" } -func (m *ResponseCheckTx) GetTags() []*KVPair { - if m != nil { - return m.Tags - } - return nil -} - type ResponseQuery struct { Code CodeType `protobuf:"varint,1,opt,name=code,enum=types.CodeType" json:"code,omitempty"` Index int64 `protobuf:"varint,2,opt,name=index" json:"index,omitempty"` @@ -1657,9 +1670,10 @@ func (m *Validator) GetPower() uint64 { } type KVPair struct { - Key string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` - ValueString string `protobuf:"bytes,2,opt,name=value_string,json=valueString" json:"value_string,omitempty"` - ValueInt int64 `protobuf:"varint,3,opt,name=value_int,json=valueInt" json:"value_int,omitempty"` + Key string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` + ValueType KVPair_Type `protobuf:"varint,2,opt,name=value_type,json=valueType,enum=types.KVPair_Type" json:"value_type,omitempty"` + ValueString string `protobuf:"bytes,3,opt,name=value_string,json=valueString" json:"value_string,omitempty"` + ValueInt int64 `protobuf:"varint,4,opt,name=value_int,json=valueInt" json:"value_int,omitempty"` } func (m *KVPair) Reset() { *m = KVPair{} } @@ -1674,6 +1688,13 @@ func (m *KVPair) GetKey() string { return "" } +func (m *KVPair) GetValueType() KVPair_Type { + if m != nil { + return m.ValueType + } + return KVPair_STRING +} + func (m *KVPair) GetValueString() string { if m != nil { return m.ValueString @@ -1720,6 +1741,7 @@ func init() { proto.RegisterType((*Validator)(nil), "types.Validator") proto.RegisterType((*KVPair)(nil), "types.KVPair") proto.RegisterEnum("types.CodeType", CodeType_name, CodeType_value) + proto.RegisterEnum("types.KVPair_Type", KVPair_Type_name, KVPair_Type_value) } // Reference imports to suppress errors if they are not otherwise used. @@ -2127,111 +2149,114 @@ var _ABCIApplication_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("types/types.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1691 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x49, 0x6f, 0x1b, 0xc9, - 0x15, 0x56, 0x73, 0xe7, 0x13, 0x45, 0xb5, 0x4a, 0x94, 0x44, 0x31, 0x39, 0xd8, 0x1d, 0x38, 0x96, - 0x1c, 0xc7, 0x0e, 0x64, 0x38, 0xb0, 0xe2, 0x20, 0x80, 0x36, 0x4b, 0x84, 0x11, 0x5b, 0x69, 0x2f, - 0x87, 0xe4, 0x40, 0xb4, 0xd8, 0x45, 0xb2, 0x22, 0xb2, 0xaa, 0xdd, 0x5d, 0x2d, 0x53, 0xb9, 0x04, - 0xb9, 0xfb, 0x9e, 0x9f, 0x30, 0xf7, 0x01, 0xe6, 0x2f, 0x0c, 0x30, 0xfb, 0xf2, 0x8b, 0x06, 0xb5, - 0xf4, 0xaa, 0xa6, 0x31, 0x87, 0xc1, 0x5c, 0x88, 0x7e, 0x5b, 0x55, 0xbd, 0x57, 0xef, 0x7d, 0xef, - 0x15, 0x61, 0x8d, 0x5f, 0x7b, 0x38, 0x78, 0x28, 0x7f, 0x1f, 0x78, 0x3e, 0xe3, 0x0c, 0x55, 0x25, - 0x61, 0x7d, 0x5e, 0x81, 0xba, 0x8d, 0xdf, 0x85, 0x38, 0xe0, 0x68, 0x07, 0x2a, 0x78, 0x38, 0x61, - 0x5d, 0xe3, 0x96, 0xb1, 0xb3, 0xbc, 0x87, 0x1e, 0x28, 0x75, 0x2d, 0x3d, 0x19, 0x4e, 0xd8, 0xd9, - 0x92, 0x2d, 0x35, 0xd0, 0x1f, 0xa0, 0x3a, 0x9a, 0x86, 0xc1, 0xa4, 0x5b, 0x92, 0xaa, 0xeb, 0x59, - 0xd5, 0x67, 0x42, 0x74, 0xb6, 0x64, 0x2b, 0x1d, 0xb1, 0x2c, 0xa1, 0x23, 0xd6, 0x2d, 0x17, 0x2d, - 0xdb, 0xa7, 0x23, 0xb9, 0xac, 0xd0, 0x40, 0x4f, 0x00, 0x02, 0xcc, 0x07, 0xcc, 0xe3, 0x84, 0xd1, - 0x6e, 0x45, 0xea, 0x6f, 0x65, 0xf5, 0x5f, 0x61, 0xfe, 0x52, 0x8a, 0xcf, 0x96, 0xec, 0x66, 0x10, - 0x11, 0xc2, 0xd2, 0xc5, 0x53, 0x72, 0x85, 0xfd, 0x01, 0x9f, 0x77, 0xab, 0x45, 0x96, 0xc7, 0x4a, - 0xfe, 0x7a, 0x2e, 0x2c, 0xdd, 0x88, 0x40, 0x7b, 0xd0, 0x18, 0x4e, 0xf0, 0xf0, 0x52, 0xd8, 0xd5, - 0xa4, 0xdd, 0x46, 0xd6, 0xee, 0x48, 0x48, 0xa5, 0x55, 0x7d, 0xa8, 0x3e, 0xd1, 0x03, 0xa8, 0x0d, - 0xd9, 0x6c, 0x46, 0x78, 0xb7, 0x2e, 0x2d, 0x3a, 0x39, 0x0b, 0x29, 0x3b, 0x5b, 0xb2, 0xb5, 0x96, - 0x08, 0xd7, 0xbb, 0x10, 0xfb, 0xd7, 0xdd, 0x46, 0x51, 0xb8, 0xfe, 0x21, 0x44, 0x22, 0x5c, 0x52, - 0x47, 0xb8, 0x42, 0x28, 0xe1, 0x83, 0xe1, 0xc4, 0x21, 0xb4, 0xdb, 0x2c, 0x72, 0xa5, 0x4f, 0x09, - 0x3f, 0x12, 0x62, 0xe1, 0x0a, 0x89, 0x08, 0xf4, 0x14, 0x96, 0x2f, 0xf0, 0x98, 0xd0, 0xc1, 0xc5, - 0x94, 0x0d, 0x2f, 0xbb, 0x20, 0x4d, 0xbb, 0x59, 0xd3, 0x43, 0xa1, 0x70, 0x28, 0xe4, 0x67, 0x4b, - 0x36, 0x5c, 0xc4, 0x14, 0x7a, 0x0c, 0x4d, 0x4c, 0x5d, 0x6d, 0xba, 0x2c, 0x4d, 0x37, 0x73, 0x19, - 0x40, 0xdd, 0xc8, 0xb0, 0x81, 0xf5, 0xf7, 0x61, 0x1d, 0xaa, 0x57, 0xce, 0x34, 0xc4, 0xd6, 0x5d, - 0x58, 0x4e, 0x65, 0x0a, 0xea, 0x42, 0x7d, 0x86, 0x83, 0xc0, 0x19, 0x63, 0x99, 0x4e, 0x4d, 0x3b, - 0x22, 0xad, 0x36, 0xb4, 0xd2, 0x79, 0x92, 0x32, 0x14, 0xb9, 0x20, 0x0c, 0xaf, 0xb0, 0x1f, 0x88, - 0x04, 0xd0, 0x86, 0x9a, 0xb4, 0xfe, 0x02, 0x66, 0x3e, 0x09, 0x90, 0x09, 0xe5, 0x4b, 0x7c, 0xad, - 0x35, 0xc5, 0x27, 0xea, 0xe8, 0x03, 0xc9, 0xd4, 0x6c, 0xda, 0xfa, 0x74, 0x56, 0x6c, 0x1b, 0xa7, - 0x01, 0x6a, 0x43, 0x89, 0xcf, 0xa5, 0x69, 0xcb, 0x2e, 0xf1, 0xb9, 0x75, 0x0b, 0xda, 0xd9, 0x2b, - 0xbf, 0xa1, 0xe1, 0xc6, 0x47, 0x97, 0x77, 0x86, 0x10, 0x54, 0x5c, 0x87, 0x3b, 0x5a, 0x43, 0x7e, - 0x0b, 0x9e, 0xe7, 0xf0, 0x89, 0xde, 0x5e, 0x7e, 0xa3, 0x4d, 0xa8, 0x4d, 0x30, 0x19, 0x4f, 0xb8, - 0xac, 0x81, 0x8a, 0xad, 0x29, 0x71, 0x56, 0xcf, 0x67, 0x57, 0x58, 0xa6, 0x7a, 0xc3, 0x56, 0x84, - 0xb5, 0x0a, 0x2b, 0x99, 0x44, 0xb2, 0x8e, 0xe3, 0xc3, 0xc7, 0x17, 0x8f, 0xfe, 0x04, 0x70, 0xe5, - 0x4c, 0x89, 0xeb, 0x70, 0xe6, 0x07, 0x5d, 0xe3, 0x56, 0x79, 0x67, 0x79, 0xcf, 0xd4, 0xf7, 0xf5, - 0x36, 0x12, 0xd8, 0x29, 0x1d, 0xeb, 0x05, 0xac, 0xdd, 0xc8, 0x01, 0x71, 0xda, 0x89, 0x13, 0x4c, - 0x22, 0x0f, 0xc4, 0x37, 0xba, 0x23, 0x4e, 0xeb, 0xb8, 0xd8, 0xd7, 0xd5, 0xbd, 0xa2, 0x97, 0x3d, - 0x93, 0x4c, 0x5b, 0x0b, 0xad, 0x5d, 0x58, 0xcd, 0x25, 0x46, 0xca, 0x4f, 0x23, 0xed, 0xa7, 0xf5, - 0xa1, 0x0a, 0x0d, 0x1b, 0x07, 0x1e, 0xa3, 0x01, 0x46, 0x4f, 0xa0, 0x89, 0xe7, 0x43, 0xac, 0x6a, - 0xdc, 0xc8, 0xe5, 0xa8, 0xd2, 0x39, 0x89, 0xe4, 0x22, 0xbf, 0x63, 0x65, 0xb4, 0xab, 0xf1, 0x29, - 0x0f, 0x3a, 0xda, 0x28, 0x0d, 0x50, 0xf7, 0x23, 0x80, 0x2a, 0xe7, 0x0a, 0x54, 0xe9, 0xe6, 0x10, - 0x6a, 0x57, 0x23, 0x54, 0xa5, 0x70, 0xe1, 0x0c, 0x44, 0xed, 0x67, 0x20, 0xaa, 0x5a, 0x78, 0xfc, - 0x05, 0x18, 0xb5, 0x9f, 0xc1, 0xa8, 0x5a, 0xa1, 0xe9, 0x02, 0x90, 0x7a, 0x94, 0x02, 0xa9, 0x7a, - 0xae, 0x36, 0x95, 0x61, 0x01, 0x4a, 0x3d, 0x8c, 0x51, 0xaa, 0x91, 0xc3, 0x35, 0x6d, 0x92, 0x87, - 0xa9, 0xfb, 0x11, 0x4c, 0x35, 0x0b, 0x83, 0x96, 0xc3, 0xa9, 0xfd, 0x0c, 0x4e, 0x41, 0xa1, 0x3b, - 0x0b, 0x80, 0xea, 0xaf, 0x59, 0xa0, 0x52, 0x68, 0xb3, 0x9d, 0xb3, 0x5d, 0x88, 0x54, 0x7f, 0x4e, - 0x23, 0x55, 0x2b, 0x87, 0x8f, 0x3a, 0x17, 0x3e, 0x0a, 0x55, 0xbb, 0xa2, 0x12, 0x72, 0x99, 0x26, - 0x6a, 0x11, 0xfb, 0x3e, 0xf3, 0x35, 0x96, 0x28, 0xc2, 0xda, 0x11, 0x15, 0x9f, 0xe4, 0xd7, 0x47, - 0x60, 0x4d, 0x56, 0x6d, 0x2a, 0xbb, 0xac, 0xff, 0x1b, 0x89, 0xad, 0x44, 0xb6, 0x34, 0x5a, 0x34, - 0x35, 0x5a, 0xa4, 0xd0, 0xae, 0x94, 0x41, 0x3b, 0x74, 0x0f, 0xd6, 0xa6, 0x4e, 0xc0, 0x95, 0x9b, - 0x83, 0x0c, 0x7c, 0xac, 0x0a, 0x81, 0xf2, 0x4f, 0xe1, 0xc8, 0x1f, 0x61, 0x3d, 0xa5, 0xeb, 0x78, - 0xde, 0x40, 0x16, 0x75, 0x45, 0x16, 0xb5, 0x19, 0x6b, 0x1f, 0x78, 0xde, 0x99, 0x13, 0x4c, 0xac, - 0x3b, 0x89, 0xff, 0x19, 0x24, 0x9d, 0xb2, 0x71, 0x84, 0xa4, 0x53, 0x36, 0xb6, 0xfe, 0x67, 0x24, - 0x7a, 0x09, 0x6a, 0xfe, 0x0e, 0x2a, 0x43, 0xe6, 0x2a, 0xf7, 0xdb, 0x7b, 0xab, 0x3a, 0xf0, 0x47, - 0xcc, 0xc5, 0xaf, 0xaf, 0x3d, 0x6c, 0x4b, 0x61, 0xec, 0x6a, 0x29, 0x05, 0x8c, 0x7a, 0x83, 0x72, - 0xbc, 0x01, 0xba, 0x0d, 0x15, 0xee, 0x8c, 0x83, 0x6e, 0x45, 0xa2, 0x57, 0x04, 0x33, 0xcf, 0xdf, - 0x9e, 0x3b, 0xc4, 0xb7, 0xa5, 0xc8, 0xfa, 0xaf, 0x00, 0x99, 0x4c, 0x86, 0xff, 0xca, 0x07, 0xf8, - 0xd4, 0x48, 0xee, 0x55, 0x81, 0xfe, 0xcf, 0xda, 0xbf, 0x03, 0x55, 0x42, 0x5d, 0x3c, 0x97, 0x07, - 0x28, 0xdb, 0x8a, 0x88, 0xba, 0x55, 0x59, 0x1e, 0x2a, 0xdb, 0xad, 0xd4, 0x5d, 0x29, 0x42, 0xf7, - 0x05, 0x36, 0x92, 0xf8, 0xd2, 0xb2, 0x15, 0x91, 0x42, 0xd7, 0x5a, 0xa6, 0x8b, 0x68, 0xbf, 0xea, - 0xc9, 0xcd, 0xfd, 0x4b, 0x74, 0xb2, 0x74, 0x91, 0xff, 0x82, 0x41, 0xb3, 0xd6, 0x93, 0xac, 0x88, - 0xcb, 0xdb, 0xea, 0x00, 0xba, 0x59, 0xb7, 0xaa, 0x63, 0x67, 0x2b, 0x12, 0xfd, 0x1e, 0xaa, 0x2e, - 0x19, 0x8d, 0x16, 0xf7, 0x2c, 0x25, 0xb6, 0x3e, 0x29, 0x41, 0x4d, 0x75, 0x1c, 0xb4, 0x2d, 0xd0, - 0xcf, 0x21, 0x74, 0x40, 0xdc, 0xa8, 0xea, 0x24, 0xdd, 0x77, 0x53, 0x31, 0x29, 0x65, 0x62, 0x82, - 0xa0, 0xc2, 0xc9, 0x0c, 0xeb, 0x82, 0x91, 0xdf, 0x68, 0x0b, 0xea, 0x34, 0x9c, 0x0d, 0xf8, 0x3c, - 0x90, 0xd1, 0xae, 0xd8, 0x35, 0x1a, 0xce, 0x5e, 0xcf, 0x03, 0xb4, 0x07, 0x2b, 0xa9, 0xf2, 0x21, - 0xae, 0x86, 0xf5, 0xb6, 0x3e, 0x9a, 0x3c, 0x77, 0xff, 0xd8, 0x5e, 0x8e, 0x0b, 0xa9, 0xef, 0xa2, - 0x1d, 0x90, 0x75, 0x35, 0x50, 0xd0, 0xa9, 0xea, 0xad, 0x26, 0xe3, 0xd6, 0x16, 0x7c, 0x8d, 0xad, - 0xa2, 0x9d, 0xfe, 0x06, 0x9a, 0x22, 0x92, 0x4a, 0xa5, 0x2e, 0x55, 0x1a, 0x82, 0x21, 0x85, 0x77, - 0x61, 0x35, 0x69, 0xd1, 0x4a, 0xa5, 0xa1, 0x56, 0x49, 0xd8, 0x52, 0x71, 0x1b, 0x1a, 0x71, 0x5d, - 0x37, 0xa5, 0x46, 0xdd, 0xd1, 0xe5, 0xdc, 0x87, 0xba, 0x3e, 0x62, 0x61, 0x3b, 0xbf, 0x07, 0x55, - 0xcf, 0xf1, 0x79, 0xa0, 0xdb, 0x66, 0x84, 0xea, 0xe7, 0x8e, 0x2f, 0xe6, 0x28, 0xdd, 0xd4, 0x95, - 0x8a, 0xb5, 0x0f, 0x2b, 0x19, 0xbe, 0xc8, 0x44, 0xce, 0xb8, 0x33, 0xd5, 0x0d, 0x5d, 0x11, 0xf1, - 0x36, 0xa5, 0x64, 0x1b, 0x6b, 0x1f, 0x9a, 0xf1, 0x1d, 0x8a, 0x6b, 0xf1, 0xc2, 0x8b, 0xe7, 0x7a, - 0x32, 0x6b, 0xd9, 0x9a, 0x92, 0x89, 0xcd, 0xde, 0xeb, 0xc9, 0xa2, 0x62, 0x2b, 0xc2, 0xfa, 0x27, - 0xd4, 0x54, 0xcd, 0x15, 0x8c, 0x73, 0xb7, 0xa1, 0x25, 0x6b, 0x62, 0x10, 0x70, 0x9f, 0xd0, 0xb1, - 0x46, 0xc9, 0x65, 0xc9, 0x7b, 0x25, 0x59, 0x22, 0xc0, 0x4a, 0x85, 0x50, 0x85, 0x90, 0x65, 0xbb, - 0x21, 0x19, 0x7d, 0xca, 0xef, 0x7d, 0x56, 0x85, 0x46, 0x94, 0xe6, 0xa8, 0x06, 0xa5, 0x97, 0xcf, - 0xcd, 0x25, 0xb4, 0x06, 0x2b, 0x7d, 0xca, 0xb1, 0x4f, 0x9d, 0xe9, 0x89, 0x80, 0x79, 0xd3, 0x10, - 0xac, 0x13, 0x3a, 0x64, 0x2e, 0xa1, 0x63, 0xc5, 0x2a, 0xa1, 0x16, 0x34, 0x0e, 0x1d, 0xf7, 0x05, - 0xa3, 0x43, 0x6c, 0x96, 0x91, 0x09, 0xad, 0x37, 0xd4, 0x09, 0xf9, 0x84, 0xf9, 0xe4, 0x3f, 0xd8, - 0x35, 0x2b, 0x68, 0x03, 0xd6, 0xfa, 0x34, 0x08, 0x47, 0x23, 0x32, 0x24, 0x98, 0xf2, 0x67, 0x21, - 0x75, 0x03, 0xb3, 0x8a, 0x10, 0xb4, 0xdf, 0xd0, 0x4b, 0xca, 0xde, 0x53, 0x3d, 0x1e, 0x99, 0x35, - 0xd4, 0x85, 0xce, 0xa1, 0x13, 0xe0, 0xe3, 0xd0, 0x9b, 0x92, 0xa1, 0xc3, 0xf1, 0x81, 0xeb, 0xfa, - 0x38, 0x08, 0x4c, 0x2c, 0x16, 0x11, 0x92, 0xec, 0xde, 0xa3, 0xc8, 0x20, 0xb3, 0x3e, 0xc6, 0x81, - 0x39, 0x46, 0xdb, 0xb0, 0x71, 0x43, 0x22, 0x77, 0x9e, 0xa0, 0xdf, 0x42, 0x37, 0x2f, 0x3a, 0x75, - 0x82, 0x73, 0x9f, 0x0c, 0xb1, 0x49, 0x50, 0x07, 0x4c, 0x25, 0x95, 0x99, 0xd5, 0xa7, 0x5e, 0xc8, - 0xcd, 0x7f, 0x47, 0xfb, 0x6b, 0xee, 0xcb, 0x90, 0x0b, 0xf6, 0x65, 0x8e, 0x7d, 0x2e, 0x6f, 0xcf, - 0x9c, 0xa2, 0x2d, 0x58, 0x4f, 0xb1, 0x5f, 0x09, 0xff, 0x44, 0x74, 0x66, 0xc9, 0x79, 0x95, 0x80, - 0x8c, 0xa9, 0xc3, 0x43, 0x1f, 0x9b, 0x14, 0x6d, 0x02, 0x12, 0x12, 0x1d, 0x92, 0xc8, 0x71, 0x16, - 0xed, 0xa0, 0xf9, 0x7a, 0x07, 0x2f, 0xcf, 0x9e, 0x86, 0x63, 0x42, 0xcd, 0x77, 0x68, 0x03, 0xcc, - 0x53, 0x76, 0xa5, 0xb9, 0x27, 0x94, 0x13, 0x7e, 0x6d, 0x7e, 0x61, 0xa0, 0x0e, 0xac, 0x26, 0xec, - 0x53, 0x9f, 0x85, 0x9e, 0xf9, 0xa5, 0x81, 0xb6, 0x00, 0x25, 0xdc, 0x73, 0x9f, 0x79, 0x2c, 0x70, - 0xa6, 0xe6, 0x57, 0x06, 0xda, 0x84, 0xb5, 0x53, 0x76, 0x15, 0xdf, 0x82, 0x32, 0xf8, 0x3a, 0x32, - 0x88, 0xf9, 0x7f, 0xc7, 0xb3, 0x0b, 0xec, 0x9b, 0xdf, 0x18, 0x68, 0x1b, 0x3a, 0x69, 0x41, 0xbc, - 0xd6, 0xb7, 0x86, 0x3e, 0x51, 0x2c, 0x7a, 0xcb, 0x38, 0x36, 0xbf, 0x8b, 0xd8, 0x3a, 0x0e, 0x7a, - 0xa1, 0xef, 0x0d, 0xb4, 0x0e, 0xed, 0x84, 0x2d, 0x75, 0x7f, 0x30, 0x50, 0x0f, 0x36, 0x32, 0x4c, - 0x42, 0xc7, 0xe7, 0xa2, 0x20, 0xcc, 0x1f, 0x8d, 0xbd, 0x0f, 0x55, 0x58, 0x3d, 0x38, 0x3c, 0xea, - 0x1f, 0x78, 0x6a, 0x03, 0xd1, 0xa2, 0x1f, 0x42, 0x45, 0x0e, 0x21, 0x05, 0x2f, 0xf3, 0x5e, 0xd1, - 0x34, 0x8c, 0xf6, 0xa0, 0x2a, 0x67, 0x11, 0x54, 0xf4, 0x40, 0xef, 0x15, 0x0e, 0xc5, 0x62, 0x13, - 0x35, 0xad, 0xdc, 0x7c, 0xa7, 0xf7, 0x8a, 0x26, 0x63, 0xf4, 0x37, 0x68, 0x26, 0x53, 0xc4, 0xa2, - 0xd7, 0x7a, 0x6f, 0xe1, 0x8c, 0x2c, 0xec, 0x93, 0xe9, 0x62, 0xd1, 0x9b, 0xbd, 0xb7, 0x70, 0x50, - 0x46, 0x4f, 0xa0, 0x1e, 0x8d, 0x06, 0xc5, 0x2f, 0xf7, 0xde, 0x82, 0x59, 0x59, 0x84, 0x47, 0xb5, - 0xf4, 0xa2, 0x07, 0x79, 0xaf, 0x70, 0xfc, 0x45, 0x8f, 0xa1, 0xa6, 0x5b, 0x6a, 0xe1, 0xa3, 0xbf, - 0x57, 0x3c, 0x64, 0x0b, 0x27, 0x93, 0xb7, 0xdb, 0xa2, 0xd7, 0x7c, 0x6f, 0xe1, 0xf8, 0x8c, 0x0e, - 0x00, 0x52, 0xaf, 0xb6, 0x85, 0x6f, 0xfa, 0xde, 0xe2, 0x21, 0x1a, 0x3d, 0x85, 0x46, 0xf2, 0x50, - 0x2b, 0x7e, 0xd9, 0xf7, 0x16, 0xcd, 0xd1, 0x17, 0x35, 0xf9, 0xa7, 0xd1, 0xa3, 0x9f, 0x02, 0x00, - 0x00, 0xff, 0xff, 0x37, 0x8d, 0xa7, 0x8f, 0x49, 0x12, 0x00, 0x00, + // 1736 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xcb, 0x6e, 0xdb, 0xcc, + 0x15, 0x36, 0x25, 0xea, 0x76, 0x2c, 0xcb, 0xf4, 0x58, 0xb6, 0x65, 0xa5, 0x8b, 0x84, 0x45, 0x1a, + 0x3b, 0x4d, 0x9d, 0xd6, 0x41, 0x8a, 0xb8, 0x29, 0x0a, 0xf8, 0x16, 0x5b, 0x08, 0xea, 0xb8, 0xb4, + 0x93, 0x4d, 0x0b, 0x08, 0xb4, 0x38, 0x92, 0xa6, 0x96, 0x86, 0x0c, 0x39, 0x74, 0xe4, 0xee, 0xba, + 0xcf, 0xbe, 0x8f, 0x50, 0xa0, 0xcb, 0x02, 0x7d, 0x85, 0x02, 0xff, 0xfd, 0xf2, 0x44, 0x3f, 0xe6, + 0xc2, 0xab, 0xa9, 0xe0, 0x5f, 0x64, 0x23, 0xf0, 0x5c, 0xbe, 0x99, 0x33, 0x33, 0xe7, 0x7c, 0x73, + 0x46, 0xb0, 0xc2, 0x6e, 0x3d, 0x1c, 0x3c, 0x15, 0xbf, 0x3b, 0x9e, 0xef, 0x32, 0x17, 0x55, 0x84, + 0x60, 0xfe, 0x5f, 0x87, 0x9a, 0x85, 0xdf, 0x87, 0x38, 0x60, 0x68, 0x0b, 0x74, 0x3c, 0x18, 0xbb, + 0x1d, 0xed, 0xbe, 0xb6, 0xb5, 0xb8, 0x8b, 0x76, 0xa4, 0xbb, 0xb2, 0x1e, 0x0f, 0xc6, 0xee, 0xe9, + 0x82, 0x25, 0x3c, 0xd0, 0xaf, 0xa1, 0x32, 0x9c, 0x84, 0xc1, 0xb8, 0x53, 0x12, 0xae, 0xab, 0x59, + 0xd7, 0x57, 0xdc, 0x74, 0xba, 0x60, 0x49, 0x1f, 0x3e, 0x2c, 0xa1, 0x43, 0xb7, 0x53, 0x2e, 0x1a, + 0xb6, 0x47, 0x87, 0x62, 0x58, 0xee, 0x81, 0x5e, 0x00, 0x04, 0x98, 0xf5, 0x5d, 0x8f, 0x11, 0x97, + 0x76, 0x74, 0xe1, 0xbf, 0x91, 0xf5, 0xbf, 0xc0, 0xec, 0x8d, 0x30, 0x9f, 0x2e, 0x58, 0x8d, 0x20, + 0x12, 0x38, 0xd2, 0xc1, 0x13, 0x72, 0x83, 0xfd, 0x3e, 0x9b, 0x75, 0x2a, 0x45, 0xc8, 0x23, 0x69, + 0xbf, 0x9c, 0x71, 0xa4, 0x13, 0x09, 0x68, 0x17, 0xea, 0x83, 0x31, 0x1e, 0x5c, 0x73, 0x5c, 0x55, + 0xe0, 0xd6, 0xb2, 0xb8, 0x43, 0x6e, 0x15, 0xa8, 0xda, 0x40, 0x7e, 0xa2, 0x1d, 0xa8, 0x0e, 0xdc, + 0xe9, 0x94, 0xb0, 0x4e, 0x4d, 0x20, 0xda, 0x39, 0x84, 0xb0, 0x9d, 0x2e, 0x58, 0xca, 0x8b, 0x6f, + 0xd7, 0xfb, 0x10, 0xfb, 0xb7, 0x9d, 0x7a, 0xd1, 0x76, 0xfd, 0x85, 0x9b, 0xf8, 0x76, 0x09, 0x1f, + 0xbe, 0x14, 0x42, 0x09, 0xeb, 0x0f, 0xc6, 0x36, 0xa1, 0x9d, 0x46, 0xd1, 0x52, 0x7a, 0x94, 0xb0, + 0x43, 0x6e, 0xe6, 0x4b, 0x21, 0x91, 0x80, 0x5e, 0xc2, 0xe2, 0x15, 0x1e, 0x11, 0xda, 0xbf, 0x9a, + 0xb8, 0x83, 0xeb, 0x0e, 0x08, 0x68, 0x27, 0x0b, 0x3d, 0xe0, 0x0e, 0x07, 0xdc, 0x7e, 0xba, 0x60, + 0xc1, 0x55, 0x2c, 0xa1, 0xe7, 0xd0, 0xc0, 0xd4, 0x51, 0xd0, 0x45, 0x01, 0x5d, 0xcf, 0x65, 0x00, + 0x75, 0x22, 0x60, 0x1d, 0xab, 0xef, 0x83, 0x1a, 0x54, 0x6e, 0xec, 0x49, 0x88, 0xcd, 0x47, 0xb0, + 0x98, 0xca, 0x14, 0xd4, 0x81, 0xda, 0x14, 0x07, 0x81, 0x3d, 0xc2, 0x22, 0x9d, 0x1a, 0x56, 0x24, + 0x9a, 0x2d, 0x68, 0xa6, 0xf3, 0x24, 0x05, 0xe4, 0xb9, 0xc0, 0x81, 0x37, 0xd8, 0x0f, 0x78, 0x02, + 0x28, 0xa0, 0x12, 0xcd, 0x3f, 0x80, 0x91, 0x4f, 0x02, 0x64, 0x40, 0xf9, 0x1a, 0xdf, 0x2a, 0x4f, + 0xfe, 0x89, 0xda, 0x2a, 0x20, 0x91, 0x9a, 0x0d, 0x4b, 0x45, 0x67, 0xc6, 0xd8, 0x38, 0x0d, 0x50, + 0x0b, 0x4a, 0x6c, 0x26, 0xa0, 0x4d, 0xab, 0xc4, 0x66, 0xe6, 0x7d, 0x68, 0x65, 0x8f, 0xfc, 0x8e, + 0x87, 0x13, 0x87, 0x2e, 0xce, 0x0c, 0x21, 0xd0, 0x1d, 0x9b, 0xd9, 0xca, 0x43, 0x7c, 0x73, 0x9d, + 0x67, 0xb3, 0xb1, 0x9a, 0x5e, 0x7c, 0xa3, 0x75, 0xa8, 0x8e, 0x31, 0x19, 0x8d, 0x99, 0xa8, 0x01, + 0xdd, 0x52, 0x12, 0x8f, 0xd5, 0xf3, 0xdd, 0x1b, 0x2c, 0x52, 0xbd, 0x6e, 0x49, 0xc1, 0x5c, 0x86, + 0xa5, 0x4c, 0x22, 0x99, 0x47, 0x71, 0xf0, 0xf1, 0xc1, 0xa3, 0xdf, 0x02, 0xdc, 0xd8, 0x13, 0xe2, + 0xd8, 0xcc, 0xf5, 0x83, 0x8e, 0x76, 0xbf, 0xbc, 0xb5, 0xb8, 0x6b, 0xa8, 0xf3, 0x7a, 0x17, 0x19, + 0xac, 0x94, 0x8f, 0x79, 0x06, 0x2b, 0x77, 0x72, 0x80, 0x47, 0x3b, 0xb6, 0x83, 0x71, 0xb4, 0x02, + 0xfe, 0x8d, 0x1e, 0xf2, 0x68, 0x6d, 0x07, 0xfb, 0xaa, 0xba, 0x97, 0xd4, 0xb0, 0xa7, 0x42, 0x69, + 0x29, 0xa3, 0xb9, 0x0d, 0xcb, 0xb9, 0xc4, 0x48, 0xad, 0x53, 0x4b, 0xaf, 0xd3, 0xfc, 0x58, 0x81, + 0xba, 0x85, 0x03, 0xcf, 0xa5, 0x01, 0x46, 0x2f, 0xa0, 0x81, 0x67, 0x03, 0x2c, 0x6b, 0x5c, 0xcb, + 0xe5, 0xa8, 0xf4, 0x39, 0x8e, 0xec, 0x3c, 0xbf, 0x63, 0x67, 0xb4, 0xad, 0xf8, 0x29, 0x4f, 0x3a, + 0x0a, 0x94, 0x26, 0xa8, 0x27, 0x11, 0x41, 0x95, 0x73, 0x05, 0x2a, 0x7d, 0x73, 0x0c, 0xb5, 0xad, + 0x18, 0x4a, 0x2f, 0x1c, 0x38, 0x43, 0x51, 0x7b, 0x19, 0x8a, 0xaa, 0x14, 0x86, 0x3f, 0x87, 0xa3, + 0xf6, 0x32, 0x1c, 0x55, 0x2d, 0x84, 0xce, 0x21, 0xa9, 0x67, 0x29, 0x92, 0xaa, 0xe5, 0x6a, 0x53, + 0x02, 0x0b, 0x58, 0xea, 0x69, 0xcc, 0x52, 0xf5, 0x1c, 0xaf, 0x29, 0x48, 0x9e, 0xa6, 0x9e, 0x44, + 0x34, 0xd5, 0x28, 0xdc, 0xb4, 0x1c, 0x4f, 0xed, 0x65, 0x78, 0x0a, 0x0a, 0x97, 0x33, 0x87, 0xa8, + 0xfe, 0x98, 0x25, 0x2a, 0xc9, 0x36, 0x9b, 0x39, 0xec, 0x5c, 0xa6, 0xfa, 0x7d, 0x9a, 0xa9, 0x9a, + 0x39, 0x7e, 0x54, 0xb9, 0xf0, 0x49, 0xaa, 0xda, 0xe6, 0x95, 0x90, 0xcb, 0x34, 0x5e, 0x8b, 0xd8, + 0xf7, 0x5d, 0x5f, 0x71, 0x89, 0x14, 0xcc, 0x2d, 0x5e, 0xf1, 0x49, 0x7e, 0x7d, 0x82, 0xd6, 0x44, + 0xd5, 0xa6, 0xb2, 0xcb, 0xfc, 0x97, 0x96, 0x60, 0x05, 0xb3, 0xa5, 0xd9, 0xa2, 0xa1, 0xd8, 0x22, + 0xc5, 0x76, 0xa5, 0x0c, 0xdb, 0xa1, 0xc7, 0xb0, 0x32, 0xb1, 0x03, 0x26, 0x97, 0xd9, 0xcf, 0xd0, + 0xc7, 0x32, 0x37, 0xc8, 0xf5, 0x49, 0x1e, 0xf9, 0x0d, 0xac, 0xa6, 0x7c, 0x6d, 0xcf, 0xeb, 0x8b, + 0xa2, 0xd6, 0x45, 0x51, 0x1b, 0xb1, 0xf7, 0xbe, 0xe7, 0x9d, 0xda, 0xc1, 0xd8, 0x7c, 0x98, 0xac, + 0x3f, 0xc3, 0xa4, 0x13, 0x77, 0x14, 0x31, 0xe9, 0xc4, 0x1d, 0x99, 0xff, 0xd4, 0x12, 0xbf, 0x84, + 0x35, 0x7f, 0x09, 0xfa, 0xc0, 0x75, 0xe4, 0xf2, 0x5b, 0xbb, 0xcb, 0x6a, 0xe3, 0x0f, 0x5d, 0x07, + 0x5f, 0xde, 0x7a, 0xd8, 0x12, 0xc6, 0x78, 0xa9, 0xa5, 0x14, 0x31, 0xaa, 0x09, 0xca, 0xf1, 0x04, + 0xe8, 0x01, 0xe8, 0xcc, 0x1e, 0x05, 0x1d, 0x5d, 0xb0, 0x57, 0x44, 0x33, 0xaf, 0xdf, 0x9d, 0xdb, + 0xc4, 0xb7, 0x84, 0xc9, 0xfc, 0x1b, 0x27, 0x99, 0x4c, 0x86, 0x7f, 0xc6, 0x00, 0xcc, 0xff, 0x6a, + 0xc9, 0xa1, 0x49, 0x46, 0xff, 0x59, 0x83, 0xb7, 0xa1, 0x42, 0xa8, 0x83, 0x67, 0x62, 0xf4, 0xb2, + 0x25, 0x85, 0xe8, 0x2a, 0x2a, 0x8b, 0x19, 0xb3, 0x57, 0x91, 0x3c, 0x08, 0x29, 0x28, 0xd2, 0x77, + 0x87, 0x82, 0x3c, 0x9a, 0x96, 0x14, 0x52, 0xd4, 0x59, 0xcd, 0x5c, 0x11, 0x2a, 0xe8, 0x5a, 0x12, + 0xf4, 0x5f, 0xf9, 0x35, 0x95, 0xae, 0xe0, 0xcf, 0xb9, 0x23, 0xab, 0xc9, 0x91, 0xc7, 0xb5, 0x6b, + 0xb6, 0x01, 0xdd, 0x2d, 0x4a, 0x79, 0x1d, 0x67, 0xcb, 0x0d, 0xfd, 0x0a, 0x2a, 0x0e, 0x19, 0x0e, + 0xe7, 0x5f, 0x48, 0xd2, 0x6c, 0xfe, 0xbb, 0x04, 0x55, 0x79, 0x9d, 0xa0, 0x4d, 0x4e, 0x6d, 0x36, + 0xa1, 0x7d, 0xe2, 0x44, 0x25, 0x25, 0xe4, 0x9e, 0x93, 0xda, 0x93, 0x52, 0x66, 0x4f, 0x10, 0xe8, + 0x8c, 0x4c, 0xb1, 0xaa, 0x06, 0xf1, 0x8d, 0x36, 0xa0, 0x46, 0xc3, 0x69, 0x9f, 0xcd, 0x02, 0xb1, + 0xdb, 0xba, 0x55, 0xa5, 0xe1, 0xf4, 0x72, 0x16, 0xa0, 0x5d, 0x58, 0x4a, 0xd5, 0x06, 0x71, 0x14, + 0x67, 0xb7, 0x54, 0x68, 0x22, 0xee, 0xde, 0x91, 0xb5, 0x18, 0x57, 0x49, 0xcf, 0x41, 0x5b, 0x20, + 0x8a, 0xa6, 0x2f, 0x79, 0x51, 0x16, 0x53, 0x55, 0xec, 0x5b, 0x8b, 0xeb, 0x15, 0x71, 0xf2, 0xbb, + 0xf2, 0x1e, 0x34, 0xf8, 0x4e, 0x4a, 0x97, 0x9a, 0x70, 0xa9, 0x73, 0x85, 0x30, 0x3e, 0x82, 0xe5, + 0xe4, 0xfe, 0x95, 0x2e, 0x75, 0x39, 0x4a, 0xa2, 0x16, 0x8e, 0x9b, 0x50, 0x8f, 0x8b, 0xb6, 0x21, + 0x3c, 0x6a, 0xb6, 0xaa, 0xd5, 0x1e, 0xd4, 0x54, 0x88, 0x85, 0x77, 0xf5, 0x63, 0xa8, 0x78, 0xb6, + 0xcf, 0x02, 0x75, 0x27, 0x46, 0x94, 0x7d, 0x6e, 0xfb, 0xbc, 0x49, 0x52, 0x37, 0xb6, 0x74, 0x31, + 0xf7, 0x60, 0x29, 0xa3, 0xe7, 0x99, 0xc8, 0x5c, 0x66, 0x4f, 0xd4, 0x6d, 0x2d, 0x85, 0x78, 0x9a, + 0x52, 0x32, 0x8d, 0xb9, 0x07, 0x8d, 0xf8, 0x0c, 0xf9, 0xb1, 0x78, 0xe1, 0xd5, 0x6b, 0xd5, 0x76, + 0x35, 0x2d, 0x25, 0x89, 0xc4, 0x76, 0x3f, 0xa8, 0xb6, 0x41, 0xb7, 0xa4, 0x60, 0xfe, 0x47, 0x83, + 0xaa, 0x2c, 0xe9, 0x82, 0x66, 0xed, 0x77, 0xa2, 0x8b, 0x09, 0x71, 0x9f, 0x87, 0x2d, 0x70, 0xad, + 0xf8, 0x81, 0x20, 0x41, 0x3b, 0x22, 0x85, 0x1b, 0xc2, 0x8b, 0x7f, 0xa2, 0x07, 0xd0, 0x94, 0x90, + 0x80, 0xf9, 0x84, 0x46, 0xc9, 0xbb, 0x28, 0x74, 0x17, 0x42, 0xc5, 0x0f, 0x45, 0xba, 0x10, 0xca, + 0x44, 0x36, 0x94, 0xad, 0xba, 0x50, 0xf4, 0x28, 0x33, 0xef, 0x81, 0x2e, 0xc6, 0x01, 0xa8, 0x5e, + 0x5c, 0x5a, 0xbd, 0xb3, 0x13, 0x63, 0x01, 0xd5, 0xa0, 0xdc, 0x3b, 0xbb, 0x34, 0xb4, 0xc7, 0xff, + 0xab, 0x40, 0x3d, 0xaa, 0x1b, 0x54, 0x85, 0xd2, 0x9b, 0xd7, 0xc6, 0x02, 0x5a, 0x81, 0xa5, 0x1e, + 0x65, 0xd8, 0xa7, 0xf6, 0xe4, 0x98, 0x5f, 0x0a, 0x86, 0xc6, 0x55, 0xc7, 0x74, 0xe0, 0x3a, 0x84, + 0x8e, 0xa4, 0xaa, 0x84, 0x9a, 0x50, 0x3f, 0xb0, 0x9d, 0x33, 0x97, 0x0e, 0xb0, 0x51, 0x46, 0x06, + 0x34, 0xdf, 0x52, 0x3b, 0x64, 0x63, 0xd7, 0x27, 0xff, 0xc0, 0x8e, 0xa1, 0xa3, 0x35, 0x58, 0xe9, + 0xd1, 0x20, 0x1c, 0x0e, 0xc9, 0x80, 0x60, 0xca, 0x5e, 0x85, 0xd4, 0x09, 0x8c, 0x0a, 0x42, 0xd0, + 0x7a, 0x4b, 0xaf, 0xa9, 0xfb, 0x81, 0xaa, 0x66, 0xca, 0xa8, 0xa2, 0x0e, 0xb4, 0x0f, 0xec, 0x00, + 0x1f, 0x85, 0xde, 0x84, 0x0c, 0x6c, 0x86, 0xf7, 0x1d, 0xc7, 0xc7, 0x41, 0x60, 0x60, 0x3e, 0x08, + 0xb7, 0x64, 0xe7, 0x1e, 0x46, 0x80, 0xcc, 0xf8, 0x18, 0x07, 0xc6, 0x08, 0x6d, 0xc2, 0xda, 0x1d, + 0x8b, 0x98, 0x79, 0x8c, 0x7e, 0x01, 0x9d, 0xbc, 0xe9, 0xc4, 0x0e, 0xce, 0x7d, 0x32, 0xc0, 0x06, + 0x41, 0x6d, 0x30, 0xa4, 0x55, 0xa4, 0x6a, 0x8f, 0x7a, 0x21, 0x33, 0xfe, 0x1e, 0xcd, 0xaf, 0xb4, + 0x6f, 0x42, 0xc6, 0xd5, 0xd7, 0x39, 0xf5, 0xb9, 0x48, 0x07, 0x63, 0x82, 0x36, 0x60, 0x35, 0xa5, + 0xbe, 0xe0, 0xeb, 0xe3, 0xbb, 0x33, 0x4d, 0xe2, 0x95, 0x06, 0x32, 0xa2, 0x36, 0x0b, 0x7d, 0x6c, + 0x50, 0xb4, 0x0e, 0x88, 0x5b, 0xd4, 0x96, 0x44, 0x0b, 0x77, 0xa3, 0x19, 0x94, 0x5e, 0xcd, 0xe0, + 0xe5, 0xd5, 0x93, 0x70, 0x44, 0xa8, 0xf1, 0x1e, 0xad, 0x81, 0x71, 0xe2, 0xde, 0x28, 0xed, 0x31, + 0x65, 0x84, 0xdd, 0x1a, 0x5f, 0x68, 0xa8, 0x0d, 0xcb, 0x89, 0xfa, 0xc4, 0x77, 0x43, 0xcf, 0xf8, + 0x52, 0x43, 0x1b, 0x80, 0x12, 0xed, 0xb9, 0xef, 0x7a, 0x6e, 0x60, 0x4f, 0x8c, 0xaf, 0x34, 0xb4, + 0x0e, 0x2b, 0x27, 0xee, 0x4d, 0x7c, 0x0a, 0x12, 0xf0, 0x75, 0x04, 0x88, 0xf5, 0x7f, 0xc6, 0xd3, + 0x2b, 0xec, 0x1b, 0xdf, 0x68, 0x68, 0x13, 0xda, 0x69, 0x43, 0x3c, 0xd6, 0xb7, 0x9a, 0x8a, 0x28, + 0x36, 0xbd, 0x73, 0x19, 0x36, 0xbe, 0x8b, 0xd4, 0x6a, 0x1f, 0xd4, 0x40, 0xdf, 0x6b, 0x68, 0x15, + 0x5a, 0x89, 0x5a, 0xf8, 0xfe, 0xa0, 0xa1, 0x2e, 0xac, 0x65, 0x94, 0x84, 0x8e, 0xce, 0x79, 0x85, + 0x19, 0x3f, 0x6a, 0xbb, 0x1f, 0x2b, 0xb0, 0xbc, 0x7f, 0x70, 0xd8, 0xdb, 0xf7, 0xe4, 0x04, 0xfc, + 0x42, 0x7f, 0x0a, 0xba, 0x68, 0x59, 0x0a, 0xde, 0xf1, 0xdd, 0xa2, 0xde, 0x19, 0xed, 0x42, 0x45, + 0x74, 0x2e, 0xa8, 0xe8, 0x39, 0xdf, 0x2d, 0x6c, 0xa1, 0xf9, 0x24, 0xb2, 0xb7, 0xb9, 0xfb, 0xaa, + 0xef, 0x16, 0xf5, 0xd1, 0xe8, 0x4f, 0xd0, 0x48, 0x7a, 0x8e, 0x79, 0x6f, 0xfb, 0xee, 0xdc, 0x8e, + 0x9a, 0xe3, 0x93, 0x5e, 0x64, 0xde, 0x0b, 0xbf, 0x3b, 0xb7, 0xad, 0x46, 0x2f, 0xa0, 0x16, 0x35, + 0x12, 0xc5, 0xef, 0xfc, 0xee, 0x9c, 0xce, 0x9a, 0x6f, 0x8f, 0xec, 0x11, 0x8a, 0x9e, 0xef, 0xdd, + 0xc2, 0x66, 0x19, 0x3d, 0x87, 0xaa, 0xba, 0xa3, 0x0b, 0xff, 0x22, 0xe8, 0x16, 0xb7, 0xe4, 0x7c, + 0x91, 0xc9, 0x4b, 0x6f, 0xde, 0xdb, 0xbf, 0x3b, 0xb7, 0xd9, 0x46, 0xfb, 0x00, 0xa9, 0x37, 0xde, + 0xdc, 0x7f, 0x00, 0xba, 0xf3, 0x5b, 0x6e, 0xf4, 0x12, 0xea, 0xc9, 0xb3, 0xae, 0xf8, 0x7f, 0x80, + 0xee, 0xbc, 0xae, 0xfb, 0xaa, 0x2a, 0xfe, 0x62, 0x7a, 0xf6, 0x53, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x59, 0xf7, 0xaf, 0xdb, 0x77, 0x12, 0x00, 0x00, } diff --git a/types/types.proto b/types/types.proto index 09dcb1bd8..e83df9851 100644 --- a/types/types.proto +++ b/types/types.proto @@ -166,7 +166,6 @@ message ResponseCheckTx{ CodeType code = 1; bytes data = 2; string log = 3; - repeated KVPair tags = 4; } message ResponseQuery{ @@ -231,8 +230,13 @@ message Validator { message KVPair { string key = 1; - string value_string = 2; - int64 value_int = 3; + enum Type { + STRING = 0; + INT = 1; + } + Type value_type = 2; + string value_string = 3; + int64 value_int = 4; } //---------------------------------------- From 92801dbd72fddc0521575f8666aa4582710157f0 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 20 Nov 2017 18:30:10 -0600 Subject: [PATCH 12/42] [dockerfile] install psmisc for tests --- Dockerfile.develop | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Dockerfile.develop b/Dockerfile.develop index e21350ce7..d4643155a 100644 --- a/Dockerfile.develop +++ b/Dockerfile.develop @@ -5,9 +5,13 @@ WORKDIR /go/src/github.com/tendermint/abci COPY Makefile /go/src/github.com/tendermint/abci/ -RUN make install_protoc -# see make protoc for details -RUN ldconfig +# see make protoc for details on ldconfig +RUN make install_protoc && ldconfig + +# killall is used in tests +RUN apt-get update && apt-get install -y \ + psmisc \ + && rm -rf /var/lib/apt/lists/* COPY glide.yaml /go/src/github.com/tendermint/abci/ COPY glide.lock /go/src/github.com/tendermint/abci/ From 3a3d508e5c57112977e387d21106a9c601d93b3c Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 20 Nov 2017 20:26:37 -0600 Subject: [PATCH 13/42] CheckTx and DeliverTx return ResponseCheckTx and ResponseDeliverTx respectively Commit now returns ResponseCommit --- client/local_client.go | 6 ++--- example/counter/counter.go | 31 +++++++++++++++--------- example/dummy/dummy.go | 16 ++++++------- example/dummy/persistent_dummy.go | 39 ++++++++++++++++++++----------- types/application.go | 6 ++--- types/base_app.go | 12 +++++----- types/result.go | 8 +++++++ 7 files changed, 74 insertions(+), 44 deletions(-) diff --git a/client/local_client.go b/client/local_client.go index 539c1eef0..89f984184 100644 --- a/client/local_client.go +++ b/client/local_client.go @@ -164,14 +164,14 @@ func (app *localClient) SetOptionSync(key string, value string) (res types.Resul return types.OK.SetLog(log) } -func (app *localClient) DeliverTxSync(tx []byte) (res types.Result) { +func (app *localClient) DeliverTxSync(tx []byte) (res types.ResponseDeliverTx) { app.mtx.Lock() res = app.Application.DeliverTx(tx) app.mtx.Unlock() return res } -func (app *localClient) CheckTxSync(tx []byte) (res types.Result) { +func (app *localClient) CheckTxSync(tx []byte) (res types.ResponseCheckTx) { app.mtx.Lock() res = app.Application.CheckTx(tx) app.mtx.Unlock() @@ -185,7 +185,7 @@ func (app *localClient) QuerySync(reqQuery types.RequestQuery) (resQuery types.R return resQuery, nil } -func (app *localClient) CommitSync() (res types.Result) { +func (app *localClient) CommitSync() (res types.ResponseCommit) { app.mtx.Lock() res = app.Application.Commit() app.mtx.Unlock() diff --git a/example/counter/counter.go b/example/counter/counter.go index d2478ae28..65cac4a0e 100644 --- a/example/counter/counter.go +++ b/example/counter/counter.go @@ -2,6 +2,7 @@ package counter import ( "encoding/binary" + "fmt" "github.com/tendermint/abci/types" cmn "github.com/tendermint/tmlibs/common" @@ -30,45 +31,53 @@ func (app *CounterApplication) SetOption(key string, value string) (log string) return "" } -func (app *CounterApplication) DeliverTx(tx []byte) types.Result { +func (app *CounterApplication) DeliverTx(tx []byte) types.ResponseDeliverTx { if app.serial { if len(tx) > 8 { - return types.ErrEncodingError.SetLog(cmn.Fmt("Max tx size is 8 bytes, got %d", len(tx))) + return types.ResponseDeliverTx{ + Code: types.CodeType_EncodingError, + Log: fmt.Sprintf("Max tx size is 8 bytes, got %d", len(tx))} } tx8 := make([]byte, 8) copy(tx8[len(tx8)-len(tx):], tx) txValue := binary.BigEndian.Uint64(tx8) if txValue != uint64(app.txCount) { - return types.ErrBadNonce.SetLog(cmn.Fmt("Invalid nonce. Expected %v, got %v", app.txCount, txValue)) + return types.ResponseDeliverTx{ + Code: types.CodeType_BadNonce, + Log: fmt.Sprintf("Invalid nonce. Expected %v, got %v", app.txCount, txValue)} } } app.txCount++ - return types.OK + return types.ResponseDeliverTx{Code: types.CodeType_OK} } -func (app *CounterApplication) CheckTx(tx []byte) types.Result { +func (app *CounterApplication) CheckTx(tx []byte) types.ResponseCheckTx { if app.serial { if len(tx) > 8 { - return types.ErrEncodingError.SetLog(cmn.Fmt("Max tx size is 8 bytes, got %d", len(tx))) + return types.ResponseCheckTx{ + Code: types.CodeType_EncodingError, + Log: fmt.Sprintf("Max tx size is 8 bytes, got %d", len(tx))} } tx8 := make([]byte, 8) copy(tx8[len(tx8)-len(tx):], tx) txValue := binary.BigEndian.Uint64(tx8) if txValue < uint64(app.txCount) { - return types.ErrBadNonce.SetLog(cmn.Fmt("Invalid nonce. Expected >= %v, got %v", app.txCount, txValue)) + return types.ResponseCheckTx{ + Code: types.CodeType_BadNonce, + Log: fmt.Sprintf("Invalid nonce. Expected >= %v, got %v", app.txCount, txValue)} } } - return types.OK + return types.ResponseCheckTx{Code: types.CodeType_OK} } -func (app *CounterApplication) Commit() types.Result { +func (app *CounterApplication) Commit() (resp types.ResponseCommit) { app.hashCount++ if app.txCount == 0 { - return types.OK + return types.ResponseCommit{Code: types.CodeType_OK} } hash := make([]byte, 8) binary.BigEndian.PutUint64(hash, uint64(app.txCount)) - return types.NewResultOK(hash, "") + return types.ResponseCommit{Code: types.CodeType_OK, Data: hash} } func (app *CounterApplication) Query(reqQuery types.RequestQuery) types.ResponseQuery { diff --git a/example/dummy/dummy.go b/example/dummy/dummy.go index 7e95c859b..a4edacac4 100644 --- a/example/dummy/dummy.go +++ b/example/dummy/dummy.go @@ -1,12 +1,12 @@ package dummy import ( + "fmt" "strings" "github.com/tendermint/abci/types" wire "github.com/tendermint/go-wire" "github.com/tendermint/iavl" - cmn "github.com/tendermint/tmlibs/common" dbm "github.com/tendermint/tmlibs/db" ) @@ -22,25 +22,25 @@ func NewDummyApplication() *DummyApplication { } func (app *DummyApplication) Info(req types.RequestInfo) (resInfo types.ResponseInfo) { - return types.ResponseInfo{Data: cmn.Fmt("{\"size\":%v}", app.state.Size())} + return types.ResponseInfo{Data: fmt.Sprintf("{\"size\":%v}", app.state.Size())} } // tx is either "key=value" or just arbitrary bytes -func (app *DummyApplication) DeliverTx(tx []byte) types.Result { +func (app *DummyApplication) DeliverTx(tx []byte) types.ResponseDeliverTx { parts := strings.Split(string(tx), "=") if len(parts) == 2 { app.state.Set([]byte(parts[0]), []byte(parts[1])) } else { app.state.Set(tx, tx) } - return types.OK + return types.ResponseDeliverTx{Code: types.CodeType_OK} } -func (app *DummyApplication) CheckTx(tx []byte) types.Result { - return types.OK +func (app *DummyApplication) CheckTx(tx []byte) types.ResponseCheckTx { + return types.ResponseCheckTx{Code: types.CodeType_OK} } -func (app *DummyApplication) Commit() types.Result { +func (app *DummyApplication) Commit() types.ResponseCommit { // Save a new version var hash []byte var err error @@ -55,7 +55,7 @@ func (app *DummyApplication) Commit() types.Result { } } - return types.NewResultOK(hash, "") + return types.ResponseCommit{Code: types.CodeType_OK, Data: hash} } func (app *DummyApplication) Query(reqQuery types.RequestQuery) (resQuery types.ResponseQuery) { diff --git a/example/dummy/persistent_dummy.go b/example/dummy/persistent_dummy.go index 4c4801755..8fa112820 100644 --- a/example/dummy/persistent_dummy.go +++ b/example/dummy/persistent_dummy.go @@ -3,6 +3,7 @@ package dummy import ( "bytes" "encoding/hex" + "fmt" "strconv" "strings" @@ -61,7 +62,7 @@ func (app *PersistentDummyApplication) SetOption(key string, value string) (log } // tx is either "val:pubkey/power" or "key=value" or just arbitrary bytes -func (app *PersistentDummyApplication) DeliverTx(tx []byte) types.Result { +func (app *PersistentDummyApplication) DeliverTx(tx []byte) types.ResponseDeliverTx { // if it starts with "val:", update the validator set // format is "val:pubkey/power" if isValidatorTx(tx) { @@ -74,12 +75,12 @@ func (app *PersistentDummyApplication) DeliverTx(tx []byte) types.Result { return app.app.DeliverTx(tx) } -func (app *PersistentDummyApplication) CheckTx(tx []byte) types.Result { +func (app *PersistentDummyApplication) CheckTx(tx []byte) types.ResponseCheckTx { return app.app.CheckTx(tx) } // Commit will panic if InitChain was not called -func (app *PersistentDummyApplication) Commit() types.Result { +func (app *PersistentDummyApplication) Commit() types.ResponseCommit { // Save a new version for next height height := app.app.state.LatestVersion() + 1 @@ -93,7 +94,7 @@ func (app *PersistentDummyApplication) Commit() types.Result { } app.logger.Info("Commit block", "height", height, "root", appHash) - return types.NewResultOK(appHash, "") + return types.ResponseCommit{Code: types.CodeType_OK, Data: appHash} } func (app *PersistentDummyApplication) Query(reqQuery types.RequestQuery) types.ResponseQuery { @@ -148,30 +149,38 @@ func isValidatorTx(tx []byte) bool { } // format is "val:pubkey1/power1,addr2/power2,addr3/power3"tx -func (app *PersistentDummyApplication) execValidatorTx(tx []byte) types.Result { +func (app *PersistentDummyApplication) execValidatorTx(tx []byte) types.ResponseDeliverTx { tx = tx[len(ValidatorSetChangePrefix):] //get the pubkey and power pubKeyAndPower := strings.Split(string(tx), "/") if len(pubKeyAndPower) != 2 { - return types.ErrEncodingError.SetLog(cmn.Fmt("Expected 'pubkey/power'. Got %v", pubKeyAndPower)) + return types.ResponseDeliverTx{ + Code: types.CodeType_EncodingError, + Log: fmt.Sprintf("Expected 'pubkey/power'. Got %v", pubKeyAndPower)} } pubkeyS, powerS := pubKeyAndPower[0], pubKeyAndPower[1] // decode the pubkey, ensuring its go-crypto encoded pubkey, err := hex.DecodeString(pubkeyS) if err != nil { - return types.ErrEncodingError.SetLog(cmn.Fmt("Pubkey (%s) is invalid hex", pubkeyS)) + return types.ResponseDeliverTx{ + Code: types.CodeType_EncodingError, + Log: fmt.Sprintf("Pubkey (%s) is invalid hex", pubkeyS)} } _, err = crypto.PubKeyFromBytes(pubkey) if err != nil { - return types.ErrEncodingError.SetLog(cmn.Fmt("Pubkey (%X) is invalid go-crypto encoded", pubkey)) + return types.ResponseDeliverTx{ + Code: types.CodeType_EncodingError, + Log: fmt.Sprintf("Pubkey (%X) is invalid go-crypto encoded", pubkey)} } // decode the power power, err := strconv.Atoi(powerS) if err != nil { - return types.ErrEncodingError.SetLog(cmn.Fmt("Power (%s) is not an int", powerS)) + return types.ResponseDeliverTx{ + Code: types.CodeType_EncodingError, + Log: fmt.Sprintf("Power (%s) is not an int", powerS)} } // update @@ -179,19 +188,23 @@ func (app *PersistentDummyApplication) execValidatorTx(tx []byte) types.Result { } // add, update, or remove a validator -func (app *PersistentDummyApplication) updateValidator(v *types.Validator) types.Result { +func (app *PersistentDummyApplication) updateValidator(v *types.Validator) types.ResponseDeliverTx { key := []byte("val:" + string(v.PubKey)) if v.Power == 0 { // remove validator if !app.app.state.Has(key) { - return types.ErrUnauthorized.SetLog(cmn.Fmt("Cannot remove non-existent validator %X", key)) + return types.ResponseDeliverTx{ + Code: types.CodeType_Unauthorized, + Log: fmt.Sprintf("Cannot remove non-existent validator %X", key)} } app.app.state.Remove(key) } else { // add or update validator value := bytes.NewBuffer(make([]byte, 0)) if err := types.WriteMessage(v, value); err != nil { - return types.ErrInternalError.SetLog(cmn.Fmt("Error encoding validator: %v", err)) + return types.ResponseDeliverTx{ + Code: types.CodeType_InternalError, + Log: fmt.Sprintf("Error encoding validator: %v", err)} } app.app.state.Set(key, value.Bytes()) } @@ -199,5 +212,5 @@ func (app *PersistentDummyApplication) updateValidator(v *types.Validator) types // we only update the changes array if we successfully updated the tree app.changes = append(app.changes, v) - return types.OK + return types.ResponseDeliverTx{Code: types.CodeType_OK} } diff --git a/types/application.go b/types/application.go index 51a1869b0..ed9b0d20d 100644 --- a/types/application.go +++ b/types/application.go @@ -13,14 +13,14 @@ type Application interface { Query(RequestQuery) ResponseQuery // Query for state // Mempool Connection - CheckTx(tx []byte) Result // Validate a tx for the mempool + CheckTx(tx []byte) ResponseCheckTx // Validate a tx for the mempool // 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) ResponseDeliverTx // 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 + Commit() ResponseCommit // Commit the state and return the application Merkle root hash } //------------------------------------ diff --git a/types/base_app.go b/types/base_app.go index 60bf43880..75fdae8d7 100644 --- a/types/base_app.go +++ b/types/base_app.go @@ -15,16 +15,16 @@ func (BaseApplication) SetOption(key string, value string) (log string) { return "" } -func (BaseApplication) DeliverTx(tx []byte) Result { - return NewResultOK(nil, "") +func (BaseApplication) DeliverTx(tx []byte) ResponseDeliverTx { + return ResponseDeliverTx{} } -func (BaseApplication) CheckTx(tx []byte) Result { - return NewResultOK(nil, "") +func (BaseApplication) CheckTx(tx []byte) ResponseCheckTx { + return ResponseCheckTx{} } -func (BaseApplication) Commit() Result { - return NewResultOK([]byte("nil"), "") +func (BaseApplication) Commit() ResponseCommit { + return ResponseCommit{Code: CodeType_OK, Data: []byte("nil")} } func (BaseApplication) Query(req RequestQuery) ResponseQuery { diff --git a/types/result.go b/types/result.go index 96dd4e795..ffd8966a9 100644 --- a/types/result.go +++ b/types/result.go @@ -106,6 +106,10 @@ func (r *ResponseCheckTx) Result() Result { } } +func (r ResponseCheckTx) IsErr() bool { + return r.Code != CodeType_OK +} + // Convert ResponseDeliverTx to standard Result func (r *ResponseDeliverTx) Result() Result { return Result{ @@ -116,6 +120,10 @@ func (r *ResponseDeliverTx) Result() Result { } } +func (r ResponseDeliverTx) IsErr() bool { + return r.Code != CodeType_OK +} + type ResultQuery struct { Code CodeType `json:"code"` Index int64 `json:"index"` From 8e6269ce930f785cb8987cea3498ca7cff104ae5 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 21 Nov 2017 15:24:29 -0600 Subject: [PATCH 14/42] update README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index aedebee60..4cfcce749 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ Here, we describe the requests and responses as function arguments and return va * `Code (uint32)`: Response code * `Data ([]byte)`: Result bytes, if any * `Log (string)`: Debug or error message + * `Tags ([]*KVPair)`: Optional tags for indexing * __Usage__:
Append and run a transaction. If the transaction is valid, returns CodeType.OK From fbe7234639d411ddd15aea039dc9532adaaa3f21 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 21 Nov 2017 17:33:34 -0600 Subject: [PATCH 15/42] remove Result from the client package plus make Client interface more consistent. All *Sync functions now return an error as a second return param. Deliver/Check/Commit use Code to indicate errors and have IsErr() func defined on ResponseXYZ structs. --- client/client.go | 20 ++++----- client/grpc_client.go | 95 +++++++++++++--------------------------- client/local_client.go | 58 ++++++++++++------------ client/socket_client.go | 84 ++++++++++++----------------------- cmd/abci-cli/abci-cli.go | 18 +++++--- tests/test_app/app.go | 47 ++++++++++---------- types/result.go | 7 +++ 7 files changed, 140 insertions(+), 189 deletions(-) diff --git a/client/client.go b/client/client.go index 51d04124b..b550dc926 100644 --- a/client/client.go +++ b/client/client.go @@ -24,21 +24,21 @@ type Client interface { CommitAsync() *ReqRes FlushSync() error - EchoSync(msg string) (res types.Result) - 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) - QuerySync(types.RequestQuery) (resQuery types.ResponseQuery, err error) - CommitSync() (res types.Result) + EchoSync(msg string) (*types.ResponseEcho, error) + InfoSync(types.RequestInfo) (*types.ResponseInfo, error) + SetOptionSync(key string, value string) (log string, err error) + DeliverTxSync(tx []byte) *types.ResponseDeliverTx + CheckTxSync(tx []byte) *types.ResponseCheckTx + QuerySync(types.RequestQuery) (*types.ResponseQuery, error) + CommitSync() *types.ResponseCommit InitChainAsync(types.RequestInitChain) *ReqRes BeginBlockAsync(types.RequestBeginBlock) *ReqRes EndBlockAsync(height uint64) *ReqRes - InitChainSync(types.RequestInitChain) (err error) - BeginBlockSync(types.RequestBeginBlock) (err error) - EndBlockSync(height uint64) (resEndBlock types.ResponseEndBlock, err error) + InitChainSync(types.RequestInitChain) error + BeginBlockSync(types.RequestBeginBlock) error + EndBlockSync(height uint64) (*types.ResponseEndBlock, error) } //---------------------------------------- diff --git a/client/grpc_client.go b/client/grpc_client.go index 30f5d088a..524f1f7f9 100644 --- a/client/grpc_client.go +++ b/client/grpc_client.go @@ -240,104 +240,71 @@ func (cli *grpcClient) finishAsyncCall(req *types.Request, res *types.Response) return reqres } -func (cli *grpcClient) checkErrGetResult() types.Result { - if err := cli.Error(); err != nil { - // StopForError should already have been called if error is set - return types.ErrInternalError.SetLog(err.Error()) - } - return types.Result{} -} - //---------------------------------------- -func (cli *grpcClient) EchoSync(msg string) (res types.Result) { - reqres := cli.EchoAsync(msg) - if res := cli.checkErrGetResult(); res.IsErr() { - return res - } - resp := reqres.Response.GetEcho() - return types.NewResultOK([]byte(resp.Message), "") -} - func (cli *grpcClient) FlushSync() error { return nil } -func (cli *grpcClient) InfoSync(req types.RequestInfo) (resInfo types.ResponseInfo, err error) { +func (cli *grpcClient) EchoSync(msg string) (*types.ResponseEcho, error) { + reqres := cli.EchoAsync(msg) + // StopForError should already have been called if error is set + return reqres.Response.GetEcho(), cli.Error() +} + +func (cli *grpcClient) InfoSync(req types.RequestInfo) (*types.ResponseInfo, error) { reqres := cli.InfoAsync(req) - if err = cli.Error(); err != nil { - return resInfo, err - } - if info := reqres.Response.GetInfo(); info != nil { - return *info, nil - } - return resInfo, nil + return reqres.Response.GetInfo(), cli.Error() } -func (cli *grpcClient) SetOptionSync(key string, value string) (res types.Result) { +func (cli *grpcClient) SetOptionSync(key string, value string) (log string, err error) { reqres := cli.SetOptionAsync(key, value) - if res := cli.checkErrGetResult(); res.IsErr() { - return res + if err := cli.Error(); err != nil { + return "", err } - resp := reqres.Response.GetSetOption() - return types.Result{Code: OK, Data: nil, Log: resp.Log} + return reqres.Response.GetSetOption().Log, nil } -func (cli *grpcClient) DeliverTxSync(tx []byte) (res types.Result) { +func (cli *grpcClient) DeliverTxSync(tx []byte) *types.ResponseDeliverTx { reqres := cli.DeliverTxAsync(tx) - if res := cli.checkErrGetResult(); res.IsErr() { - return res + if err := cli.Error(); err != nil { + return &types.ResponseDeliverTx{Code: types.CodeType_InternalError, Log: err.Error()} } - resp := reqres.Response.GetDeliverTx() - return types.Result{Code: resp.Code, Data: resp.Data, Log: resp.Log} + return reqres.Response.GetDeliverTx() } -func (cli *grpcClient) CheckTxSync(tx []byte) (res types.Result) { +func (cli *grpcClient) CheckTxSync(tx []byte) *types.ResponseCheckTx { reqres := cli.CheckTxAsync(tx) - if res := cli.checkErrGetResult(); res.IsErr() { - return res + if err := cli.Error(); err != nil { + return &types.ResponseCheckTx{Code: types.CodeType_InternalError, Log: err.Error()} } - resp := reqres.Response.GetCheckTx() - return types.Result{Code: resp.Code, Data: resp.Data, Log: resp.Log} + return reqres.Response.GetCheckTx() } -func (cli *grpcClient) QuerySync(reqQuery types.RequestQuery) (resQuery types.ResponseQuery, err error) { - reqres := cli.QueryAsync(reqQuery) - if err = cli.Error(); err != nil { - return resQuery, err - } - if resQuery_ := reqres.Response.GetQuery(); resQuery_ != nil { - return *resQuery_, nil - } - return resQuery, nil +func (cli *grpcClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery, error) { + reqres := cli.QueryAsync(req) + return reqres.Response.GetQuery(), cli.Error() } -func (cli *grpcClient) CommitSync() (res types.Result) { +func (cli *grpcClient) CommitSync() *types.ResponseCommit { reqres := cli.CommitAsync() - if res := cli.checkErrGetResult(); res.IsErr() { - return res + if err := cli.Error(); err != nil { + return &types.ResponseCommit{Code: types.CodeType_InternalError, Log: err.Error()} } - resp := reqres.Response.GetCommit() - return types.Result{Code: resp.Code, Data: resp.Data, Log: resp.Log} + return reqres.Response.GetCommit() } -func (cli *grpcClient) InitChainSync(params types.RequestInitChain) (err error) { +func (cli *grpcClient) InitChainSync(params types.RequestInitChain) error { cli.InitChainAsync(params) return cli.Error() } -func (cli *grpcClient) BeginBlockSync(params types.RequestBeginBlock) (err error) { +func (cli *grpcClient) BeginBlockSync(params types.RequestBeginBlock) error { cli.BeginBlockAsync(params) return cli.Error() } -func (cli *grpcClient) EndBlockSync(height uint64) (resEndBlock types.ResponseEndBlock, err error) { +func (cli *grpcClient) EndBlockSync(height uint64) (*types.ResponseEndBlock, error) { reqres := cli.EndBlockAsync(height) - if err := cli.Error(); err != nil { - return resEndBlock, err - } - if blk := reqres.Response.GetEndBlock(); blk != nil { - return *blk, nil - } - return resEndBlock, nil + return reqres.Response.GetEndBlock(), cli.Error() } diff --git a/client/local_client.go b/client/local_client.go index 89f984184..9081406af 100644 --- a/client/local_client.go +++ b/client/local_client.go @@ -146,71 +146,71 @@ func (app *localClient) FlushSync() error { return nil } -func (app *localClient) EchoSync(msg string) (res types.Result) { - return types.OK.SetData([]byte(msg)) +func (app *localClient) EchoSync(msg string) (*types.ResponseEcho, error) { + return &types.ResponseEcho{msg}, nil } -func (app *localClient) InfoSync(req types.RequestInfo) (resInfo types.ResponseInfo, err error) { +func (app *localClient) InfoSync(req types.RequestInfo) (*types.ResponseInfo, error) { app.mtx.Lock() - defer app.mtx.Unlock() - resInfo = app.Application.Info(req) - return resInfo, nil -} - -func (app *localClient) SetOptionSync(key string, value string) (res types.Result) { - app.mtx.Lock() - log := app.Application.SetOption(key, value) + res := app.Application.Info(req) app.mtx.Unlock() - return types.OK.SetLog(log) + return &res, nil } -func (app *localClient) DeliverTxSync(tx []byte) (res types.ResponseDeliverTx) { +func (app *localClient) SetOptionSync(key string, value string) (log string, err error) { app.mtx.Lock() - res = app.Application.DeliverTx(tx) + log = app.Application.SetOption(key, value) app.mtx.Unlock() - return res + return log, nil } -func (app *localClient) CheckTxSync(tx []byte) (res types.ResponseCheckTx) { +func (app *localClient) DeliverTxSync(tx []byte) *types.ResponseDeliverTx { app.mtx.Lock() - res = app.Application.CheckTx(tx) + res := app.Application.DeliverTx(tx) app.mtx.Unlock() - return res + return &res } -func (app *localClient) QuerySync(reqQuery types.RequestQuery) (resQuery types.ResponseQuery, err error) { +func (app *localClient) CheckTxSync(tx []byte) *types.ResponseCheckTx { app.mtx.Lock() - resQuery = app.Application.Query(reqQuery) + res := app.Application.CheckTx(tx) app.mtx.Unlock() - return resQuery, nil + return &res } -func (app *localClient) CommitSync() (res types.ResponseCommit) { +func (app *localClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery, error) { app.mtx.Lock() - res = app.Application.Commit() + res := app.Application.Query(req) app.mtx.Unlock() - return res + return &res, nil } -func (app *localClient) InitChainSync(params types.RequestInitChain) (err error) { +func (app *localClient) CommitSync() *types.ResponseCommit { + app.mtx.Lock() + res := app.Application.Commit() + app.mtx.Unlock() + return &res +} + +func (app *localClient) InitChainSync(params types.RequestInitChain) error { app.mtx.Lock() app.Application.InitChain(params) app.mtx.Unlock() return nil } -func (app *localClient) BeginBlockSync(params types.RequestBeginBlock) (err error) { +func (app *localClient) BeginBlockSync(params types.RequestBeginBlock) error { app.mtx.Lock() app.Application.BeginBlock(params) app.mtx.Unlock() return nil } -func (app *localClient) EndBlockSync(height uint64) (resEndBlock types.ResponseEndBlock, err error) { +func (app *localClient) EndBlockSync(height uint64) (*types.ResponseEndBlock, error) { app.mtx.Lock() - resEndBlock = app.Application.EndBlock(height) + res := app.Application.EndBlock(height) app.mtx.Unlock() - return resEndBlock, nil + return &res, nil } //------------------------------------------------------- diff --git a/client/socket_client.go b/client/socket_client.go index 1045dea78..ef0a6ecea 100644 --- a/client/socket_client.go +++ b/client/socket_client.go @@ -271,111 +271,85 @@ func (cli *socketClient) EndBlockAsync(height uint64) *ReqRes { //---------------------------------------- -func (cli *socketClient) EchoSync(msg string) (res types.Result) { - reqres := cli.queueRequest(types.ToRequestEcho(msg)) - cli.FlushSync() - if err := cli.Error(); err != nil { - return types.ErrInternalError.SetLog(err.Error()) - } - resp := reqres.Response.GetEcho() - return types.Result{Code: OK, Data: []byte(resp.Message)} -} - func (cli *socketClient) FlushSync() error { reqRes := cli.queueRequest(types.ToRequestFlush()) if err := cli.Error(); err != nil { - return types.ErrInternalError.SetLog(err.Error()) + return err } reqRes.Wait() // NOTE: if we don't flush the queue, its possible to get stuck here return cli.Error() } -func (cli *socketClient) InfoSync(req types.RequestInfo) (resInfo types.ResponseInfo, err error) { - reqres := cli.queueRequest(types.ToRequestInfo(req)) +func (cli *socketClient) EchoSync(msg string) (*types.ResponseEcho, error) { + reqres := cli.queueRequest(types.ToRequestEcho(msg)) cli.FlushSync() - if err := cli.Error(); err != nil { - return resInfo, err - } - if resInfo_ := reqres.Response.GetInfo(); resInfo_ != nil { - return *resInfo_, nil - } - return resInfo, nil + return reqres.Response.GetEcho(), cli.Error() } -func (cli *socketClient) SetOptionSync(key string, value string) (res types.Result) { +func (cli *socketClient) InfoSync(req types.RequestInfo) (*types.ResponseInfo, error) { + reqres := cli.queueRequest(types.ToRequestInfo(req)) + cli.FlushSync() + return reqres.Response.GetInfo(), cli.Error() +} + +func (cli *socketClient) SetOptionSync(key string, value string) (log string, err error) { reqres := cli.queueRequest(types.ToRequestSetOption(key, value)) cli.FlushSync() if err := cli.Error(); err != nil { - return types.ErrInternalError.SetLog(err.Error()) + return "", err } - resp := reqres.Response.GetSetOption() - return types.Result{Code: OK, Data: nil, Log: resp.Log} + return reqres.Response.GetSetOption().Log, nil } -func (cli *socketClient) DeliverTxSync(tx []byte) (res types.Result) { +func (cli *socketClient) DeliverTxSync(tx []byte) *types.ResponseDeliverTx { reqres := cli.queueRequest(types.ToRequestDeliverTx(tx)) cli.FlushSync() if err := cli.Error(); err != nil { - return types.ErrInternalError.SetLog(err.Error()) + return &types.ResponseDeliverTx{Code: types.CodeType_InternalError, Log: err.Error()} } - resp := reqres.Response.GetDeliverTx() - return types.Result{Code: resp.Code, Data: resp.Data, Log: resp.Log} + return reqres.Response.GetDeliverTx() } -func (cli *socketClient) CheckTxSync(tx []byte) (res types.Result) { +func (cli *socketClient) CheckTxSync(tx []byte) *types.ResponseCheckTx { reqres := cli.queueRequest(types.ToRequestCheckTx(tx)) cli.FlushSync() if err := cli.Error(); err != nil { - return types.ErrInternalError.SetLog(err.Error()) + return &types.ResponseCheckTx{Code: types.CodeType_InternalError, Log: err.Error()} } - resp := reqres.Response.GetCheckTx() - return types.Result{Code: resp.Code, Data: resp.Data, Log: resp.Log} + return reqres.Response.GetCheckTx() } -func (cli *socketClient) QuerySync(reqQuery types.RequestQuery) (resQuery types.ResponseQuery, err error) { - reqres := cli.queueRequest(types.ToRequestQuery(reqQuery)) +func (cli *socketClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery, error) { + reqres := cli.queueRequest(types.ToRequestQuery(req)) cli.FlushSync() - if err := cli.Error(); err != nil { - return resQuery, err - } - if resQuery_ := reqres.Response.GetQuery(); resQuery_ != nil { - return *resQuery_, nil - } - return resQuery, nil + return reqres.Response.GetQuery(), cli.Error() } -func (cli *socketClient) CommitSync() (res types.Result) { +func (cli *socketClient) CommitSync() *types.ResponseCommit { reqres := cli.queueRequest(types.ToRequestCommit()) cli.FlushSync() if err := cli.Error(); err != nil { - return types.ErrInternalError.SetLog(err.Error()) + return &types.ResponseCommit{Code: types.CodeType_InternalError, Log: err.Error()} } - resp := reqres.Response.GetCommit() - return types.Result{Code: resp.Code, Data: resp.Data, Log: resp.Log} + return reqres.Response.GetCommit() } -func (cli *socketClient) InitChainSync(params types.RequestInitChain) (err error) { +func (cli *socketClient) InitChainSync(params types.RequestInitChain) error { cli.queueRequest(types.ToRequestInitChain(params)) cli.FlushSync() return cli.Error() } -func (cli *socketClient) BeginBlockSync(params types.RequestBeginBlock) (err error) { +func (cli *socketClient) BeginBlockSync(params types.RequestBeginBlock) error { cli.queueRequest(types.ToRequestBeginBlock(params)) cli.FlushSync() return cli.Error() } -func (cli *socketClient) EndBlockSync(height uint64) (resEndBlock types.ResponseEndBlock, err error) { +func (cli *socketClient) EndBlockSync(height uint64) (*types.ResponseEndBlock, error) { reqres := cli.queueRequest(types.ToRequestEndBlock(height)) cli.FlushSync() - if err := cli.Error(); err != nil { - return resEndBlock, err - } - if blk := reqres.Response.GetEndBlock(); blk != nil { - return *blk, nil - } - return resEndBlock, nil + return reqres.Response.GetEndBlock(), cli.Error() } //---------------------------------------- diff --git a/cmd/abci-cli/abci-cli.go b/cmd/abci-cli/abci-cli.go index 9962380b4..9c14aa4d6 100644 --- a/cmd/abci-cli/abci-cli.go +++ b/cmd/abci-cli/abci-cli.go @@ -327,9 +327,12 @@ func cmdConsole(cmd *cobra.Command, args []string) error { // Have the application echo a message func cmdEcho(cmd *cobra.Command, args []string) error { - resEcho := client.EchoSync(args[0]) + res, err := client.EchoSync(args[0]) + if err != nil { + return err + } printResponse(cmd, args, response{ - Data: resEcho.Data, + Data: []byte(res.Message), }) return nil } @@ -340,21 +343,24 @@ func cmdInfo(cmd *cobra.Command, args []string) error { if len(args) == 1 { version = args[0] } - resInfo, err := client.InfoSync(types.RequestInfo{version}) + res, err := client.InfoSync(types.RequestInfo{version}) if err != nil { return err } printResponse(cmd, args, response{ - Data: []byte(resInfo.Data), + Data: []byte(res.Data), }) return nil } // Set an option on the application func cmdSetOption(cmd *cobra.Command, args []string) error { - resSetOption := client.SetOptionSync(args[0], args[1]) + log, err := client.SetOptionSync(args[0], args[1]) + if err != nil { + return err + } printResponse(cmd, args, response{ - Log: resSetOption.Log, + Log: log, }) return nil } diff --git a/tests/test_app/app.go b/tests/test_app/app.go index 127ba78f7..67742b383 100644 --- a/tests/test_app/app.go +++ b/tests/test_app/app.go @@ -23,7 +23,7 @@ func startApp(abciApp string) *process.Process { os.Stdout, ) if err != nil { - panic("running abci_app: " + err.Error()) + panicf("running abci_app: %v", err) } // TODO a better way to handle this? @@ -41,57 +41,54 @@ func startClient(abciType string) abcicli.Client { logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) client.SetLogger(logger.With("module", "abcicli")) if _, err := client.Start(); err != nil { - panic("connecting to abci_app: " + err.Error()) + panicf("connecting to abci_app: %v", err.Error()) } return client } func setOption(client abcicli.Client, key, value string) { - res := client.SetOptionSync(key, value) - _, _, log := res.Code, res.Data, res.Log - if res.IsErr() { - panic(fmt.Sprintf("setting %v=%v: \nlog: %v", key, value, log)) + _, err := client.SetOptionSync(key, value) + if err != nil { + panicf("setting %v=%v: \nerr: %v", key, value, err) } } func commit(client abcicli.Client, hashExp []byte) { res := client.CommitSync() - _, data, _ := res.Code, res.Data, res.Log if res.IsErr() { - panic(fmt.Sprintf("committing err %v\n", res)) + panicf("committing err %v\n", res) } if !bytes.Equal(res.Data, hashExp) { - panic(fmt.Sprintf("Commit hash was unexpected. Got %X expected %X", - data, hashExp)) + panicf("Commit hash was unexpected. Got %X expected %X", res.Data, hashExp) } } func deliverTx(client abcicli.Client, txBytes []byte, codeExp types.CodeType, dataExp []byte) { res := client.DeliverTxSync(txBytes) - code, data, log := res.Code, res.Data, res.Log - if code != codeExp { - panic(fmt.Sprintf("DeliverTx response code was unexpected. Got %v expected %v. Log: %v", - code, codeExp, log)) + if res.Code != codeExp { + panicf("DeliverTx response code was unexpected. Got %v expected %v. Log: %v", res.Code, codeExp, res.Log) } - if !bytes.Equal(data, dataExp) { - panic(fmt.Sprintf("DeliverTx response data was unexpected. Got %X expected %X", - data, dataExp)) + if !bytes.Equal(res.Data, dataExp) { + panicf("DeliverTx response data was unexpected. Got %X expected %X", res.Data, dataExp) } } /*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() { - panic(fmt.Sprintf("checking tx %X: %v\nlog: %v", txBytes, log)) + panicf("checking tx %X: %v\nlog: %v", txBytes, res.Log) } - if code != codeExp { - panic(fmt.Sprintf("CheckTx response code was unexpected. Got %v expected %v. Log: %v", - code, codeExp, log)) + if res.Code != codeExp { + panicf("CheckTx response code was unexpected. Got %v expected %v. Log: %v", + res.Code, codeExp, res.Log) } - if !bytes.Equal(data, dataExp) { - panic(fmt.Sprintf("CheckTx response data was unexpected. Got %X expected %X", - data, dataExp)) + if !bytes.Equal(res.Data, dataExp) { + panicf("CheckTx response data was unexpected. Got %X expected %X", + res.Data, dataExp) } }*/ + +func panicf(format string, a ...interface{}) { + panic(fmt.Sprintf(format, a)) +} diff --git a/types/result.go b/types/result.go index ffd8966a9..1cb96879a 100644 --- a/types/result.go +++ b/types/result.go @@ -106,6 +106,7 @@ func (r *ResponseCheckTx) Result() Result { } } +// IsErr returns true if Code is something other than OK. func (r ResponseCheckTx) IsErr() bool { return r.Code != CodeType_OK } @@ -120,6 +121,7 @@ func (r *ResponseDeliverTx) Result() Result { } } +// IsErr returns true if Code is something other than OK. func (r ResponseDeliverTx) IsErr() bool { return r.Code != CodeType_OK } @@ -145,3 +147,8 @@ func (r *ResponseQuery) Result() *ResultQuery { Log: r.Log, } } + +// IsErr returns true if Code is something other than OK. +func (r ResponseCommit) IsErr() bool { + return r.Code != CodeType_OK +} From e6fdc98aeb40421cde26d7f0a5fda1099f6aa80f Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 21 Nov 2017 17:44:22 -0600 Subject: [PATCH 16/42] update changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cd5046c0..4f944d9f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.8.0 (TBD) + +BREAKING CHANGES: + - [client] more consistent interface + +IMPROVEMENTS: + - [types] added Tags field to ResponseDeliverTx + ## 0.7.1 (November 14, 2017) IMPROVEMENTS: From f6a79dd7c50c49a3e9ae39bde76af6d1ae773985 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 21 Nov 2017 17:50:06 -0600 Subject: [PATCH 17/42] add interface assertions for all clients --- client/grpc_client.go | 2 ++ client/local_client.go | 2 ++ client/socket_client.go | 2 ++ 3 files changed, 6 insertions(+) diff --git a/client/grpc_client.go b/client/grpc_client.go index 524f1f7f9..c7a4c2aed 100644 --- a/client/grpc_client.go +++ b/client/grpc_client.go @@ -13,6 +13,8 @@ import ( cmn "github.com/tendermint/tmlibs/common" ) +var _ Client = (*grpcClient)(nil) + // A stripped copy of the remoteClient that makes // synchronous calls using grpc type grpcClient struct { diff --git a/client/local_client.go b/client/local_client.go index 9081406af..2a294f48a 100644 --- a/client/local_client.go +++ b/client/local_client.go @@ -7,6 +7,8 @@ import ( cmn "github.com/tendermint/tmlibs/common" ) +var _ Client = (*localClient)(nil) + type localClient struct { cmn.BaseService mtx *sync.Mutex diff --git a/client/socket_client.go b/client/socket_client.go index ef0a6ecea..642119792 100644 --- a/client/socket_client.go +++ b/client/socket_client.go @@ -23,6 +23,8 @@ const reqQueueSize = 256 // TODO make configurable // const maxResponseSize = 1048576 // 1MB TODO make configurable const flushThrottleMS = 20 // Don't wait longer than... +var _ Client = (*socketClient)(nil) + // This is goroutine-safe, but users should beware that // the application in general is not meant to be interfaced // with concurrent callers. From 5be9c50b47d93a977c3eec19dd49e7c486d7e008 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 21 Nov 2017 17:53:48 -0600 Subject: [PATCH 18/42] fix megacheck warning --- cmd/abci-cli/abci-cli.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/abci-cli/abci-cli.go b/cmd/abci-cli/abci-cli.go index 9c14aa4d6..cd6f05f4f 100644 --- a/cmd/abci-cli/abci-cli.go +++ b/cmd/abci-cli/abci-cli.go @@ -355,12 +355,12 @@ func cmdInfo(cmd *cobra.Command, args []string) error { // Set an option on the application func cmdSetOption(cmd *cobra.Command, args []string) error { - log, err := client.SetOptionSync(args[0], args[1]) + resLog, err := client.SetOptionSync(args[0], args[1]) if err != nil { return err } printResponse(cmd, args, response{ - Log: log, + Log: resLog, }) return nil } From 52ec4efe275ec96d01d741415996d473c748b19e Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 21 Nov 2017 18:11:23 -0600 Subject: [PATCH 19/42] retire test_integrations in favor of just make test --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index aeb6d7160..57ab4052d 100644 --- a/Makefile +++ b/Makefile @@ -37,15 +37,15 @@ dist: # test.sh requires that we run the installed cmds, must not be out of date test: install - find . -path ./vendor -prune -o -name *.sock -exec rm {} \; + @ find . -path ./vendor -prune -o -name "*.sock" -exec rm {} \; + @ echo "==> Running unit tests" @ go test $(PACKAGES) + @ echo "==> Running integration tests (./tests)" @ bash tests/test.sh fmt: @ go fmt ./... -test_integrations: get_vendor_deps install test - get_deps: @ go get -d $(PACKAGES) From 7868a3358f8b31b090e2a60ce3d27145ca93bc5c Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 21 Nov 2017 18:12:12 -0600 Subject: [PATCH 20/42] gather test coverage --- circle.yml | 10 +++++----- test.sh | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) create mode 100755 test.sh diff --git a/circle.yml b/circle.yml index daa4218e0..459873637 100644 --- a/circle.yml +++ b/circle.yml @@ -12,11 +12,11 @@ checkout: - rm -rf $REPO - mkdir -p $HOME/.go_workspace/src/github.com/$CIRCLE_PROJECT_USERNAME - mv $HOME/$CIRCLE_PROJECT_REPONAME $REPO - # - git submodule sync - # - git submodule update --init # use submodules + - go version test: override: - - "go version" - - "cd $REPO && make get_vendor_deps && make metalinter_test" - - "cd $REPO && make test_integrations" + - cd $REPO && make get_vendor_deps && make metalinter_test && bash ./test.sh + post: + - cd "$REPO" && bash <(curl -s https://codecov.io/bash) -f coverage.txt + - cd "$REPO" && mv coverage.txt "${CIRCLE_ARTIFACTS}" diff --git a/test.sh b/test.sh new file mode 100755 index 000000000..136f60e2a --- /dev/null +++ b/test.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +echo "==> Running unit tests" +for d in $(go list ./... | grep -v vendor); do + go test -race -coverprofile=profile.out -covermode=atomic "$d" + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done + +echo "==> Running integration tests (./tests)" +find . -path ./vendor -prune -o -name "*.sock" -exec rm {} \; +make install +bash tests/test.sh From 5fd83b3eeec162b7f1b34795a5a9ca19a9cca76a Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 22 Nov 2017 16:17:34 -0600 Subject: [PATCH 21/42] implement error interface for ResponseDeliverTx/CheckTx/Commit --- types/errors.go | 23 +++++++++++++++++++++++ types/result.go | 24 ++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/types/errors.go b/types/errors.go index 7fa1f0090..03d14578f 100644 --- a/types/errors.go +++ b/types/errors.go @@ -23,4 +23,27 @@ var ( ErrBaseUnknownAddress = NewError(CodeType_BaseUnknownAddress, "Error (base) unknown address") ErrBaseUnknownPlugin = NewError(CodeType_BaseUnknownPlugin, "Error (base) unknown plugin") ErrBaseUnknownPubKey = NewError(CodeType_BaseUnknownPubKey, "Error (base) unknown pubkey") + + code2string = map[CodeType]string{ + CodeType_InternalError: "Internal error", + CodeType_EncodingError: "Encoding error", + CodeType_BadNonce: "Error bad nonce", + CodeType_Unauthorized: "Unauthorized", + CodeType_InsufficientFunds: "Insufficient funds", + CodeType_UnknownRequest: "Unknown request", + + CodeType_BaseDuplicateAddress: "Error (base) duplicate address", + CodeType_BaseEncodingError: "Error (base) encoding error", + CodeType_BaseInsufficientFees: "Error (base) insufficient fees", + CodeType_BaseInsufficientFunds: "Error (base) insufficient funds", + CodeType_BaseInsufficientGasPrice: "Error (base) insufficient gas price", + CodeType_BaseInvalidInput: "Error (base) invalid input", + CodeType_BaseInvalidOutput: "Error (base) invalid output", + CodeType_BaseInvalidPubKey: "Error (base) invalid pubkey", + CodeType_BaseInvalidSequence: "Error (base) invalid sequence", + CodeType_BaseInvalidSignature: "Error (base) invalid signature", + CodeType_BaseUnknownAddress: "Error (base) unknown address", + CodeType_BaseUnknownPlugin: "Error (base) unknown plugin", + CodeType_BaseUnknownPubKey: "Error (base) unknown pubkey", + } ) diff --git a/types/result.go b/types/result.go index 1cb96879a..8dba24486 100644 --- a/types/result.go +++ b/types/result.go @@ -111,6 +111,11 @@ func (r ResponseCheckTx) IsErr() bool { return r.Code != CodeType_OK } +// Error implements error interface by formatting response as string. +func (r ResponseCheckTx) Error() string { + return fmtError(r.Code, r.Log) +} + // Convert ResponseDeliverTx to standard Result func (r *ResponseDeliverTx) Result() Result { return Result{ @@ -126,6 +131,11 @@ func (r ResponseDeliverTx) IsErr() bool { return r.Code != CodeType_OK } +// Error implements error interface by formatting response as string. +func (r ResponseDeliverTx) Error() string { + return fmtError(r.Code, r.Log) +} + type ResultQuery struct { Code CodeType `json:"code"` Index int64 `json:"index"` @@ -152,3 +162,17 @@ func (r *ResponseQuery) Result() *ResultQuery { func (r ResponseCommit) IsErr() bool { return r.Code != CodeType_OK } + +// Error implements error interface by formatting response as string. +func (r ResponseCommit) Error() string { + return fmtError(r.Code, r.Log) +} + +func fmtError(code CodeType, log string) string { + codeAsStr, ok := code2string[code] + if ok { + return fmt.Sprintf("%s (%v): %s", codeAsStr, code, log) + } else { + return fmt.Sprintf("Unknown error (%v): %s", code, log) + } +} From 01252e8cc84229ad0f47921e1b2a74592de72ffc Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 22 Nov 2017 16:18:06 -0600 Subject: [PATCH 22/42] mark Result as deprecated --- types/result.go | 1 + 1 file changed, 1 insertion(+) diff --git a/types/result.go b/types/result.go index 8dba24486..e37f6f497 100644 --- a/types/result.go +++ b/types/result.go @@ -8,6 +8,7 @@ import ( // Result is a common result object for ABCI calls. // CONTRACT: a zero Result is OK. +// DEPRECATED: prefer raw types instead. type Result struct { Code CodeType `json:"code"` Data data.Bytes `json:"data"` From f01f2bbf3a52c395c22a96c5cff442cd433bcb84 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 22 Nov 2017 17:34:00 -0600 Subject: [PATCH 23/42] DeliverTxSync/CheckTxSync/CommitSync now return error as well --- client/client.go | 6 +++--- client/grpc_client.go | 19 ++++++++++--------- client/local_client.go | 12 ++++++------ client/socket_client.go | 20 ++++++++++---------- cmd/abci-cli/abci-cli.go | 15 ++++++++++++--- example/dummy/dummy_test.go | 6 ++++-- tests/test_app/app.go | 15 ++++++++++++--- types/errors.go | 9 +++++++++ 8 files changed, 66 insertions(+), 36 deletions(-) diff --git a/client/client.go b/client/client.go index b550dc926..5878b6197 100644 --- a/client/client.go +++ b/client/client.go @@ -27,10 +27,10 @@ type Client interface { EchoSync(msg string) (*types.ResponseEcho, error) InfoSync(types.RequestInfo) (*types.ResponseInfo, error) SetOptionSync(key string, value string) (log string, err error) - DeliverTxSync(tx []byte) *types.ResponseDeliverTx - CheckTxSync(tx []byte) *types.ResponseCheckTx + DeliverTxSync(tx []byte) (*types.ResponseDeliverTx, error) + CheckTxSync(tx []byte) (*types.ResponseCheckTx, error) QuerySync(types.RequestQuery) (*types.ResponseQuery, error) - CommitSync() *types.ResponseCommit + CommitSync() (*types.ResponseCommit, error) InitChainAsync(types.RequestInitChain) *ReqRes BeginBlockAsync(types.RequestBeginBlock) *ReqRes diff --git a/client/grpc_client.go b/client/grpc_client.go index c7a4c2aed..6a53cb21a 100644 --- a/client/grpc_client.go +++ b/client/grpc_client.go @@ -6,6 +6,7 @@ import ( "sync" "time" + "github.com/pkg/errors" context "golang.org/x/net/context" grpc "google.golang.org/grpc" @@ -267,20 +268,20 @@ func (cli *grpcClient) SetOptionSync(key string, value string) (log string, err return reqres.Response.GetSetOption().Log, nil } -func (cli *grpcClient) DeliverTxSync(tx []byte) *types.ResponseDeliverTx { +func (cli *grpcClient) DeliverTxSync(tx []byte) (*types.ResponseDeliverTx, error) { reqres := cli.DeliverTxAsync(tx) if err := cli.Error(); err != nil { - return &types.ResponseDeliverTx{Code: types.CodeType_InternalError, Log: err.Error()} + return nil, errors.Wrap(err, types.HumanCode(types.CodeType_InternalError)) } - return reqres.Response.GetDeliverTx() + return reqres.Response.GetDeliverTx(), nil } -func (cli *grpcClient) CheckTxSync(tx []byte) *types.ResponseCheckTx { +func (cli *grpcClient) CheckTxSync(tx []byte) (*types.ResponseCheckTx, error) { reqres := cli.CheckTxAsync(tx) if err := cli.Error(); err != nil { - return &types.ResponseCheckTx{Code: types.CodeType_InternalError, Log: err.Error()} + return nil, errors.Wrap(err, types.HumanCode(types.CodeType_InternalError)) } - return reqres.Response.GetCheckTx() + return reqres.Response.GetCheckTx(), nil } func (cli *grpcClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery, error) { @@ -288,12 +289,12 @@ func (cli *grpcClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery, return reqres.Response.GetQuery(), cli.Error() } -func (cli *grpcClient) CommitSync() *types.ResponseCommit { +func (cli *grpcClient) CommitSync() (*types.ResponseCommit, error) { reqres := cli.CommitAsync() if err := cli.Error(); err != nil { - return &types.ResponseCommit{Code: types.CodeType_InternalError, Log: err.Error()} + return nil, errors.Wrap(err, types.HumanCode(types.CodeType_InternalError)) } - return reqres.Response.GetCommit() + return reqres.Response.GetCommit(), nil } func (cli *grpcClient) InitChainSync(params types.RequestInitChain) error { diff --git a/client/local_client.go b/client/local_client.go index 2a294f48a..15dda8e6a 100644 --- a/client/local_client.go +++ b/client/local_client.go @@ -166,18 +166,18 @@ func (app *localClient) SetOptionSync(key string, value string) (log string, err return log, nil } -func (app *localClient) DeliverTxSync(tx []byte) *types.ResponseDeliverTx { +func (app *localClient) DeliverTxSync(tx []byte) (*types.ResponseDeliverTx, error) { app.mtx.Lock() res := app.Application.DeliverTx(tx) app.mtx.Unlock() - return &res + return &res, nil } -func (app *localClient) CheckTxSync(tx []byte) *types.ResponseCheckTx { +func (app *localClient) CheckTxSync(tx []byte) (*types.ResponseCheckTx, error) { app.mtx.Lock() res := app.Application.CheckTx(tx) app.mtx.Unlock() - return &res + return &res, nil } func (app *localClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery, error) { @@ -187,11 +187,11 @@ func (app *localClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery, return &res, nil } -func (app *localClient) CommitSync() *types.ResponseCommit { +func (app *localClient) CommitSync() (*types.ResponseCommit, error) { app.mtx.Lock() res := app.Application.Commit() app.mtx.Unlock() - return &res + return &res, nil } func (app *localClient) InitChainSync(params types.RequestInitChain) error { diff --git a/client/socket_client.go b/client/socket_client.go index 642119792..7e117d228 100644 --- a/client/socket_client.go +++ b/client/socket_client.go @@ -3,13 +3,13 @@ package abcicli import ( "bufio" "container/list" - "errors" "fmt" "net" "reflect" "sync" "time" + "github.com/pkg/errors" "github.com/tendermint/abci/types" cmn "github.com/tendermint/tmlibs/common" ) @@ -303,22 +303,22 @@ func (cli *socketClient) SetOptionSync(key string, value string) (log string, er return reqres.Response.GetSetOption().Log, nil } -func (cli *socketClient) DeliverTxSync(tx []byte) *types.ResponseDeliverTx { +func (cli *socketClient) DeliverTxSync(tx []byte) (*types.ResponseDeliverTx, error) { reqres := cli.queueRequest(types.ToRequestDeliverTx(tx)) cli.FlushSync() if err := cli.Error(); err != nil { - return &types.ResponseDeliverTx{Code: types.CodeType_InternalError, Log: err.Error()} + return nil, errors.Wrap(err, types.HumanCode(types.CodeType_InternalError)) } - return reqres.Response.GetDeliverTx() + return reqres.Response.GetDeliverTx(), nil } -func (cli *socketClient) CheckTxSync(tx []byte) *types.ResponseCheckTx { +func (cli *socketClient) CheckTxSync(tx []byte) (*types.ResponseCheckTx, error) { reqres := cli.queueRequest(types.ToRequestCheckTx(tx)) cli.FlushSync() if err := cli.Error(); err != nil { - return &types.ResponseCheckTx{Code: types.CodeType_InternalError, Log: err.Error()} + return nil, errors.Wrap(err, types.HumanCode(types.CodeType_InternalError)) } - return reqres.Response.GetCheckTx() + return reqres.Response.GetCheckTx(), nil } func (cli *socketClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery, error) { @@ -327,13 +327,13 @@ func (cli *socketClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery return reqres.Response.GetQuery(), cli.Error() } -func (cli *socketClient) CommitSync() *types.ResponseCommit { +func (cli *socketClient) CommitSync() (*types.ResponseCommit, error) { reqres := cli.queueRequest(types.ToRequestCommit()) cli.FlushSync() if err := cli.Error(); err != nil { - return &types.ResponseCommit{Code: types.CodeType_InternalError, Log: err.Error()} + return nil, errors.Wrap(err, types.HumanCode(types.CodeType_InternalError)) } - return reqres.Response.GetCommit() + return reqres.Response.GetCommit(), nil } func (cli *socketClient) InitChainSync(params types.RequestInitChain) error { diff --git a/cmd/abci-cli/abci-cli.go b/cmd/abci-cli/abci-cli.go index cd6f05f4f..e3f0daec8 100644 --- a/cmd/abci-cli/abci-cli.go +++ b/cmd/abci-cli/abci-cli.go @@ -371,7 +371,10 @@ func cmdDeliverTx(cmd *cobra.Command, args []string) error { if err != nil { return err } - res := client.DeliverTxSync(txBytes) + res, err := client.DeliverTxSync(txBytes) + if err != nil { + return err + } printResponse(cmd, args, response{ Code: res.Code, Data: res.Data, @@ -386,7 +389,10 @@ func cmdCheckTx(cmd *cobra.Command, args []string) error { if err != nil { return err } - res := client.CheckTxSync(txBytes) + res, err := client.CheckTxSync(txBytes) + if err != nil { + return err + } printResponse(cmd, args, response{ Code: res.Code, Data: res.Data, @@ -397,7 +403,10 @@ func cmdCheckTx(cmd *cobra.Command, args []string) error { // Get application Merkle root hash func cmdCommit(cmd *cobra.Command, args []string) error { - res := client.CommitSync() + res, err := client.CommitSync() + if err != nil { + return err + } printResponse(cmd, args, response{ Code: res.Code, Data: res.Data, diff --git a/example/dummy/dummy_test.go b/example/dummy/dummy_test.go index efbc5af77..798da7200 100644 --- a/example/dummy/dummy_test.go +++ b/example/dummy/dummy_test.go @@ -281,10 +281,12 @@ func runClientTests(t *testing.T, client abcicli.Client) { } func testClient(t *testing.T, app abcicli.Client, tx []byte, key, value string) { - ar := app.DeliverTxSync(tx) + ar, err := app.DeliverTxSync(tx) + require.NoError(t, err) require.False(t, ar.IsErr(), ar) // repeating tx doesn't raise error - ar = app.DeliverTxSync(tx) + ar, err = app.DeliverTxSync(tx) + require.NoError(t, err) require.False(t, ar.IsErr(), ar) // make sure query is fine diff --git a/tests/test_app/app.go b/tests/test_app/app.go index 67742b383..c3e9d14fc 100644 --- a/tests/test_app/app.go +++ b/tests/test_app/app.go @@ -55,7 +55,10 @@ func setOption(client abcicli.Client, key, value string) { } func commit(client abcicli.Client, hashExp []byte) { - res := client.CommitSync() + res, err := client.CommitSync() + if err != nil { + panicf("client error: %v", err) + } if res.IsErr() { panicf("committing err %v\n", res) } @@ -65,7 +68,10 @@ func commit(client abcicli.Client, hashExp []byte) { } func deliverTx(client abcicli.Client, txBytes []byte, codeExp types.CodeType, dataExp []byte) { - res := client.DeliverTxSync(txBytes) + res, err := client.DeliverTxSync(txBytes) + if err != nil { + panicf("client error: %v", err) + } if res.Code != codeExp { panicf("DeliverTx response code was unexpected. Got %v expected %v. Log: %v", res.Code, codeExp, res.Log) } @@ -75,7 +81,10 @@ func deliverTx(client abcicli.Client, txBytes []byte, codeExp types.CodeType, da } /*func checkTx(client abcicli.Client, txBytes []byte, codeExp types.CodeType, dataExp []byte) { - res := client.CheckTxSync(txBytes) + res, err := client.CheckTxSync(txBytes) + if err != nil { + panicf("client error: %v", err) + } if res.IsErr() { panicf("checking tx %X: %v\nlog: %v", txBytes, res.Log) } diff --git a/types/errors.go b/types/errors.go index 03d14578f..f63d2470f 100644 --- a/types/errors.go +++ b/types/errors.go @@ -47,3 +47,12 @@ var ( CodeType_BaseUnknownPubKey: "Error (base) unknown pubkey", } ) + +// HumanCode transforms code into a more humane format, such as "Internal error" instead of 0. +func HumanCode(code CodeType) string { + s, ok := code2string[code] + if !ok { + return "Unknown code" + } + return s +} From 91efacfabc086f14a9d4fe4f2d661a0e647915c2 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 22 Nov 2017 17:44:39 -0600 Subject: [PATCH 24/42] remove types.Result --- types/code.go | 34 +++++++++++ types/errors.go | 58 ------------------ types/result.go | 158 ++++++++---------------------------------------- 3 files changed, 59 insertions(+), 191 deletions(-) delete mode 100644 types/errors.go diff --git a/types/code.go b/types/code.go index c99a0bbe1..613c4cda3 100644 --- a/types/code.go +++ b/types/code.go @@ -1,3 +1,37 @@ package types +var ( + code2string = map[CodeType]string{ + CodeType_InternalError: "Internal error", + CodeType_EncodingError: "Encoding error", + CodeType_BadNonce: "Error bad nonce", + CodeType_Unauthorized: "Unauthorized", + CodeType_InsufficientFunds: "Insufficient funds", + CodeType_UnknownRequest: "Unknown request", + + CodeType_BaseDuplicateAddress: "Error (base) duplicate address", + CodeType_BaseEncodingError: "Error (base) encoding error", + CodeType_BaseInsufficientFees: "Error (base) insufficient fees", + CodeType_BaseInsufficientFunds: "Error (base) insufficient funds", + CodeType_BaseInsufficientGasPrice: "Error (base) insufficient gas price", + CodeType_BaseInvalidInput: "Error (base) invalid input", + CodeType_BaseInvalidOutput: "Error (base) invalid output", + CodeType_BaseInvalidPubKey: "Error (base) invalid pubkey", + CodeType_BaseInvalidSequence: "Error (base) invalid sequence", + CodeType_BaseInvalidSignature: "Error (base) invalid signature", + CodeType_BaseUnknownAddress: "Error (base) unknown address", + CodeType_BaseUnknownPlugin: "Error (base) unknown plugin", + CodeType_BaseUnknownPubKey: "Error (base) unknown pubkey", + } +) + func (c CodeType) IsOK() bool { return c == CodeType_OK } + +// HumanCode transforms code into a more humane format, such as "Internal error" instead of 0. +func HumanCode(code CodeType) string { + s, ok := code2string[code] + if !ok { + return "Unknown code" + } + return s +} diff --git a/types/errors.go b/types/errors.go deleted file mode 100644 index f63d2470f..000000000 --- a/types/errors.go +++ /dev/null @@ -1,58 +0,0 @@ -package types - -var ( - OK = NewResultOK(nil, "") - - ErrInternalError = NewError(CodeType_InternalError, "Internal error") - ErrEncodingError = NewError(CodeType_EncodingError, "Encoding error") - ErrBadNonce = NewError(CodeType_BadNonce, "Error bad nonce") - ErrUnauthorized = NewError(CodeType_Unauthorized, "Unauthorized") - ErrInsufficientFunds = NewError(CodeType_InsufficientFunds, "Insufficient funds") - ErrUnknownRequest = NewError(CodeType_UnknownRequest, "Unknown request") - - ErrBaseDuplicateAddress = NewError(CodeType_BaseDuplicateAddress, "Error (base) duplicate address") - ErrBaseEncodingError = NewError(CodeType_BaseEncodingError, "Error (base) encoding error") - ErrBaseInsufficientFees = NewError(CodeType_BaseInsufficientFees, "Error (base) insufficient fees") - ErrBaseInsufficientFunds = NewError(CodeType_BaseInsufficientFunds, "Error (base) insufficient funds") - ErrBaseInsufficientGasPrice = NewError(CodeType_BaseInsufficientGasPrice, "Error (base) insufficient gas price") - ErrBaseInvalidInput = NewError(CodeType_BaseInvalidInput, "Error (base) invalid input") - ErrBaseInvalidOutput = NewError(CodeType_BaseInvalidOutput, "Error (base) invalid output") - ErrBaseInvalidPubKey = NewError(CodeType_BaseInvalidPubKey, "Error (base) invalid pubkey") - ErrBaseInvalidSequence = NewError(CodeType_BaseInvalidSequence, "Error (base) invalid sequence") - ErrBaseInvalidSignature = NewError(CodeType_BaseInvalidSignature, "Error (base) invalid signature") - ErrBaseUnknownAddress = NewError(CodeType_BaseUnknownAddress, "Error (base) unknown address") - ErrBaseUnknownPlugin = NewError(CodeType_BaseUnknownPlugin, "Error (base) unknown plugin") - ErrBaseUnknownPubKey = NewError(CodeType_BaseUnknownPubKey, "Error (base) unknown pubkey") - - code2string = map[CodeType]string{ - CodeType_InternalError: "Internal error", - CodeType_EncodingError: "Encoding error", - CodeType_BadNonce: "Error bad nonce", - CodeType_Unauthorized: "Unauthorized", - CodeType_InsufficientFunds: "Insufficient funds", - CodeType_UnknownRequest: "Unknown request", - - CodeType_BaseDuplicateAddress: "Error (base) duplicate address", - CodeType_BaseEncodingError: "Error (base) encoding error", - CodeType_BaseInsufficientFees: "Error (base) insufficient fees", - CodeType_BaseInsufficientFunds: "Error (base) insufficient funds", - CodeType_BaseInsufficientGasPrice: "Error (base) insufficient gas price", - CodeType_BaseInvalidInput: "Error (base) invalid input", - CodeType_BaseInvalidOutput: "Error (base) invalid output", - CodeType_BaseInvalidPubKey: "Error (base) invalid pubkey", - CodeType_BaseInvalidSequence: "Error (base) invalid sequence", - CodeType_BaseInvalidSignature: "Error (base) invalid signature", - CodeType_BaseUnknownAddress: "Error (base) unknown address", - CodeType_BaseUnknownPlugin: "Error (base) unknown plugin", - CodeType_BaseUnknownPubKey: "Error (base) unknown pubkey", - } -) - -// HumanCode transforms code into a more humane format, such as "Internal error" instead of 0. -func HumanCode(code CodeType) string { - s, ok := code2string[code] - if !ok { - return "Unknown code" - } - return s -} diff --git a/types/result.go b/types/result.go index e37f6f497..78cea710c 100644 --- a/types/result.go +++ b/types/result.go @@ -6,107 +6,6 @@ import ( "github.com/tendermint/go-wire/data" ) -// Result is a common result object for ABCI calls. -// CONTRACT: a zero Result is OK. -// DEPRECATED: prefer raw types instead. -type Result struct { - Code CodeType `json:"code"` - Data data.Bytes `json:"data"` - Log string `json:"log"` // Can be non-deterministic - Tags []*KVPair `json:"tags"` -} - -func NewResult(code CodeType, data []byte, log string) Result { - return Result{ - Code: code, - Data: data, - Log: log, - } -} - -func (res Result) IsOK() bool { - return res.Code == CodeType_OK -} - -func (res Result) IsErr() bool { - return res.Code != CodeType_OK -} - -func (res Result) IsSameCode(compare Result) bool { - return res.Code == compare.Code -} - -func (res Result) Error() string { - return fmt.Sprintf("ABCI{code:%v, data:%X, log:%v}", res.Code, res.Data, res.Log) -} - -func (res Result) String() string { - return fmt.Sprintf("ABCI{code:%v, data:%X, log:%v}", res.Code, res.Data, res.Log) -} - -func (res Result) PrependLog(log string) Result { - return Result{ - Code: res.Code, - Data: res.Data, - Log: log + ";" + res.Log, - } -} - -func (res Result) AppendLog(log string) Result { - return Result{ - Code: res.Code, - Data: res.Data, - Log: res.Log + ";" + log, - } -} - -func (res Result) SetLog(log string) Result { - return Result{ - Code: res.Code, - Data: res.Data, - Log: log, - } -} - -func (res Result) SetData(data []byte) Result { - return Result{ - Code: res.Code, - Data: data, - Log: res.Log, - } -} - -//---------------------------------------- - -// NOTE: if data == nil and log == "", same as zero Result. -func NewResultOK(data []byte, log string) Result { - return Result{ - Code: CodeType_OK, - Data: data, - Log: log, - } -} - -func NewError(code CodeType, log string) Result { - return Result{ - Code: code, - Log: log, - } -} - -//---------------------------------------- -// Convenience methods for turning the -// pb type into one using data.Bytes - -// Convert ResponseCheckTx to standard Result -func (r *ResponseCheckTx) Result() Result { - return Result{ - Code: r.Code, - Data: r.Data, - Log: r.Log, - } -} - // IsErr returns true if Code is something other than OK. func (r ResponseCheckTx) IsErr() bool { return r.Code != CodeType_OK @@ -117,16 +16,6 @@ func (r ResponseCheckTx) Error() string { return fmtError(r.Code, r.Log) } -// Convert ResponseDeliverTx to standard Result -func (r *ResponseDeliverTx) Result() Result { - return Result{ - Code: r.Code, - Data: r.Data, - Log: r.Log, - Tags: r.Tags, - } -} - // IsErr returns true if Code is something other than OK. func (r ResponseDeliverTx) IsErr() bool { return r.Code != CodeType_OK @@ -137,28 +26,6 @@ func (r ResponseDeliverTx) Error() string { return fmtError(r.Code, r.Log) } -type ResultQuery struct { - Code CodeType `json:"code"` - Index int64 `json:"index"` - Key data.Bytes `json:"key"` - Value data.Bytes `json:"value"` - Proof data.Bytes `json:"proof"` - Height uint64 `json:"height"` - Log string `json:"log"` -} - -func (r *ResponseQuery) Result() *ResultQuery { - return &ResultQuery{ - Code: r.Code, - Index: r.Index, - Key: r.Key, - Value: r.Value, - Proof: r.Proof, - Height: r.Height, - Log: r.Log, - } -} - // IsErr returns true if Code is something other than OK. func (r ResponseCommit) IsErr() bool { return r.Code != CodeType_OK @@ -177,3 +44,28 @@ func fmtError(code CodeType, log string) string { return fmt.Sprintf("Unknown error (%v): %s", code, log) } } + +// ResultQuery is a wrapper around ResponseQuery using data.Bytes instead of +// raw byte slices. +type ResultQuery struct { + Code CodeType `json:"code"` + Index int64 `json:"index"` + Key data.Bytes `json:"key"` + Value data.Bytes `json:"value"` + Proof data.Bytes `json:"proof"` + Height uint64 `json:"height"` + Log string `json:"log"` +} + +// Result converts response query to ResultQuery. +func (r *ResponseQuery) Result() *ResultQuery { + return &ResultQuery{ + Code: r.Code, + Index: r.Index, + Key: r.Key, + Value: r.Value, + Proof: r.Proof, + Height: r.Height, + Log: r.Log, + } +} From afb7feeea20b2255be7f808caa227e67dfb1fe8e Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 22 Nov 2017 17:51:36 -0600 Subject: [PATCH 25/42] update CHANGELOG --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f944d9f5..9db1817c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,9 @@ ## 0.8.0 (TBD) BREAKING CHANGES: - - [client] more consistent interface + - [client] all {X}Sync methods now return an error + - [types] removed Result + - [client] all {X}Sync methods now return Response{X} as first return value IMPROVEMENTS: - [types] added Tags field to ResponseDeliverTx From 1726e828655000f09804046e8a2e1cab5799c8a9 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 22 Nov 2017 18:19:41 -0600 Subject: [PATCH 26/42] add IsErr and Error method for ResultQuery --- types/result.go | 14 ++++++-- types/result_test.go | 76 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 types/result_test.go diff --git a/types/result.go b/types/result.go index 78cea710c..6ebad8ab2 100644 --- a/types/result.go +++ b/types/result.go @@ -39,9 +39,9 @@ func (r ResponseCommit) Error() string { func fmtError(code CodeType, log string) string { codeAsStr, ok := code2string[code] if ok { - return fmt.Sprintf("%s (%v): %s", codeAsStr, code, log) + return fmt.Sprintf("%s (%d): %s", codeAsStr, code, log) } else { - return fmt.Sprintf("Unknown error (%v): %s", code, log) + return fmt.Sprintf("Unknown error (%d): %s", code, log) } } @@ -69,3 +69,13 @@ func (r *ResponseQuery) Result() *ResultQuery { Log: r.Log, } } + +// IsErr returns true if Code is something other than OK. +func (r *ResultQuery) IsErr() bool { + return r.Code != CodeType_OK +} + +// Error implements error interface by formatting result as string. +func (r *ResultQuery) Error() string { + return fmtError(r.Code, r.Log) +} diff --git a/types/result_test.go b/types/result_test.go new file mode 100644 index 000000000..14f334c49 --- /dev/null +++ b/types/result_test.go @@ -0,0 +1,76 @@ +package types + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestResultQuery(t *testing.T) { + orig := &ResponseQuery{ + Code: CodeType_OK, + Index: 0, + Key: []byte("hello"), + Value: []byte("world"), + Height: 1, + } + res := orig.Result() + assert.False(t, res.IsErr()) + + orig = &ResponseQuery{ + Code: CodeType_BadNonce, + Index: 0, + Key: []byte("hello"), + Value: []byte("world"), + Height: 1, + Log: "bad", + } + res = orig.Result() + assert.True(t, res.IsErr()) + assert.Equal(t, "Error bad nonce (3): bad", res.Error()) +} + +func TestResponseDeliverTx(t *testing.T) { + res := ResponseDeliverTx{ + Code: CodeType_OK, + Data: []byte("Victor Mancha"), + } + assert.False(t, res.IsErr()) + + res = ResponseDeliverTx{ + Code: CodeType_InternalError, + Log: "bad", + } + assert.True(t, res.IsErr()) + assert.Equal(t, "Internal error (1): bad", res.Error()) +} + +func TestResponseCheckTx(t *testing.T) { + res := ResponseCheckTx{ + Code: CodeType_OK, + Data: []byte("Talos"), + } + assert.False(t, res.IsErr()) + + res = ResponseCheckTx{ + Code: CodeType_InternalError, + Log: "bad", + } + assert.True(t, res.IsErr()) + assert.Equal(t, "Internal error (1): bad", res.Error()) +} + +func TestResponseCommit(t *testing.T) { + res := ResponseCommit{ + Code: CodeType_OK, + Data: []byte("Old Lace"), + } + assert.False(t, res.IsErr()) + + res = ResponseCommit{ + Code: CodeType_Unauthorized, + Log: "bad", + } + assert.True(t, res.IsErr()) + assert.Equal(t, "Unauthorized (4): bad", res.Error()) +} From 2cfad8523a54d64271d7cbc69a39433eab918aa0 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 22 Nov 2017 18:24:53 -0600 Subject: [PATCH 27/42] test HumanCode --- types/code_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 types/code_test.go diff --git a/types/code_test.go b/types/code_test.go new file mode 100644 index 000000000..d9032d3c5 --- /dev/null +++ b/types/code_test.go @@ -0,0 +1,12 @@ +package types + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestHumanCode(t *testing.T) { + assert.Equal(t, "Internal error", HumanCode(CodeType_InternalError)) + assert.Equal(t, "Unknown code", HumanCode(-1)) +} From cbf347e2aabbb06e84eba7f0debcc92dedce4aa0 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 22 Nov 2017 19:07:36 -0600 Subject: [PATCH 28/42] add comment for Client interface [ci skip] --- client/client.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/client.go b/client/client.go index 5878b6197..092c479ab 100644 --- a/client/client.go +++ b/client/client.go @@ -8,6 +8,10 @@ import ( cmn "github.com/tendermint/tmlibs/common" ) +// Client defines an interface for an ABCI client. Client-related errors (e.g. +// network errors) are returned as a second return value for most calls +// (sometimes there is no response). Application-related errors are reflected +// in response via ABCI error codes and logs. type Client interface { cmn.Service From 0176a834d197a3718808cd04e6407fee1631298a Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 22 Nov 2017 19:37:51 -0600 Subject: [PATCH 29/42] refactor code --- client/grpc_client.go | 17 ++++------------- client/socket_client.go | 17 ++++------------- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/client/grpc_client.go b/client/grpc_client.go index 6a53cb21a..f7889d69a 100644 --- a/client/grpc_client.go +++ b/client/grpc_client.go @@ -104,7 +104,7 @@ func (cli *grpcClient) StopForError(err error) { func (cli *grpcClient) Error() error { cli.mtx.Lock() defer cli.mtx.Unlock() - return cli.err + return errors.Wrap(cli.err, types.HumanCode(types.CodeType_InternalError)) } // Set listener for all responses @@ -270,18 +270,12 @@ func (cli *grpcClient) SetOptionSync(key string, value string) (log string, err func (cli *grpcClient) DeliverTxSync(tx []byte) (*types.ResponseDeliverTx, error) { reqres := cli.DeliverTxAsync(tx) - if err := cli.Error(); err != nil { - return nil, errors.Wrap(err, types.HumanCode(types.CodeType_InternalError)) - } - return reqres.Response.GetDeliverTx(), nil + return reqres.Response.GetDeliverTx(), cli.Error() } func (cli *grpcClient) CheckTxSync(tx []byte) (*types.ResponseCheckTx, error) { reqres := cli.CheckTxAsync(tx) - if err := cli.Error(); err != nil { - return nil, errors.Wrap(err, types.HumanCode(types.CodeType_InternalError)) - } - return reqres.Response.GetCheckTx(), nil + return reqres.Response.GetCheckTx(), cli.Error() } func (cli *grpcClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery, error) { @@ -291,10 +285,7 @@ func (cli *grpcClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery, func (cli *grpcClient) CommitSync() (*types.ResponseCommit, error) { reqres := cli.CommitAsync() - if err := cli.Error(); err != nil { - return nil, errors.Wrap(err, types.HumanCode(types.CodeType_InternalError)) - } - return reqres.Response.GetCommit(), nil + return reqres.Response.GetCommit(), cli.Error() } func (cli *grpcClient) InitChainSync(params types.RequestInitChain) error { diff --git a/client/socket_client.go b/client/socket_client.go index 7e117d228..716ef4510 100644 --- a/client/socket_client.go +++ b/client/socket_client.go @@ -116,7 +116,7 @@ func (cli *socketClient) StopForError(err error) { func (cli *socketClient) Error() error { cli.mtx.Lock() defer cli.mtx.Unlock() - return cli.err + return errors.Wrap(cli.err, types.HumanCode(types.CodeType_InternalError)) } // Set listener for all responses @@ -306,19 +306,13 @@ func (cli *socketClient) SetOptionSync(key string, value string) (log string, er func (cli *socketClient) DeliverTxSync(tx []byte) (*types.ResponseDeliverTx, error) { reqres := cli.queueRequest(types.ToRequestDeliverTx(tx)) cli.FlushSync() - if err := cli.Error(); err != nil { - return nil, errors.Wrap(err, types.HumanCode(types.CodeType_InternalError)) - } - return reqres.Response.GetDeliverTx(), nil + return reqres.Response.GetDeliverTx(), cli.Error() } func (cli *socketClient) CheckTxSync(tx []byte) (*types.ResponseCheckTx, error) { reqres := cli.queueRequest(types.ToRequestCheckTx(tx)) cli.FlushSync() - if err := cli.Error(); err != nil { - return nil, errors.Wrap(err, types.HumanCode(types.CodeType_InternalError)) - } - return reqres.Response.GetCheckTx(), nil + return reqres.Response.GetCheckTx(), cli.Error() } func (cli *socketClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery, error) { @@ -330,10 +324,7 @@ func (cli *socketClient) QuerySync(req types.RequestQuery) (*types.ResponseQuery func (cli *socketClient) CommitSync() (*types.ResponseCommit, error) { reqres := cli.queueRequest(types.ToRequestCommit()) cli.FlushSync() - if err := cli.Error(); err != nil { - return nil, errors.Wrap(err, types.HumanCode(types.CodeType_InternalError)) - } - return reqres.Response.GetCommit(), nil + return reqres.Response.GetCommit(), cli.Error() } func (cli *socketClient) InitChainSync(params types.RequestInitChain) error { From 03fafeec2fc8fd95e30f4a9af31472b4a5e5718b Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 22 Nov 2017 19:38:04 -0600 Subject: [PATCH 30/42] fix formatting of panicf function --- 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 c3e9d14fc..c869fe83a 100644 --- a/tests/test_app/app.go +++ b/tests/test_app/app.go @@ -99,5 +99,5 @@ func deliverTx(client abcicli.Client, txBytes []byte, codeExp types.CodeType, da }*/ func panicf(format string, a ...interface{}) { - panic(fmt.Sprintf(format, a)) + panic(fmt.Sprintf(format, a...)) } From 9b30fab4fc5ab59f34fc8ad72b7288178246bd27 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 22 Nov 2017 19:38:28 -0600 Subject: [PATCH 31/42] preserve behaviour of BaseApplication --- types/base_app.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/types/base_app.go b/types/base_app.go index 75fdae8d7..5432a5310 100644 --- a/types/base_app.go +++ b/types/base_app.go @@ -16,11 +16,11 @@ func (BaseApplication) SetOption(key string, value string) (log string) { } func (BaseApplication) DeliverTx(tx []byte) ResponseDeliverTx { - return ResponseDeliverTx{} + return ResponseDeliverTx{Code: CodeType_OK} } func (BaseApplication) CheckTx(tx []byte) ResponseCheckTx { - return ResponseCheckTx{} + return ResponseCheckTx{Code: CodeType_OK} } func (BaseApplication) Commit() ResponseCommit { From 67d2a5f66d958f881ca6957eb4b3a9268dc00b41 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 24 Nov 2017 16:45:36 -0600 Subject: [PATCH 32/42] set Code to OK in ResponseQuery in BaseApplication See https://github.com/tendermint/abci/pull/130#discussion_r152713220 --- types/base_app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/base_app.go b/types/base_app.go index 5432a5310..0086685b8 100644 --- a/types/base_app.go +++ b/types/base_app.go @@ -28,7 +28,7 @@ func (BaseApplication) Commit() ResponseCommit { } func (BaseApplication) Query(req RequestQuery) ResponseQuery { - return ResponseQuery{} + return ResponseQuery{Code: CodeType_OK} } func (BaseApplication) InitChain(req RequestInitChain) { From c7f54fb56cbc2f896e24f2f25d54aeccbb1e2dcd Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 27 Nov 2017 19:04:21 +0000 Subject: [PATCH 33/42] everything takes Request, returns Response; expect DeliverTx/CheckTx/Commit --- client/client.go | 27 +++++----- client/grpc_client.go | 33 ++++++------ client/local_client.go | 72 ++++++++++++------------- client/socket_client.go | 41 +++++++------- cmd/abci-cli/abci-cli.go | 5 +- example/block_aware/block_aware_app.go | 65 ---------------------- example/block_aware/block_aware_test.go | 57 -------------------- example/counter/counter.go | 5 +- example/dummy/dummy.go | 2 + example/dummy/dummy_test.go | 4 +- example/dummy/persistent_dummy.go | 26 +++++---- server/socket_server.go | 31 ++++++----- types/application.go | 33 ++++++------ types/base_app.go | 12 +++-- types/messages.go | 52 +++++++++--------- 15 files changed, 174 insertions(+), 291 deletions(-) delete mode 100644 example/block_aware/block_aware_app.go delete mode 100644 example/block_aware/block_aware_test.go diff --git a/client/client.go b/client/client.go index 092c479ab..ddb589a40 100644 --- a/client/client.go +++ b/client/client.go @@ -8,10 +8,11 @@ import ( cmn "github.com/tendermint/tmlibs/common" ) -// Client defines an interface for an ABCI client. Client-related errors (e.g. -// network errors) are returned as a second return value for most calls -// (sometimes there is no response). Application-related errors are reflected -// in response via ABCI error codes and logs. +// Client defines an interface for an ABCI client. +// All `Async` methods return a `ReqRes` object. +// All `Sync` methods return the appropriate protobuf ResponseXxx struct and an error. +// Note these are client errors, eg. ABCI socket connectivity issues. +// Application-related errors are reflected in response via ABCI error codes and logs. type Client interface { cmn.Service @@ -21,28 +22,26 @@ type Client interface { FlushAsync() *ReqRes EchoAsync(msg string) *ReqRes InfoAsync(types.RequestInfo) *ReqRes - SetOptionAsync(key string, value string) *ReqRes + SetOptionAsync(types.RequestSetOption) *ReqRes DeliverTxAsync(tx []byte) *ReqRes CheckTxAsync(tx []byte) *ReqRes QueryAsync(types.RequestQuery) *ReqRes CommitAsync() *ReqRes + InitChainAsync(types.RequestInitChain) *ReqRes + BeginBlockAsync(types.RequestBeginBlock) *ReqRes + EndBlockAsync(types.RequestEndBlock) *ReqRes FlushSync() error EchoSync(msg string) (*types.ResponseEcho, error) InfoSync(types.RequestInfo) (*types.ResponseInfo, error) - SetOptionSync(key string, value string) (log string, err error) + SetOptionSync(types.RequestSetOption) (*types.ResponseSetOption, error) DeliverTxSync(tx []byte) (*types.ResponseDeliverTx, error) CheckTxSync(tx []byte) (*types.ResponseCheckTx, error) QuerySync(types.RequestQuery) (*types.ResponseQuery, error) CommitSync() (*types.ResponseCommit, error) - - InitChainAsync(types.RequestInitChain) *ReqRes - BeginBlockAsync(types.RequestBeginBlock) *ReqRes - EndBlockAsync(height uint64) *ReqRes - - InitChainSync(types.RequestInitChain) error - BeginBlockSync(types.RequestBeginBlock) error - EndBlockSync(height uint64) (*types.ResponseEndBlock, error) + InitChainSync(types.RequestInitChain) (*types.ResponseInitChain, error) + BeginBlockSync(types.RequestBeginBlock) (*types.ResponseBeginBlock, error) + EndBlockSync(types.RequestEndBlock) (*types.ResponseEndBlock, error) } //---------------------------------------- diff --git a/client/grpc_client.go b/client/grpc_client.go index f7889d69a..6079c90ce 100644 --- a/client/grpc_client.go +++ b/client/grpc_client.go @@ -150,8 +150,8 @@ func (cli *grpcClient) InfoAsync(params types.RequestInfo) *ReqRes { return cli.finishAsyncCall(req, &types.Response{&types.Response_Info{res}}) } -func (cli *grpcClient) SetOptionAsync(key string, value string) *ReqRes { - req := types.ToRequestSetOption(key, value) +func (cli *grpcClient) SetOptionAsync(params types.RequestSetOption) *ReqRes { + req := types.ToRequestSetOption(params) res, err := cli.client.SetOption(context.Background(), req.GetSetOption(), grpc.FailFast(true)) if err != nil { cli.StopForError(err) @@ -213,8 +213,8 @@ func (cli *grpcClient) BeginBlockAsync(params types.RequestBeginBlock) *ReqRes { return cli.finishAsyncCall(req, &types.Response{&types.Response_BeginBlock{res}}) } -func (cli *grpcClient) EndBlockAsync(height uint64) *ReqRes { - req := types.ToRequestEndBlock(height) +func (cli *grpcClient) EndBlockAsync(params types.RequestEndBlock) *ReqRes { + req := types.ToRequestEndBlock(params) res, err := cli.client.EndBlock(context.Background(), req.GetEndBlock(), grpc.FailFast(true)) if err != nil { cli.StopForError(err) @@ -260,12 +260,9 @@ func (cli *grpcClient) InfoSync(req types.RequestInfo) (*types.ResponseInfo, err return reqres.Response.GetInfo(), cli.Error() } -func (cli *grpcClient) SetOptionSync(key string, value string) (log string, err error) { - reqres := cli.SetOptionAsync(key, value) - if err := cli.Error(); err != nil { - return "", err - } - return reqres.Response.GetSetOption().Log, nil +func (cli *grpcClient) SetOptionSync(req types.RequestSetOption) (*types.ResponseSetOption, error) { + reqres := cli.SetOptionAsync(req) + return reqres.Response.GetSetOption(), cli.Error() } func (cli *grpcClient) DeliverTxSync(tx []byte) (*types.ResponseDeliverTx, error) { @@ -288,17 +285,17 @@ func (cli *grpcClient) CommitSync() (*types.ResponseCommit, error) { return reqres.Response.GetCommit(), cli.Error() } -func (cli *grpcClient) InitChainSync(params types.RequestInitChain) error { - cli.InitChainAsync(params) - return cli.Error() +func (cli *grpcClient) InitChainSync(params types.RequestInitChain) (*types.ResponseInitChain, error) { + reqres := cli.InitChainAsync(params) + return reqres.Response.GetInitChain(), cli.Error() } -func (cli *grpcClient) BeginBlockSync(params types.RequestBeginBlock) error { - cli.BeginBlockAsync(params) - return cli.Error() +func (cli *grpcClient) BeginBlockSync(params types.RequestBeginBlock) (*types.ResponseBeginBlock, error) { + reqres := cli.BeginBlockAsync(params) + return reqres.Response.GetBeginBlock(), cli.Error() } -func (cli *grpcClient) EndBlockSync(height uint64) (*types.ResponseEndBlock, error) { - reqres := cli.EndBlockAsync(height) +func (cli *grpcClient) EndBlockSync(params types.RequestEndBlock) (*types.ResponseEndBlock, error) { + reqres := cli.EndBlockAsync(params) return reqres.Response.GetEndBlock(), cli.Error() } diff --git a/client/local_client.go b/client/local_client.go index 15dda8e6a..64bf5fe08 100644 --- a/client/local_client.go +++ b/client/local_client.go @@ -53,21 +53,21 @@ func (app *localClient) EchoAsync(msg string) *ReqRes { func (app *localClient) InfoAsync(req types.RequestInfo) *ReqRes { app.mtx.Lock() - resInfo := app.Application.Info(req) + res := app.Application.Info(req) app.mtx.Unlock() return app.callback( types.ToRequestInfo(req), - types.ToResponseInfo(resInfo), + types.ToResponseInfo(res), ) } -func (app *localClient) SetOptionAsync(key string, value string) *ReqRes { +func (app *localClient) SetOptionAsync(req types.RequestSetOption) *ReqRes { app.mtx.Lock() - log := app.Application.SetOption(key, value) + res := app.Application.SetOption(req) app.mtx.Unlock() return app.callback( - types.ToRequestSetOption(key, value), - types.ToResponseSetOption(log), + types.ToRequestSetOption(req), + types.ToResponseSetOption(res), ) } @@ -77,7 +77,7 @@ func (app *localClient) DeliverTxAsync(tx []byte) *ReqRes { app.mtx.Unlock() return app.callback( types.ToRequestDeliverTx(tx), - types.ToResponseDeliverTx(res.Code, res.Data, res.Log, res.Tags), + types.ToResponseDeliverTx(res), ) } @@ -87,17 +87,17 @@ func (app *localClient) CheckTxAsync(tx []byte) *ReqRes { app.mtx.Unlock() return app.callback( types.ToRequestCheckTx(tx), - types.ToResponseCheckTx(res.Code, res.Data, res.Log), + types.ToResponseCheckTx(res), ) } -func (app *localClient) QueryAsync(reqQuery types.RequestQuery) *ReqRes { +func (app *localClient) QueryAsync(req types.RequestQuery) *ReqRes { app.mtx.Lock() - resQuery := app.Application.Query(reqQuery) + res := app.Application.Query(req) app.mtx.Unlock() return app.callback( - types.ToRequestQuery(reqQuery), - types.ToResponseQuery(resQuery), + types.ToRequestQuery(req), + types.ToResponseQuery(res), ) } @@ -107,38 +107,38 @@ func (app *localClient) CommitAsync() *ReqRes { app.mtx.Unlock() return app.callback( types.ToRequestCommit(), - types.ToResponseCommit(res.Code, res.Data, res.Log), + types.ToResponseCommit(res), ) } -func (app *localClient) InitChainAsync(params types.RequestInitChain) *ReqRes { +func (app *localClient) InitChainAsync(req types.RequestInitChain) *ReqRes { app.mtx.Lock() - app.Application.InitChain(params) + res := app.Application.InitChain(req) reqRes := app.callback( - types.ToRequestInitChain(params), - types.ToResponseInitChain(), + types.ToRequestInitChain(req), + types.ToResponseInitChain(res), ) app.mtx.Unlock() return reqRes } -func (app *localClient) BeginBlockAsync(params types.RequestBeginBlock) *ReqRes { +func (app *localClient) BeginBlockAsync(req types.RequestBeginBlock) *ReqRes { app.mtx.Lock() - app.Application.BeginBlock(params) + res := app.Application.BeginBlock(req) app.mtx.Unlock() return app.callback( - types.ToRequestBeginBlock(params), - types.ToResponseBeginBlock(), + types.ToRequestBeginBlock(req), + types.ToResponseBeginBlock(res), ) } -func (app *localClient) EndBlockAsync(height uint64) *ReqRes { +func (app *localClient) EndBlockAsync(req types.RequestEndBlock) *ReqRes { app.mtx.Lock() - resEndBlock := app.Application.EndBlock(height) + res := app.Application.EndBlock(req) app.mtx.Unlock() return app.callback( - types.ToRequestEndBlock(height), - types.ToResponseEndBlock(resEndBlock), + types.ToRequestEndBlock(req), + types.ToResponseEndBlock(res), ) } @@ -159,11 +159,11 @@ func (app *localClient) InfoSync(req types.RequestInfo) (*types.ResponseInfo, er return &res, nil } -func (app *localClient) SetOptionSync(key string, value string) (log string, err error) { +func (app *localClient) SetOptionSync(req types.RequestSetOption) (*types.ResponseSetOption, error) { app.mtx.Lock() - log = app.Application.SetOption(key, value) + res := app.Application.SetOption(req) app.mtx.Unlock() - return log, nil + return &res, nil } func (app *localClient) DeliverTxSync(tx []byte) (*types.ResponseDeliverTx, error) { @@ -194,23 +194,23 @@ func (app *localClient) CommitSync() (*types.ResponseCommit, error) { return &res, nil } -func (app *localClient) InitChainSync(params types.RequestInitChain) error { +func (app *localClient) InitChainSync(req types.RequestInitChain) (*types.ResponseInitChain, error) { app.mtx.Lock() - app.Application.InitChain(params) + res := app.Application.InitChain(req) app.mtx.Unlock() - return nil + return &res, nil } -func (app *localClient) BeginBlockSync(params types.RequestBeginBlock) error { +func (app *localClient) BeginBlockSync(req types.RequestBeginBlock) (*types.ResponseBeginBlock, error) { app.mtx.Lock() - app.Application.BeginBlock(params) + res := app.Application.BeginBlock(req) app.mtx.Unlock() - return nil + return &res, nil } -func (app *localClient) EndBlockSync(height uint64) (*types.ResponseEndBlock, error) { +func (app *localClient) EndBlockSync(req types.RequestEndBlock) (*types.ResponseEndBlock, error) { app.mtx.Lock() - res := app.Application.EndBlock(height) + res := app.Application.EndBlock(req) app.mtx.Unlock() return &res, nil } diff --git a/client/socket_client.go b/client/socket_client.go index 716ef4510..84377a055 100644 --- a/client/socket_client.go +++ b/client/socket_client.go @@ -239,8 +239,8 @@ func (cli *socketClient) InfoAsync(req types.RequestInfo) *ReqRes { return cli.queueRequest(types.ToRequestInfo(req)) } -func (cli *socketClient) SetOptionAsync(key string, value string) *ReqRes { - return cli.queueRequest(types.ToRequestSetOption(key, value)) +func (cli *socketClient) SetOptionAsync(req types.RequestSetOption) *ReqRes { + return cli.queueRequest(types.ToRequestSetOption(req)) } func (cli *socketClient) DeliverTxAsync(tx []byte) *ReqRes { @@ -259,16 +259,16 @@ func (cli *socketClient) CommitAsync() *ReqRes { return cli.queueRequest(types.ToRequestCommit()) } -func (cli *socketClient) InitChainAsync(params types.RequestInitChain) *ReqRes { - return cli.queueRequest(types.ToRequestInitChain(params)) +func (cli *socketClient) InitChainAsync(req types.RequestInitChain) *ReqRes { + return cli.queueRequest(types.ToRequestInitChain(req)) } -func (cli *socketClient) BeginBlockAsync(params types.RequestBeginBlock) *ReqRes { - return cli.queueRequest(types.ToRequestBeginBlock(params)) +func (cli *socketClient) BeginBlockAsync(req types.RequestBeginBlock) *ReqRes { + return cli.queueRequest(types.ToRequestBeginBlock(req)) } -func (cli *socketClient) EndBlockAsync(height uint64) *ReqRes { - return cli.queueRequest(types.ToRequestEndBlock(height)) +func (cli *socketClient) EndBlockAsync(req types.RequestEndBlock) *ReqRes { + return cli.queueRequest(types.ToRequestEndBlock(req)) } //---------------------------------------- @@ -294,13 +294,10 @@ func (cli *socketClient) InfoSync(req types.RequestInfo) (*types.ResponseInfo, e return reqres.Response.GetInfo(), cli.Error() } -func (cli *socketClient) SetOptionSync(key string, value string) (log string, err error) { - reqres := cli.queueRequest(types.ToRequestSetOption(key, value)) +func (cli *socketClient) SetOptionSync(req types.RequestSetOption) (*types.ResponseSetOption, error) { + reqres := cli.queueRequest(types.ToRequestSetOption(req)) cli.FlushSync() - if err := cli.Error(); err != nil { - return "", err - } - return reqres.Response.GetSetOption().Log, nil + return reqres.Response.GetSetOption(), cli.Error() } func (cli *socketClient) DeliverTxSync(tx []byte) (*types.ResponseDeliverTx, error) { @@ -327,20 +324,20 @@ func (cli *socketClient) CommitSync() (*types.ResponseCommit, error) { return reqres.Response.GetCommit(), cli.Error() } -func (cli *socketClient) InitChainSync(params types.RequestInitChain) error { - cli.queueRequest(types.ToRequestInitChain(params)) +func (cli *socketClient) InitChainSync(req types.RequestInitChain) (*types.ResponseInitChain, error) { + reqres := cli.queueRequest(types.ToRequestInitChain(req)) cli.FlushSync() - return cli.Error() + return reqres.Response.GetInitChain(), cli.Error() } -func (cli *socketClient) BeginBlockSync(params types.RequestBeginBlock) error { - cli.queueRequest(types.ToRequestBeginBlock(params)) +func (cli *socketClient) BeginBlockSync(req types.RequestBeginBlock) (*types.ResponseBeginBlock, error) { + reqres := cli.queueRequest(types.ToRequestBeginBlock(req)) cli.FlushSync() - return cli.Error() + return reqres.Response.GetBeginBlock(), cli.Error() } -func (cli *socketClient) EndBlockSync(height uint64) (*types.ResponseEndBlock, error) { - reqres := cli.queueRequest(types.ToRequestEndBlock(height)) +func (cli *socketClient) EndBlockSync(req types.RequestEndBlock) (*types.ResponseEndBlock, error) { + reqres := cli.queueRequest(types.ToRequestEndBlock(req)) cli.FlushSync() return reqres.Response.GetEndBlock(), cli.Error() } diff --git a/cmd/abci-cli/abci-cli.go b/cmd/abci-cli/abci-cli.go index e3f0daec8..d27bf24bc 100644 --- a/cmd/abci-cli/abci-cli.go +++ b/cmd/abci-cli/abci-cli.go @@ -355,12 +355,13 @@ func cmdInfo(cmd *cobra.Command, args []string) error { // Set an option on the application func cmdSetOption(cmd *cobra.Command, args []string) error { - resLog, err := client.SetOptionSync(args[0], args[1]) + key, val := args[0], args[1] + res, err := client.SetOptionSync(types.RequestSetOption{key, val}) if err != nil { return err } printResponse(cmd, args, response{ - Log: resLog, + Log: res.Log, }) return nil } diff --git a/example/block_aware/block_aware_app.go b/example/block_aware/block_aware_app.go deleted file mode 100644 index 8a031da2f..000000000 --- a/example/block_aware/block_aware_app.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import ( - "flag" - "os" - - "github.com/tendermint/abci/server" - "github.com/tendermint/abci/types" - cmn "github.com/tendermint/tmlibs/common" - "github.com/tendermint/tmlibs/log" -) - -func main() { - - addrPtr := flag.String("addr", "tcp://0.0.0.0:46658", "Listen address") - abciPtr := flag.String("abci", "socket", "socket | grpc") - flag.Parse() - - logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) - - // Start the listener - srv, err := server.NewServer(*addrPtr, *abciPtr, NewChainAwareApplication()) - if err != nil { - logger.Error(err.Error()) - os.Exit(1) - } - srv.SetLogger(logger.With("module", "abci-server")) - if _, err := srv.Start(); err != nil { - logger.Error(err.Error()) - os.Exit(1) - } - - // Wait forever - cmn.TrapSignal(func() { - // Cleanup - srv.Stop() - }) - -} - -type ChainAwareApplication struct { - types.BaseApplication - - beginCount int - endCount int -} - -func NewChainAwareApplication() *ChainAwareApplication { - return &ChainAwareApplication{} -} - -func (app *ChainAwareApplication) Query(reqQuery types.RequestQuery) (resQuery types.ResponseQuery) { - return types.ResponseQuery{ - Value: []byte(cmn.Fmt("%d,%d", app.beginCount, app.endCount)), - } -} - -func (app *ChainAwareApplication) BeginBlock(reqBeginBlock types.RequestBeginBlock) { - app.beginCount++ -} - -func (app *ChainAwareApplication) EndBlock(height uint64) (resEndBlock types.ResponseEndBlock) { - app.endCount++ - return -} diff --git a/example/block_aware/block_aware_test.go b/example/block_aware/block_aware_test.go deleted file mode 100644 index 2777ce1a2..000000000 --- a/example/block_aware/block_aware_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package main - -import ( - "strconv" - "strings" - "testing" - - abcicli "github.com/tendermint/abci/client" - "github.com/tendermint/abci/server" - "github.com/tendermint/abci/types" - "github.com/tendermint/tmlibs/log" -) - -func TestChainAware(t *testing.T) { - app := NewChainAwareApplication() - - // Start the listener - srv, err := server.NewServer("unix://test.sock", "socket", app) - if err != nil { - t.Fatal(err) - } - srv.SetLogger(log.TestingLogger().With("module", "abci-server")) - if _, err := srv.Start(); err != nil { - t.Fatal(err.Error()) - } - defer srv.Stop() - - // Connect to the socket - client := abcicli.NewSocketClient("unix://test.sock", false) - client.SetLogger(log.TestingLogger().With("module", "abci-client")) - if _, err := client.Start(); err != nil { - t.Fatalf("Error starting socket client: %v", err.Error()) - } - defer client.Stop() - - n := uint64(5) - hash := []byte("fake block hash") - header := &types.Header{} - for i := uint64(0); i < n; i++ { - client.BeginBlockSync(types.RequestBeginBlock{hash, header}) - client.EndBlockSync(i) - client.CommitSync() - } - - r := app.Query(types.RequestQuery{}) - spl := strings.Split(string(r.Value), ",") - if len(spl) != 2 { - t.Fatal("expected %d,%d ; got %s", n, n, string(r.Value)) - } - beginCount, _ := strconv.Atoi(spl[0]) - endCount, _ := strconv.Atoi(spl[1]) - if uint64(beginCount) != n { - t.Fatalf("expected beginCount of %d, got %d", n, beginCount) - } else if uint64(endCount) != n { - t.Fatalf("expected endCount of %d, got %d", n, endCount) - } -} diff --git a/example/counter/counter.go b/example/counter/counter.go index 65cac4a0e..a7b090275 100644 --- a/example/counter/counter.go +++ b/example/counter/counter.go @@ -24,11 +24,12 @@ func (app *CounterApplication) Info(req types.RequestInfo) types.ResponseInfo { return types.ResponseInfo{Data: cmn.Fmt("{\"hashes\":%v,\"txs\":%v}", app.hashCount, app.txCount)} } -func (app *CounterApplication) SetOption(key string, value string) (log string) { +func (app *CounterApplication) SetOption(req types.RequestSetOption) types.ResponseSetOption { + key, value := req.Key, req.Value if key == "serial" && value == "on" { app.serial = true } - return "" + return types.ResponseSetOption{} } func (app *CounterApplication) DeliverTx(tx []byte) types.ResponseDeliverTx { diff --git a/example/dummy/dummy.go b/example/dummy/dummy.go index a4edacac4..65d524cfe 100644 --- a/example/dummy/dummy.go +++ b/example/dummy/dummy.go @@ -10,6 +10,8 @@ import ( dbm "github.com/tendermint/tmlibs/db" ) +var _ types.Application = (*DummyApplication)(nil) + type DummyApplication struct { types.BaseApplication diff --git a/example/dummy/dummy_test.go b/example/dummy/dummy_test.go index 798da7200..b7aef6a8b 100644 --- a/example/dummy/dummy_test.go +++ b/example/dummy/dummy_test.go @@ -93,7 +93,7 @@ func TestPersistentDummyInfo(t *testing.T) { Height: uint64(height), } dummy.BeginBlock(types.RequestBeginBlock{hash, header}) - dummy.EndBlock(height) + dummy.EndBlock(types.RequestEndBlock{header.Height}) dummy.Commit() resInfo = dummy.Info(types.RequestInfo{}) @@ -182,7 +182,7 @@ func makeApplyBlock(t *testing.T, dummy types.Application, heightInt int, diff [ t.Fatal(r) } } - resEndBlock := dummy.EndBlock(height) + resEndBlock := dummy.EndBlock(types.RequestEndBlock{header.Height}) dummy.Commit() valsEqual(t, diff, resEndBlock.Diffs) diff --git a/example/dummy/persistent_dummy.go b/example/dummy/persistent_dummy.go index 8fa112820..ed2845296 100644 --- a/example/dummy/persistent_dummy.go +++ b/example/dummy/persistent_dummy.go @@ -21,6 +21,8 @@ const ( //----------------------------------------- +var _ types.Application = (*PersistentDummyApplication)(nil) + type PersistentDummyApplication struct { app *DummyApplication @@ -50,15 +52,15 @@ func (app *PersistentDummyApplication) SetLogger(l log.Logger) { app.logger = l } -func (app *PersistentDummyApplication) Info(req types.RequestInfo) (resInfo types.ResponseInfo) { - resInfo = app.app.Info(req) - resInfo.LastBlockHeight = app.app.state.LatestVersion() - resInfo.LastBlockAppHash = app.app.state.Hash() - return resInfo +func (app *PersistentDummyApplication) Info(req types.RequestInfo) types.ResponseInfo { + res := app.app.Info(req) + res.LastBlockHeight = app.app.state.LatestVersion() + res.LastBlockAppHash = app.app.state.Hash() + return res } -func (app *PersistentDummyApplication) SetOption(key string, value string) (log string) { - return app.app.SetOption(key, value) +func (app *PersistentDummyApplication) SetOption(req types.RequestSetOption) types.ResponseSetOption { + return app.app.SetOption(req) } // tx is either "val:pubkey/power" or "key=value" or just arbitrary bytes @@ -102,23 +104,25 @@ func (app *PersistentDummyApplication) Query(reqQuery types.RequestQuery) types. } // Save the validators in the merkle tree -func (app *PersistentDummyApplication) InitChain(params types.RequestInitChain) { - for _, v := range params.Validators { +func (app *PersistentDummyApplication) InitChain(req types.RequestInitChain) types.ResponseInitChain { + for _, v := range req.Validators { r := app.updateValidator(v) if r.IsErr() { app.logger.Error("Error updating validators", "r", r) } } + return types.ResponseInitChain{} } // Track the block hash and header information -func (app *PersistentDummyApplication) BeginBlock(params types.RequestBeginBlock) { +func (app *PersistentDummyApplication) BeginBlock(req types.RequestBeginBlock) types.ResponseBeginBlock { // reset valset changes app.changes = make([]*types.Validator, 0) + return types.ResponseBeginBlock{} } // Update the validator set -func (app *PersistentDummyApplication) EndBlock(height uint64) (resEndBlock types.ResponseEndBlock) { +func (app *PersistentDummyApplication) EndBlock(req types.RequestEndBlock) types.ResponseEndBlock { return types.ResponseEndBlock{Diffs: app.changes} } diff --git a/server/socket_server.go b/server/socket_server.go index 68a213225..c88180d43 100644 --- a/server/socket_server.go +++ b/server/socket_server.go @@ -168,33 +168,32 @@ 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(*r.Info) - responses <- types.ToResponseInfo(resInfo) + res := s.app.Info(*r.Info) + responses <- types.ToResponseInfo(res) case *types.Request_SetOption: - so := r.SetOption - logStr := s.app.SetOption(so.Key, so.Value) - responses <- types.ToResponseSetOption(logStr) + res := s.app.SetOption(*r.SetOption) + responses <- types.ToResponseSetOption(res) case *types.Request_DeliverTx: res := s.app.DeliverTx(r.DeliverTx.Tx) - responses <- types.ToResponseDeliverTx(res.Code, res.Data, res.Log, res.Tags) + responses <- types.ToResponseDeliverTx(res) case *types.Request_CheckTx: res := s.app.CheckTx(r.CheckTx.Tx) - responses <- types.ToResponseCheckTx(res.Code, res.Data, res.Log) + responses <- types.ToResponseCheckTx(res) case *types.Request_Commit: res := s.app.Commit() - responses <- types.ToResponseCommit(res.Code, res.Data, res.Log) + responses <- types.ToResponseCommit(res) case *types.Request_Query: - resQuery := s.app.Query(*r.Query) - responses <- types.ToResponseQuery(resQuery) + res := s.app.Query(*r.Query) + responses <- types.ToResponseQuery(res) case *types.Request_InitChain: - s.app.InitChain(*r.InitChain) - responses <- types.ToResponseInitChain() + res := s.app.InitChain(*r.InitChain) + responses <- types.ToResponseInitChain(res) case *types.Request_BeginBlock: - s.app.BeginBlock(*r.BeginBlock) - responses <- types.ToResponseBeginBlock() + res := s.app.BeginBlock(*r.BeginBlock) + responses <- types.ToResponseBeginBlock(res) case *types.Request_EndBlock: - resEndBlock := s.app.EndBlock(r.EndBlock.Height) - responses <- types.ToResponseEndBlock(resEndBlock) + res := s.app.EndBlock(*r.EndBlock) + responses <- types.ToResponseEndBlock(res) default: responses <- types.ToResponseException("Unknown request") } diff --git a/types/application.go b/types/application.go index ed9b0d20d..c36e58f09 100644 --- a/types/application.go +++ b/types/application.go @@ -5,22 +5,24 @@ import ( ) // Application is an interface that enables any finite, deterministic state machine -// to be driven by a blockchain-based replication engine via the ABCI +// to be driven by a blockchain-based replication engine via the ABCI. +// All methods take a RequestXxx argument and return a ResponseXxx argument, +// except CheckTx/DeliverTx, which take `tx []byte`, and `Commit`, which takes nothing. type Application interface { // Info/Query Connection - Info(RequestInfo) ResponseInfo // Return application info - SetOption(key string, value string) (log string) // Set application option - Query(RequestQuery) ResponseQuery // Query for state + Info(RequestInfo) ResponseInfo // Return application info + SetOption(RequestSetOption) ResponseSetOption // Set application option + Query(RequestQuery) ResponseQuery // Query for state // Mempool Connection CheckTx(tx []byte) ResponseCheckTx // Validate a tx for the mempool // Consensus Connection - InitChain(RequestInitChain) // Initialize blockchain with validators and other info from TendermintCore - BeginBlock(RequestBeginBlock) // Signals the beginning of a block - DeliverTx(tx []byte) ResponseDeliverTx // Deliver a tx for full processing - EndBlock(height uint64) ResponseEndBlock // Signals the end of a block, returns changes to the validator set - Commit() ResponseCommit // Commit the state and return the application Merkle root hash + InitChain(RequestInitChain) ResponseInitChain // Initialize blockchain with validators and other info from TendermintCore + BeginBlock(RequestBeginBlock) ResponseBeginBlock // Signals the beginning of a block + DeliverTx(tx []byte) ResponseDeliverTx // Deliver a tx for full processing + EndBlock(RequestEndBlock) ResponseEndBlock // Signals the end of a block, returns changes to the validator set + Commit() ResponseCommit // Commit the state and return the application Merkle root hash } //------------------------------------ @@ -48,7 +50,8 @@ func (app *GRPCApplication) Info(ctx context.Context, req *RequestInfo) (*Respon } func (app *GRPCApplication) SetOption(ctx context.Context, req *RequestSetOption) (*ResponseSetOption, error) { - return &ResponseSetOption{app.app.SetOption(req.Key, req.Value)}, nil + resSetOption := app.app.SetOption(*req) + return &resSetOption, nil } func (app *GRPCApplication) DeliverTx(ctx context.Context, req *RequestDeliverTx) (*ResponseDeliverTx, error) { @@ -72,16 +75,16 @@ 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) - return &ResponseInitChain{}, nil // NOTE: empty return + resInitChain := app.app.InitChain(*req) + return &resInitChain, nil } func (app *GRPCApplication) BeginBlock(ctx context.Context, req *RequestBeginBlock) (*ResponseBeginBlock, error) { - app.app.BeginBlock(*req) - return &ResponseBeginBlock{}, nil // NOTE: empty return + resBeginBlock := app.app.BeginBlock(*req) + return &resBeginBlock, nil } func (app *GRPCApplication) EndBlock(ctx context.Context, req *RequestEndBlock) (*ResponseEndBlock, error) { - resEndBlock := app.app.EndBlock(req.Height) + resEndBlock := app.app.EndBlock(*req) return &resEndBlock, nil } diff --git a/types/base_app.go b/types/base_app.go index 0086685b8..404678e95 100644 --- a/types/base_app.go +++ b/types/base_app.go @@ -11,8 +11,8 @@ func (BaseApplication) Info(req RequestInfo) ResponseInfo { return ResponseInfo{} } -func (BaseApplication) SetOption(key string, value string) (log string) { - return "" +func (BaseApplication) SetOption(req RequestSetOption) ResponseSetOption { + return ResponseSetOption{} } func (BaseApplication) DeliverTx(tx []byte) ResponseDeliverTx { @@ -31,12 +31,14 @@ func (BaseApplication) Query(req RequestQuery) ResponseQuery { return ResponseQuery{Code: CodeType_OK} } -func (BaseApplication) InitChain(req RequestInitChain) { +func (BaseApplication) InitChain(req RequestInitChain) ResponseInitChain { + return ResponseInitChain{} } -func (BaseApplication) BeginBlock(req RequestBeginBlock) { +func (BaseApplication) BeginBlock(req RequestBeginBlock) ResponseBeginBlock { + return ResponseBeginBlock{} } -func (BaseApplication) EndBlock(height uint64) ResponseEndBlock { +func (BaseApplication) EndBlock(req RequestEndBlock) ResponseEndBlock { return ResponseEndBlock{} } diff --git a/types/messages.go b/types/messages.go index 298f17ba2..77ad538ed 100644 --- a/types/messages.go +++ b/types/messages.go @@ -25,21 +25,21 @@ func ToRequestInfo(req RequestInfo) *Request { } } -func ToRequestSetOption(key string, value string) *Request { +func ToRequestSetOption(req RequestSetOption) *Request { return &Request{ - Value: &Request_SetOption{&RequestSetOption{key, value}}, + Value: &Request_SetOption{&req}, } } -func ToRequestDeliverTx(txBytes []byte) *Request { +func ToRequestDeliverTx(tx []byte) *Request { return &Request{ - Value: &Request_DeliverTx{&RequestDeliverTx{txBytes}}, + Value: &Request_DeliverTx{&RequestDeliverTx{tx}}, } } -func ToRequestCheckTx(txBytes []byte) *Request { +func ToRequestCheckTx(tx []byte) *Request { return &Request{ - Value: &Request_CheckTx{&RequestCheckTx{txBytes}}, + Value: &Request_CheckTx{&RequestCheckTx{tx}}, } } @@ -67,9 +67,9 @@ func ToRequestBeginBlock(req RequestBeginBlock) *Request { } } -func ToRequestEndBlock(height uint64) *Request { +func ToRequestEndBlock(req RequestEndBlock) *Request { return &Request{ - Value: &Request_EndBlock{&RequestEndBlock{height}}, + Value: &Request_EndBlock{&req}, } } @@ -93,57 +93,57 @@ func ToResponseFlush() *Response { } } -func ToResponseInfo(resInfo ResponseInfo) *Response { +func ToResponseInfo(res ResponseInfo) *Response { return &Response{ - Value: &Response_Info{&resInfo}, + Value: &Response_Info{&res}, } } -func ToResponseSetOption(log string) *Response { +func ToResponseSetOption(res ResponseSetOption) *Response { return &Response{ - Value: &Response_SetOption{&ResponseSetOption{log}}, + Value: &Response_SetOption{&res}, } } -func ToResponseDeliverTx(code CodeType, data []byte, log string, tags []*KVPair) *Response { +func ToResponseDeliverTx(res ResponseDeliverTx) *Response { return &Response{ - Value: &Response_DeliverTx{&ResponseDeliverTx{code, data, log, tags}}, + Value: &Response_DeliverTx{&res}, } } -func ToResponseCheckTx(code CodeType, data []byte, log string) *Response { +func ToResponseCheckTx(res ResponseCheckTx) *Response { return &Response{ - Value: &Response_CheckTx{&ResponseCheckTx{code, data, log}}, + Value: &Response_CheckTx{&res}, } } -func ToResponseCommit(code CodeType, data []byte, log string) *Response { +func ToResponseCommit(res ResponseCommit) *Response { return &Response{ - Value: &Response_Commit{&ResponseCommit{code, data, log}}, + Value: &Response_Commit{&res}, } } -func ToResponseQuery(resQuery ResponseQuery) *Response { +func ToResponseQuery(res ResponseQuery) *Response { return &Response{ - Value: &Response_Query{&resQuery}, + Value: &Response_Query{&res}, } } -func ToResponseInitChain() *Response { +func ToResponseInitChain(res ResponseInitChain) *Response { return &Response{ - Value: &Response_InitChain{&ResponseInitChain{}}, + Value: &Response_InitChain{&res}, } } -func ToResponseBeginBlock() *Response { +func ToResponseBeginBlock(res ResponseBeginBlock) *Response { return &Response{ - Value: &Response_BeginBlock{&ResponseBeginBlock{}}, + Value: &Response_BeginBlock{&res}, } } -func ToResponseEndBlock(resEndBlock ResponseEndBlock) *Response { +func ToResponseEndBlock(res ResponseEndBlock) *Response { return &Response{ - Value: &Response_EndBlock{&resEndBlock}, + Value: &Response_EndBlock{&res}, } } From fb612e5a7b83b8a008ed813974c452726b4a1da9 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 27 Nov 2017 19:52:06 +0000 Subject: [PATCH 34/42] fixup tests --- Makefile | 14 ++++++++++---- circle.yml | 2 +- cmd/abci-cli/abci-cli.go | 4 ++-- cmd/abci-cli/main.go | 11 ++++++++++- test.sh | 10 +++++----- tests/test_app/app.go | 2 +- 6 files changed, 29 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 57ab4052d..ab9223f61 100644 --- a/Makefile +++ b/Makefile @@ -36,12 +36,18 @@ dist: @ bash scripts/publish.sh # test.sh requires that we run the installed cmds, must not be out of date -test: install +test: @ find . -path ./vendor -prune -o -name "*.sock" -exec rm {} \; - @ echo "==> Running unit tests" + @ echo "==> Running go test" @ go test $(PACKAGES) - @ echo "==> Running integration tests (./tests)" - @ bash tests/test.sh + +test_race: + @ find . -path ./vendor -prune -o -name "*.sock" -exec rm {} \; + @ echo "==> Running go test --race" + @go test -v -race $(PACKAGES) + +test_integrations: + @ bash test.sh fmt: @ go fmt ./... diff --git a/circle.yml b/circle.yml index 459873637..c6904fae6 100644 --- a/circle.yml +++ b/circle.yml @@ -16,7 +16,7 @@ checkout: test: override: - - cd $REPO && make get_vendor_deps && make metalinter_test && bash ./test.sh + - cd $REPO && make get_vendor_deps && make metalinter_test && make test_integrations post: - cd "$REPO" && bash <(curl -s https://codecov.io/bash) -f coverage.txt - cd "$REPO" && mv coverage.txt "${CIRCLE_ARTIFACTS}" diff --git a/cmd/abci-cli/abci-cli.go b/cmd/abci-cli/abci-cli.go index d27bf24bc..d6e95d963 100644 --- a/cmd/abci-cli/abci-cli.go +++ b/cmd/abci-cli/abci-cli.go @@ -96,10 +96,10 @@ var RootCmd = &cobra.Command{ }, } -func Execute() { +func Execute() error { addGlobalFlags() addCommands() - RootCmd.Execute() + return RootCmd.Execute() } func addGlobalFlags() { diff --git a/cmd/abci-cli/main.go b/cmd/abci-cli/main.go index 736ef3102..a927e7ed8 100644 --- a/cmd/abci-cli/main.go +++ b/cmd/abci-cli/main.go @@ -1,5 +1,14 @@ package main +import ( + "fmt" + "os" +) + func main() { - Execute() + err := Execute() + if err != nil { + fmt.Print(err) + os.Exit(1) + } } diff --git a/test.sh b/test.sh index 136f60e2a..33839c062 100755 --- a/test.sh +++ b/test.sh @@ -5,11 +5,11 @@ echo "" > coverage.txt echo "==> Running unit tests" for d in $(go list ./... | grep -v vendor); do - go test -race -coverprofile=profile.out -covermode=atomic "$d" - if [ -f profile.out ]; then - cat profile.out >> coverage.txt - rm profile.out - fi + go test -race -coverprofile=profile.out -covermode=atomic "$d" + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi done echo "==> Running integration tests (./tests)" diff --git a/tests/test_app/app.go b/tests/test_app/app.go index c869fe83a..59d7aec4b 100644 --- a/tests/test_app/app.go +++ b/tests/test_app/app.go @@ -48,7 +48,7 @@ func startClient(abciType string) abcicli.Client { } func setOption(client abcicli.Client, key, value string) { - _, err := client.SetOptionSync(key, value) + _, err := client.SetOptionSync(types.RequestSetOption{key, value}) if err != nil { panicf("setting %v=%v: \nerr: %v", key, value, err) } From 7dc5b746ac7bf18d49c61154de81fc99909ef81c Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 27 Nov 2017 20:10:11 +0000 Subject: [PATCH 35/42] types: add gas and fee fields to CheckTx --- types/types.pb.go | 240 +++++++++++++++++++++++++--------------------- types/types.proto | 2 + 2 files changed, 131 insertions(+), 111 deletions(-) diff --git a/types/types.pb.go b/types/types.pb.go index 0cd976796..7b278ea26 100644 --- a/types/types.pb.go +++ b/types/types.pb.go @@ -1,5 +1,6 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. +// Code generated by protoc-gen-go. // source: types/types.proto +// DO NOT EDIT! /* Package types is a generated protocol buffer package. @@ -1361,6 +1362,8 @@ type ResponseCheckTx struct { Code CodeType `protobuf:"varint,1,opt,name=code,enum=types.CodeType" json:"code,omitempty"` Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` Log string `protobuf:"bytes,3,opt,name=log" json:"log,omitempty"` + Gas uint64 `protobuf:"varint,4,opt,name=gas" json:"gas,omitempty"` + Fee uint64 `protobuf:"varint,5,opt,name=fee" json:"fee,omitempty"` } func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } @@ -1389,6 +1392,20 @@ func (m *ResponseCheckTx) GetLog() string { return "" } +func (m *ResponseCheckTx) GetGas() uint64 { + if m != nil { + return m.Gas + } + return 0 +} + +func (m *ResponseCheckTx) GetFee() uint64 { + if m != nil { + return m.Fee + } + return 0 +} + type ResponseQuery struct { Code CodeType `protobuf:"varint,1,opt,name=code,enum=types.CodeType" json:"code,omitempty"` Index int64 `protobuf:"varint,2,opt,name=index" json:"index,omitempty"` @@ -2149,114 +2166,115 @@ var _ABCIApplication_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("types/types.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1736 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xcb, 0x6e, 0xdb, 0xcc, - 0x15, 0x36, 0x25, 0xea, 0x76, 0x2c, 0xcb, 0xf4, 0x58, 0xb6, 0x65, 0xa5, 0x8b, 0x84, 0x45, 0x1a, - 0x3b, 0x4d, 0x9d, 0xd6, 0x41, 0x8a, 0xb8, 0x29, 0x0a, 0xf8, 0x16, 0x5b, 0x08, 0xea, 0xb8, 0xb4, - 0x93, 0x4d, 0x0b, 0x08, 0xb4, 0x38, 0x92, 0xa6, 0x96, 0x86, 0x0c, 0x39, 0x74, 0xe4, 0xee, 0xba, - 0xcf, 0xbe, 0x8f, 0x50, 0xa0, 0xcb, 0x02, 0x7d, 0x85, 0x02, 0xff, 0xfd, 0xf2, 0x44, 0x3f, 0xe6, - 0xc2, 0xab, 0xa9, 0xe0, 0x5f, 0x64, 0x23, 0xf0, 0x5c, 0xbe, 0x99, 0x33, 0x33, 0xe7, 0x7c, 0x73, - 0x46, 0xb0, 0xc2, 0x6e, 0x3d, 0x1c, 0x3c, 0x15, 0xbf, 0x3b, 0x9e, 0xef, 0x32, 0x17, 0x55, 0x84, - 0x60, 0xfe, 0x5f, 0x87, 0x9a, 0x85, 0xdf, 0x87, 0x38, 0x60, 0x68, 0x0b, 0x74, 0x3c, 0x18, 0xbb, - 0x1d, 0xed, 0xbe, 0xb6, 0xb5, 0xb8, 0x8b, 0x76, 0xa4, 0xbb, 0xb2, 0x1e, 0x0f, 0xc6, 0xee, 0xe9, - 0x82, 0x25, 0x3c, 0xd0, 0xaf, 0xa1, 0x32, 0x9c, 0x84, 0xc1, 0xb8, 0x53, 0x12, 0xae, 0xab, 0x59, - 0xd7, 0x57, 0xdc, 0x74, 0xba, 0x60, 0x49, 0x1f, 0x3e, 0x2c, 0xa1, 0x43, 0xb7, 0x53, 0x2e, 0x1a, - 0xb6, 0x47, 0x87, 0x62, 0x58, 0xee, 0x81, 0x5e, 0x00, 0x04, 0x98, 0xf5, 0x5d, 0x8f, 0x11, 0x97, - 0x76, 0x74, 0xe1, 0xbf, 0x91, 0xf5, 0xbf, 0xc0, 0xec, 0x8d, 0x30, 0x9f, 0x2e, 0x58, 0x8d, 0x20, - 0x12, 0x38, 0xd2, 0xc1, 0x13, 0x72, 0x83, 0xfd, 0x3e, 0x9b, 0x75, 0x2a, 0x45, 0xc8, 0x23, 0x69, - 0xbf, 0x9c, 0x71, 0xa4, 0x13, 0x09, 0x68, 0x17, 0xea, 0x83, 0x31, 0x1e, 0x5c, 0x73, 0x5c, 0x55, - 0xe0, 0xd6, 0xb2, 0xb8, 0x43, 0x6e, 0x15, 0xa8, 0xda, 0x40, 0x7e, 0xa2, 0x1d, 0xa8, 0x0e, 0xdc, - 0xe9, 0x94, 0xb0, 0x4e, 0x4d, 0x20, 0xda, 0x39, 0x84, 0xb0, 0x9d, 0x2e, 0x58, 0xca, 0x8b, 0x6f, - 0xd7, 0xfb, 0x10, 0xfb, 0xb7, 0x9d, 0x7a, 0xd1, 0x76, 0xfd, 0x85, 0x9b, 0xf8, 0x76, 0x09, 0x1f, - 0xbe, 0x14, 0x42, 0x09, 0xeb, 0x0f, 0xc6, 0x36, 0xa1, 0x9d, 0x46, 0xd1, 0x52, 0x7a, 0x94, 0xb0, - 0x43, 0x6e, 0xe6, 0x4b, 0x21, 0x91, 0x80, 0x5e, 0xc2, 0xe2, 0x15, 0x1e, 0x11, 0xda, 0xbf, 0x9a, - 0xb8, 0x83, 0xeb, 0x0e, 0x08, 0x68, 0x27, 0x0b, 0x3d, 0xe0, 0x0e, 0x07, 0xdc, 0x7e, 0xba, 0x60, - 0xc1, 0x55, 0x2c, 0xa1, 0xe7, 0xd0, 0xc0, 0xd4, 0x51, 0xd0, 0x45, 0x01, 0x5d, 0xcf, 0x65, 0x00, - 0x75, 0x22, 0x60, 0x1d, 0xab, 0xef, 0x83, 0x1a, 0x54, 0x6e, 0xec, 0x49, 0x88, 0xcd, 0x47, 0xb0, - 0x98, 0xca, 0x14, 0xd4, 0x81, 0xda, 0x14, 0x07, 0x81, 0x3d, 0xc2, 0x22, 0x9d, 0x1a, 0x56, 0x24, - 0x9a, 0x2d, 0x68, 0xa6, 0xf3, 0x24, 0x05, 0xe4, 0xb9, 0xc0, 0x81, 0x37, 0xd8, 0x0f, 0x78, 0x02, - 0x28, 0xa0, 0x12, 0xcd, 0x3f, 0x80, 0x91, 0x4f, 0x02, 0x64, 0x40, 0xf9, 0x1a, 0xdf, 0x2a, 0x4f, - 0xfe, 0x89, 0xda, 0x2a, 0x20, 0x91, 0x9a, 0x0d, 0x4b, 0x45, 0x67, 0xc6, 0xd8, 0x38, 0x0d, 0x50, - 0x0b, 0x4a, 0x6c, 0x26, 0xa0, 0x4d, 0xab, 0xc4, 0x66, 0xe6, 0x7d, 0x68, 0x65, 0x8f, 0xfc, 0x8e, - 0x87, 0x13, 0x87, 0x2e, 0xce, 0x0c, 0x21, 0xd0, 0x1d, 0x9b, 0xd9, 0xca, 0x43, 0x7c, 0x73, 0x9d, - 0x67, 0xb3, 0xb1, 0x9a, 0x5e, 0x7c, 0xa3, 0x75, 0xa8, 0x8e, 0x31, 0x19, 0x8d, 0x99, 0xa8, 0x01, - 0xdd, 0x52, 0x12, 0x8f, 0xd5, 0xf3, 0xdd, 0x1b, 0x2c, 0x52, 0xbd, 0x6e, 0x49, 0xc1, 0x5c, 0x86, - 0xa5, 0x4c, 0x22, 0x99, 0x47, 0x71, 0xf0, 0xf1, 0xc1, 0xa3, 0xdf, 0x02, 0xdc, 0xd8, 0x13, 0xe2, - 0xd8, 0xcc, 0xf5, 0x83, 0x8e, 0x76, 0xbf, 0xbc, 0xb5, 0xb8, 0x6b, 0xa8, 0xf3, 0x7a, 0x17, 0x19, - 0xac, 0x94, 0x8f, 0x79, 0x06, 0x2b, 0x77, 0x72, 0x80, 0x47, 0x3b, 0xb6, 0x83, 0x71, 0xb4, 0x02, - 0xfe, 0x8d, 0x1e, 0xf2, 0x68, 0x6d, 0x07, 0xfb, 0xaa, 0xba, 0x97, 0xd4, 0xb0, 0xa7, 0x42, 0x69, - 0x29, 0xa3, 0xb9, 0x0d, 0xcb, 0xb9, 0xc4, 0x48, 0xad, 0x53, 0x4b, 0xaf, 0xd3, 0xfc, 0x58, 0x81, - 0xba, 0x85, 0x03, 0xcf, 0xa5, 0x01, 0x46, 0x2f, 0xa0, 0x81, 0x67, 0x03, 0x2c, 0x6b, 0x5c, 0xcb, - 0xe5, 0xa8, 0xf4, 0x39, 0x8e, 0xec, 0x3c, 0xbf, 0x63, 0x67, 0xb4, 0xad, 0xf8, 0x29, 0x4f, 0x3a, - 0x0a, 0x94, 0x26, 0xa8, 0x27, 0x11, 0x41, 0x95, 0x73, 0x05, 0x2a, 0x7d, 0x73, 0x0c, 0xb5, 0xad, - 0x18, 0x4a, 0x2f, 0x1c, 0x38, 0x43, 0x51, 0x7b, 0x19, 0x8a, 0xaa, 0x14, 0x86, 0x3f, 0x87, 0xa3, - 0xf6, 0x32, 0x1c, 0x55, 0x2d, 0x84, 0xce, 0x21, 0xa9, 0x67, 0x29, 0x92, 0xaa, 0xe5, 0x6a, 0x53, - 0x02, 0x0b, 0x58, 0xea, 0x69, 0xcc, 0x52, 0xf5, 0x1c, 0xaf, 0x29, 0x48, 0x9e, 0xa6, 0x9e, 0x44, - 0x34, 0xd5, 0x28, 0xdc, 0xb4, 0x1c, 0x4f, 0xed, 0x65, 0x78, 0x0a, 0x0a, 0x97, 0x33, 0x87, 0xa8, - 0xfe, 0x98, 0x25, 0x2a, 0xc9, 0x36, 0x9b, 0x39, 0xec, 0x5c, 0xa6, 0xfa, 0x7d, 0x9a, 0xa9, 0x9a, - 0x39, 0x7e, 0x54, 0xb9, 0xf0, 0x49, 0xaa, 0xda, 0xe6, 0x95, 0x90, 0xcb, 0x34, 0x5e, 0x8b, 0xd8, - 0xf7, 0x5d, 0x5f, 0x71, 0x89, 0x14, 0xcc, 0x2d, 0x5e, 0xf1, 0x49, 0x7e, 0x7d, 0x82, 0xd6, 0x44, - 0xd5, 0xa6, 0xb2, 0xcb, 0xfc, 0x97, 0x96, 0x60, 0x05, 0xb3, 0xa5, 0xd9, 0xa2, 0xa1, 0xd8, 0x22, - 0xc5, 0x76, 0xa5, 0x0c, 0xdb, 0xa1, 0xc7, 0xb0, 0x32, 0xb1, 0x03, 0x26, 0x97, 0xd9, 0xcf, 0xd0, - 0xc7, 0x32, 0x37, 0xc8, 0xf5, 0x49, 0x1e, 0xf9, 0x0d, 0xac, 0xa6, 0x7c, 0x6d, 0xcf, 0xeb, 0x8b, - 0xa2, 0xd6, 0x45, 0x51, 0x1b, 0xb1, 0xf7, 0xbe, 0xe7, 0x9d, 0xda, 0xc1, 0xd8, 0x7c, 0x98, 0xac, - 0x3f, 0xc3, 0xa4, 0x13, 0x77, 0x14, 0x31, 0xe9, 0xc4, 0x1d, 0x99, 0xff, 0xd4, 0x12, 0xbf, 0x84, - 0x35, 0x7f, 0x09, 0xfa, 0xc0, 0x75, 0xe4, 0xf2, 0x5b, 0xbb, 0xcb, 0x6a, 0xe3, 0x0f, 0x5d, 0x07, - 0x5f, 0xde, 0x7a, 0xd8, 0x12, 0xc6, 0x78, 0xa9, 0xa5, 0x14, 0x31, 0xaa, 0x09, 0xca, 0xf1, 0x04, - 0xe8, 0x01, 0xe8, 0xcc, 0x1e, 0x05, 0x1d, 0x5d, 0xb0, 0x57, 0x44, 0x33, 0xaf, 0xdf, 0x9d, 0xdb, - 0xc4, 0xb7, 0x84, 0xc9, 0xfc, 0x1b, 0x27, 0x99, 0x4c, 0x86, 0x7f, 0xc6, 0x00, 0xcc, 0xff, 0x6a, - 0xc9, 0xa1, 0x49, 0x46, 0xff, 0x59, 0x83, 0xb7, 0xa1, 0x42, 0xa8, 0x83, 0x67, 0x62, 0xf4, 0xb2, - 0x25, 0x85, 0xe8, 0x2a, 0x2a, 0x8b, 0x19, 0xb3, 0x57, 0x91, 0x3c, 0x08, 0x29, 0x28, 0xd2, 0x77, - 0x87, 0x82, 0x3c, 0x9a, 0x96, 0x14, 0x52, 0xd4, 0x59, 0xcd, 0x5c, 0x11, 0x2a, 0xe8, 0x5a, 0x12, - 0xf4, 0x5f, 0xf9, 0x35, 0x95, 0xae, 0xe0, 0xcf, 0xb9, 0x23, 0xab, 0xc9, 0x91, 0xc7, 0xb5, 0x6b, - 0xb6, 0x01, 0xdd, 0x2d, 0x4a, 0x79, 0x1d, 0x67, 0xcb, 0x0d, 0xfd, 0x0a, 0x2a, 0x0e, 0x19, 0x0e, - 0xe7, 0x5f, 0x48, 0xd2, 0x6c, 0xfe, 0xbb, 0x04, 0x55, 0x79, 0x9d, 0xa0, 0x4d, 0x4e, 0x6d, 0x36, - 0xa1, 0x7d, 0xe2, 0x44, 0x25, 0x25, 0xe4, 0x9e, 0x93, 0xda, 0x93, 0x52, 0x66, 0x4f, 0x10, 0xe8, - 0x8c, 0x4c, 0xb1, 0xaa, 0x06, 0xf1, 0x8d, 0x36, 0xa0, 0x46, 0xc3, 0x69, 0x9f, 0xcd, 0x02, 0xb1, - 0xdb, 0xba, 0x55, 0xa5, 0xe1, 0xf4, 0x72, 0x16, 0xa0, 0x5d, 0x58, 0x4a, 0xd5, 0x06, 0x71, 0x14, - 0x67, 0xb7, 0x54, 0x68, 0x22, 0xee, 0xde, 0x91, 0xb5, 0x18, 0x57, 0x49, 0xcf, 0x41, 0x5b, 0x20, - 0x8a, 0xa6, 0x2f, 0x79, 0x51, 0x16, 0x53, 0x55, 0xec, 0x5b, 0x8b, 0xeb, 0x15, 0x71, 0xf2, 0xbb, - 0xf2, 0x1e, 0x34, 0xf8, 0x4e, 0x4a, 0x97, 0x9a, 0x70, 0xa9, 0x73, 0x85, 0x30, 0x3e, 0x82, 0xe5, - 0xe4, 0xfe, 0x95, 0x2e, 0x75, 0x39, 0x4a, 0xa2, 0x16, 0x8e, 0x9b, 0x50, 0x8f, 0x8b, 0xb6, 0x21, - 0x3c, 0x6a, 0xb6, 0xaa, 0xd5, 0x1e, 0xd4, 0x54, 0x88, 0x85, 0x77, 0xf5, 0x63, 0xa8, 0x78, 0xb6, - 0xcf, 0x02, 0x75, 0x27, 0x46, 0x94, 0x7d, 0x6e, 0xfb, 0xbc, 0x49, 0x52, 0x37, 0xb6, 0x74, 0x31, - 0xf7, 0x60, 0x29, 0xa3, 0xe7, 0x99, 0xc8, 0x5c, 0x66, 0x4f, 0xd4, 0x6d, 0x2d, 0x85, 0x78, 0x9a, - 0x52, 0x32, 0x8d, 0xb9, 0x07, 0x8d, 0xf8, 0x0c, 0xf9, 0xb1, 0x78, 0xe1, 0xd5, 0x6b, 0xd5, 0x76, - 0x35, 0x2d, 0x25, 0x89, 0xc4, 0x76, 0x3f, 0xa8, 0xb6, 0x41, 0xb7, 0xa4, 0x60, 0xfe, 0x47, 0x83, - 0xaa, 0x2c, 0xe9, 0x82, 0x66, 0xed, 0x77, 0xa2, 0x8b, 0x09, 0x71, 0x9f, 0x87, 0x2d, 0x70, 0xad, - 0xf8, 0x81, 0x20, 0x41, 0x3b, 0x22, 0x85, 0x1b, 0xc2, 0x8b, 0x7f, 0xa2, 0x07, 0xd0, 0x94, 0x90, - 0x80, 0xf9, 0x84, 0x46, 0xc9, 0xbb, 0x28, 0x74, 0x17, 0x42, 0xc5, 0x0f, 0x45, 0xba, 0x10, 0xca, - 0x44, 0x36, 0x94, 0xad, 0xba, 0x50, 0xf4, 0x28, 0x33, 0xef, 0x81, 0x2e, 0xc6, 0x01, 0xa8, 0x5e, - 0x5c, 0x5a, 0xbd, 0xb3, 0x13, 0x63, 0x01, 0xd5, 0xa0, 0xdc, 0x3b, 0xbb, 0x34, 0xb4, 0xc7, 0xff, - 0xab, 0x40, 0x3d, 0xaa, 0x1b, 0x54, 0x85, 0xd2, 0x9b, 0xd7, 0xc6, 0x02, 0x5a, 0x81, 0xa5, 0x1e, - 0x65, 0xd8, 0xa7, 0xf6, 0xe4, 0x98, 0x5f, 0x0a, 0x86, 0xc6, 0x55, 0xc7, 0x74, 0xe0, 0x3a, 0x84, - 0x8e, 0xa4, 0xaa, 0x84, 0x9a, 0x50, 0x3f, 0xb0, 0x9d, 0x33, 0x97, 0x0e, 0xb0, 0x51, 0x46, 0x06, - 0x34, 0xdf, 0x52, 0x3b, 0x64, 0x63, 0xd7, 0x27, 0xff, 0xc0, 0x8e, 0xa1, 0xa3, 0x35, 0x58, 0xe9, - 0xd1, 0x20, 0x1c, 0x0e, 0xc9, 0x80, 0x60, 0xca, 0x5e, 0x85, 0xd4, 0x09, 0x8c, 0x0a, 0x42, 0xd0, - 0x7a, 0x4b, 0xaf, 0xa9, 0xfb, 0x81, 0xaa, 0x66, 0xca, 0xa8, 0xa2, 0x0e, 0xb4, 0x0f, 0xec, 0x00, - 0x1f, 0x85, 0xde, 0x84, 0x0c, 0x6c, 0x86, 0xf7, 0x1d, 0xc7, 0xc7, 0x41, 0x60, 0x60, 0x3e, 0x08, - 0xb7, 0x64, 0xe7, 0x1e, 0x46, 0x80, 0xcc, 0xf8, 0x18, 0x07, 0xc6, 0x08, 0x6d, 0xc2, 0xda, 0x1d, - 0x8b, 0x98, 0x79, 0x8c, 0x7e, 0x01, 0x9d, 0xbc, 0xe9, 0xc4, 0x0e, 0xce, 0x7d, 0x32, 0xc0, 0x06, - 0x41, 0x6d, 0x30, 0xa4, 0x55, 0xa4, 0x6a, 0x8f, 0x7a, 0x21, 0x33, 0xfe, 0x1e, 0xcd, 0xaf, 0xb4, - 0x6f, 0x42, 0xc6, 0xd5, 0xd7, 0x39, 0xf5, 0xb9, 0x48, 0x07, 0x63, 0x82, 0x36, 0x60, 0x35, 0xa5, - 0xbe, 0xe0, 0xeb, 0xe3, 0xbb, 0x33, 0x4d, 0xe2, 0x95, 0x06, 0x32, 0xa2, 0x36, 0x0b, 0x7d, 0x6c, - 0x50, 0xb4, 0x0e, 0x88, 0x5b, 0xd4, 0x96, 0x44, 0x0b, 0x77, 0xa3, 0x19, 0x94, 0x5e, 0xcd, 0xe0, - 0xe5, 0xd5, 0x93, 0x70, 0x44, 0xa8, 0xf1, 0x1e, 0xad, 0x81, 0x71, 0xe2, 0xde, 0x28, 0xed, 0x31, - 0x65, 0x84, 0xdd, 0x1a, 0x5f, 0x68, 0xa8, 0x0d, 0xcb, 0x89, 0xfa, 0xc4, 0x77, 0x43, 0xcf, 0xf8, - 0x52, 0x43, 0x1b, 0x80, 0x12, 0xed, 0xb9, 0xef, 0x7a, 0x6e, 0x60, 0x4f, 0x8c, 0xaf, 0x34, 0xb4, - 0x0e, 0x2b, 0x27, 0xee, 0x4d, 0x7c, 0x0a, 0x12, 0xf0, 0x75, 0x04, 0x88, 0xf5, 0x7f, 0xc6, 0xd3, - 0x2b, 0xec, 0x1b, 0xdf, 0x68, 0x68, 0x13, 0xda, 0x69, 0x43, 0x3c, 0xd6, 0xb7, 0x9a, 0x8a, 0x28, - 0x36, 0xbd, 0x73, 0x19, 0x36, 0xbe, 0x8b, 0xd4, 0x6a, 0x1f, 0xd4, 0x40, 0xdf, 0x6b, 0x68, 0x15, - 0x5a, 0x89, 0x5a, 0xf8, 0xfe, 0xa0, 0xa1, 0x2e, 0xac, 0x65, 0x94, 0x84, 0x8e, 0xce, 0x79, 0x85, - 0x19, 0x3f, 0x6a, 0xbb, 0x1f, 0x2b, 0xb0, 0xbc, 0x7f, 0x70, 0xd8, 0xdb, 0xf7, 0xe4, 0x04, 0xfc, - 0x42, 0x7f, 0x0a, 0xba, 0x68, 0x59, 0x0a, 0xde, 0xf1, 0xdd, 0xa2, 0xde, 0x19, 0xed, 0x42, 0x45, - 0x74, 0x2e, 0xa8, 0xe8, 0x39, 0xdf, 0x2d, 0x6c, 0xa1, 0xf9, 0x24, 0xb2, 0xb7, 0xb9, 0xfb, 0xaa, - 0xef, 0x16, 0xf5, 0xd1, 0xe8, 0x4f, 0xd0, 0x48, 0x7a, 0x8e, 0x79, 0x6f, 0xfb, 0xee, 0xdc, 0x8e, - 0x9a, 0xe3, 0x93, 0x5e, 0x64, 0xde, 0x0b, 0xbf, 0x3b, 0xb7, 0xad, 0x46, 0x2f, 0xa0, 0x16, 0x35, - 0x12, 0xc5, 0xef, 0xfc, 0xee, 0x9c, 0xce, 0x9a, 0x6f, 0x8f, 0xec, 0x11, 0x8a, 0x9e, 0xef, 0xdd, - 0xc2, 0x66, 0x19, 0x3d, 0x87, 0xaa, 0xba, 0xa3, 0x0b, 0xff, 0x22, 0xe8, 0x16, 0xb7, 0xe4, 0x7c, - 0x91, 0xc9, 0x4b, 0x6f, 0xde, 0xdb, 0xbf, 0x3b, 0xb7, 0xd9, 0x46, 0xfb, 0x00, 0xa9, 0x37, 0xde, - 0xdc, 0x7f, 0x00, 0xba, 0xf3, 0x5b, 0x6e, 0xf4, 0x12, 0xea, 0xc9, 0xb3, 0xae, 0xf8, 0x7f, 0x80, - 0xee, 0xbc, 0xae, 0xfb, 0xaa, 0x2a, 0xfe, 0x62, 0x7a, 0xf6, 0x53, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x59, 0xf7, 0xaf, 0xdb, 0x77, 0x12, 0x00, 0x00, + // 1755 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0x49, 0x6f, 0xdb, 0xce, + 0x15, 0x37, 0x25, 0x6a, 0x7b, 0x96, 0x65, 0x7a, 0x2c, 0xdb, 0xb2, 0xd2, 0x43, 0xc2, 0x22, 0x8d, + 0x9d, 0xa6, 0x4e, 0xeb, 0x20, 0x45, 0xdc, 0x14, 0x05, 0xbc, 0xc5, 0x16, 0x82, 0x3a, 0x2e, 0xed, + 0xe4, 0xd2, 0x83, 0x40, 0x8b, 0x23, 0x69, 0x6a, 0x69, 0xc8, 0x90, 0x43, 0x47, 0xee, 0xa9, 0xbd, + 0xe7, 0xde, 0x8f, 0x50, 0xa0, 0xc7, 0x02, 0xfd, 0x0a, 0x05, 0xfe, 0xfb, 0xf2, 0x89, 0xfe, 0x98, + 0x85, 0xab, 0xa9, 0xe0, 0x7f, 0xc8, 0x85, 0x98, 0xb7, 0xcd, 0xbc, 0x99, 0x79, 0xef, 0xf7, 0x1e, + 0x07, 0x56, 0xd8, 0xad, 0x87, 0x83, 0xa7, 0xe2, 0xbb, 0xe3, 0xf9, 0x2e, 0x73, 0x51, 0x45, 0x10, + 0xe6, 0xff, 0x75, 0xa8, 0x59, 0xf8, 0x7d, 0x88, 0x03, 0x86, 0xb6, 0x40, 0xc7, 0x83, 0xb1, 0xdb, + 0xd1, 0xee, 0x6b, 0x5b, 0x8b, 0xbb, 0x68, 0x47, 0xaa, 0x2b, 0xe9, 0xf1, 0x60, 0xec, 0x9e, 0x2e, + 0x58, 0x42, 0x03, 0xfd, 0x1a, 0x2a, 0xc3, 0x49, 0x18, 0x8c, 0x3b, 0x25, 0xa1, 0xba, 0x9a, 0x55, + 0x7d, 0xc5, 0x45, 0xa7, 0x0b, 0x96, 0xd4, 0xe1, 0xd3, 0x12, 0x3a, 0x74, 0x3b, 0xe5, 0xa2, 0x69, + 0x7b, 0x74, 0x28, 0xa6, 0xe5, 0x1a, 0xe8, 0x05, 0x40, 0x80, 0x59, 0xdf, 0xf5, 0x18, 0x71, 0x69, + 0x47, 0x17, 0xfa, 0x1b, 0x59, 0xfd, 0x0b, 0xcc, 0xde, 0x08, 0xf1, 0xe9, 0x82, 0xd5, 0x08, 0x22, + 0x82, 0x5b, 0x3a, 0x78, 0x42, 0x6e, 0xb0, 0xdf, 0x67, 0xb3, 0x4e, 0xa5, 0xc8, 0xf2, 0x48, 0xca, + 0x2f, 0x67, 0xdc, 0xd2, 0x89, 0x08, 0xb4, 0x0b, 0xf5, 0xc1, 0x18, 0x0f, 0xae, 0xb9, 0x5d, 0x55, + 0xd8, 0xad, 0x65, 0xed, 0x0e, 0xb9, 0x54, 0x58, 0xd5, 0x06, 0x72, 0x88, 0x76, 0xa0, 0x3a, 0x70, + 0xa7, 0x53, 0xc2, 0x3a, 0x35, 0x61, 0xd1, 0xce, 0x59, 0x08, 0xd9, 0xe9, 0x82, 0xa5, 0xb4, 0xf8, + 0x71, 0xbd, 0x0f, 0xb1, 0x7f, 0xdb, 0xa9, 0x17, 0x1d, 0xd7, 0x5f, 0xb8, 0x88, 0x1f, 0x97, 0xd0, + 0xe1, 0x5b, 0x21, 0x94, 0xb0, 0xfe, 0x60, 0x6c, 0x13, 0xda, 0x69, 0x14, 0x6d, 0xa5, 0x47, 0x09, + 0x3b, 0xe4, 0x62, 0xbe, 0x15, 0x12, 0x11, 0xe8, 0x25, 0x2c, 0x5e, 0xe1, 0x11, 0xa1, 0xfd, 0xab, + 0x89, 0x3b, 0xb8, 0xee, 0x80, 0x30, 0xed, 0x64, 0x4d, 0x0f, 0xb8, 0xc2, 0x01, 0x97, 0x9f, 0x2e, + 0x58, 0x70, 0x15, 0x53, 0xe8, 0x39, 0x34, 0x30, 0x75, 0x94, 0xe9, 0xa2, 0x30, 0x5d, 0xcf, 0x45, + 0x00, 0x75, 0x22, 0xc3, 0x3a, 0x56, 0xe3, 0x83, 0x1a, 0x54, 0x6e, 0xec, 0x49, 0x88, 0xcd, 0x47, + 0xb0, 0x98, 0x8a, 0x14, 0xd4, 0x81, 0xda, 0x14, 0x07, 0x81, 0x3d, 0xc2, 0x22, 0x9c, 0x1a, 0x56, + 0x44, 0x9a, 0x2d, 0x68, 0xa6, 0xe3, 0x24, 0x65, 0xc8, 0x63, 0x81, 0x1b, 0xde, 0x60, 0x3f, 0xe0, + 0x01, 0xa0, 0x0c, 0x15, 0x69, 0xfe, 0x01, 0x8c, 0x7c, 0x10, 0x20, 0x03, 0xca, 0xd7, 0xf8, 0x56, + 0x69, 0xf2, 0x21, 0x6a, 0x2b, 0x87, 0x44, 0x68, 0x36, 0x2c, 0xe5, 0x9d, 0x19, 0xdb, 0xc6, 0x61, + 0x80, 0x5a, 0x50, 0x62, 0x33, 0x61, 0xda, 0xb4, 0x4a, 0x6c, 0x66, 0xde, 0x87, 0x56, 0xf6, 0xca, + 0xef, 0x68, 0x38, 0xb1, 0xeb, 0xe2, 0xce, 0x10, 0x02, 0xdd, 0xb1, 0x99, 0xad, 0x34, 0xc4, 0x98, + 0xf3, 0x3c, 0x9b, 0x8d, 0xd5, 0xf2, 0x62, 0x8c, 0xd6, 0xa1, 0x3a, 0xc6, 0x64, 0x34, 0x66, 0x22, + 0x07, 0x74, 0x4b, 0x51, 0xdc, 0x57, 0xcf, 0x77, 0x6f, 0xb0, 0x08, 0xf5, 0xba, 0x25, 0x09, 0x73, + 0x19, 0x96, 0x32, 0x81, 0x64, 0x1e, 0xc5, 0xce, 0xc7, 0x17, 0x8f, 0x7e, 0x0b, 0x70, 0x63, 0x4f, + 0x88, 0x63, 0x33, 0xd7, 0x0f, 0x3a, 0xda, 0xfd, 0xf2, 0xd6, 0xe2, 0xae, 0xa1, 0xee, 0xeb, 0x5d, + 0x24, 0xb0, 0x52, 0x3a, 0xe6, 0x19, 0xac, 0xdc, 0x89, 0x01, 0xee, 0xed, 0xd8, 0x0e, 0xc6, 0xd1, + 0x0e, 0xf8, 0x18, 0x3d, 0xe4, 0xde, 0xda, 0x0e, 0xf6, 0x55, 0x76, 0x2f, 0xa9, 0x69, 0x4f, 0x05, + 0xd3, 0x52, 0x42, 0x73, 0x1b, 0x96, 0x73, 0x81, 0x91, 0xda, 0xa7, 0x96, 0xde, 0xa7, 0xf9, 0xb1, + 0x02, 0x75, 0x0b, 0x07, 0x9e, 0x4b, 0x03, 0x8c, 0x5e, 0x40, 0x03, 0xcf, 0x06, 0x58, 0xe6, 0xb8, + 0x96, 0x8b, 0x51, 0xa9, 0x73, 0x1c, 0xc9, 0x79, 0x7c, 0xc7, 0xca, 0x68, 0x5b, 0xe1, 0x53, 0x1e, + 0x74, 0x94, 0x51, 0x1a, 0xa0, 0x9e, 0x44, 0x00, 0x55, 0xce, 0x25, 0xa8, 0xd4, 0xcd, 0x21, 0xd4, + 0xb6, 0x42, 0x28, 0xbd, 0x70, 0xe2, 0x0c, 0x44, 0xed, 0x65, 0x20, 0xaa, 0x52, 0xe8, 0xfe, 0x1c, + 0x8c, 0xda, 0xcb, 0x60, 0x54, 0xb5, 0xd0, 0x74, 0x0e, 0x48, 0x3d, 0x4b, 0x81, 0x54, 0x2d, 0x97, + 0x9b, 0xd2, 0xb0, 0x00, 0xa5, 0x9e, 0xc6, 0x28, 0x55, 0xcf, 0xe1, 0x9a, 0x32, 0xc9, 0xc3, 0xd4, + 0x93, 0x08, 0xa6, 0x1a, 0x85, 0x87, 0x96, 0xc3, 0xa9, 0xbd, 0x0c, 0x4e, 0x41, 0xe1, 0x76, 0xe6, + 0x00, 0xd5, 0x1f, 0xb3, 0x40, 0x25, 0xd1, 0x66, 0x33, 0x67, 0x3b, 0x17, 0xa9, 0x7e, 0x9f, 0x46, + 0xaa, 0x66, 0x0e, 0x1f, 0x55, 0x2c, 0x7c, 0x12, 0xaa, 0xb6, 0x79, 0x26, 0xe4, 0x22, 0x8d, 0xe7, + 0x22, 0xf6, 0x7d, 0xd7, 0x57, 0x58, 0x22, 0x09, 0x73, 0x8b, 0x67, 0x7c, 0x12, 0x5f, 0x9f, 0x80, + 0x35, 0x91, 0xb5, 0xa9, 0xe8, 0x32, 0xff, 0xa5, 0x25, 0xb6, 0x02, 0xd9, 0xd2, 0x68, 0xd1, 0x50, + 0x68, 0x91, 0x42, 0xbb, 0x52, 0x06, 0xed, 0xd0, 0x63, 0x58, 0x99, 0xd8, 0x01, 0x93, 0xdb, 0xec, + 0x67, 0xe0, 0x63, 0x99, 0x0b, 0xe4, 0xfe, 0x24, 0x8e, 0xfc, 0x06, 0x56, 0x53, 0xba, 0xb6, 0xe7, + 0xf5, 0x45, 0x52, 0xeb, 0x22, 0xa9, 0x8d, 0x58, 0x7b, 0xdf, 0xf3, 0x4e, 0xed, 0x60, 0x6c, 0x3e, + 0x4c, 0xf6, 0x9f, 0x41, 0xd2, 0x89, 0x3b, 0x8a, 0x90, 0x74, 0xe2, 0x8e, 0xcc, 0x7f, 0x6a, 0x89, + 0x5e, 0x82, 0x9a, 0xbf, 0x04, 0x7d, 0xe0, 0x3a, 0x72, 0xfb, 0xad, 0xdd, 0x65, 0x75, 0xf0, 0x87, + 0xae, 0x83, 0x2f, 0x6f, 0x3d, 0x6c, 0x09, 0x61, 0xbc, 0xd5, 0x52, 0x0a, 0x18, 0xd5, 0x02, 0xe5, + 0x78, 0x01, 0xf4, 0x00, 0x74, 0x66, 0x8f, 0x82, 0x8e, 0x2e, 0xd0, 0x2b, 0x82, 0x99, 0xd7, 0xef, + 0xce, 0x6d, 0xe2, 0x5b, 0x42, 0x64, 0xfe, 0x43, 0xe3, 0x28, 0x93, 0x09, 0xf1, 0xcf, 0xe9, 0x81, + 0x01, 0xe5, 0x91, 0x1d, 0x88, 0x83, 0xd2, 0x2d, 0x3e, 0xe4, 0x9c, 0x21, 0xc6, 0x22, 0xb1, 0x75, + 0x8b, 0x0f, 0xcd, 0xff, 0x6a, 0xc9, 0xcd, 0x4a, 0xd8, 0xff, 0x59, 0x0e, 0xb4, 0xa1, 0x42, 0xa8, + 0x83, 0x67, 0xc2, 0x83, 0xb2, 0x25, 0x89, 0xa8, 0x5e, 0x95, 0x85, 0x57, 0xd9, 0x7a, 0x25, 0x6f, + 0x4b, 0x12, 0xaa, 0x32, 0xb8, 0x43, 0xe1, 0x48, 0xd3, 0x92, 0x44, 0x0a, 0x5f, 0xab, 0x99, 0x3a, + 0xa2, 0x36, 0x56, 0x4b, 0xee, 0xee, 0xaf, 0xbc, 0x96, 0xa5, 0xd3, 0xfc, 0x33, 0x9e, 0x9a, 0xb9, + 0x9a, 0xc4, 0x45, 0x9c, 0xe0, 0x66, 0x1b, 0xd0, 0xdd, 0xcc, 0x95, 0x35, 0x3b, 0x9b, 0x93, 0xe8, + 0x57, 0x50, 0x71, 0xc8, 0x70, 0x38, 0xbf, 0x6a, 0x49, 0xb1, 0xf9, 0xef, 0x12, 0x54, 0x65, 0xcd, + 0x41, 0x9b, 0x1c, 0xff, 0x6c, 0x42, 0xfb, 0xc4, 0x89, 0xf2, 0x4e, 0xd0, 0x3d, 0x27, 0x75, 0x26, + 0xa5, 0xcc, 0x99, 0x20, 0xd0, 0x19, 0x99, 0x62, 0x95, 0x32, 0x62, 0x8c, 0x36, 0xa0, 0x46, 0xc3, + 0x69, 0x9f, 0xcd, 0xa2, 0x2b, 0xaf, 0xd2, 0x70, 0x7a, 0x39, 0x0b, 0xd0, 0x2e, 0x2c, 0xa5, 0x12, + 0x88, 0x38, 0x0a, 0xd8, 0x5b, 0xca, 0x35, 0xe1, 0x77, 0xef, 0xc8, 0x5a, 0x8c, 0x53, 0xa9, 0xe7, + 0xa0, 0x2d, 0x10, 0x99, 0xd5, 0x97, 0xe0, 0x29, 0x33, 0xae, 0x2a, 0xce, 0xad, 0xc5, 0xf9, 0x0a, + 0x5d, 0x79, 0x41, 0xbd, 0x07, 0x0d, 0x7e, 0x92, 0x52, 0xa5, 0x26, 0x54, 0xea, 0x9c, 0x21, 0x84, + 0x8f, 0x60, 0x39, 0x29, 0xd2, 0x52, 0xa5, 0x2e, 0x67, 0x49, 0xd8, 0x42, 0x71, 0x13, 0xea, 0x71, + 0x66, 0x37, 0x84, 0x46, 0xcd, 0x56, 0x09, 0xdd, 0x83, 0x9a, 0x72, 0xb1, 0xb0, 0xa0, 0x3f, 0x86, + 0x8a, 0x67, 0xfb, 0x2c, 0x50, 0x85, 0x33, 0xc2, 0xf5, 0x73, 0xdb, 0xe7, 0x9d, 0x94, 0x2a, 0xeb, + 0x52, 0xc5, 0xdc, 0x83, 0xa5, 0x0c, 0x9f, 0x47, 0x22, 0x73, 0x99, 0x3d, 0x51, 0x25, 0x5d, 0x12, + 0xf1, 0x32, 0xa5, 0x64, 0x19, 0x73, 0x0f, 0x1a, 0xf1, 0x1d, 0xf2, 0x6b, 0xf1, 0xc2, 0xab, 0xd7, + 0xaa, 0x37, 0x6b, 0x5a, 0x8a, 0x12, 0x81, 0xed, 0x7e, 0x50, 0xbd, 0x85, 0x6e, 0x49, 0xc2, 0xfc, + 0x8f, 0x06, 0x55, 0x99, 0xf7, 0x05, 0x1d, 0xdd, 0xef, 0x44, 0xab, 0x13, 0xe2, 0x3e, 0x77, 0x5b, + 0xd8, 0xb5, 0xe2, 0xbf, 0x08, 0x69, 0xb4, 0x23, 0x42, 0xb8, 0x21, 0xb4, 0xf8, 0x10, 0x3d, 0x80, + 0xa6, 0x34, 0x09, 0x98, 0x4f, 0x68, 0x14, 0xbc, 0x8b, 0x82, 0x77, 0x21, 0x58, 0xfc, 0x52, 0xa4, + 0x0a, 0xa1, 0x4c, 0x44, 0x43, 0xd9, 0xaa, 0x0b, 0x46, 0x8f, 0x32, 0xf3, 0x1e, 0xe8, 0x62, 0x1e, + 0x80, 0xea, 0xc5, 0xa5, 0xd5, 0x3b, 0x3b, 0x31, 0x16, 0x50, 0x0d, 0xca, 0xbd, 0xb3, 0x4b, 0x43, + 0x7b, 0xfc, 0xbf, 0x0a, 0xd4, 0xa3, 0xbc, 0x41, 0x55, 0x28, 0xbd, 0x79, 0x6d, 0x2c, 0xa0, 0x15, + 0x58, 0xea, 0x51, 0x86, 0x7d, 0x6a, 0x4f, 0x8e, 0x79, 0xe5, 0x30, 0x34, 0xce, 0x3a, 0xa6, 0x03, + 0xd7, 0x21, 0x74, 0x24, 0x59, 0x25, 0xd4, 0x84, 0xfa, 0x81, 0xed, 0x9c, 0xb9, 0x74, 0x80, 0x8d, + 0x32, 0x32, 0xa0, 0xf9, 0x96, 0xda, 0x21, 0x1b, 0xbb, 0x3e, 0xf9, 0x3b, 0x76, 0x0c, 0x1d, 0xad, + 0xc1, 0x4a, 0x8f, 0x06, 0xe1, 0x70, 0x48, 0x06, 0x04, 0x53, 0xf6, 0x2a, 0xa4, 0x4e, 0x60, 0x54, + 0x10, 0x82, 0xd6, 0x5b, 0x7a, 0x4d, 0xdd, 0x0f, 0x54, 0x75, 0x5c, 0x46, 0x15, 0x75, 0xa0, 0x7d, + 0x60, 0x07, 0xf8, 0x28, 0xf4, 0x26, 0x64, 0x60, 0x33, 0xbc, 0xef, 0x38, 0x3e, 0x0e, 0x02, 0x03, + 0xf3, 0x49, 0xb8, 0x24, 0xbb, 0xf6, 0x30, 0x32, 0xc8, 0xcc, 0x8f, 0x71, 0x60, 0x8c, 0xd0, 0x26, + 0xac, 0xdd, 0x91, 0x88, 0x95, 0xc7, 0xe8, 0x17, 0xd0, 0xc9, 0x8b, 0x4e, 0xec, 0xe0, 0xdc, 0x27, + 0x03, 0x6c, 0x10, 0xd4, 0x06, 0x43, 0x4a, 0x45, 0xa8, 0xf6, 0xa8, 0x17, 0x32, 0xe3, 0x6f, 0xd1, + 0xfa, 0x8a, 0xfb, 0x26, 0x64, 0x9c, 0x7d, 0x9d, 0x63, 0x9f, 0x8b, 0x70, 0x30, 0x26, 0x68, 0x03, + 0x56, 0x53, 0xec, 0x0b, 0xbe, 0x3f, 0x7e, 0x3a, 0xd3, 0xc4, 0x5f, 0x29, 0x20, 0x23, 0x6a, 0xb3, + 0xd0, 0xc7, 0x06, 0x45, 0xeb, 0x80, 0xb8, 0x44, 0x1d, 0x49, 0xb4, 0x71, 0x37, 0x5a, 0x41, 0xf1, + 0xd5, 0x0a, 0x5e, 0x9e, 0x3d, 0x09, 0x47, 0x84, 0x1a, 0xef, 0xd1, 0x1a, 0x18, 0x27, 0xee, 0x8d, + 0xe2, 0x1e, 0x53, 0x46, 0xd8, 0xad, 0xf1, 0x85, 0x86, 0xda, 0xb0, 0x9c, 0xb0, 0x4f, 0x7c, 0x37, + 0xf4, 0x8c, 0x2f, 0x35, 0xb4, 0x01, 0x28, 0xe1, 0x9e, 0xfb, 0xae, 0xe7, 0x06, 0xf6, 0xc4, 0xf8, + 0x4a, 0x43, 0xeb, 0xb0, 0x72, 0xe2, 0xde, 0xc4, 0xb7, 0x20, 0x0d, 0xbe, 0x8e, 0x0c, 0x62, 0xfe, + 0x9f, 0xf1, 0xf4, 0x0a, 0xfb, 0xc6, 0x37, 0x1a, 0xda, 0x84, 0x76, 0x5a, 0x10, 0xcf, 0xf5, 0xad, + 0xa6, 0x3c, 0x8a, 0x45, 0xef, 0x5c, 0x86, 0x8d, 0xef, 0x22, 0xb6, 0x3a, 0x07, 0x35, 0xd1, 0xf7, + 0x1a, 0x5a, 0x85, 0x56, 0xc2, 0x16, 0xba, 0x3f, 0x68, 0xa8, 0x0b, 0x6b, 0x19, 0x26, 0xa1, 0xa3, + 0x73, 0x9e, 0x61, 0xc6, 0x8f, 0xda, 0xee, 0xc7, 0x0a, 0x2c, 0xef, 0x1f, 0x1c, 0xf6, 0xf6, 0x3d, + 0xb9, 0x00, 0xaf, 0xfa, 0x4f, 0x41, 0x17, 0x7d, 0x4d, 0xc1, 0xcf, 0x7e, 0xb7, 0xa8, 0xc1, 0x46, + 0xbb, 0x50, 0x11, 0xed, 0x0d, 0x2a, 0xfa, 0xe7, 0xef, 0x16, 0xf6, 0xd9, 0x7c, 0x11, 0xd9, 0x00, + 0xdd, 0xfd, 0xf5, 0xef, 0x16, 0x35, 0xdb, 0xe8, 0x4f, 0xd0, 0x48, 0x1a, 0x93, 0x79, 0x0f, 0x00, + 0xdd, 0xb9, 0x6d, 0x37, 0xb7, 0x4f, 0x1a, 0x96, 0x79, 0xcf, 0x00, 0xdd, 0xb9, 0xbd, 0x37, 0x7a, + 0x01, 0xb5, 0xa8, 0xd9, 0x28, 0x7e, 0x0c, 0xe8, 0xce, 0x69, 0xbf, 0xf9, 0xf1, 0xc8, 0x1e, 0xa1, + 0xe8, 0x1f, 0xbf, 0x5b, 0xd8, 0x51, 0xa3, 0xe7, 0x50, 0x55, 0x35, 0xba, 0xf0, 0x1d, 0xa1, 0x5b, + 0xdc, 0xb7, 0xf3, 0x4d, 0x26, 0xbf, 0x83, 0xf3, 0x1e, 0x08, 0xba, 0x73, 0x3b, 0x72, 0xb4, 0x0f, + 0x90, 0xfa, 0x11, 0x9c, 0xfb, 0x4c, 0xd0, 0x9d, 0xdf, 0x97, 0xa3, 0x97, 0x50, 0x4f, 0xfe, 0xfd, + 0x8a, 0x1f, 0x0b, 0xba, 0xf3, 0x5a, 0xf3, 0xab, 0xaa, 0x78, 0x87, 0x7a, 0xf6, 0x53, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x3c, 0xa1, 0xc6, 0x00, 0x9c, 0x12, 0x00, 0x00, } diff --git a/types/types.proto b/types/types.proto index e83df9851..7b2c75e32 100644 --- a/types/types.proto +++ b/types/types.proto @@ -166,6 +166,8 @@ message ResponseCheckTx{ CodeType code = 1; bytes data = 2; string log = 3; + uint64 gas = 4; + uint64 fee = 5; } message ResponseQuery{ From e08885e3cdf3163c2bbc81ddef9471ee15943cd8 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 27 Nov 2017 20:16:35 +0000 Subject: [PATCH 36/42] minor fix --- types/application.go | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/types/application.go b/types/application.go index c36e58f09..bb9a0030d 100644 --- a/types/application.go +++ b/types/application.go @@ -45,46 +45,46 @@ 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(*req) - return &resInfo, nil + res := app.app.Info(*req) + return &res, nil } func (app *GRPCApplication) SetOption(ctx context.Context, req *RequestSetOption) (*ResponseSetOption, error) { - resSetOption := app.app.SetOption(*req) - return &resSetOption, nil + res := app.app.SetOption(*req) + return &res, nil } func (app *GRPCApplication) DeliverTx(ctx context.Context, req *RequestDeliverTx) (*ResponseDeliverTx, error) { - r := app.app.DeliverTx(req.Tx) - return &ResponseDeliverTx{r.Code, r.Data, r.Log, r.Tags}, nil + res := app.app.DeliverTx(req.Tx) + return &res, nil } func (app *GRPCApplication) CheckTx(ctx context.Context, req *RequestCheckTx) (*ResponseCheckTx, error) { - r := app.app.CheckTx(req.Tx) - return &ResponseCheckTx{r.Code, r.Data, r.Log}, nil + res := app.app.CheckTx(req.Tx) + return &res, nil } func (app *GRPCApplication) Query(ctx context.Context, req *RequestQuery) (*ResponseQuery, error) { - resQuery := app.app.Query(*req) - return &resQuery, nil + res := app.app.Query(*req) + return &res, nil } func (app *GRPCApplication) Commit(ctx context.Context, req *RequestCommit) (*ResponseCommit, error) { - r := app.app.Commit() - return &ResponseCommit{r.Code, r.Data, r.Log}, nil + res := app.app.Commit() + return &res, nil } func (app *GRPCApplication) InitChain(ctx context.Context, req *RequestInitChain) (*ResponseInitChain, error) { - resInitChain := app.app.InitChain(*req) - return &resInitChain, nil + res := app.app.InitChain(*req) + return &res, nil } func (app *GRPCApplication) BeginBlock(ctx context.Context, req *RequestBeginBlock) (*ResponseBeginBlock, error) { - resBeginBlock := app.app.BeginBlock(*req) - return &resBeginBlock, nil + res := app.app.BeginBlock(*req) + return &res, nil } func (app *GRPCApplication) EndBlock(ctx context.Context, req *RequestEndBlock) (*ResponseEndBlock, error) { - resEndBlock := app.app.EndBlock(*req) - return &resEndBlock, nil + res := app.app.EndBlock(*req) + return &res, nil } From e9094fbee3001db87f495fb8b6387cdc7deab75d Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 27 Nov 2017 20:19:04 +0000 Subject: [PATCH 37/42] update changelog --- CHANGELOG.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9db1817c4..3c6956cfc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,14 @@ ## 0.8.0 (TBD) BREAKING CHANGES: - - [client] all {X}Sync methods now return an error + - [client] all XxxSync methods now return (ResponseXxx, error) + - [types] Application: all methods take RequestXxx and return (ResponseXxx, error), + except CheckTx/DeliverTx, which take `tx []byte`, and `Commit`, which takes nothing. - [types] removed Result - - [client] all {X}Sync methods now return Response{X} as first return value -IMPROVEMENTS: +FEATURES: - [types] added Tags field to ResponseDeliverTx + - [types] added Gas and Fee fields to ResponseCheckTx ## 0.7.1 (November 14, 2017) From 5a46675185d2bd76b79819075703a32b1cc175be Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 27 Nov 2017 20:27:18 +0000 Subject: [PATCH 38/42] minor things --- CHANGELOG.md | 5 +++-- client/socket_client.go | 9 ++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c6956cfc..44db318bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,9 @@ BREAKING CHANGES: - [client] all XxxSync methods now return (ResponseXxx, error) - - [types] Application: all methods take RequestXxx and return (ResponseXxx, error), - except CheckTx/DeliverTx, which take `tx []byte`, and `Commit`, which takes nothing. + - [types] Application: all methods now take RequestXxx and return (ResponseXxx, error). + - Except `CheckTx`/`DeliverTx`, which takes a `tx []byte` argument. + - Except `Commit`, which takes no arguments. - [types] removed Result FEATURES: diff --git a/client/socket_client.go b/client/socket_client.go index 84377a055..7e5a1f30f 100644 --- a/client/socket_client.go +++ b/client/socket_client.go @@ -14,11 +14,6 @@ import ( cmn "github.com/tendermint/tmlibs/common" ) -const ( - OK = types.CodeType_OK - LOG = "" -) - const reqQueueSize = 256 // TODO make configurable // const maxResponseSize = 1048576 // 1MB TODO make configurable const flushThrottleMS = 20 // Don't wait longer than... @@ -251,8 +246,8 @@ func (cli *socketClient) CheckTxAsync(tx []byte) *ReqRes { return cli.queueRequest(types.ToRequestCheckTx(tx)) } -func (cli *socketClient) QueryAsync(reqQuery types.RequestQuery) *ReqRes { - return cli.queueRequest(types.ToRequestQuery(reqQuery)) +func (cli *socketClient) QueryAsync(req types.RequestQuery) *ReqRes { + return cli.queueRequest(types.ToRequestQuery(req)) } func (cli *socketClient) CommitAsync() *ReqRes { From 26d967af7e5d348a5c072f121f931925258d29e9 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 27 Nov 2017 20:42:30 +0000 Subject: [PATCH 39/42] linter --- cmd/abci-cli/abci-cli.go | 4 ++-- server/socket_server.go | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/cmd/abci-cli/abci-cli.go b/cmd/abci-cli/abci-cli.go index d6e95d963..789832508 100644 --- a/cmd/abci-cli/abci-cli.go +++ b/cmd/abci-cli/abci-cli.go @@ -294,7 +294,7 @@ func cmdBatch(cmd *cobra.Command, args []string) error { } pArgs := persistentArgs(line) - out, err := exec.Command(pArgs[0], pArgs[1:]...).Output() + out, err := exec.Command(pArgs[0], pArgs[1:]...).Output() // nolint: gas if err != nil { return err } @@ -316,7 +316,7 @@ func cmdConsole(cmd *cobra.Command, args []string) error { } pArgs := persistentArgs(line) - out, err := exec.Command(pArgs[0], pArgs[1:]...).Output() + out, err := exec.Command(pArgs[0], pArgs[1:]...).Output() // nolint: gas if err != nil { return err } diff --git a/server/socket_server.go b/server/socket_server.go index c88180d43..eb26dc353 100644 --- a/server/socket_server.go +++ b/server/socket_server.go @@ -56,13 +56,17 @@ func (s *SocketServer) OnStart() error { func (s *SocketServer) OnStop() { s.BaseService.OnStop() - s.listener.Close() + if err := s.listener.Close(); err != nil { + s.Logger.Error("Error closing listener", "err", err) + } s.connsMtx.Lock() defer s.connsMtx.Unlock() for id, conn := range s.conns { delete(s.conns, id) - conn.Close() + if err := conn.Close(); err != nil { + s.Logger.Error("Error closing connection", "id", id, "conn", conn, "err", err) + } } } From ab51bdef994946d5bf24c5808d730b493c8e923e Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 27 Nov 2017 20:53:03 +0000 Subject: [PATCH 40/42] types.pb.go isnt linted. use nolint :( --- types/types.pb.go | 1 + 1 file changed, 1 insertion(+) diff --git a/types/types.pb.go b/types/types.pb.go index 7b278ea26..e433d1986 100644 --- a/types/types.pb.go +++ b/types/types.pb.go @@ -40,6 +40,7 @@ It has these top-level messages: Validator KVPair */ +//nolint: gas package types import proto "github.com/golang/protobuf/proto" From 0981c174ccc3f5ea7dea40f1e2b7d7cabfdc8b14 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 27 Nov 2017 22:28:41 +0000 Subject: [PATCH 41/42] update README for CheckTx Gas and Fee --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4cfcce749..f2546c004 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,8 @@ Here, we describe the requests and responses as function arguments and return va * `Code (uint32)`: Response code * `Data ([]byte)`: Result bytes, if any * `Log (string)`: Debug or error message + * `Gas (uint64)`: Amount of gas consumed by transaction + * `Fee (uint64)`: Fee paid by transaction * __Usage__:
Validate a mempool transaction, prior to broadcasting or proposing. This message should not mutate the main state, but application developers may want to keep a separate CheckTx state that gets reset upon Commit. From a0bf6dc1a136bbd79785649c2d678a75ed491ee5 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 27 Nov 2017 16:27:18 -0600 Subject: [PATCH 42/42] move comment --- Makefile | 1 - test.sh | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ab9223f61..11a75664a 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,6 @@ dist: @ bash scripts/dist.sh @ bash scripts/publish.sh -# test.sh requires that we run the installed cmds, must not be out of date test: @ find . -path ./vendor -prune -o -name "*.sock" -exec rm {} \; @ echo "==> Running go test" diff --git a/test.sh b/test.sh index 33839c062..978b26e1f 100755 --- a/test.sh +++ b/test.sh @@ -14,5 +14,6 @@ done echo "==> Running integration tests (./tests)" find . -path ./vendor -prune -o -name "*.sock" -exec rm {} \; +# tests/test.sh requires that we run the installed cmds, must not be out of date make install bash tests/test.sh