diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md
index 3ab1632e3..405e95696 100644
--- a/CHANGELOG_PENDING.md
+++ b/CHANGELOG_PENDING.md
@@ -21,6 +21,7 @@ program](https://hackerone.com/tendermint).
- [rpc] \#2010 Add NewHTTPWithClient and NewJSONRPCClientWithHTTPClient (note these and NewHTTP, NewJSONRPCClient functions panic if remote is invalid) (@gracenoah)
- [rpc] \#3984 Add `MempoolClient` interface to `Client` interface
+- [rpc] \#3882 Add custom marshalers to proto messages to disable `omitempty`
### BUG FIXES:
diff --git a/Makefile b/Makefile
index 6870258f6..e7937cfc6 100644
--- a/Makefile
+++ b/Makefile
@@ -15,7 +15,7 @@ BUILD_FLAGS = -mod=readonly -ldflags "$(LD_FLAGS)"
all: check build test install
# The below include contains the tools.
-include scripts/devtools/Makefile
+include tools.mk
include tests.mk
########################################
@@ -153,10 +153,6 @@ lint:
DESTINATION = ./index.html.md
-rpc-docs:
- cat rpc/core/slate_header.txt > $(DESTINATION)
- godoc2md -template rpc/core/doc_template.txt github.com/tendermint/tendermint/rpc/core | grep -v -e "pipe.go" -e "routes.go" -e "dev.go" | sed 's,/src/target,https://github.com/tendermint/tendermint/tree/master/rpc/core,' >> $(DESTINATION)
-
###########################################################
### Docker image
diff --git a/abci/types/messages_test.go b/abci/types/messages_test.go
index 904b16410..b9ba72dcf 100644
--- a/abci/types/messages_test.go
+++ b/abci/types/messages_test.go
@@ -15,9 +15,8 @@ import (
func TestMarshalJSON(t *testing.T) {
b, err := json.Marshal(&ResponseDeliverTx{})
assert.Nil(t, err)
- // Do not include empty fields.
- assert.False(t, strings.Contains(string(b), "code"))
-
+ // include empty fields.
+ assert.True(t, strings.Contains(string(b), "code"))
r1 := ResponseCheckTx{
Code: 1,
Data: []byte("hello"),
diff --git a/abci/types/result.go b/abci/types/result.go
index dbf409f4c..321e71f08 100644
--- a/abci/types/result.go
+++ b/abci/types/result.go
@@ -42,14 +42,12 @@ func (r ResponseQuery) IsErr() bool {
}
//---------------------------------------------------------------------------
-// override JSON marshalling so we dont emit defaults (ie. disable omitempty)
-// note we need Unmarshal functions too because protobuf had the bright idea
-// to marshal int64->string. cool. cool, cool, cool: https://developers.google.com/protocol-buffers/docs/proto3#json
+// override JSON marshalling so we emit defaults (ie. disable omitempty)
var (
jsonpbMarshaller = jsonpb.Marshaler{
EnumsAsInts: true,
- EmitDefaults: false,
+ EmitDefaults: true,
}
jsonpbUnmarshaller = jsonpb.Unmarshaler{}
)
diff --git a/crypto/merkle/result.go b/crypto/merkle/result.go
new file mode 100644
index 000000000..c7bbb575f
--- /dev/null
+++ b/crypto/merkle/result.go
@@ -0,0 +1,53 @@
+// nolint: dupl
+package merkle
+
+import (
+ "bytes"
+ "encoding/json"
+
+ "github.com/gogo/protobuf/jsonpb"
+)
+
+//---------------------------------------------------------------------------
+// override JSON marshalling so we emit defaults (ie. disable omitempty)
+
+var (
+ jsonpbMarshaller = jsonpb.Marshaler{
+ EnumsAsInts: true,
+ EmitDefaults: true,
+ }
+ jsonpbUnmarshaller = jsonpb.Unmarshaler{}
+)
+
+func (r *ProofOp) MarshalJSON() ([]byte, error) {
+ s, err := jsonpbMarshaller.MarshalToString(r)
+ return []byte(s), err
+}
+
+func (r *ProofOp) UnmarshalJSON(b []byte) error {
+ reader := bytes.NewBuffer(b)
+ return jsonpbUnmarshaller.Unmarshal(reader, r)
+}
+
+func (r *Proof) MarshalJSON() ([]byte, error) {
+ s, err := jsonpbMarshaller.MarshalToString(r)
+ return []byte(s), err
+}
+
+func (r *Proof) UnmarshalJSON(b []byte) error {
+ reader := bytes.NewBuffer(b)
+ return jsonpbUnmarshaller.Unmarshal(reader, r)
+}
+
+// Some compile time assertions to ensure we don't
+// have accidental runtime surprises later on.
+// jsonEncodingRoundTripper ensures that asserted
+// interfaces implement both MarshalJSON and UnmarshalJSON
+
+type jsonRoundTripper interface {
+ json.Marshaler
+ json.Unmarshaler
+}
+
+var _ jsonRoundTripper = (*ProofOp)(nil)
+var _ jsonRoundTripper = (*Proof)(nil)
diff --git a/libs/common/result.go b/libs/common/result.go
new file mode 100644
index 000000000..90d149f4b
--- /dev/null
+++ b/libs/common/result.go
@@ -0,0 +1,54 @@
+// nolint: dupl
+// dupl is reading this as the same file as crypto/merkle/result.go
+package common
+
+import (
+ "bytes"
+ "encoding/json"
+
+ "github.com/gogo/protobuf/jsonpb"
+)
+
+//---------------------------------------------------------------------------
+// override JSON marshalling so we emit defaults (ie. disable omitempty)
+
+var (
+ jsonpbMarshaller = jsonpb.Marshaler{
+ EnumsAsInts: true,
+ EmitDefaults: true,
+ }
+ jsonpbUnmarshaller = jsonpb.Unmarshaler{}
+)
+
+func (r *KVPair) MarshalJSON() ([]byte, error) {
+ s, err := jsonpbMarshaller.MarshalToString(r)
+ return []byte(s), err
+}
+
+func (r *KVPair) UnmarshalJSON(b []byte) error {
+ reader := bytes.NewBuffer(b)
+ return jsonpbUnmarshaller.Unmarshal(reader, r)
+}
+
+func (r *KI64Pair) MarshalJSON() ([]byte, error) {
+ s, err := jsonpbMarshaller.MarshalToString(r)
+ return []byte(s), err
+}
+
+func (r *KI64Pair) UnmarshalJSON(b []byte) error {
+ reader := bytes.NewBuffer(b)
+ return jsonpbUnmarshaller.Unmarshal(reader, r)
+}
+
+// Some compile time assertions to ensure we don't
+// have accidental runtime surprises later on.
+// jsonEncodingRoundTripper ensures that asserted
+// interfaces implement both MarshalJSON and UnmarshalJSON
+
+type jsonRoundTripper interface {
+ json.Marshaler
+ json.Unmarshaler
+}
+
+var _ jsonRoundTripper = (*KVPair)(nil)
+var _ jsonRoundTripper = (*KI64Pair)(nil)
diff --git a/rpc/core/README.md b/rpc/core/README.md
index 32c3051e3..d767c5f71 100644
--- a/rpc/core/README.md
+++ b/rpc/core/README.md
@@ -1,15 +1,5 @@
# Tendermint RPC
-We are using [Slate](https://github.com/lord/slate) to power our RPC
-documentation. For generating markdown use:
-
-```shell
-go get github.com/davecheney/godoc2md
-
-# from root of this repo
-make rpc-docs
-```
-
## Pagination
Requests that return multiple items will be paginated to 30 items by default.
diff --git a/rpc/core/slate_header.txt b/rpc/core/slate_header.txt
deleted file mode 100644
index bb4ca6e03..000000000
--- a/rpc/core/slate_header.txt
+++ /dev/null
@@ -1,13 +0,0 @@
----
-title: RPC Reference
-
-language_tabs: # must be one of https://git.io/vQNgJ
- - shell
- - go
-
-toc_footers:
- - Tendermint
- - Documentation Powered by Slate
-
-search: true
----
diff --git a/scripts/devtools/Makefile b/tools.mk
similarity index 86%
rename from scripts/devtools/Makefile
rename to tools.mk
index 1ca24bf9d..f0a8338a6 100644
--- a/scripts/devtools/Makefile
+++ b/tools.mk
@@ -40,7 +40,6 @@ mkfile_dir := $(shell cd $(shell dirname $(mkfile_path)); pwd)
TOOLS_DESTDIR ?= $(GOPATH)/bin
-GOIMPORTS = $(TOOLS_DESTDIR)/goimports
CERTSTRAP = $(TOOLS_DESTDIR)/certstrap
PROTOBUF = $(TOOLS_DESTDIR)/protoc
GOX = $(TOOLS_DESTDIR)/gox
@@ -48,7 +47,7 @@ GOODMAN = $(TOOLS_DESTDIR)/goodman
all: tools
-tools: goimports certstrap protobuf gox goodman
+tools: certstrap protobuf gox goodman
check: check_tools
@@ -57,11 +56,6 @@ check_tools:
@echo "Found tools: $(foreach tool,$(notdir $(GOTOOLS)),\
$(if $(shell which $(tool)),$(tool),$(error "No $(tool) in PATH")))"
-goimports: $(GOIMPORTS)
-$(GOIMPORTS):
- @echo "Get goimports@v0.0.0-20190628034336-212fb13d595e"
- @go get golang.org/x/tools/cmd/goimports@v0.0.0-20190628034336-212fb13d595e
-
certstrap: $(CERTSTRAP)
$(CERTSTRAP):
@echo "Get Certstrap"
@@ -86,7 +80,7 @@ $(GOODMAN):
@go get github.com/snikch/goodman/cmd/goodman@10e37e294daa3c9a90abded60ff9924bafab3888
tools-clean:
- rm -f $(CERTSTRAP) $(GOIMPORTS) $(PROTOBUF) $(GOX) $(GOODMAN)
+ rm -f $(CERTSTRAP) $(PROTOBUF) $(GOX) $(GOODMAN)
rm -f tools-stamp
.PHONY: all tools tools-clean
diff --git a/tools/tm-bench/README.md b/tools/tm-bench/README.md
index d5ed1231f..b69f693f7 100644
--- a/tools/tm-bench/README.md
+++ b/tools/tm-bench/README.md
@@ -1,4 +1,8 @@
-# tm-bench
+# tm-bench (Deprecated)
+
+> ## **Deprecation Warning**
+
+### This tool will be depreacted in favor of [tm-load-test](https://github.com/interchainio/tm-load-test).
Tendermint blockchain benchmarking tool:
diff --git a/types/block.go b/types/block.go
index 537aed2e7..2dbab1393 100644
--- a/types/block.go
+++ b/types/block.go
@@ -432,7 +432,7 @@ func (h *Header) StringIndented(indent string) string {
%s Validators: %v
%s NextValidators: %v
%s App: %v
-%s Consensus: %v
+%s Consensus: %v
%s Results: %v
%s Evidence: %v
%s Proposer: %v
diff --git a/types/proto3/result.go b/types/proto3/result.go
new file mode 100644
index 000000000..ee5269bd3
--- /dev/null
+++ b/types/proto3/result.go
@@ -0,0 +1,74 @@
+package proto3
+
+import (
+ "bytes"
+ "encoding/json"
+
+ "github.com/gogo/protobuf/jsonpb"
+)
+
+//---------------------------------------------------------------------------
+// override JSON marshalling so we emit defaults (ie. disable omitempty)
+
+var (
+ jsonpbMarshaller = jsonpb.Marshaler{
+ EnumsAsInts: true,
+ EmitDefaults: true,
+ }
+ jsonpbUnmarshaller = jsonpb.Unmarshaler{}
+)
+
+func (r *PartSetHeader) MarshalJSON() ([]byte, error) {
+ s, err := jsonpbMarshaller.MarshalToString(r)
+ return []byte(s), err
+}
+
+func (r *PartSetHeader) UnmarshalJSON(b []byte) error {
+ reader := bytes.NewBuffer(b)
+ return jsonpbUnmarshaller.Unmarshal(reader, r)
+}
+
+func (r *Header) MarshalJSON() ([]byte, error) {
+ s, err := jsonpbMarshaller.MarshalToString(r)
+ return []byte(s), err
+}
+
+func (r *Header) UnmarshalJSON(b []byte) error {
+ reader := bytes.NewBuffer(b)
+ return jsonpbUnmarshaller.Unmarshal(reader, r)
+}
+
+func (r *Version) MarshalJSON() ([]byte, error) {
+ s, err := jsonpbMarshaller.MarshalToString(r)
+ return []byte(s), err
+}
+
+func (r *Version) UnmarshalJSON(b []byte) error {
+ reader := bytes.NewBuffer(b)
+ return jsonpbUnmarshaller.Unmarshal(reader, r)
+}
+
+func (r *Timestamp) MarshalJSON() ([]byte, error) {
+ s, err := jsonpbMarshaller.MarshalToString(r)
+ return []byte(s), err
+}
+
+func (r *Timestamp) UnmarshalJSON(b []byte) error {
+ reader := bytes.NewBuffer(b)
+ return jsonpbUnmarshaller.Unmarshal(reader, r)
+}
+
+// Some compile time assertions to ensure we don't
+// have accidental runtime surprises later on.
+// jsonEncodingRoundTripper ensures that asserted
+// interfaces implement both MarshalJSON and UnmarshalJSON
+
+type jsonRoundTripper interface {
+ json.Marshaler
+ json.Unmarshaler
+}
+
+var _ jsonRoundTripper = (*PartSetHeader)(nil)
+var _ jsonRoundTripper = (*Header)(nil)
+var _ jsonRoundTripper = (*Version)(nil)
+var _ jsonRoundTripper = (*Timestamp)(nil)
diff --git a/types/tx.go b/types/tx.go
index b71c70029..54ba6bde8 100644
--- a/types/tx.go
+++ b/types/tx.go
@@ -83,9 +83,9 @@ func (txs Txs) Proof(i int) TxProof {
// TxProof represents a Merkle proof of the presence of a transaction in the Merkle tree.
type TxProof struct {
- RootHash cmn.HexBytes
- Data Tx
- Proof merkle.SimpleProof
+ RootHash cmn.HexBytes `json:"root_hash"`
+ Data Tx `json:"data"`
+ Proof merkle.SimpleProof `json:"proof"`
}
// Leaf returns the hash(tx), which is the leaf in the merkle tree which this proof refers to.