github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/trie/iterator.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:45</date> 10 //</624450122926788608> 11 12 13 package trie 14 15 import ( 16 "bytes" 17 "container/heap" 18 "errors" 19 20 "github.com/ethereum/go-ethereum/common" 21 "github.com/ethereum/go-ethereum/rlp" 22 ) 23 24 //迭代器是一个键值trie迭代器,它遍历trie。 25 type Iterator struct { 26 nodeIt NodeIterator 27 28 Key []byte //迭代器所在的当前数据键 29 Value []byte //迭代器所在的当前数据值 30 Err error 31 } 32 33 //NewIterator从节点迭代器创建新的键值迭代器 34 func NewIterator(it NodeIterator) *Iterator { 35 return &Iterator{ 36 nodeIt: it, 37 } 38 } 39 40 //下一步将迭代器向前移动一个键值项。 41 func (it *Iterator) Next() bool { 42 for it.nodeIt.Next(true) { 43 if it.nodeIt.Leaf() { 44 it.Key = it.nodeIt.LeafKey() 45 it.Value = it.nodeIt.LeafBlob() 46 return true 47 } 48 } 49 it.Key = nil 50 it.Value = nil 51 it.Err = it.nodeIt.Error() 52 return false 53 } 54 55 //prove为迭代器当前所在的叶节点生成merkle proof 56 //定位在。 57 func (it *Iterator) Prove() [][]byte { 58 return it.nodeIt.LeafProof() 59 } 60 61 //nodeiterator是一个迭代器,用于遍历trie的pre-order。 62 type NodeIterator interface { 63 //下一步将迭代器移动到下一个节点。如果参数为false,则任何子级 64 //将跳过节点。 65 Next(bool) bool 66 67 //错误返回迭代器的错误状态。 68 Error() error 69 70 //哈希返回当前节点的哈希。 71 Hash() common.Hash 72 73 //父节点返回当前节点父节点的哈希。哈希值可能是 74 //如果直接父节点是没有哈希的内部节点,则为祖父母。 75 Parent() common.Hash 76 77 //path返回到当前节点的十六进制编码路径。 78 //调用方在调用next后不能保留对返回值的引用。 79 //对于叶节点,路径的最后一个元素是“终止符符号”0x10。 80 Path() []byte 81 82 //如果当前节点是叶节点,则叶返回真值。 83 Leaf() bool 84 85 //leaf key返回叶的键。如果迭代器不是 86 //放在一片叶子上。调用方不能保留对以下值的引用 87 //呼叫下一个。 88 LeafKey() []byte 89 90 //leafblob返回叶的内容。如果迭代器 91 //不在叶上。调用方不能保留对值的引用 92 //在呼叫下一个之后。 93 LeafBlob() []byte 94 95 //leaf proof返回叶子的merkle证明。如果 96 //迭代器未定位在叶上。调用方不能保留引用 97 //调用next后的值。 98 LeafProof() [][]byte 99 } 100 101 //nodeiteratorState表示在 102 //trie,可以在以后的调用中恢复。 103 type nodeIteratorState struct { 104 hash common.Hash //正在迭代的节点的哈希(如果不是独立的,则为零) 105 node node //正在迭代的trie节点 106 parent common.Hash //第一个完整祖先节点的哈希(如果当前是根节点,则为零) 107 index int //下一个要处理的子级 108 pathlen int //此节点的路径长度 109 } 110 111 type nodeIterator struct { 112 trie *Trie //正在迭代的trie 113 stack []*nodeIteratorState //保持迭代状态的trie节点的层次结构 114 path []byte //当前节点的路径 115 err error //迭代器中出现内部错误时的故障集 116 } 117 118 //迭代完成后,errIteratorEnd存储在nodeiterator.err中。 119 var errIteratorEnd = errors.New("end of iteration") 120 121 //如果初始搜索失败,则seek err存储在nodeiterator.err中。 122 type seekError struct { 123 key []byte 124 err error 125 } 126 127 func (e seekError) Error() string { 128 return "seek error: " + e.err.Error() 129 } 130 131 func newNodeIterator(trie *Trie, start []byte) NodeIterator { 132 if trie.Hash() == emptyState { 133 return new(nodeIterator) 134 } 135 it := &nodeIterator{trie: trie} 136 it.err = it.seek(start) 137 return it 138 } 139 140 func (it *nodeIterator) Hash() common.Hash { 141 if len(it.stack) == 0 { 142 return common.Hash{} 143 } 144 return it.stack[len(it.stack)-1].hash 145 } 146 147 func (it *nodeIterator) Parent() common.Hash { 148 if len(it.stack) == 0 { 149 return common.Hash{} 150 } 151 return it.stack[len(it.stack)-1].parent 152 } 153 154 func (it *nodeIterator) Leaf() bool { 155 return hasTerm(it.path) 156 } 157 158 func (it *nodeIterator) LeafKey() []byte { 159 if len(it.stack) > 0 { 160 if _, ok := it.stack[len(it.stack)-1].node.(valueNode); ok { 161 return hexToKeybytes(it.path) 162 } 163 } 164 panic("not at leaf") 165 } 166 167 func (it *nodeIterator) LeafBlob() []byte { 168 if len(it.stack) > 0 { 169 if node, ok := it.stack[len(it.stack)-1].node.(valueNode); ok { 170 return []byte(node) 171 } 172 } 173 panic("not at leaf") 174 } 175 176 func (it *nodeIterator) LeafProof() [][]byte { 177 if len(it.stack) > 0 { 178 if _, ok := it.stack[len(it.stack)-1].node.(valueNode); ok { 179 hasher := newHasher(0, 0, nil) 180 defer returnHasherToPool(hasher) 181 182 proofs := make([][]byte, 0, len(it.stack)) 183 184 for i, item := range it.stack[:len(it.stack)-1] { 185 //收集最终成为哈希节点(或根节点)的节点 186 node, _, _ := hasher.hashChildren(item.node, nil) 187 hashed, _ := hasher.store(node, nil, false) 188 if _, ok := hashed.(hashNode); ok || i == 0 { 189 enc, _ := rlp.EncodeToBytes(node) 190 proofs = append(proofs, enc) 191 } 192 } 193 return proofs 194 } 195 } 196 panic("not at leaf") 197 } 198 199 func (it *nodeIterator) Path() []byte { 200 return it.path 201 } 202 203 func (it *nodeIterator) Error() error { 204 if it.err == errIteratorEnd { 205 return nil 206 } 207 if seek, ok := it.err.(seekError); ok { 208 return seek.err 209 } 210 return it.err 211 } 212 213 //next将迭代器移动到下一个节点,返回是否存在 214 //进一步的节点。如果出现内部错误,此方法将返回false,并且 215 //将错误字段设置为遇到的故障。如果'Descend'为false, 216 //跳过当前节点的任何子节点的迭代。 217 func (it *nodeIterator) Next(descend bool) bool { 218 if it.err == errIteratorEnd { 219 return false 220 } 221 if seek, ok := it.err.(seekError); ok { 222 if it.err = it.seek(seek.key); it.err != nil { 223 return false 224 } 225 } 226 //否则,使用迭代器前进并报告任何错误。 227 state, parentIndex, path, err := it.peek(descend) 228 it.err = err 229 if it.err != nil { 230 return false 231 } 232 it.push(state, parentIndex, path) 233 return true 234 } 235 236 func (it *nodeIterator) seek(prefix []byte) error { 237 //我们要查找的路径是不带终止符的十六进制编码键。 238 key := keybytesToHex(prefix) 239 key = key[:len(key)-1] 240 //向前移动,直到我们刚好在最接近的匹配键之前。 241 for { 242 state, parentIndex, path, err := it.peek(bytes.HasPrefix(key, it.path)) 243 if err == errIteratorEnd { 244 return errIteratorEnd 245 } else if err != nil { 246 return seekError{prefix, err} 247 } else if bytes.Compare(path, key) >= 0 { 248 return nil 249 } 250 it.push(state, parentIndex, path) 251 } 252 } 253 254 //Peek创建迭代器的下一个状态。 255 func (it *nodeIterator) peek(descend bool) (*nodeIteratorState, *int, []byte, error) { 256 if len(it.stack) == 0 { 257 //如果我们刚刚开始,初始化迭代器。 258 root := it.trie.Hash() 259 state := &nodeIteratorState{node: it.trie.root, index: -1} 260 if root != emptyRoot { 261 state.hash = root 262 } 263 err := state.resolve(it.trie, nil) 264 return state, nil, nil, err 265 } 266 if !descend { 267 //如果跳过子节点,请先弹出当前节点 268 it.pop() 269 } 270 271 //继续迭代到下一个子级 272 for len(it.stack) > 0 { 273 parent := it.stack[len(it.stack)-1] 274 ancestor := parent.hash 275 if (ancestor == common.Hash{}) { 276 ancestor = parent.parent 277 } 278 state, path, ok := it.nextChild(parent, ancestor) 279 if ok { 280 if err := state.resolve(it.trie, path); err != nil { 281 return parent, &parent.index, path, err 282 } 283 return state, &parent.index, path, nil 284 } 285 //不再有子节点,请向后移动。 286 it.pop() 287 } 288 return nil, nil, nil, errIteratorEnd 289 } 290 291 func (st *nodeIteratorState) resolve(tr *Trie, path []byte) error { 292 if hash, ok := st.node.(hashNode); ok { 293 resolved, err := tr.resolveHash(hash, path) 294 if err != nil { 295 return err 296 } 297 st.node = resolved 298 st.hash = common.BytesToHash(hash) 299 } 300 return nil 301 } 302 303 func (it *nodeIterator) nextChild(parent *nodeIteratorState, ancestor common.Hash) (*nodeIteratorState, []byte, bool) { 304 switch node := parent.node.(type) { 305 case *fullNode: 306 //完整节点,移动到第一个非零子节点。 307 for i := parent.index + 1; i < len(node.Children); i++ { 308 child := node.Children[i] 309 if child != nil { 310 hash, _ := child.cache() 311 state := &nodeIteratorState{ 312 hash: common.BytesToHash(hash), 313 node: child, 314 parent: ancestor, 315 index: -1, 316 pathlen: len(it.path), 317 } 318 path := append(it.path, byte(i)) 319 parent.index = i - 1 320 return state, path, true 321 } 322 } 323 case *shortNode: 324 //短节点,返回指针singleton子级 325 if parent.index < 0 { 326 hash, _ := node.Val.cache() 327 state := &nodeIteratorState{ 328 hash: common.BytesToHash(hash), 329 node: node.Val, 330 parent: ancestor, 331 index: -1, 332 pathlen: len(it.path), 333 } 334 path := append(it.path, node.Key...) 335 return state, path, true 336 } 337 } 338 return parent, it.path, false 339 } 340 341 func (it *nodeIterator) push(state *nodeIteratorState, parentIndex *int, path []byte) { 342 it.path = path 343 it.stack = append(it.stack, state) 344 if parentIndex != nil { 345 *parentIndex++ 346 } 347 } 348 349 func (it *nodeIterator) pop() { 350 parent := it.stack[len(it.stack)-1] 351 it.path = it.path[:parent.pathlen] 352 it.stack = it.stack[:len(it.stack)-1] 353 } 354 355 func compareNodes(a, b NodeIterator) int { 356 if cmp := bytes.Compare(a.Path(), b.Path()); cmp != 0 { 357 return cmp 358 } 359 if a.Leaf() && !b.Leaf() { 360 return -1 361 } else if b.Leaf() && !a.Leaf() { 362 return 1 363 } 364 if cmp := bytes.Compare(a.Hash().Bytes(), b.Hash().Bytes()); cmp != 0 { 365 return cmp 366 } 367 if a.Leaf() && b.Leaf() { 368 return bytes.Compare(a.LeafBlob(), b.LeafBlob()) 369 } 370 return 0 371 } 372 373 type differenceIterator struct { 374 a, b NodeIterator //返回的节点是B-A中的节点。 375 eof bool //表示元素已用完 376 count int //在任一个trie上扫描的节点数 377 } 378 379 //newDifferenceInterator构造一个nodeiterator,它迭代b中的元素, 380 //不在a中。返回迭代器和一个指向记录数字的整数的指针 381 //节点看到。 382 func NewDifferenceIterator(a, b NodeIterator) (NodeIterator, *int) { 383 a.Next(true) 384 it := &differenceIterator{ 385 a: a, 386 b: b, 387 } 388 return it, &it.count 389 } 390 391 func (it *differenceIterator) Hash() common.Hash { 392 return it.b.Hash() 393 } 394 395 func (it *differenceIterator) Parent() common.Hash { 396 return it.b.Parent() 397 } 398 399 func (it *differenceIterator) Leaf() bool { 400 return it.b.Leaf() 401 } 402 403 func (it *differenceIterator) LeafKey() []byte { 404 return it.b.LeafKey() 405 } 406 407 func (it *differenceIterator) LeafBlob() []byte { 408 return it.b.LeafBlob() 409 } 410 411 func (it *differenceIterator) LeafProof() [][]byte { 412 return it.b.LeafProof() 413 } 414 415 func (it *differenceIterator) Path() []byte { 416 return it.b.Path() 417 } 418 419 func (it *differenceIterator) Next(bool) bool { 420 //Invariants: 421 //-我们总是在b中至少推进一个元素。 422 //—在该函数的开头,a的路径在词汇上大于b的路径。 423 if !it.b.Next(true) { 424 return false 425 } 426 it.count++ 427 428 if it.eof { 429 //A已达到EOF,所以我们只返回B的所有元素 430 return true 431 } 432 433 for { 434 switch compareNodes(it.a, it.b) { 435 case -1: 436 //B跳过A;前进A 437 if !it.a.Next(true) { 438 it.eof = true 439 return true 440 } 441 it.count++ 442 case 1: 443 //B在A之前 444 return true 445 case 0: 446 //A和B是相同的;如果节点具有哈希值,则跳过整个子树 447 hasHash := it.a.Hash() == common.Hash{} 448 if !it.b.Next(hasHash) { 449 return false 450 } 451 it.count++ 452 if !it.a.Next(hasHash) { 453 it.eof = true 454 return true 455 } 456 it.count++ 457 } 458 } 459 } 460 461 func (it *differenceIterator) Error() error { 462 if err := it.a.Error(); err != nil { 463 return err 464 } 465 return it.b.Error() 466 } 467 468 type nodeIteratorHeap []NodeIterator 469 470 func (h nodeIteratorHeap) Len() int { return len(h) } 471 func (h nodeIteratorHeap) Less(i, j int) bool { return compareNodes(h[i], h[j]) < 0 } 472 func (h nodeIteratorHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } 473 func (h *nodeIteratorHeap) Push(x interface{}) { *h = append(*h, x.(NodeIterator)) } 474 func (h *nodeIteratorHeap) Pop() interface{} { 475 n := len(*h) 476 x := (*h)[n-1] 477 *h = (*h)[0 : n-1] 478 return x 479 } 480 481 type unionIterator struct { 482 items *nodeIteratorHeap //返回的节点是这些迭代器中的节点的联合 483 count int //在所有尝试中扫描的节点数 484 } 485 486 //NewUnionIterator构造一个节点运算符,它迭代联合中的元素 487 //提供的节点运算符。返回迭代器和指向整数的指针 488 //记录访问的节点数。 489 func NewUnionIterator(iters []NodeIterator) (NodeIterator, *int) { 490 h := make(nodeIteratorHeap, len(iters)) 491 copy(h, iters) 492 heap.Init(&h) 493 494 ui := &unionIterator{items: &h} 495 return ui, &ui.count 496 } 497 498 func (it *unionIterator) Hash() common.Hash { 499 return (*it.items)[0].Hash() 500 } 501 502 func (it *unionIterator) Parent() common.Hash { 503 return (*it.items)[0].Parent() 504 } 505 506 func (it *unionIterator) Leaf() bool { 507 return (*it.items)[0].Leaf() 508 } 509 510 func (it *unionIterator) LeafKey() []byte { 511 return (*it.items)[0].LeafKey() 512 } 513 514 func (it *unionIterator) LeafBlob() []byte { 515 return (*it.items)[0].LeafBlob() 516 } 517 518 func (it *unionIterator) LeafProof() [][]byte { 519 return (*it.items)[0].LeafProof() 520 } 521 522 func (it *unionIterator) Path() []byte { 523 return (*it.items)[0].Path() 524 } 525 526 //next返回正在迭代的尝试联合中的下一个节点。 527 // 528 //它通过维护一堆迭代器(按迭代排序)来实现这一点。 529 //下一个元素的顺序,每个源trie有一个条目。各 530 //调用next()时,需要从堆中返回最少的元素, 531 //推进任何其他也指向同一元素的迭代器。这些 532 //使用Descend=false调用迭代器,因为我们知道 533 //这些节点也将是重复的,可以在当前选定的迭代器中找到。 534 //每当一个迭代器被提升时,如果它仍然被推回到堆中 535 //还有个元素。 536 // 537 //在Descend=false的情况下-例如,我们被要求忽略 538 //当前节点-我们还推进堆中具有当前节点的任何迭代器 539 //作为前缀的路径。 540 func (it *unionIterator) Next(descend bool) bool { 541 if len(*it.items) == 0 { 542 return false 543 } 544 545 //从工会那里拿到下一把钥匙 546 least := heap.Pop(it.items).(NodeIterator) 547 548 //跳过其他节点,只要它们相同,或者,如果我们不降序,则为 549 //只要它们具有与当前节点相同的前缀。 550 for len(*it.items) > 0 && ((!descend && bytes.HasPrefix((*it.items)[0].Path(), least.Path())) || compareNodes(least, (*it.items)[0]) == 0) { 551 skipped := heap.Pop(it.items).(NodeIterator) 552 //如果节点具有哈希值,则跳过整个子树;否则只跳过此节点。 553 if skipped.Next(skipped.Hash() == common.Hash{}) { 554 it.count++ 555 //如果有更多的元素,将迭代器推回到堆上 556 heap.Push(it.items, skipped) 557 } 558 } 559 if least.Next(descend) { 560 it.count++ 561 heap.Push(it.items, least) 562 } 563 return len(*it.items) > 0 564 } 565 566 func (it *unionIterator) Error() error { 567 for i := 0; i < len(*it.items); i++ { 568 if err := (*it.items)[i].Error(); err != nil { 569 return err 570 } 571 } 572 return nil 573 } 574