From 1302db7dacdfbebc7c070db8dba782b12b36726e Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Thu, 30 Aug 2018 22:30:05 -0700 Subject: [PATCH] Update types package, fix proof's aunt handling --- crypto/merkle/simple_map_test.go | 12 ++++++------ crypto/merkle/simple_proof.go | 2 +- crypto/merkle/simple_tree.go | 2 -- crypto/merkle/types.go | 13 ------------- types/block.go | 13 +++++-------- types/part_set.go | 6 +++--- types/results.go | 12 ++++++------ types/tx.go | 6 +++--- types/validator.go | 14 ++++++++++++++ types/validator_set.go | 6 +++--- 10 files changed, 41 insertions(+), 45 deletions(-) diff --git a/crypto/merkle/simple_map_test.go b/crypto/merkle/simple_map_test.go index 34febcf1..372c4c2d 100644 --- a/crypto/merkle/simple_map_test.go +++ b/crypto/merkle/simple_map_test.go @@ -18,37 +18,37 @@ func TestSimpleMap(t *testing.T) { { db := newSimpleMap() db.Set("key1", strHasher("value1")) - assert.Equal(t, "fa9bc106ffd932d919bee935ceb6cf2b3dd72d8f", fmt.Sprintf("%x", db.Hash()), "Hash didn't match") + assert.Equal(t, "5e0c721faaa2e92bdb37e7d7297d6affb3bac87d", fmt.Sprintf("%x", db.Hash()), "Hash didn't match") } { db := newSimpleMap() db.Set("key1", strHasher("value2")) - assert.Equal(t, "e00e7dcfe54e9fafef5111e813a587f01ba9c3e8", fmt.Sprintf("%x", db.Hash()), "Hash didn't match") + assert.Equal(t, "968fdd7e6e94448b0ab5d38cd9b3618b860e2443", fmt.Sprintf("%x", db.Hash()), "Hash didn't match") } { db := newSimpleMap() db.Set("key1", strHasher("value1")) db.Set("key2", strHasher("value2")) - assert.Equal(t, "eff12d1c703a1022ab509287c0f196130123d786", fmt.Sprintf("%x", db.Hash()), "Hash didn't match") + assert.Equal(t, "7dc11c8e1bc6fe0aaa0d691560c25c3f33940e14", fmt.Sprintf("%x", db.Hash()), "Hash didn't match") } { db := newSimpleMap() db.Set("key2", strHasher("value2")) // NOTE: out of order db.Set("key1", strHasher("value1")) - assert.Equal(t, "eff12d1c703a1022ab509287c0f196130123d786", fmt.Sprintf("%x", db.Hash()), "Hash didn't match") + assert.Equal(t, "7dc11c8e1bc6fe0aaa0d691560c25c3f33940e14", fmt.Sprintf("%x", db.Hash()), "Hash didn't match") } { db := newSimpleMap() db.Set("key1", strHasher("value1")) db.Set("key2", strHasher("value2")) db.Set("key3", strHasher("value3")) - assert.Equal(t, "b2c62a277c08dbd2ad73ca53cd1d6bfdf5830d26", fmt.Sprintf("%x", db.Hash()), "Hash didn't match") + assert.Equal(t, "2584d8b484db08cd807b931e0b95f64a9105d41d", fmt.Sprintf("%x", db.Hash()), "Hash didn't match") } { db := newSimpleMap() db.Set("key2", strHasher("value2")) // NOTE: out of order db.Set("key1", strHasher("value1")) db.Set("key3", strHasher("value3")) - assert.Equal(t, "b2c62a277c08dbd2ad73ca53cd1d6bfdf5830d26", fmt.Sprintf("%x", db.Hash()), "Hash didn't match") + assert.Equal(t, "2584d8b484db08cd807b931e0b95f64a9105d41d", fmt.Sprintf("%x", db.Hash()), "Hash didn't match") } } diff --git a/crypto/merkle/simple_proof.go b/crypto/merkle/simple_proof.go index b579483f..ab1fa00f 100644 --- a/crypto/merkle/simple_proof.go +++ b/crypto/merkle/simple_proof.go @@ -99,7 +99,7 @@ func computeHashFromAunts(index int, total int, leafHash []byte, innerHashes [][ if len(innerHashes) == 0 { return nil } - numLeft := (total + 1) / 2 + numLeft := getSplitPoint(total) if index < numLeft { leftHash := computeHashFromAunts(index, numLeft, leafHash, innerHashes[:len(innerHashes)-1]) if leftHash == nil { diff --git a/crypto/merkle/simple_tree.go b/crypto/merkle/simple_tree.go index cc3b63a2..7485b61f 100644 --- a/crypto/merkle/simple_tree.go +++ b/crypto/merkle/simple_tree.go @@ -1,7 +1,6 @@ package merkle import ( - "fmt" "math/bits" "github.com/tendermint/tendermint/crypto/tmhash" @@ -75,6 +74,5 @@ func getSplitPoint(length int) int { if k == length { k >>= 1 } - fmt.Println(length, k) return k } diff --git a/crypto/merkle/types.go b/crypto/merkle/types.go index 022ede25..26be6f4a 100644 --- a/crypto/merkle/types.go +++ b/crypto/merkle/types.go @@ -1,11 +1,5 @@ package merkle -import ( - "io" - - amino "github.com/tendermint/go-amino" -) - var ( LeafHashPrefix = []byte{0} InnerHashPrefix = []byte{1} @@ -34,10 +28,3 @@ type Tree interface { type Hasher interface { Hash() []byte } - -//----------------------------------------------------------------------- - -// Uvarint length prefixed byteslice -func encodeByteSlice(w io.Writer, bz []byte) (err error) { - return amino.EncodeByteSlice(w, bz) -} diff --git a/types/block.go b/types/block.go index 8588d557..0102e72a 100644 --- a/types/block.go +++ b/types/block.go @@ -419,11 +419,11 @@ func (commit *Commit) Hash() cmn.HexBytes { return nil } if commit.hash == nil { - bs := make([]merkle.Hasher, len(commit.Precommits)) + bzs := make([][]byte, len(commit.Precommits)) for i, precommit := range commit.Precommits { - bs[i] = aminoHasher(precommit) + bzs[i] = cdc.MustMarshalBinaryBare(precommit) } - commit.hash = merkle.SimpleHashFromHashers(bs) + commit.hash = merkle.SimpleHashFromByteSlices(bzs) } return commit.hash } @@ -638,11 +638,8 @@ type hasher struct { func (h hasher) Hash() []byte { hasher := tmhash.New() if h.item != nil && !cmn.IsTypedNil(h.item) && !cmn.IsEmpty(h.item) { - bz, err := cdc.MarshalBinaryBare(h.item) - if err != nil { - panic(err) - } - _, err = hasher.Write(bz) + bz := cdc.MustMarshalBinaryBare(h.item) + _, err := hasher.Write(bz) if err != nil { panic(err) } diff --git a/types/part_set.go b/types/part_set.go index f6d7f6b6..9e60bc4d 100644 --- a/types/part_set.go +++ b/types/part_set.go @@ -88,7 +88,7 @@ func NewPartSetFromData(data []byte, partSize int) *PartSet { // divide data into 4kb parts. total := (len(data) + partSize - 1) / partSize parts := make([]*Part, total) - parts_ := make([]merkle.Hasher, total) + parts_ := make([][]byte, total) partsBitArray := cmn.NewBitArray(total) for i := 0; i < total; i++ { part := &Part{ @@ -96,11 +96,11 @@ func NewPartSetFromData(data []byte, partSize int) *PartSet { Bytes: data[i*partSize : cmn.MinInt(len(data), (i+1)*partSize)], } parts[i] = part - parts_[i] = part + parts_[i] = part.Bytes partsBitArray.SetIndex(i, true) } // Compute merkle proofs - root, proofs := merkle.SimpleProofsFromHashers(parts_) + root, proofs := merkle.SimpleProofsFromByteSlices(parts_) for i := 0; i < total; i++ { parts[i].Proof = *proofs[i] } diff --git a/types/results.go b/types/results.go index 17d5891c..92a19643 100644 --- a/types/results.go +++ b/types/results.go @@ -54,20 +54,20 @@ func (a ABCIResults) Bytes() []byte { func (a ABCIResults) Hash() []byte { // NOTE: we copy the impl of the merkle tree for txs - // we should be consistent and either do it for both or not. - return merkle.SimpleHashFromHashers(a.toHashers()) + return merkle.SimpleHashFromByteSlices(a.toByteSlices()) } // ProveResult returns a merkle proof of one result from the set func (a ABCIResults) ProveResult(i int) merkle.SimpleProof { - _, proofs := merkle.SimpleProofsFromHashers(a.toHashers()) + _, proofs := merkle.SimpleProofsFromByteSlices(a.toByteSlices()) return *proofs[i] } -func (a ABCIResults) toHashers() []merkle.Hasher { +func (a ABCIResults) toByteSlices() [][]byte { l := len(a) - hashers := make([]merkle.Hasher, l) + byteslices := make([][]byte, l) for i := 0; i < l; i++ { - hashers[i] = a[i] + byteslices[i] = cdc.MustMarshalBinaryBare(a[i]) } - return hashers + return byteslices } diff --git a/types/tx.go b/types/tx.go index 489f0b23..d95e215f 100644 --- a/types/tx.go +++ b/types/tx.go @@ -70,11 +70,11 @@ func (txs Txs) IndexByHash(hash []byte) int { // TODO: optimize this! func (txs Txs) Proof(i int) TxProof { l := len(txs) - hashers := make([]merkle.Hasher, l) + bzs := make([][]byte, l) for i := 0; i < l; i++ { - hashers[i] = txs[i] + bzs[i] = txs[i] } - root, proofs := merkle.SimpleProofsFromHashers(hashers) + root, proofs := merkle.SimpleProofsFromByteSlices(bzs) return TxProof{ Index: i, diff --git a/types/validator.go b/types/validator.go index e43acf09..9f6f135c 100644 --- a/types/validator.go +++ b/types/validator.go @@ -82,6 +82,20 @@ func (v *Validator) Hash() []byte { }) } +// hashBytes computes the bytes to be hashed of a validator with a given voting power. +// It excludes the Accum value, which changes with every round. +func (v *Validator) hashBytes() []byte { + return cdc.MustMarshalBinaryBare(struct { + Address Address + PubKey crypto.PubKey + VotingPower int64 + }{ + v.Address, + v.PubKey, + v.VotingPower, + }) +} + //---------------------------------------- // RandValidator diff --git a/types/validator_set.go b/types/validator_set.go index 4dab4d84..49a1d6eb 100644 --- a/types/validator_set.go +++ b/types/validator_set.go @@ -176,11 +176,11 @@ func (vals *ValidatorSet) Hash() []byte { if len(vals.Validators) == 0 { return nil } - hashers := make([]merkle.Hasher, len(vals.Validators)) + bzs := make([][]byte, len(vals.Validators)) for i, val := range vals.Validators { - hashers[i] = val + bzs[i] = val.hashBytes() } - return merkle.SimpleHashFromHashers(hashers) + return merkle.SimpleHashFromByteSlices(bzs) } // Add adds val to the validator set and returns true. It returns false if val