trie.go 12.6 KB
Newer Older
F
Felix Lange 已提交
1
// Copyright 2014 The go-ethereum Authors
2
// This file is part of the go-ethereum library.
F
Felix Lange 已提交
3
//
4
// The go-ethereum library is free software: you can redistribute it and/or modify
F
Felix Lange 已提交
5 6 7 8
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
9
// The go-ethereum library is distributed in the hope that it will be useful,
F
Felix Lange 已提交
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
F
Felix Lange 已提交
12 13 14
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
15
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
F
Felix Lange 已提交
16

17
// Package trie implements Merkle Patricia Tries.
O
obscuren 已提交
18
package trie
O
obscuren 已提交
19 20

import (
O
obscuren 已提交
21
	"bytes"
F
Felix Lange 已提交
22
	"errors"
O
obscuren 已提交
23
	"fmt"
F
Felix Lange 已提交
24
	"hash"
O
obscuren 已提交
25

O
obscuren 已提交
26
	"github.com/ethereum/go-ethereum/common"
F
Felix Lange 已提交
27 28 29 30
	"github.com/ethereum/go-ethereum/crypto/sha3"
	"github.com/ethereum/go-ethereum/logger"
	"github.com/ethereum/go-ethereum/logger/glog"
	"github.com/ethereum/go-ethereum/rlp"
O
obscuren 已提交
31 32
)

F
Felix Lange 已提交
33
const defaultCacheCapacity = 800
O
obscuren 已提交
34

F
Felix Lange 已提交
35 36 37 38 39 40
var (
	// The global cache stores decoded trie nodes by hash as they get loaded.
	globalCache = newARC(defaultCacheCapacity)
	// This is the known root hash of an empty trie.
	emptyRoot = common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")
)
O
obscuren 已提交
41

F
Felix Lange 已提交
42
var ErrMissingRoot = errors.New("missing root node")
O
obscuren 已提交
43

F
Felix Lange 已提交
44 45 46 47 48
// Database must be implemented by backing stores for the trie.
type Database interface {
	DatabaseWriter
	// Get returns the value for key from the database.
	Get(key []byte) (value []byte, err error)
O
obscuren 已提交
49 50
}

F
Felix Lange 已提交
51 52 53 54 55 56
// DatabaseWriter wraps the Put method of a backing store for the trie.
type DatabaseWriter interface {
	// Put stores the mapping key->value in the database.
	// Implementations must not hold onto the value bytes, the trie
	// will reuse the slice across calls to Put.
	Put(key, value []byte) error
O
obscuren 已提交
57 58
}

F
Felix Lange 已提交
59 60 61 62 63 64 65 66 67
// Trie is a Merkle Patricia Trie.
// The zero value is an empty trie with no database.
// Use New to create a trie that sits on top of a database.
//
// Trie is not safe for concurrent use.
type Trie struct {
	root node
	db   Database
	*hasher
O
obscuren 已提交
68 69
}

F
Felix Lange 已提交
70 71 72 73 74 75 76 77 78 79 80
// New creates a trie with an existing root node from db.
//
// If root is the zero hash or the sha3 hash of an empty string, the
// trie is initially empty and does not require a database. Otherwise,
// New will panics if db is nil or root does not exist in the
// database. Accessing the trie loads nodes from db on demand.
func New(root common.Hash, db Database) (*Trie, error) {
	trie := &Trie{db: db}
	if (root != common.Hash{}) && root != emptyRoot {
		if db == nil {
			panic("trie.New: cannot use existing root without a database")
O
obscuren 已提交
81
		}
F
Felix Lange 已提交
82 83 84 85
		if v, _ := trie.db.Get(root[:]); len(v) == 0 {
			return nil, ErrMissingRoot
		}
		trie.root = hashNode(root.Bytes())
O
obscuren 已提交
86
	}
F
Felix Lange 已提交
87
	return trie, nil
O
obscuren 已提交
88 89
}

F
Felix Lange 已提交
90 91 92
// Iterator returns an iterator over all mappings in the trie.
func (t *Trie) Iterator() *Iterator {
	return NewIterator(t)
O
obscuren 已提交
93 94
}

F
Felix Lange 已提交
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
// Get returns the value for key stored in the trie.
// The value bytes must not be modified by the caller.
func (t *Trie) Get(key []byte) []byte {
	key = compactHexDecode(key)
	tn := t.root
	for len(key) > 0 {
		switch n := tn.(type) {
		case shortNode:
			if len(key) < len(n.Key) || !bytes.Equal(n.Key, key[:len(n.Key)]) {
				return nil
			}
			tn = n.Val
			key = key[len(n.Key):]
		case fullNode:
			tn = n[key[0]]
			key = key[1:]
		case nil:
			return nil
		case hashNode:
			tn = t.resolveHash(n)
		default:
			panic(fmt.Sprintf("%T: invalid node: %v", tn, tn))
		}
O
obscuren 已提交
118
	}
F
Felix Lange 已提交
119
	return tn.(valueNode)
O
obscuren 已提交
120 121
}

F
Felix Lange 已提交
122 123 124 125 126 127 128 129
// Update associates key with value in the trie. Subsequent calls to
// Get will return value. If value has length zero, any existing value
// is deleted from the trie and calls to Get will return nil.
//
// The value bytes must not be modified by the caller while they are
// stored in the trie.
func (t *Trie) Update(key, value []byte) {
	k := compactHexDecode(key)
O
obscuren 已提交
130
	if len(value) != 0 {
F
Felix Lange 已提交
131
		t.root = t.insert(t.root, k, valueNode(value))
132
	} else {
F
Felix Lange 已提交
133
		t.root = t.delete(t.root, k)
134
	}
O
obscuren 已提交
135 136
}

F
Felix Lange 已提交
137
func (t *Trie) insert(n node, key []byte, value node) node {
O
obscuren 已提交
138 139
	if len(key) == 0 {
		return value
O
obscuren 已提交
140
	}
F
Felix Lange 已提交
141 142 143 144 145 146 147
	switch n := n.(type) {
	case shortNode:
		matchlen := prefixLen(key, n.Key)
		// If the whole key matches, keep this short node as is
		// and only update the value.
		if matchlen == len(n.Key) {
			return shortNode{n.Key, t.insert(n.Val, key[matchlen:], value)}
O
obscuren 已提交
148
		}
F
Felix Lange 已提交
149 150 151 152 153 154 155
		// Otherwise branch out at the index where they differ.
		var branch fullNode
		branch[n.Key[matchlen]] = t.insert(nil, n.Key[matchlen+1:], n.Val)
		branch[key[matchlen]] = t.insert(nil, key[matchlen+1:], value)
		// Replace this shortNode with the branch if it occurs at index 0.
		if matchlen == 0 {
			return branch
O
obscuren 已提交
156
		}
F
Felix Lange 已提交
157 158
		// Otherwise, replace it with a short node leading up to the branch.
		return shortNode{key[:matchlen], branch}
O
obscuren 已提交
159

F
Felix Lange 已提交
160 161 162
	case fullNode:
		n[key[0]] = t.insert(n[key[0]], key[1:], value)
		return n
O
obscuren 已提交
163

F
Felix Lange 已提交
164 165
	case nil:
		return shortNode{key, value}
O
obscuren 已提交
166

F
Felix Lange 已提交
167 168 169 170 171 172 173 174
	case hashNode:
		// We've hit a part of the trie that isn't loaded yet. Load
		// the node and insert into it. This leaves all child nodes on
		// the path to the value in the trie.
		//
		// TODO: track whether insertion changed the value and keep
		// n as a hash node if it didn't.
		return t.insert(t.resolveHash(n), key, value)
O
obscuren 已提交
175

O
obscuren 已提交
176
	default:
F
Felix Lange 已提交
177
		panic(fmt.Sprintf("%T: invalid node: %v", n, n))
O
obscuren 已提交
178 179 180
	}
}

F
Felix Lange 已提交
181 182 183 184
// Delete removes any existing value for key from the trie.
func (t *Trie) Delete(key []byte) {
	k := compactHexDecode(key)
	t.root = t.delete(t.root, k)
O
obscuren 已提交
185 186
}

F
Felix Lange 已提交
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
// delete returns the new root of the trie with key deleted.
// It reduces the trie to minimal form by simplifying
// nodes on the way up after deleting recursively.
func (t *Trie) delete(n node, key []byte) node {
	switch n := n.(type) {
	case shortNode:
		matchlen := prefixLen(key, n.Key)
		if matchlen < len(n.Key) {
			return n // don't replace n on mismatch
		}
		if matchlen == len(key) {
			return nil // remove n entirely for whole matches
		}
		// The key is longer than n.Key. Remove the remaining suffix
		// from the subtrie. Child can never be nil here since the
		// subtrie must contain at least two other values with keys
		// longer than n.Key.
		child := t.delete(n.Val, key[len(n.Key):])
		switch child := child.(type) {
		case shortNode:
			// Deleting from the subtrie reduced it to another
			// short node. Merge the nodes to avoid creating a
			// shortNode{..., shortNode{...}}. Use concat (which
			// always creates a new slice) instead of append to
			// avoid modifying n.Key since it might be shared with
			// other nodes.
			return shortNode{concat(n.Key, child.Key...), child.Val}
		default:
			return shortNode{n.Key, child}
O
obscuren 已提交
216 217
		}

F
Felix Lange 已提交
218 219 220 221 222 223 224 225 226 227 228
	case fullNode:
		n[key[0]] = t.delete(n[key[0]], key[1:])
		// Check how many non-nil entries are left after deleting and
		// reduce the full node to a short node if only one entry is
		// left. Since n must've contained at least two children
		// before deletion (otherwise it would not be a full node) n
		// can never be reduced to nil.
		//
		// When the loop is done, pos contains the index of the single
		// value that is left in n or -2 if n contains at least two
		// values.
O
obscuren 已提交
229
		pos := -1
F
Felix Lange 已提交
230 231
		for i, cld := range n {
			if cld != nil {
O
obscuren 已提交
232 233
				if pos == -1 {
					pos = i
O
obscuren 已提交
234
				} else {
O
obscuren 已提交
235
					pos = -2
F
Felix Lange 已提交
236
					break
O
obscuren 已提交
237 238 239
				}
			}
		}
F
Felix Lange 已提交
240 241 242 243 244 245 246 247 248 249 250 251 252
		if pos >= 0 {
			if pos != 16 {
				// If the remaining entry is a short node, it replaces
				// n and its key gets the missing nibble tacked to the
				// front. This avoids creating an invalid
				// shortNode{..., shortNode{...}}.  Since the entry
				// might not be loaded yet, resolve it just for this
				// check.
				cnode := t.resolve(n[pos])
				if cnode, ok := cnode.(shortNode); ok {
					k := append([]byte{byte(pos)}, cnode.Key...)
					return shortNode{k, cnode.Val}
				}
O
obscuren 已提交
253
			}
F
Felix Lange 已提交
254 255 256
			// Otherwise, n is replaced by a one-nibble short node
			// containing the child.
			return shortNode{[]byte{byte(pos)}, n[pos]}
O
obscuren 已提交
257
		}
F
Felix Lange 已提交
258 259
		// n still contains at least two values and cannot be reduced.
		return n
O
obscuren 已提交
260

O
obscuren 已提交
261 262
	case nil:
		return nil
F
Felix Lange 已提交
263 264 265 266 267 268 269 270 271 272

	case hashNode:
		// We've hit a part of the trie that isn't loaded yet. Load
		// the node and delete from it. This leaves all child nodes on
		// the path to the value in the trie.
		//
		// TODO: track whether deletion actually hit a key and keep
		// n as a hash node if it didn't.
		return t.delete(t.resolveHash(n), key)

O
obscuren 已提交
273
	default:
F
Felix Lange 已提交
274
		panic(fmt.Sprintf("%T: invalid node: %v (%v)", n, n, key))
O
obscuren 已提交
275
	}
O
obscuren 已提交
276 277
}

F
Felix Lange 已提交
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
func concat(s1 []byte, s2 ...byte) []byte {
	r := make([]byte, len(s1)+len(s2))
	copy(r, s1)
	copy(r[len(s1):], s2)
	return r
}

func (t *Trie) resolve(n node) node {
	if n, ok := n.(hashNode); ok {
		return t.resolveHash(n)
	}
	return n
}

func (t *Trie) resolveHash(n hashNode) node {
	if v, ok := globalCache.Get(n); ok {
		return v
	}
	enc, err := t.db.Get(n)
	if err != nil || enc == nil {
		// TODO: This needs to be improved to properly distinguish errors.
		// Disk I/O errors shouldn't produce nil (and cause a
		// consensus failure or weird crash), but it is unclear how
		// they could be handled because the entire stack above the trie isn't
		// prepared to cope with missing state nodes.
		if glog.V(logger.Error) {
			glog.Errorf("Dangling hash node ref %x: %v", n, err)
O
obscuren 已提交
305
		}
F
Felix Lange 已提交
306 307 308 309 310
		return nil
	}
	dec := mustDecodeNode(n, enc)
	if dec != nil {
		globalCache.Put(n, dec)
O
obscuren 已提交
311
	}
F
Felix Lange 已提交
312 313 314 315 316 317
	return dec
}

// Root returns the root hash of the trie.
// Deprecated: use Hash instead.
func (t *Trie) Root() []byte { return t.Hash().Bytes() }
O
obscuren 已提交
318

F
Felix Lange 已提交
319 320 321 322 323
// Hash returns the root hash of the trie. It does not write to the
// database and can be used even if the trie doesn't have one.
func (t *Trie) Hash() common.Hash {
	root, _ := t.hashRoot(nil)
	return common.BytesToHash(root.(hashNode))
O
obscuren 已提交
324 325
}

F
Felix Lange 已提交
326 327 328 329 330 331 332 333
// Commit writes all nodes to the trie's database.
// Nodes are stored with their sha3 hash as the key.
//
// Committing flushes nodes from memory.
// Subsequent Get calls will load nodes from the database.
func (t *Trie) Commit() (root common.Hash, err error) {
	if t.db == nil {
		panic("Commit called on trie with nil database")
O
obscuren 已提交
334
	}
F
Felix Lange 已提交
335
	return t.CommitTo(t.db)
O
obscuren 已提交
336 337
}

F
Felix Lange 已提交
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
// CommitTo writes all nodes to the given database.
// Nodes are stored with their sha3 hash as the key.
//
// Committing flushes nodes from memory. Subsequent Get calls will
// load nodes from the trie's database. Calling code must ensure that
// the changes made to db are written back to the trie's attached
// database before using the trie.
func (t *Trie) CommitTo(db DatabaseWriter) (root common.Hash, err error) {
	n, err := t.hashRoot(db)
	if err != nil {
		return (common.Hash{}), err
	}
	t.root = n
	return common.BytesToHash(n.(hashNode)), nil
}
O
obscuren 已提交
353

F
Felix Lange 已提交
354 355 356 357 358 359
func (t *Trie) hashRoot(db DatabaseWriter) (node, error) {
	if t.root == nil {
		return hashNode(emptyRoot.Bytes()), nil
	}
	if t.hasher == nil {
		t.hasher = newHasher()
O
obscuren 已提交
360
	}
F
Felix Lange 已提交
361 362
	return t.hasher.hash(t.root, db, true)
}
O
obscuren 已提交
363

F
Felix Lange 已提交
364 365 366
type hasher struct {
	tmp *bytes.Buffer
	sha hash.Hash
O
obscuren 已提交
367 368
}

F
Felix Lange 已提交
369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
func newHasher() *hasher {
	return &hasher{tmp: new(bytes.Buffer), sha: sha3.NewKeccak256()}
}

func (h *hasher) hash(n node, db DatabaseWriter, force bool) (node, error) {
	hashed, err := h.replaceChildren(n, db)
	if err != nil {
		return hashNode{}, err
	}
	if n, err = h.store(hashed, db, force); err != nil {
		return hashNode{}, err
	}
	return n, nil
}

// hashChildren replaces child nodes of n with their hashes if the encoded
// size of the child is larger than a hash.
func (h *hasher) replaceChildren(n node, db DatabaseWriter) (node, error) {
	var err error
	switch n := n.(type) {
	case shortNode:
		n.Key = compactEncode(n.Key)
		if _, ok := n.Val.(valueNode); !ok {
			if n.Val, err = h.hash(n.Val, db, false); err != nil {
				return n, err
			}
		}
		if n.Val == nil {
			// Ensure that nil children are encoded as empty strings.
			n.Val = valueNode(nil)
		}
		return n, nil
	case fullNode:
		for i := 0; i < 16; i++ {
			if n[i] != nil {
				if n[i], err = h.hash(n[i], db, false); err != nil {
					return n, err
				}
			} else {
				// Ensure that nil children are encoded as empty strings.
				n[i] = valueNode(nil)
			}
		}
		if n[16] == nil {
			n[16] = valueNode(nil)
		}
		return n, nil
	default:
		return n, nil
	}
}

func (h *hasher) store(n node, db DatabaseWriter, force bool) (node, error) {
	// Don't store hashes or empty nodes.
	if _, isHash := n.(hashNode); n == nil || isHash {
		return n, nil
	}
	h.tmp.Reset()
	if err := rlp.Encode(h.tmp, n); err != nil {
		panic("encode error: " + err.Error())
	}
	if h.tmp.Len() < 32 && !force {
		// Nodes smaller than 32 bytes are stored inside their parent.
		return n, nil
	}
	// Larger nodes are replaced by their hash and stored in the database.
	h.sha.Reset()
	h.sha.Write(h.tmp.Bytes())
	key := hashNode(h.sha.Sum(nil))
	if db != nil {
		err := db.Put(key, h.tmp.Bytes())
		return key, err
	}
	return key, nil
O
obscuren 已提交
443
}