mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
trie: stacktrie -- don't create unnecessary common.Hash objects (#14)
* revert snaphash to processing all accounts * use ReStackTrie in generateTrie * Save memory by hashing a branch if no more insert will occur * Don't create unnecessary common.Hash objects
This commit is contained in:
parent
62d322a1a7
commit
daea1c45c4
1 changed files with 11 additions and 8 deletions
|
|
@ -322,7 +322,7 @@ func (st *ReStackTrie) insert(key, value []byte) {
|
||||||
for i := idx - 1; i >= 0; i-- {
|
for i := idx - 1; i >= 0; i-- {
|
||||||
if st.children[i] != nil {
|
if st.children[i] != nil {
|
||||||
if st.children[i].nodeType != hashedNode {
|
if st.children[i].nodeType != hashedNode {
|
||||||
st.children[i].val = st.children[i].Hash().Bytes()
|
st.children[i].val = st.children[i].hash()
|
||||||
st.children[i].key = nil
|
st.children[i].key = nil
|
||||||
st.children[i].nodeType = hashedNode
|
st.children[i].nodeType = hashedNode
|
||||||
}
|
}
|
||||||
|
|
@ -437,7 +437,7 @@ func (st *ReStackTrie) insert(key, value []byte) {
|
||||||
p.children[origIdx].val = st.val
|
p.children[origIdx].val = st.val
|
||||||
p.children[origIdx].keyOffset = p.keyOffset + 1
|
p.children[origIdx].keyOffset = p.keyOffset + 1
|
||||||
|
|
||||||
p.children[origIdx].val = p.children[origIdx].Hash().Bytes()
|
p.children[origIdx].val = p.children[origIdx].hash()
|
||||||
p.children[origIdx].nodeType = hashedNode
|
p.children[origIdx].nodeType = hashedNode
|
||||||
p.children[origIdx].key = nil
|
p.children[origIdx].key = nil
|
||||||
|
|
||||||
|
|
@ -559,10 +559,10 @@ func writeHPRLP(writer io.Writer, key, val []byte, leaf bool) {
|
||||||
//io.Copy(w, &writer)
|
//io.Copy(w, &writer)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ReStackTrie) Hash() (h common.Hash) {
|
func (st *ReStackTrie) hash() []byte {
|
||||||
/* Shortcut if node is already hashed */
|
/* Shortcut if node is already hashed */
|
||||||
if st.nodeType == hashedNode {
|
if st.nodeType == hashedNode {
|
||||||
return common.BytesToHash(st.val)
|
return st.val
|
||||||
}
|
}
|
||||||
|
|
||||||
d := sha3.NewLegacyKeccak256()
|
d := sha3.NewLegacyKeccak256()
|
||||||
|
|
@ -575,7 +575,7 @@ func (st *ReStackTrie) Hash() (h common.Hash) {
|
||||||
// Write a 32 byte list to the sponge
|
// Write a 32 byte list to the sponge
|
||||||
payload[pos] = 0xa0
|
payload[pos] = 0xa0
|
||||||
pos++
|
pos++
|
||||||
copy(payload[pos:pos+32], v.Hash().Bytes())
|
copy(payload[pos:pos+32], v.hash())
|
||||||
pos += 32
|
pos += 32
|
||||||
st.children[i] = nil // Reclaim mem from subtree
|
st.children[i] = nil // Reclaim mem from subtree
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -607,7 +607,7 @@ func (st *ReStackTrie) Hash() (h common.Hash) {
|
||||||
}
|
}
|
||||||
d.Write(payload[start:pos])
|
d.Write(payload[start:pos])
|
||||||
case extNode:
|
case extNode:
|
||||||
ch := st.children[0].Hash().Bytes()
|
ch := st.children[0].hash()
|
||||||
writeHPRLP(d, st.key, ch, false)
|
writeHPRLP(d, st.key, ch, false)
|
||||||
st.children[0] = nil // Reclaim mem from subtree
|
st.children[0] = nil // Reclaim mem from subtree
|
||||||
case leafNode:
|
case leafNode:
|
||||||
|
|
@ -616,6 +616,9 @@ func (st *ReStackTrie) Hash() (h common.Hash) {
|
||||||
default:
|
default:
|
||||||
panic("Invalid node type")
|
panic("Invalid node type")
|
||||||
}
|
}
|
||||||
d.Sum(h[:0])
|
return d.Sum(nil)
|
||||||
return
|
}
|
||||||
|
|
||||||
|
func (st *ReStackTrie) Hash() (h common.Hash) {
|
||||||
|
return common.BytesToHash(st.hash())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue