diff options
author | Péter Szilágyi <peterke@gmail.com> | 2018-06-21 17:28:05 +0800 |
---|---|---|
committer | Felix Lange <fjl@users.noreply.github.com> | 2018-06-21 17:28:05 +0800 |
commit | d926bf2c7e3182d694c15829a37a0ca7331cd03c (patch) | |
tree | c2d3ddd85941a231fb05de46c36703273d11814a /trie/node.go | |
parent | 8db8d074e2fff547e9d85169018e03f89b5975a1 (diff) | |
download | dexon-d926bf2c7e3182d694c15829a37a0ca7331cd03c.tar dexon-d926bf2c7e3182d694c15829a37a0ca7331cd03c.tar.gz dexon-d926bf2c7e3182d694c15829a37a0ca7331cd03c.tar.bz2 dexon-d926bf2c7e3182d694c15829a37a0ca7331cd03c.tar.lz dexon-d926bf2c7e3182d694c15829a37a0ca7331cd03c.tar.xz dexon-d926bf2c7e3182d694c15829a37a0ca7331cd03c.tar.zst dexon-d926bf2c7e3182d694c15829a37a0ca7331cd03c.zip |
trie: cache collapsed tries node, not rlp blobs (#16876)
The current trie memory database/cache that we do pruning on stores
trie nodes as binary rlp encoded blobs, and also stores the node
relationships/references for GC purposes. However, most of the trie
nodes (everything apart from a value node) is in essence just a
collection of references.
This PR switches out the RLP encoded trie blobs with the
collapsed-but-not-serialized trie nodes. This permits most of the
references to be recovered from within the node data structure,
avoiding the need to track them a second time (expensive memory wise).
Diffstat (limited to 'trie/node.go')
-rw-r--r-- | trie/node.go | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/trie/node.go b/trie/node.go index 02815042c..a06f1b389 100644 --- a/trie/node.go +++ b/trie/node.go @@ -47,9 +47,22 @@ type ( valueNode []byte ) +// nilValueNode is used when collapsing internal trie nodes for hashing, since +// unset children need to serialize correctly. +var nilValueNode = valueNode(nil) + // EncodeRLP encodes a full node into the consensus RLP format. func (n *fullNode) EncodeRLP(w io.Writer) error { - return rlp.Encode(w, n.Children) + var nodes [17]node + + for i, child := range n.Children { + if child != nil { + nodes[i] = child + } else { + nodes[i] = nilValueNode + } + } + return rlp.Encode(w, nodes) } func (n *fullNode) copy() *fullNode { copy := *n; return © } |