Fixed a bug where keys where serialised twice

This commit is contained in:
obscuren 2014-12-24 14:47:50 +01:00
parent 804af9658a
commit 58d477f7a6
4 changed files with 23 additions and 12 deletions

View File

@ -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

View File

@ -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 {

View File

@ -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+" "))
} }

View File

@ -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)
}