diff --git a/spec/core/data_structures.md b/spec/core/data_structures.md index b4f2dd0ce..421ab283a 100644 --- a/spec/core/data_structures.md +++ b/spec/core/data_structures.md @@ -423,7 +423,7 @@ block.LastResultsHash == MerkleRoot([]ResponseDeliverTx) `LastResultsHash` is the root hash of a Merkle tree built from `ResponseDeliverTx` responses (`Log`,`Info`, `Codespace` and `Events` fields are ignored). -The first block has `block.Header.ResultsHash == []byte{}`. +The first block has `block.Header.ResultsHash == MerkleRoot(nil)`, i.e. the hash of an empty input, for RFC-6962 conformance. ## EvidenceHash diff --git a/spec/core/encoding.md b/spec/core/encoding.md index 31b9c0625..649d91e67 100644 --- a/spec/core/encoding.md +++ b/spec/core/encoding.md @@ -216,6 +216,11 @@ h0 h1 h2 h3 h0 h1 h2 h3 h4 h5 The function `MerkleRoot` is a simple recursive function defined as follows: ```go +// SHA256([]byte{}) +func emptyHash() []byte { + return tmhash.Sum([]byte{}) +} + // SHA256(0x00 || leaf) func leafHash(leaf []byte) []byte { return tmhash.Sum(append(0x00, leaf...)) @@ -232,7 +237,7 @@ func getSplitPoint(k int) { ... } func MerkleRoot(items [][]byte) []byte{ switch len(items) { case 0: - return nil + return empthHash() case 1: return leafHash(items[0]) default: