From 89ac8f6e622d641097425461e1c10f4cd2490e2d Mon Sep 17 00:00:00 2001 From: Erik Grinaker Date: Tue, 11 Aug 2020 16:52:23 +0200 Subject: [PATCH] update hashing of empty inputs, and initial block LastResultsHash (#141) --- spec/core/data_structures.md | 2 +- spec/core/encoding.md | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) 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: