Fixed a bug where keys where serialised twice
This commit is contained in:
parent
804af9658a
commit
58d477f7a6
@ -23,7 +23,9 @@ func (self *FullNode) Branches() []Node {
|
|||||||
func (self *FullNode) Copy() Node {
|
func (self *FullNode) Copy() Node {
|
||||||
nnode := NewFullNode(self.trie)
|
nnode := NewFullNode(self.trie)
|
||||||
for i, node := range self.nodes {
|
for i, node := range self.nodes {
|
||||||
nnode.nodes[i] = node
|
if node != nil {
|
||||||
|
nnode.nodes[i] = node
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nnode
|
return nnode
|
||||||
@ -60,7 +62,6 @@ func (self *FullNode) RlpData() interface{} {
|
|||||||
func (self *FullNode) set(k byte, value Node) {
|
func (self *FullNode) set(k byte, value Node) {
|
||||||
if _, ok := value.(*ValueNode); ok && k != 16 {
|
if _, ok := value.(*ValueNode); ok && k != 16 {
|
||||||
fmt.Println(value, k)
|
fmt.Println(value, k)
|
||||||
panic(":(")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.nodes[int(k)] = value
|
self.nodes[int(k)] = value
|
||||||
|
@ -14,7 +14,7 @@ type Iterator struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewIterator(trie *Trie) *Iterator {
|
func NewIterator(trie *Trie) *Iterator {
|
||||||
return &Iterator{trie: trie, Key: []byte{0}}
|
return &Iterator{trie: trie, Key: make([]byte, 32)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Iterator) Next() bool {
|
func (self *Iterator) Next() bool {
|
||||||
|
@ -17,7 +17,7 @@ type Node interface {
|
|||||||
func (self *ValueNode) String() string { return self.fstring("") }
|
func (self *ValueNode) String() string { return self.fstring("") }
|
||||||
func (self *FullNode) String() string { return self.fstring("") }
|
func (self *FullNode) String() string { return self.fstring("") }
|
||||||
func (self *ShortNode) String() string { return self.fstring("") }
|
func (self *ShortNode) String() string { return self.fstring("") }
|
||||||
func (self *ValueNode) fstring(ind string) string { return fmt.Sprintf("%s ", self.data) }
|
func (self *ValueNode) fstring(ind string) string { return fmt.Sprintf("%x ", self.data) }
|
||||||
func (self *HashNode) fstring(ind string) string { return fmt.Sprintf("%x ", self.key) }
|
func (self *HashNode) fstring(ind string) string { return fmt.Sprintf("%x ", self.key) }
|
||||||
|
|
||||||
// Full node
|
// Full node
|
||||||
@ -36,5 +36,5 @@ func (self *FullNode) fstring(ind string) string {
|
|||||||
|
|
||||||
// Short node
|
// Short node
|
||||||
func (self *ShortNode) fstring(ind string) string {
|
func (self *ShortNode) fstring(ind string) string {
|
||||||
return fmt.Sprintf("[ %s: %v ] ", self.key, self.value.fstring(ind+" "))
|
return fmt.Sprintf("[ %x: %v ] ", self.key, self.value.fstring(ind+" "))
|
||||||
}
|
}
|
||||||
|
@ -215,7 +215,7 @@ func (self *Trie) get(node Node, key []byte) Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *Trie) delete(node Node, key []byte) Node {
|
func (self *Trie) delete(node Node, key []byte) Node {
|
||||||
if len(key) == 0 {
|
if len(key) == 0 && node == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -234,7 +234,9 @@ func (self *Trie) delete(node Node, key []byte) Node {
|
|||||||
nkey := append(k, child.Key()...)
|
nkey := append(k, child.Key()...)
|
||||||
n = NewShortNode(self, nkey, child.Value())
|
n = NewShortNode(self, nkey, child.Value())
|
||||||
case *FullNode:
|
case *FullNode:
|
||||||
n = NewShortNode(self, node.key, child)
|
sn := NewShortNode(self, node.Key(), child)
|
||||||
|
sn.key = node.key
|
||||||
|
n = sn
|
||||||
}
|
}
|
||||||
|
|
||||||
return n
|
return n
|
||||||
@ -275,9 +277,10 @@ func (self *Trie) delete(node Node, key []byte) Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return nnode
|
return nnode
|
||||||
|
case nil:
|
||||||
|
return nil
|
||||||
default:
|
default:
|
||||||
panic("Invalid node")
|
panic(fmt.Sprintf("%T: invalid node: %v (%v)", node, node, key))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -288,7 +291,10 @@ func (self *Trie) mknode(value *ethutil.Value) Node {
|
|||||||
case 0:
|
case 0:
|
||||||
return nil
|
return nil
|
||||||
case 2:
|
case 2:
|
||||||
return NewShortNode(self, trie.CompactDecode(string(value.Get(0).Bytes())), self.mknode(value.Get(1)))
|
// A value node may consists of 2 bytes.
|
||||||
|
if value.Get(0).Len() != 0 {
|
||||||
|
return NewShortNode(self, trie.CompactDecode(string(value.Get(0).Bytes())), self.mknode(value.Get(1)))
|
||||||
|
}
|
||||||
case 17:
|
case 17:
|
||||||
fnode := NewFullNode(self)
|
fnode := NewFullNode(self)
|
||||||
for i := 0; i < l; i++ {
|
for i := 0; i < l; i++ {
|
||||||
@ -297,9 +303,9 @@ func (self *Trie) mknode(value *ethutil.Value) Node {
|
|||||||
return fnode
|
return fnode
|
||||||
case 32:
|
case 32:
|
||||||
return &HashNode{value.Bytes()}
|
return &HashNode{value.Bytes()}
|
||||||
default:
|
|
||||||
return &ValueNode{self, value.Bytes()}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return &ValueNode{self, value.Bytes()}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Trie) trans(node Node) Node {
|
func (self *Trie) trans(node Node) Node {
|
||||||
@ -323,3 +329,7 @@ func (self *Trie) store(node Node) interface{} {
|
|||||||
|
|
||||||
return node.RlpData()
|
return node.RlpData()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *Trie) PrintRoot() {
|
||||||
|
fmt.Println(self.root)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user