diff --git a/cmd/hack/hack.go b/cmd/hack/hack.go index 6a481ebc0026580e17ee380680cdb83412d6027d..535cca5031cec95e6ecbe77e426b88f717bdc7f7 100644 --- a/cmd/hack/hack.go +++ b/cmd/hack/hack.go @@ -36,7 +36,6 @@ import ( "github.com/ledgerwatch/erigon-lib/kv/mdbx" "github.com/ledgerwatch/erigon-lib/patricia" "github.com/ledgerwatch/erigon-lib/recsplit" - "github.com/ledgerwatch/erigon-lib/txpool" hackdb "github.com/ledgerwatch/erigon/cmd/hack/db" "github.com/ledgerwatch/erigon/cmd/hack/flow" "github.com/ledgerwatch/erigon/cmd/hack/tool" @@ -1188,11 +1187,6 @@ func dumpState(chaindata string, block int, name string) error { return err } defer cc.Close() - var hc kv.Cursor - if hc, err = tx.Cursor(kv.Code); err != nil { - return err - } - defer hc.Close() i := 0 numBuf := make([]byte, binary.MaxVarintLen64) k, v, e := sc.First() @@ -1221,8 +1215,8 @@ func dumpState(chaindata string, block int, name string) error { return err } if a.CodeHash != trie.EmptyCodeHash { - var code []byte - if _, code, err = hc.SeekExact(a.CodeHash[:]); err != nil { + code, err := tx.GetOne(kv.Code, a.CodeHash[:]) + if err != nil { return err } if len(code) != 0 { @@ -2649,153 +2643,6 @@ func recsplitWholeChain(chaindata string) error { return nil } -func recsplitLookup(chaindata, name string) error { - database := mdbx.MustOpen(chaindata) - defer database.Close() - chainConfig := tool.ChainConfigFromDB(database) - chainID, _ := uint256.FromBig(chainConfig.ChainID) - logEvery := time.NewTicker(20 * time.Second) - defer logEvery.Stop() - - d, err := compress.NewDecompressor(name + ".seg") - if err != nil { - return err - } - defer d.Close() - - idx := recsplit.MustOpen(name + ".idx") - defer idx.Close() - - var word, word2 = make([]byte, 0, 4096), make([]byte, 0, 4096) - wc := 0 - g := d.MakeGetter() - dataGetter := d.MakeGetter() - - parseCtx := txpool.NewTxParseContext(*chainID) - parseCtx.WithSender(false) - slot := txpool.TxSlot{} - var sender [20]byte - var l1, l2, total time.Duration - start := time.Now() - var prev []byte - var prevOffset uint64 - for g.HasNext() { - word, _ = g.Next(word[:0]) - if _, err := parseCtx.ParseTransaction(word[1:], 0, &slot, sender[:]); err != nil { - return err - } - wc++ - - t := time.Now() - recID := idx.Lookup(slot.IdHash[:]) - l1 += time.Since(t) - t = time.Now() - offset := idx.Lookup2(recID) - l2 += time.Since(t) - if ASSERT { - var dataP uint64 - if prev != nil { - dataGetter.Reset(prevOffset) - word2, dataP = dataGetter.Next(word2[:0]) - if !bytes.Equal(word, word2) { - fmt.Printf("wc=%d, %d,%d\n", wc, offset, dataP-uint64(len(word2))) - fmt.Printf("word: %x,%x\n\n", word, word2) - panic(fmt.Errorf("getter returned wrong data. IdHash=%x, offset=%x", slot.IdHash[:], offset)) - } - } - prev = common.CopyBytes(word) - prevOffset = offset - } - - select { - default: - case <-logEvery.C: - var m runtime.MemStats - runtime.ReadMemStats(&m) - log.Info("Checked", "millions", float64(wc)/1_000_000, - "lookup", time.Duration(int64(l1)/int64(wc)), "lookup2", time.Duration(int64(l2)/int64(wc)), - "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys), - ) - } - } - - total = time.Since(start) - log.Info("Average decoding time", "lookup", time.Duration(int64(l1)/int64(wc)), "lookup + lookup2", time.Duration(int64(l2)/int64(wc)), "items", wc, "total", total) - return nil -} - -func createIdx(chaindata string, name string) error { - database := mdbx.MustOpen(chaindata) - defer database.Close() - chainConfig := tool.ChainConfigFromDB(database) - chainID, _ := uint256.FromBig(chainConfig.ChainID) - d, err := compress.NewDecompressor(name + ".seg") - if err != nil { - return err - } - defer d.Close() - return _createIdx(*chainID, name, d.Count()) -} -func _createIdx(chainID uint256.Int, name string, count int) error { - d, err := compress.NewDecompressor(name + ".seg") - if err != nil { - return err - } - defer d.Close() - logEvery := time.NewTicker(20 * time.Second) - defer logEvery.Stop() - rs, err := recsplit.NewRecSplit(recsplit.RecSplitArgs{ - KeyCount: int(count), - Enums: true, - BucketSize: 2000, - Salt: 0, - LeafSize: 8, - TmpDir: "", - IndexFile: name + ".idx", - }) - if err != nil { - return err - } - -RETRY: - - var word = make([]byte, 0, 256) - g := d.MakeGetter() - wc := 0 - var pos uint64 - parseCtx := txpool.NewTxParseContext(chainID) - parseCtx.WithSender(false) - slot := txpool.TxSlot{} - var sender [20]byte - - for g.HasNext() { - word, pos = g.Next(word[:0]) - if _, err := parseCtx.ParseTransaction(word[1:], 0, &slot, sender[:]); err != nil { - return err - } - if err := rs.AddKey(slot.IdHash[:], pos); err != nil { - return err - } - wc++ - select { - default: - case <-logEvery.C: - log.Info("[Filling recsplit] Processed", "millions", wc/1_000_000) - } - } - log.Info("Building recsplit...") - - if err = rs.Build(); err != nil { - if errors.Is(err, recsplit.ErrCollision) { - log.Info("Building recsplit. Collision happened. It's ok. Restarting...", "err", err) - rs.ResetNextSalt() - goto RETRY - } - return err - } - - return nil -} func decompress(name string) error { d, err := compress.NewDecompressor(name + ".seg") if err != nil { @@ -4077,12 +3924,8 @@ func main() { err = dumpState(*chaindata, int(*block), *name) case "compress": err = compress1(*chaindata, *name, *name) - case "createIdx": - err = createIdx(*chaindata, *name) case "recsplitWholeChain": err = recsplitWholeChain(*chaindata) - case "recsplitLookup": - err = recsplitLookup(*chaindata, *name) case "decompress": err = decompress(*name) case "genstate": diff --git a/turbo/snapshotsync/block_reader.go b/turbo/snapshotsync/block_reader.go index 44f62d6d4066020cf15a6ab669836efee66eaab1..c136bcd1ac04ff077f390cd05fc6578082a9eba7 100644 --- a/turbo/snapshotsync/block_reader.go +++ b/turbo/snapshotsync/block_reader.go @@ -102,7 +102,7 @@ func (back *BlockReaderWithSnapshots) BlockWithSenders(ctx context.Context, tx k gg := sn.Headers.Segment.MakeGetter() gg.Reset(headerOffset) - buf, _ = gg.Next(buf[:0]) //TODO: use gg.Current here + buf, _ = gg.Next(buf[:0]) h := &types.Header{} if err = rlp.DecodeBytes(buf, h); err != nil { return nil, nil, err @@ -110,7 +110,7 @@ func (back *BlockReaderWithSnapshots) BlockWithSenders(ctx context.Context, tx k gg = sn.Bodies.Segment.MakeGetter() gg.Reset(bodyOffset) - buf, _ = gg.Next(buf[:0]) //TODO: use gg.Current here + buf, _ = gg.Next(buf[:0]) b := &types.BodyForStorage{} if err = rlp.DecodeBytes(buf, b); err != nil { return nil, nil, err @@ -124,7 +124,6 @@ func (back *BlockReaderWithSnapshots) BlockWithSenders(ctx context.Context, tx k stream := rlp.NewStream(reader, 0) txs := make([]types.Transaction, b.TxAmount) senders = make([]common.Address, b.TxAmount) - //TODO: use gg.Current here for i := uint32(0); i < b.TxAmount; i++ { buf, _ = gg.Next(buf[:0]) senders[i].SetBytes(buf[1 : 1+20])