* move from tmlibs 213 * expose KVPair, simpleproofsfrommap returns keys
This commit is contained in:
parent
c21f67c5af
commit
66794a174a
|
@ -24,16 +24,13 @@ func newSimpleMap() *simpleMap {
|
||||||
func (sm *simpleMap) Set(key string, value Hasher) {
|
func (sm *simpleMap) Set(key string, value Hasher) {
|
||||||
sm.sorted = false
|
sm.sorted = false
|
||||||
|
|
||||||
// Hash the key to blind it... why not?
|
// The value is hashed, so you can
|
||||||
khash := tmhash.Sum([]byte(key))
|
|
||||||
|
|
||||||
// And the value is hashed too, so you can
|
|
||||||
// check for equality with a cached value (say)
|
// check for equality with a cached value (say)
|
||||||
// and make a determination to fetch or not.
|
// and make a determination to fetch or not.
|
||||||
vhash := value.Hash()
|
vhash := value.Hash()
|
||||||
|
|
||||||
sm.kvs = append(sm.kvs, cmn.KVPair{
|
sm.kvs = append(sm.kvs, cmn.KVPair{
|
||||||
Key: khash,
|
Key: []byte(key),
|
||||||
Value: vhash,
|
Value: vhash,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -67,9 +64,9 @@ func (sm *simpleMap) KVPairs() cmn.KVPairs {
|
||||||
// A local extension to KVPair that can be hashed.
|
// A local extension to KVPair that can be hashed.
|
||||||
// Key and value are length prefixed and concatenated,
|
// Key and value are length prefixed and concatenated,
|
||||||
// then hashed.
|
// then hashed.
|
||||||
type kvPair cmn.KVPair
|
type KVPair cmn.KVPair
|
||||||
|
|
||||||
func (kv kvPair) Hash() []byte {
|
func (kv KVPair) Hash() []byte {
|
||||||
hasher := tmhash.New()
|
hasher := tmhash.New()
|
||||||
err := encodeByteSlice(hasher, kv.Key)
|
err := encodeByteSlice(hasher, kv.Key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -85,7 +82,7 @@ func (kv kvPair) Hash() []byte {
|
||||||
func hashKVPairs(kvs cmn.KVPairs) []byte {
|
func hashKVPairs(kvs cmn.KVPairs) []byte {
|
||||||
kvsH := make([]Hasher, len(kvs))
|
kvsH := make([]Hasher, len(kvs))
|
||||||
for i, kvp := range kvs {
|
for i, kvp := range kvs {
|
||||||
kvsH[i] = kvPair(kvp)
|
kvsH[i] = KVPair(kvp)
|
||||||
}
|
}
|
||||||
return SimpleHashFromHashers(kvsH)
|
return SimpleHashFromHashers(kvsH)
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,37 +18,37 @@ func TestSimpleMap(t *testing.T) {
|
||||||
{
|
{
|
||||||
db := newSimpleMap()
|
db := newSimpleMap()
|
||||||
db.Set("key1", strHasher("value1"))
|
db.Set("key1", strHasher("value1"))
|
||||||
assert.Equal(t, "3dafc06a52039d029be57c75c9d16356a4256ef4", fmt.Sprintf("%x", db.Hash()), "Hash didn't match")
|
assert.Equal(t, "fa9bc106ffd932d919bee935ceb6cf2b3dd72d8f", fmt.Sprintf("%x", db.Hash()), "Hash didn't match")
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
db := newSimpleMap()
|
db := newSimpleMap()
|
||||||
db.Set("key1", strHasher("value2"))
|
db.Set("key1", strHasher("value2"))
|
||||||
assert.Equal(t, "03eb5cfdff646bc4e80fec844e72fd248a1c6b2c", fmt.Sprintf("%x", db.Hash()), "Hash didn't match")
|
assert.Equal(t, "e00e7dcfe54e9fafef5111e813a587f01ba9c3e8", fmt.Sprintf("%x", db.Hash()), "Hash didn't match")
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
db := newSimpleMap()
|
db := newSimpleMap()
|
||||||
db.Set("key1", strHasher("value1"))
|
db.Set("key1", strHasher("value1"))
|
||||||
db.Set("key2", strHasher("value2"))
|
db.Set("key2", strHasher("value2"))
|
||||||
assert.Equal(t, "acc3971eab8513171cc90ce8b74f368c38f9657d", fmt.Sprintf("%x", db.Hash()), "Hash didn't match")
|
assert.Equal(t, "eff12d1c703a1022ab509287c0f196130123d786", fmt.Sprintf("%x", db.Hash()), "Hash didn't match")
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
db := newSimpleMap()
|
db := newSimpleMap()
|
||||||
db.Set("key2", strHasher("value2")) // NOTE: out of order
|
db.Set("key2", strHasher("value2")) // NOTE: out of order
|
||||||
db.Set("key1", strHasher("value1"))
|
db.Set("key1", strHasher("value1"))
|
||||||
assert.Equal(t, "acc3971eab8513171cc90ce8b74f368c38f9657d", fmt.Sprintf("%x", db.Hash()), "Hash didn't match")
|
assert.Equal(t, "eff12d1c703a1022ab509287c0f196130123d786", fmt.Sprintf("%x", db.Hash()), "Hash didn't match")
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
db := newSimpleMap()
|
db := newSimpleMap()
|
||||||
db.Set("key1", strHasher("value1"))
|
db.Set("key1", strHasher("value1"))
|
||||||
db.Set("key2", strHasher("value2"))
|
db.Set("key2", strHasher("value2"))
|
||||||
db.Set("key3", strHasher("value3"))
|
db.Set("key3", strHasher("value3"))
|
||||||
assert.Equal(t, "0cd117ad14e6cd22edcd9aa0d84d7063b54b862f", fmt.Sprintf("%x", db.Hash()), "Hash didn't match")
|
assert.Equal(t, "b2c62a277c08dbd2ad73ca53cd1d6bfdf5830d26", fmt.Sprintf("%x", db.Hash()), "Hash didn't match")
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
db := newSimpleMap()
|
db := newSimpleMap()
|
||||||
db.Set("key2", strHasher("value2")) // NOTE: out of order
|
db.Set("key2", strHasher("value2")) // NOTE: out of order
|
||||||
db.Set("key1", strHasher("value1"))
|
db.Set("key1", strHasher("value1"))
|
||||||
db.Set("key3", strHasher("value3"))
|
db.Set("key3", strHasher("value3"))
|
||||||
assert.Equal(t, "0cd117ad14e6cd22edcd9aa0d84d7063b54b862f", fmt.Sprintf("%x", db.Hash()), "Hash didn't match")
|
assert.Equal(t, "b2c62a277c08dbd2ad73ca53cd1d6bfdf5830d26", fmt.Sprintf("%x", db.Hash()), "Hash didn't match")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ func SimpleProofsFromHashers(items []Hasher) (rootHash []byte, proofs []*SimpleP
|
||||||
// SimpleProofsFromMap generates proofs from a map. The keys/values of the map will be used as the keys/values
|
// SimpleProofsFromMap generates proofs from a map. The keys/values of the map will be used as the keys/values
|
||||||
// in the underlying key-value pairs.
|
// in the underlying key-value pairs.
|
||||||
// The keys are sorted before the proofs are computed.
|
// The keys are sorted before the proofs are computed.
|
||||||
func SimpleProofsFromMap(m map[string]Hasher) (rootHash []byte, proofs []*SimpleProof) {
|
func SimpleProofsFromMap(m map[string]Hasher) (rootHash []byte, proofs map[string]*SimpleProof, keys []string) {
|
||||||
sm := newSimpleMap()
|
sm := newSimpleMap()
|
||||||
for k, v := range m {
|
for k, v := range m {
|
||||||
sm.Set(k, v)
|
sm.Set(k, v)
|
||||||
|
@ -36,9 +36,17 @@ func SimpleProofsFromMap(m map[string]Hasher) (rootHash []byte, proofs []*Simple
|
||||||
kvs := sm.kvs
|
kvs := sm.kvs
|
||||||
kvsH := make([]Hasher, 0, len(kvs))
|
kvsH := make([]Hasher, 0, len(kvs))
|
||||||
for _, kvp := range kvs {
|
for _, kvp := range kvs {
|
||||||
kvsH = append(kvsH, kvPair(kvp))
|
kvsH = append(kvsH, KVPair(kvp))
|
||||||
}
|
}
|
||||||
return SimpleProofsFromHashers(kvsH)
|
|
||||||
|
rootHash, proofList := SimpleProofsFromHashers(kvsH)
|
||||||
|
proofs = make(map[string]*SimpleProof)
|
||||||
|
keys = make([]string, len(proofList))
|
||||||
|
for i, kvp := range kvs {
|
||||||
|
proofs[string(kvp.Key)] = proofList[i]
|
||||||
|
keys[i] = string(kvp.Key)
|
||||||
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify that leafHash is a leaf hash of the simple-merkle-tree
|
// Verify that leafHash is a leaf hash of the simple-merkle-tree
|
||||||
|
|
Loading…
Reference in New Issue