From 24987878e4565c46d014048197b6e66fda69eb76 Mon Sep 17 00:00:00 2001 From: Giulio rebuffo Date: Mon, 11 Dec 2023 14:07:57 +0100 Subject: [PATCH] Resumable beacon state reconstruction (#8918) * Most of the PR changed files are extra and slightly more complicated unit tests. * Fixed Eth1DataVotes not inheriting genesis * Fixed Attestations simulation using wrong slot when reconstructing partecipation * Fixed Copy() operation on BeaconState on Eth1DataVotes * Used correct ListSSZ type for Eth1DataVotes and HistoricalSummaries * Fixed wrong []uint64 deltas on empty slots --- cl/antiquary/state_antiquary.go | 128 +++++++++++++++--- cl/antiquary/state_antiquary_test.go | 8 ++ .../test_data/bellatrix/blocks_0.ssz_snappy | Bin 0 -> 668 bytes .../test_data/bellatrix/blocks_1.ssz_snappy | Bin 0 -> 671 bytes .../test_data/bellatrix/blocks_10.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_11.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_12.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_13.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_14.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_15.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_16.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_17.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_18.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_19.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_2.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_20.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_21.ssz_snappy | Bin 0 -> 671 bytes .../test_data/bellatrix/blocks_22.ssz_snappy | Bin 0 -> 671 bytes .../test_data/bellatrix/blocks_23.ssz_snappy | Bin 0 -> 671 bytes .../test_data/bellatrix/blocks_24.ssz_snappy | Bin 0 -> 671 bytes .../test_data/bellatrix/blocks_25.ssz_snappy | Bin 0 -> 675 bytes .../test_data/bellatrix/blocks_26.ssz_snappy | Bin 0 -> 675 bytes .../test_data/bellatrix/blocks_27.ssz_snappy | Bin 0 -> 671 bytes .../test_data/bellatrix/blocks_28.ssz_snappy | Bin 0 -> 672 bytes .../test_data/bellatrix/blocks_29.ssz_snappy | Bin 0 -> 671 bytes .../test_data/bellatrix/blocks_3.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_30.ssz_snappy | Bin 0 -> 671 bytes .../test_data/bellatrix/blocks_31.ssz_snappy | Bin 0 -> 673 bytes .../test_data/bellatrix/blocks_32.ssz_snappy | Bin 0 -> 702 bytes .../test_data/bellatrix/blocks_33.ssz_snappy | Bin 0 -> 702 bytes .../test_data/bellatrix/blocks_34.ssz_snappy | Bin 0 -> 704 bytes .../test_data/bellatrix/blocks_35.ssz_snappy | Bin 0 -> 702 bytes .../test_data/bellatrix/blocks_36.ssz_snappy | Bin 0 -> 702 bytes .../test_data/bellatrix/blocks_37.ssz_snappy | Bin 0 -> 703 bytes .../test_data/bellatrix/blocks_38.ssz_snappy | Bin 0 -> 702 bytes .../test_data/bellatrix/blocks_39.ssz_snappy | Bin 0 -> 700 bytes .../test_data/bellatrix/blocks_4.ssz_snappy | Bin 0 -> 674 bytes .../test_data/bellatrix/blocks_40.ssz_snappy | Bin 0 -> 700 bytes .../test_data/bellatrix/blocks_41.ssz_snappy | Bin 0 -> 702 bytes .../test_data/bellatrix/blocks_42.ssz_snappy | Bin 0 -> 705 bytes .../test_data/bellatrix/blocks_43.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_44.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_45.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_46.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_47.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_48.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_49.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_5.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_50.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_51.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_52.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_53.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_54.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_55.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_56.ssz_snappy | Bin 0 -> 698 bytes .../test_data/bellatrix/blocks_57.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_58.ssz_snappy | Bin 0 -> 705 bytes .../test_data/bellatrix/blocks_59.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_6.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_60.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_61.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_62.ssz_snappy | Bin 0 -> 701 bytes .../test_data/bellatrix/blocks_63.ssz_snappy | Bin 0 -> 700 bytes .../test_data/bellatrix/blocks_64.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_65.ssz_snappy | Bin 0 -> 733 bytes .../test_data/bellatrix/blocks_66.ssz_snappy | Bin 0 -> 728 bytes .../test_data/bellatrix/blocks_67.ssz_snappy | Bin 0 -> 730 bytes .../test_data/bellatrix/blocks_68.ssz_snappy | Bin 0 -> 728 bytes .../test_data/bellatrix/blocks_69.ssz_snappy | Bin 0 -> 730 bytes .../test_data/bellatrix/blocks_7.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_70.ssz_snappy | Bin 0 -> 733 bytes .../test_data/bellatrix/blocks_71.ssz_snappy | Bin 0 -> 733 bytes .../test_data/bellatrix/blocks_72.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_73.ssz_snappy | Bin 0 -> 733 bytes .../test_data/bellatrix/blocks_74.ssz_snappy | Bin 0 -> 730 bytes .../test_data/bellatrix/blocks_75.ssz_snappy | Bin 0 -> 733 bytes .../test_data/bellatrix/blocks_76.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_77.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_78.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_79.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_8.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_80.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_81.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_82.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_83.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_84.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_85.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_86.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_87.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_88.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_89.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_9.ssz_snappy | Bin 0 -> 670 bytes .../test_data/bellatrix/blocks_90.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_91.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_92.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_93.ssz_snappy | Bin 0 -> 733 bytes .../test_data/bellatrix/blocks_94.ssz_snappy | Bin 0 -> 729 bytes .../test_data/bellatrix/blocks_95.ssz_snappy | Bin 0 -> 702 bytes .../tests/test_data/bellatrix/meta.yaml | 1 + .../tests/test_data/bellatrix/post.ssz_snappy | Bin 0 -> 182685 bytes .../tests/test_data/bellatrix/pre.ssz_snappy | Bin 0 -> 175634 bytes cl/antiquary/tests/tests.go | 42 ++++++ cl/cltypes/eth1_block.go | 7 +- cl/cltypes/solid/checkpoint.go | 8 +- cl/cltypes/solid/uint64slice_byte.go | 2 +- cl/cltypes/solid/validator_set.go | 2 + cl/persistence/base_encoding/uint64_diff.go | 6 +- .../historical_states_reader.go | 105 +++++++------- .../historical_states_reader_test.go | 17 ++- cl/persistence/state/state_accessors.go | 31 +++++ .../state/static_validator_table.go | 24 ++++ cl/persistence/state/validator_events_test.go | 2 - cl/phase1/core/state/cache.go | 6 +- cl/phase1/core/state/cache_accessors.go | 11 +- cl/phase1/core/state/copy.go | 2 +- cl/phase1/core/state/raw/copy.go | 2 +- cl/phase1/core/state/ssz.go | 2 +- cl/rpc/rpc.go | 2 +- cl/spectest/consensus_tests/finality.go | 5 +- cl/spectest/consensus_tests/ssz_static.go | 1 - cl/ssz/decode.go | 1 - cl/ssz/encode.go | 1 + cl/transition/impl/eth2/operations.go | 2 +- cl/utils/bytes.go | 15 ++ cmd/capcli/cli.go | 111 ++++++++++++++- cmd/caplin/caplin1/run.go | 36 ++--- 126 files changed, 466 insertions(+), 114 deletions(-) create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_0.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_1.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_10.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_11.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_12.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_13.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_14.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_15.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_16.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_17.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_18.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_19.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_2.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_20.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_21.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_22.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_23.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_24.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_25.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_26.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_27.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_28.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_29.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_3.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_30.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_31.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_32.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_33.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_34.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_35.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_36.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_37.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_38.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_39.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_4.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_40.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_41.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_42.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_43.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_44.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_45.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_46.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_47.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_48.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_49.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_5.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_50.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_51.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_52.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_53.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_54.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_55.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_56.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_57.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_58.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_59.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_6.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_60.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_61.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_62.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_63.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_64.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_65.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_66.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_67.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_68.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_69.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_7.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_70.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_71.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_72.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_73.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_74.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_75.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_76.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_77.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_78.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_79.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_8.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_80.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_81.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_82.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_83.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_84.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_85.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_86.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_87.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_88.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_89.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_9.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_90.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_91.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_92.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_93.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_94.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/blocks_95.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/meta.yaml create mode 100644 cl/antiquary/tests/test_data/bellatrix/post.ssz_snappy create mode 100644 cl/antiquary/tests/test_data/bellatrix/pre.ssz_snappy diff --git a/cl/antiquary/state_antiquary.go b/cl/antiquary/state_antiquary.go index 3cdd3de87cc..a85787e8e99 100644 --- a/cl/antiquary/state_antiquary.go +++ b/cl/antiquary/state_antiquary.go @@ -23,6 +23,7 @@ import ( "github.com/ledgerwatch/erigon/cl/persistence/base_encoding" "github.com/ledgerwatch/erigon/cl/persistence/beacon_indicies" state_accessors "github.com/ledgerwatch/erigon/cl/persistence/state" + "github.com/ledgerwatch/erigon/cl/persistence/state/historical_states_reader" "github.com/ledgerwatch/erigon/cl/phase1/core/state" "github.com/ledgerwatch/erigon/cl/phase1/core/state/raw" "github.com/ledgerwatch/erigon/cl/phase1/core/state/shuffling" @@ -134,6 +135,7 @@ func uint64BalancesList(s *state.CachingBeaconState, out []uint64) []uint64 { func (s *Antiquary) IncrementBeaconState(ctx context.Context, to uint64) error { var tx kv.Tx + tx, err := s.mainDB.BeginRo(ctx) if err != nil { return err @@ -182,6 +184,20 @@ func (s *Antiquary) IncrementBeaconState(ctx context.Context, to uint64) error { stateEvents := etl.NewCollector(kv.StateEvents, s.dirs.Tmp, etl.NewSortableBuffer(etl.BufferOptimalSize), s.logger) defer stateEvents.Close() + progress, err := state_accessors.GetStateProcessingProgress(tx) + if err != nil { + return err + } + // Go back a little bit + if progress > s.cfg.SlotsPerEpoch*2 { + progress -= s.cfg.SlotsPerEpoch * 2 + } else { + progress = 0 + } + progress, err = findNearestSlotBackwards(tx, progress) // Maybe the guess was a missed slot. + if err != nil { + return err + } // buffers commonBuffer := &bytes.Buffer{} compressedWriter, err := zstd.NewWriter(commonBuffer, zstd.WithEncoderLevel(zstd.SpeedBetterCompression)) @@ -189,18 +205,35 @@ func (s *Antiquary) IncrementBeaconState(ctx context.Context, to uint64) error { return err } defer compressedWriter.Close() - // TODO(Giulio2002): also store genesis information and resume from state. if s.currentState == nil { - s.currentState, err = s.genesisState.Copy() - if err != nil { - return err - } - // Collect genesis state if we are at genesis - if err := s.collectGenesisState(ctx, compressedWriter, s.currentState, slashings, proposers, minimalBeaconStates, stateEvents, changedValidators); err != nil { - return err + // progress is 0 when we are at genesis + if progress == 0 { + s.currentState, err = s.genesisState.Copy() + if err != nil { + return err + } + // Collect genesis state if we are at genesis + if err := s.collectGenesisState(ctx, compressedWriter, s.currentState, slashings, proposers, minimalBeaconStates, stateEvents, changedValidators); err != nil { + return err + } + } else { + start := time.Now() + // progress not 0? we need to load the state from the DB + historicalReader := historical_states_reader.NewHistoricalStatesReader(s.cfg, s.snReader, s.validatorsTable, s.fs, s.genesisState) + s.currentState, err = historicalReader.ReadHistoricalState(ctx, tx, progress) + if err != nil { + return fmt.Errorf("failed to read historical state at slot %d: %w", progress, err) + } + end := time.Since(start) + hashRoot, err := s.currentState.HashSSZ() + if err != nil { + return err + } + log.Info("Recovered Beacon State", "slot", s.currentState.Slot(), "elapsed", end, "root", libcommon.Hash(hashRoot).String()) } } + logLvl := log.LvlInfo if to-s.currentState.Slot() < 96 { logLvl = log.LvlDebug @@ -256,8 +289,11 @@ func (s *Antiquary) IncrementBeaconState(ctx context.Context, to uint64) error { return s.validatorsTable.AddWithdrawalCredentials(uint64(index), slot, libcommon.BytesToHash(wc)) }, OnEpochBoundary: func(epoch uint64) error { - v := append(s.currentState.CurrentJustifiedCheckpoint(), append(s.currentState.PreviousJustifiedCheckpoint(), s.currentState.FinalizedCheckpoint()...)...) k := base_encoding.Encode64ToBytes4(s.cfg.RoundSlotToEpoch(slot)) + v := make([]byte, solid.CheckpointSize*3) + copy(v, s.currentState.CurrentJustifiedCheckpoint()) + copy(v[solid.CheckpointSize:], s.currentState.PreviousJustifiedCheckpoint()) + copy(v[solid.CheckpointSize*2:], s.currentState.FinalizedCheckpoint()) if err := checkpoints.Collect(k, v); err != nil { return err } @@ -302,9 +338,11 @@ func (s *Antiquary) IncrementBeaconState(ctx context.Context, to uint64) error { progressTimer := time.NewTicker(1 * time.Minute) defer progressTimer.Stop() prevSlot := slot + first := false // This tells us that transition and operations do not happen concurrently and access is safe, so we can optimize for GC. // there is optimized custom cache to recycle big GC overhead. for ; slot < to; slot++ { + isDumpSlot := slot%clparams.SlotsPerDump == 0 block, err := s.snReader.ReadBlockBySlot(ctx, tx, slot) if err != nil { return err @@ -329,11 +367,11 @@ func (s *Antiquary) IncrementBeaconState(ctx context.Context, to uint64) error { } } - if slot%clparams.SlotsPerDump == 0 { + if isDumpSlot && block == nil { if err := s.antiquateField(ctx, slot, s.currentState.RawBalances(), compressedWriter, "balances"); err != nil { return err } - if err := s.antiquateEffectiveBalances(ctx, slot, s.currentState.RawBalances(), compressedWriter); err != nil { + if err := s.antiquateEffectiveBalances(ctx, slot, s.currentState.RawValidatorSet(), compressedWriter); err != nil { return err } if s.currentState.Version() >= clparams.AltairVersion { @@ -360,11 +398,15 @@ func (s *Antiquary) IncrementBeaconState(ctx context.Context, to uint64) error { slashingsBytes = slashingsBytes[:0] slashingsBytes = append(slashingsBytes, s.currentState.RawSlashings()...) - // We sanity check the state every 100k slots. - if err := transition.TransitionState(s.currentState, block, slot%100_000 == 0); err != nil { + fullValidation := slot%100_000 == 0 || first + // We sanity check the state every 100k slots or when we start. + if err := transition.TransitionState(s.currentState, block, fullValidation); err != nil { return err } - + first = false + // if s.currentState.Slot() == 3868670 { + // s.dumpFullBeaconState() + // } if err := s.storeMinimalState(commonBuffer, s.currentState, minimalBeaconStates); err != nil { return err } @@ -372,7 +414,22 @@ func (s *Antiquary) IncrementBeaconState(ctx context.Context, to uint64) error { return err } events.Reset() - if slot%clparams.SlotsPerDump == 0 { + + if isDumpSlot { + if err := s.antiquateField(ctx, slot, s.currentState.RawBalances(), compressedWriter, "balances"); err != nil { + return err + } + if err := s.antiquateEffectiveBalances(ctx, slot, s.currentState.RawValidatorSet(), compressedWriter); err != nil { + return err + } + if s.currentState.Version() >= clparams.AltairVersion { + if err := s.antiquateField(ctx, slot, s.currentState.RawInactivityScores(), compressedWriter, "inactivity_scores"); err != nil { + return err + } + } + if err := s.antiquateFullSlashings(slashings, slot, s.currentState.RawSlashings(), commonBuffer, compressedWriter); err != nil { + return err + } continue } @@ -503,9 +560,16 @@ func (s *Antiquary) IncrementBeaconState(ctx context.Context, to uint64) error { if err != nil { return err } - - log.Info("Historical antiquated", "slot", s.currentState.Slot(), "latency", time.Since(start)) - return rwTx.Commit() + if err := rwTx.Commit(); err != nil { + return err + } + endTime := time.Since(start) + stateRoot, err := s.currentState.HashSSZ() + if err != nil { + return err + } + log.Info("Historical states antiquated", "slot", s.currentState.Slot(), "root", libcommon.Hash(stateRoot), "latency", endTime) + return nil } func (s *Antiquary) antiquateField(ctx context.Context, slot uint64, uncompressed []byte, compressor *zstd.Encoder, name string) error { @@ -700,6 +764,19 @@ func (s *Antiquary) dumpPayload(k []byte, v []byte, c *etl.Collector, b *bytes.B return c.Collect(k, common.Copy(b.Bytes())) } +// func (s *Antiquary) dumpFullBeaconState() { +// b, err := s.currentState.EncodeSSZ(nil) +// if err != nil { +// s.logger.Error("Failed to encode full beacon state", "err", err) +// return +// } +// // just dump it in a.txt like an idiot without afero +// if err := os.WriteFile("b.txt", b, 0644); err != nil { +// s.logger.Error("Failed to write full beacon state", "err", err) +// } + +// } + func flattenRandaoMixes(hashes []libcommon.Hash) []byte { out := make([]byte, len(hashes)*32) for i, h := range hashes { @@ -720,3 +797,18 @@ func (s *Antiquary) antiquateFullSlashings(collector *etl.Collector, slot uint64 } return collector.Collect(base_encoding.Encode64ToBytes4(slot), common.Copy(buffer.Bytes())) } + +func findNearestSlotBackwards(tx kv.Tx, slot uint64) (uint64, error) { + canonicalRoot, err := beacon_indicies.ReadCanonicalBlockRoot(tx, slot) + if err != nil { + return 0, err + } + for canonicalRoot == (common.Hash{}) && slot > 0 { + slot-- + canonicalRoot, err = beacon_indicies.ReadCanonicalBlockRoot(tx, slot) + if err != nil { + return 0, err + } + } + return slot, nil +} diff --git a/cl/antiquary/state_antiquary_test.go b/cl/antiquary/state_antiquary_test.go index ea24cf7049b..73688024e0f 100644 --- a/cl/antiquary/state_antiquary_test.go +++ b/cl/antiquary/state_antiquary_test.go @@ -2,6 +2,7 @@ package antiquary import ( "context" + "fmt" "testing" _ "embed" @@ -36,6 +37,13 @@ func TestStateAntiquaryCapella(t *testing.T) { runTest(t, blocks, preState, postState) } +func TestStateAntiquaryBellatrix(t *testing.T) { + t.Skip() + blocks, preState, postState := tests.GetBellatrixRandom() + fmt.Println(len(blocks)) + runTest(t, blocks, preState, postState) +} + func TestStateAntiquaryPhase0(t *testing.T) { t.Skip() blocks, preState, postState := tests.GetPhase0Random() diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_0.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_0.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..ddb86265417f8dd571bd8c67073eb301487d322e GIT binary patch literal 668 zcmV;N0%QH23h-@Y0001$a(4m$90h(^QR{IB!kzOwU1_@J>J`JGK{tl;0#|9o3$gmN zbnT@1R-c1|28J91lhSqOKzDm_oZeK#X(fKOAj{VtYbR#G8_iNdCq|*VAtle}9UJmM z!)Rz?%BLPd000000001D00{{2q)a~NmYzsfmS&WgsEil)4r!Uh1_R>sGl*#bLy`uN zV@?qt(O0ho40IPV$V-#+FQF|DW8iTLD{7QN;gz_gSX2N20D|K{;u70g3>Klv;CFH# z??8+f9Kw5;i_N3z*yuUv8rKmm!$xlq=^Lho%#ar^iwZx%s4Ri?OA^#hk?Dck%&P|< z#+4)OTQ8QDhuWZ!b)qnLX$x<@u<{OO(fh|(S^x>FW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw03kXo0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4Lfr&*{FR2;IlNEXeNkl=4Bc48UMBYJ4WM}Bl zJ!dawirtbrbG~3`GZ&VtAT2f|N)$&ytwFcztn0Tcy9F>p zYi~C(1_XLwTn-J=nCZ$|kpBTi_t+vD8O7w!R4ttOYvoYK=sUd%N;sMA7*J(+4hfkJ zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0Dy3;V6WV{N^1#PhUFu8*RU>w=He94_&?QzukpLrMCSu76bOLB$x$f<0RRjQ z836nN76{6kI|UV50RW88ojxo5h#`a=l{zfUmKqXd8YFNIZ^e-iO}#8mvC*&m0RRAj CUJ~~J literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_1.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_1.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..338d0aa9f5c7f74a024f130c920ee38eabf9d393 GIT binary patch literal 671 zcmV;Q0$}}~3h-@Y0002B&YA+i!Y)BMHQ_*C6*HggpvyDfegr@iNgDrrMc$ztEhoyJ zkda6kVCQmG4?blB`v=ApY3AlplQZL~hhr+2kkxg&xr0Xk(3=d3o6 zB%e#%h-_LE+A#q>MCNG_*pRnxuJFUbr%-n>aO?CXNee273^@BcHqOsG(PBHA_X0^a zZ{u+!W3u~s{6}6W$UPupUj_L%bMIlzHOY~7OaKY1W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw03tdp0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4LfwgzBAa4@B$^5^#PZu%oCwE1gB6Us)?Qn%(i)?abg~8Vjy-{ zbP`cBlz;Vsfj>ki=qNZ9l>Y(Gojxo5h#`a=l{zfUmKqXd8YFNIZ^e-iO}#8mvC*#$ zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0DQC(R_nfBx5|$Nv{VY%el&f74&cS4#IWkRg=9s9e3wCf0Raer!^u%81px#Y z0|f^J0Q>#tuCK5vZ!Xz@N`GXOBjfnnDEY|#34-smYd2Sx66~<7*Ju^bQe8(?k8Xn60nDQ|~Sv-u*IqLM8W$#ZH zWZ6|bMP({W000000001e00{{2q!&+~stdZ;43s(Ta+=H8+5=4Eqijqu9lz+ADu&j& zn_B(Ol@I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw04q8y0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4LfrtIJFzKNhd&h)x@mO@~<)VnxdLJkCIw0pX zKrMY|GoDKyr?U)je}?U{sTvU94}mFs_%*;ZK3^I-^3o2C3kzH zCoV?8(E4Y4?W#)IwP1lvfByl9BgPiV&~XDF+Uc|b?fP>nrYo|%iV3a14TO4K7|{C- zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0Du;$R`$32)3?NCy2+XkNqdd3abU(zLqGZ4RR_5@Jv|LA6bOLB$x$f<0R)5t z1qTEG`~emS%9=X~4pspGj5b=0EQMdd3XFD8WUne~VNT54U2x^N;BA3xYB}}z7`++(M|{5EPZjx$m6WAuUhR$` z=lpnyi*}~8U~e(8BQ2RbfZN8aMZDoztf`=VM^$Jd)KmZf0J$Tln z!U-qmj~e^(!c&iRY4N3lA@wBCyXG|#HU_7E;s6P&W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw04zEz0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4Lfshh6X2LAyzT8%7)U%(2Cc2H!mDr;d*%-mgY<+$K&fotQ`>%HO) zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0Dy=v2l4QC;#TALw7ZOwm?D$QME@*hSkg50z)xWBdUC E022r%4gdfE literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_12.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_12.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..0ff0fabc2ad46dd1943952f1cee092e7af8f3b03 GIT binary patch literal 670 zcmV;P0%8503h-@Y0002AD)jluQrdwIu*r!v@{v| z$<0BTR8l}q000000001700{{2q~C>d)o4Yh7tmRT`qfSjhzGxpbZy!LNTF$}>nho} z54bsm5VR;DDMYilL=)t;tyTlAI>ULmq}~q95(jIjF@m- zx-Bl-x3a;PN+?Yf63W6ii13cFKe!Fp?iINJwg3sMW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw04+K!0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4Lft1wTf9dSUuLDIOZf!M0j7_CzU=9j+QizmS ze8nbhS^$Q3!yk%8rTj>>Yu@FqwGJ0IIAX>nZhC+dsguY(3wNJF7`diZrmpGw_$lii zcPiZUK+Tg;a`OB{r^C;tIw)JXXxG`3(zhkto`zP3bUj$$h_{zceD+b|E6XW3&7 zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0DyKcBcU9o)8mYbO@ji_><=LLG@pP#3d_(wNV&CT^w$q96bOLB$x$f<0R)@_ z1qTEG`~emS%9=X~4pspGj89=^CUWfe0w+k~n?Ji_WqNv{roKFHImi@F+IZnpF#G`k E0I#$kAOHXW literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_13.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_13.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..802619428d74d8653cb41055e05582fc528c4236 GIT binary patch literal 670 zcmV;P0%8503h-@Y0001$KO-O6#`S#54cVq(a~t|!V(U>+9DTzLrVrY_(KEQk5y`Lm z3{vSyA)A@_R~pY5HBsrGVNL+MR4pvY+`nup66yO~tvxWUB;$~L-1if@@+emtl}qZQ zGn>>|)7f55000000000400{{2q;@Kf7wrq~+%4ZJKWi_Cexx*o0N=E>Rbp`Oa0L$r`ZsuyItI0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw04_Q#0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4Lfri3^;ap*Rt#yKLyr$!Nr>N>|f2?vF%^Pnj_At$wAaQWS@w+q(GmGFKIx2pe-(l`24E_mo{?rF(}`E$fM_ z>qrEh)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0Dw=7mp&cN9C0|K722#kqdcuN;us@+_z=p8c4s`O_3{uc6bOLB$x$f<0R*T6 z1qTEG`~emS%9=X~4pspGjHqL&>(o}hv7D`q=`~3rd626`N;~Z$I-^jAk?UqaM)G3eVJOaoKzJ8@c=VNFB28qHgs9m;;$_^2rQuVew(4k~_KwW4@uXm{X zXyjmrO?Fy+_Xuj=j9PoAog1nddQJ7IgaHnM+W-lxW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw053W$0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4LfwB!~Aq+R1`wX9_E5jJJDVP)%oD^zT(jM2S zlpjZ<;!Vu__4etAyw;p-K+KQ5fEIv4t3D$(x>!LFRv7G`WMG&{y2t#?LtQiWu})Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0DzUs);aUiqP0t?G+MPr+~=;olF^8)OkJ6bOLB$x$f<0R*%I z1qTEG`~emS%9=X~4pspGjB!Db3!`|VF$wET?q;t4%bMYtD$L)PP)=XYDVo)S&-?)Z E0K4!i#sB~S literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_15.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_15.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..b9d5ef35308f7a85e5d417285dd60f12ab091732 GIT binary patch literal 670 zcmV;P0%8503h-@Y0001ovy4%;c_lNSF4L?4D>Wdp5n4{llk6$CwW4tk0cTgtH`T#$ zQ^GfPYfI|)(y?L=c%!rqjdG~>MyNs3e$e6eVIRe%>;Q@ceG_a{2u5$XUm?6RPgOX< zU;EGviZ)nK000000002z00{{2q!0NCXT7}PouQF5EKjPI@u6+rxGzz^5;UTjOv9aE z2!krJrAmzUV#^tOV@WN-JG#(xi931`2jl6oSPe&G0#pD10I$}%wS~n9+Yn-QI;Dpg ztM|Ue!85VDmVas8sNHG64}L6-tdI}z-k)8ijC~aajtkv%sLqID4-3)Vz6zz-T>PZn z&>FUT!pN_Xa3kpb`$IdI0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw05Cc%0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4Lfr3SuqLX8ee1M9dpQdh*>gzB~0cejes9E5B z>T+pUuCRPf2UjU6=3h4*+*js*0uQ-H5iZ8xSb{&jf~jxV%GJ@n^}hH>QXjYv=NX0? z>1Wf8eBbYaIuPvQ?f_YcS^oiXL68fhc%m^0>rC!uuK&xL;h8GT-9r zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0D#2b=QMi5xne$n>o<>pCjrE2^pFNFbESlNSA1x6R5B7R6bOLB$x$f<0R+GU z1qTEG`~emS%9=X~4pspGjCADngAMwl+x=D?1g30;oaf(tixuixCkuAYY*p$$)BFJd E0H(nv5C8xG literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_16.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_16.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..29d509c9a6115e983ee29a014fe776cc260396d4 GIT binary patch literal 670 zcmV;P0%8503h-@Y0001`E+DUUc36v{1zwWYugeI&{anIioy53Uyexrh`oevIaO~0< zZT55R8o@MzNLpDKPUT5hn>ritRHn?)Mu74W)idVmpVi#Nt(he0U_7Wh-Dw;??Y!h~ zg%mKS`3ZPY000000000@00{{2qzL3(@g$0Ur%_!hSoo_WrJh?C+cHCbMyn*O-f}A6 zJ$6>{>A_A>dl#Z;32T-g0?-T_VyN2|wy6G{+1sIUl2iZy0EFgh7pzgsD~(IGRCP;6 zj>qv?I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw05Li&0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4Lfudx2HX^O0E5@?B=d&F?o-yE47SIgekXM>> zYb1Hp8K#FaS0I+uRKlYcFt^7>ORvA zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0Dzl{FUy2)vj;5m1Q_@nxBUAH=)3{)x7!K$!u>3kNeL4z6bOLB$x$f<0R+qg z1qTEG`~emS%9=X~4pspGj2+R~tI32h;gqbLggY;vW71eW(-+Epxe5^A^|;rsyr E0H>BF<^TWy literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_17.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_17.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..3f976bd89e93a92170173398edb50acca4e22069 GIT binary patch literal 670 zcmV;P0%8503h-@Y0002Exxu{|Ay|B)5*-#qP`OUPK&E#4HVF%_yRgWdv>==2&KYs# zTYJ#;0TCpQUSxL(LWE;bQN~h?FPfYzELcJi9wO^JgL4yZTTAl=uh6D7O|e{FsGQQP zb%gxNV6zZX000000000400{{2q&)T2w!Kt(VyuJcI&wG8=|D2h*&v68?Bh5n<*{9R zN3Os}CF@x$BH`v76}ptp``NMX8EVBy+HYa@nn>o(DpUXf0ECuyItI0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw05Uo(0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4LftH>5ggpcfv2J^Tb-td2PeT`Z4` z43F}TsMw!IA@qQURas7O3Yyx$6c}7sXBG%Ez6ovpZ>rt2y!8Q0@S~Vup=zn4jDXu3 ztDXAM-e4f3(dYCB{0nk99{&Ly(b%iWgfZcitek{9FP~%5SUl4g%6+;70KO7xxE)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0Du^^?|n=%%lA8w9c?x>h)tGbsB&TW9Pz_1ps%;J>^&4M6bOLB$x$f<0R-3s z1qTEG`~emS%9=X~4pspGjCk4n{NS;KYDBjp7qZ7z*AOzz&7gyMMzfO6C78ek`e@l3QFDw4620|v}})5UieTS(h8yVmuwiI%i(&#Hy#k0noz1;pLzGB^kEWiH@|XF;2x?FXXAxrsV10qGhyC; z!l!peis#ey9?~S`ptk6Hw})B@&NpSzf1IYL{GiQajZ^>t0Ig4Db)4bH&eRbU9fxyM z5B6}G_Oz(&2W-o6fCVoAD(fL}FmIi#OokuRs-(G%83nc$a#W%@*kWSE7PZiQxg&GD zKSIsPcWRIb*3W$yi=h8K5H)Khbibqg$aRCR;{XY(W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw05du)0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4Lfw+v3Xrsgn)!X6$pQ~JljDTD(?f%^ z-uaUXKgiEJ?%zUdI__Lf2b!qvApz#mU0Mrxf1*!WeS4dn6Dd>y<4;R3gA*KtLS^wh zOqVii+H8~uQX5b7r@@)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0D!{tu6m*_bu&ntJnb(}_m-8XL}mu)jVo&SHy4D@0;?4*6bOLB$x$f<0R-d& z1qTEG`~emS%9=X~4pspGjGMA>SM)cM9+*^&?P$Og8hj8Ux6L^NjS!kw=knW~kN^Mx literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_19.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_19.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..5ee1b7ae12b1c9d1d39144e4a19b79670e6fdcc6 GIT binary patch literal 670 zcmV;P0%8503h-@Y00020KOSiTgErXfRu~P*I+bU1RdwI2*sv;OZ%xM+{YOd&=ubAi>Q?K<4FCzNW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw05m!*0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4LfrqqO8w}|?709Q9PRJYKn>w50Hr@qL4URn)2_b5v>dIO*gG=wVl6{D{`?DSB_ks&nRtxJh1tPsEJ%-S|>5|Co}u>S#@vT#@QH)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0Dx#aF)c-Tfvi`@F4I|pp9k&UJu3Z6vxdhD;*B*?M^P3n6bOLB$x$f<0R->^ z1qTEG`~emS%9=X~4pspGjQzOozAv8IOk2g$nxQD=)w8cTCTz9OQcuVD!FLQPXZ!&G E0I*^xYybcN literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_2.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_2.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..e5d9c4775728c017697178aefae6b06577ca88e3 GIT binary patch literal 670 zcmV;P0%8503h-@Y00029Op?8Rske10r?*>uBzRg(Oq7=FrP3J5Mi{D%_q&Z*T z7?k%>px9QnccJ+L9sQc5*m)`jw(PgCKc~}?pVLNImF+PDQgvcgJW86?n*oJZ8fY7V zyq7}NLjpHL000000002Y00{{2q&wWosqeRx4XZo~z-ii|YBBdem&kIb_FNkR>78M0 z%mV(qL`V(fJ+AhHL0uB?sT7UCVXoZG7a^K04=MKhwp0KB0J$Tln z!U-qmj~e^(!c&iRY4N3lA@wBCyXG|#HU_7E;s6P&W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw03$jq0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4LfwM#<_A<1XHYfNo<#bvnS}5yoU_c>^i+-t$ zm(p}Lvx^1QI5JtA@k2DXi(#2gHWw77XX@o)6M=7iMt4b#A(yldyb_JSQvb8!$=IV_ z2l(8AKDB9#{*b__+LYn~LjM5-``;F(xw3y#5d9a9?P=N6WApP8v|-s;35)HBZG*)P zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0DunK(B)nE;N)v8^c=&iH+A-)qD{f`n$@J1tVYA(J(vY86bOLB$x$f<0R$ui z1qTEG`~emS%9=X~4pspGjE9q#XNbVbD$KRndaiZmXgi?m3?@)ev@Kti(7u<*wEO`8 E00dGh4gdfE literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_20.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_20.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..09979630358574eb4acd1c3493929a496202293f GIT binary patch literal 670 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 F003cbA^`vZ literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_24.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_24.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..c0a4e649b1c952d37a078c81dba57df2c9ea6a3a GIT binary patch literal 671 zcmV;Q0$}}~3h-@Y00020Qo_h%4wh{^JJ(Si*$$9=y(?QmqA|9rn4c#J_+lH}1}xe8 z4=0fjwxmHxP;R;k+kdjus4!>BXQTk$8L-|J+^-j8#F_Q_#TP4<)keR-xu=sbT80Jw zqfS|dm0>bj000000000200{{2q(<@Z0j-Tx1nA%`ltBHY0zXFdyGZH~^9lu5{lciF zqwl$9lX{yZ==zErTF&d`+^!}}I^qnTpMg0?tp0kWB~$kAW@AYLWKlqO4O=`Yd%j6M{qW}r3W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0697=0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4LfrC1waY7>gqo^g2fKvdF72Qlus3ZC0=gT=% z6gzb)@Ov10WL`}n^+mnkudSwZ`W4$>pi6sVN}*vqK}79`ILP?79CpW4a7(GWpNCq% zS!eHBK?)NuWBCs`xiDoO;{O2~5|rwNtd)B}bE?e|NC`5NZ>0`G$dzzCawd%ZOfF6h zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0Dytq9sw^yaShNTzcBh!o{Y0?BU-z&3&$8Zp)?OsmJ3Bt<f1>wYALsGBOkAc1XFD}o2t;9vZs`FrY}th2~B##8_R0JJ_si;*QvXiY)b34_v3 zb-40F{n>l_EMFpQM%WQ@5+PmUH z7;Cm#tsC2G?;0v@TRmCv7-#o=CC9mkQua0DRs?u=4F*a`4W=0!BbP6v<=k znO%G+CG%4&1Yp3OR+Bm}0Ac|E009jeeoz4Lfu;h|C|#CZLMvTCA;w7m^+L`Ze5X9p-f#ggx~LE5zaXL*}F3kx6hPC#{6b_^CA0UZuL8GbjIaD=6%5#l6K zuE63oUsxPJLngo14y%i~UWKzrkN*M3hIT%S6}l@I4b&`RprH666^2(`UY8kuD%xo( zx8;HjsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900 z{s92~0RYMY0DvZv#M>?`e=3ryt1$sB@#xxSj>2qiKPyhp1zMgvF$Wwi6bOLB$x$f< z0RT8bmka;^0Q>7L}p$B&jdX JhCciO002BG86E%t literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_26.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_26.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..4299bb3cd1793381e0d227c60b8399abc6c35077 GIT binary patch literal 675 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 G0RR9KGb8B$ literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_29.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_29.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..b9cb2b91feb79689dd2aec5b7a5d61837286fea3 GIT binary patch literal 671 zcmV;Q0$}}~3h-@Y0001x)+hRr3bn27{__ zs?pi+!5xZT000000001>00{{2r00%JlUendc8%Ns6qSF$1tl$nIIV^G)Ko*^h-NxI zpJ84)zQnfIteGs!%iN97Zngbj4)H_?dm#G8%6^Osfm8qh0F>hOg{!u_)Gn;D5?ko_ zuEC9mWqjcMA`~rBF4y>oD;7T|sdE_^*GXDel{4KOEC`|&++2R^5Mv5W6xzmnx;~Ci z`{IeEwm*lwh|Ts+V0KIMy|^>7?|gEutUw&G5C93QW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw06sb_0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4LfudGR)s%K9`@t43l%5tmcbB45a?^*2s1`j6 ztvlz3`#&8OA(+3GN>HCOd61lKNK8)_psCYBmV)5IZ=v-rEZnO?ml0J(D%@~VPb3Tjqv9JYw0EG48=PQ zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0DvNkjmtBEQiU^jpksY^My-vlj(^f7Z(8d>VirV}E F003XsD>DE9 literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_3.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_3.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..93448ab0b957c61e4f382f39f09cd4d8269ffd53 GIT binary patch literal 670 zcmV;P0%8503h-@Y00020sN0+heKrXi%eGjz#0Wgq=a}=}U{?;7{Z_ZbX88PN**_<} z(&vFJ>|CNpgjRY4#WfHTkK0c@q4tw$CNvU7?oA+>&NK)iT4gj3^U9&__lcduJburK zCdnPc1P*IN000000001c00{{2q-I&)uj{65x&&R(V(|=7zf^GllD#uTXyo%!%Hvh~ zA>$$TeIo0{RLj^qq9o#pq~w8{!4t6!nX_y&FSPiX@>Bo-0I+9Z2EE}5$)GQ&9W2`+ zGvp)vF9oRC?=%K>G0`5O`ApXp#Df}SbLH1|MI3!Y5(!!)$IF`lVj!}Eg;s`%t?;(qZvY9aW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw03eS<34zj+BiI_DD(_^(<=7TLYr%yjI( zC$ebd;o{k!Fm7@@!L0{o9sdD`lb2_Rz{x7iwb^>Eb>?V0pz91KP*AijUzO0lm&mjY zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0D$nt^tG`l(NP3Y4J1wPLs&(VbN7$Rp@m@210R3%%{B%t6bOLB$x$f<0R%7u z1qTEG`~emS%9=X~4pspGjQAwsynkL)hFHj{B2)9Jm*jp>H9|B~;TI|Q|h{&7n5 zwL8*5xcs{syH4>7RVgBkHLQ1EIZMHU5qI_fh;4u6IsSh)9G*I3|+cS3I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw06#h`0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4LftkOs_soR+9j!)a-PHSabrWGpj35@e*sSzmdFbX>VdEK>q)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0DwvxIkn65o80R*EO#p!XLxa;O4th6bOLB$x$f<0RVJC zmka;^0Q>a)#dLZyJ;J6^WWe&f*2N+1^7h3@&N2JzH$0jH zSKY*+Zf&k$000000001^00{{2q_KTTANrDe)pXaZLVMZ$r{aHAy}aMB#`m~S!T&nZ zpUHA^y$uzwK@A3?=x5+e%iTFFFCZT+Gl$_0SyywjH?SeRm%?vK)BP#z~40v z-R4`AptT_I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0Bm@8e0OSAw06+jX0RVhVKIfL6NLH3+l$fZD7xxZnnZyPI z;`B3!X#hi#29RSmE&yf$0006F8-7p#@PVi}f$8Tep5yR*wzZFme^RVEh|9R|e<=v! zQ8hX}%Am;g|%n4%+wmw5=9%7igXk3p+fyY)RRXtO#uD@0R900 z{s92W0RVvd1I!d+i4HNEalhzB^P)3Sq2D6G4YeI$=8r!{lmX5nEffrZ!^r^+3k3lH zfI*iG0002|0Tu|#nmYjuUI74%rH*io#4r1K#1D(tg9S|w)mqT=fUP3?nv;$?76N$( H`~d&}{|_cL literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_32.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_32.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..ee19e4ef32004c0441505824b9adabc6138d2c6d GIT binary patch literal 702 zcmV;v0zv(r3h-@Y00020&k0Us)YH%b>29CxU(ah0z4zC#8VfgAZt*CK9j1o2{BI*u ze(4gi1W^NGdK&=+M2-ax4^J0U`8%=vOcWEqU<<7I*2h9fyNb4W<<7^lmUkxn zfnss!Y}cz9I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw06{t|0DNgq=o1VBZcKayFRWc!Bw>nD`YDp6NH5#pmb4c#7`LCVzk~v) zn(v7`&5)1jx!upjV#cYr#E1hDJtf3qDd@)hR-`340wi!Wk9T=dqNPF4GuZzDrH*io z#4r1K#1D(tg9S|w)mqT=fUP3?nv;$?76N$(0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*852D~` zA!3ixKQ<1;YOOx-4#E`qBP|yUfWyfF4GRSU0E|JG3;+NC`~emS%9=X?3|;{MjD&p< kl$1;7(Luz!_=L)?XUXzTA09c{1a2V7l9s`$1^fX30KV2MNB{r; literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_33.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_33.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..cb6b0514d2f584ee01905e9d55ed69f5f6390867 GIT binary patch literal 702 zcmV;v0zv(r3h-@Y00025p1bK(MsjlOtk<1Ez*!dZNlOzWX+w;6sF+R}zzQI%o$UCq zyHT4mK7QL;0&bKFIg|}b==g zJ=b~*9(_>t>?&{5?$^U=Ff3RMlqF-?EJhmGvo#C2ic|mq0ERzr7Uh(1qwdw%g8Y`k zc$rg=kXiH=j;)!GSrqbf4-cVKPG5BqU4>0KqI0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw075z}0DL>#%BkJF1ZfVABp4^u=fOyC?%p zu-+zjsMhxT(LI{)JVv1#0sbYsAiyLxrbT2ZHIEWBUGt!0w^zb9=-$U&daH%C zXSU4L8q*R*8BLyB3H$*70NhwDTmS$7 literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_34.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_34.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..9f7d82de01f133671d6274ca1581a1e4c280f8d5 GIT binary patch literal 704 zcmV;x0zdtp3h-@Y0002EihWzsW(MpMVNqIrN)Zy1KHn932tc>ZRz{3zQUJnF2aJhHcQfdCJ|>{^zVl7f zh(C4xqXF7u000000002r00{{2q>%z6v&sc(s&zeGJPh@+ETBmE!NA!7-voVl=f&!G zQs{PuMS0%QRY%Ys?!xVX*>rZ)>XeQL7#@X6hjz>kR8#-}0JQ1$gZfLb2QH{nMmk`9 z@I_~jEF;?5Q!t1~y@FI0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw07E(~0DNXy->>VYZMpii}U9dd*2)+)2>DIhJSn&GzMDW0qBV*D~1r{yR7N0Zc%;_141U3m@WSS`?YF# zeM*HeW*1{}lZ2)(>aHQ!C}mY@wW8PQ#8|Eg0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8(^g0t|q|$pHlk4FLe8L6-~w008^}76{6kI{^${0RW6M mPYp8UJ*RlrNDp=wMSxwf?W!r-9HI`eZ8>uJAfS=_0RR9YrY>** literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_35.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_35.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..942d790bcabc660e824e6b5ba685bba0b1ef6c7b GIT binary patch literal 702 zcmV;v0zv(r3h-@Y0001oH?y{B^q=?dvG$wi2*ilNBvaa%(#UlU##LxZQ?9G=$#g0V zs5vC+=ji9gcjZ9`FXkoS)O--huhR9aHPIACJTH876n%qugiL6M!I6sBc8H*Mt1c@G%Q5*gla<(zbgdR=sl)|VJX4NM<$ zq?Dnr0t`puF!^E$UGiWSw23O2xY=+Z6_KxyZvY9aW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw07N=00DOY;(S4O5Y&-8H!}owFp!7gW?HC;0 z4)X@;MJq%tZMr%y0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYkZpsnn2tb47?rDiI^=2o&%kUs=&XC=yeBBk#*C#GEqg%e5D=10o;Hzai?s79dR8epV&!`(=l7y(@QMNMU3)o|iAHe?sGfxdN zT?0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8oCM_2XfWyfF4GRSU0I)%q3;+NC`~emS%9=X?3|;{MjDKZI kA$WKK5}E7VdV*}i!K<@%unAn41f|Yo1l2mcy8HnE02;?EXaE2J literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_36.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_36.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..fe7bfd234875984fee090aadae602ade75e8c9d8 GIT binary patch literal 702 zcmV;v0zv(r3h-@Y0001tyGvk$hgh6D(!f~#qRGK7EUoktcp7Kdwesu!+u$T=n*=EJ z4bpaVBxyZ2hV#J)g+Xo&YDjojeIiQsVecX=Lo92jIc%@9nhwd)$}Dk6C@h31g^)!n zj|rXPSEsyX000000001!00{{2q${ek4zZZi2;!!%q!?5@z}mAqp+M$%PcXq{U0Q={ z)iL)QSa$_ATBKV~{tZo%W|sa^QrNhQt1P$?$@)&Do>Tw;0D;>3|5?JLp9S}^phL(X z)yS0m_uPGVS%M|z;RnzMq$y#m*)17_ehJ^Q8LE@lqY;#aicvztOz6F5Y?gWKx)sqv zT2Ynd9`%8#Tx#82+gYDn?I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw07W`10DQ3F1{R%)zu?(#K*U|5y=I5}zb4*& za|WpRs26h?H;y_l0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYk7)!|os-_boC@8bnr+4rKt455SwDKGAFc0~TLkQgC_j6nl;Q;++H?(12?*kCP7& zRWcSZRFF#-3$Q18xNIAn@40_X_e%FdBhvZw?@2RdW3l|I`GwCVxlUUy9DDx(e`QM{ zcz6O5nd{tof^5RUtFv{m30#;2rOspo)jGVo0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8&$;AobMOsGCzEz``xmjCoLBYfWyfF4GRSU0K7q$3;+NC`~emS%9=X?3|;{MjGSkE k8R=R8~gzP0Gcu^+yDRo literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_37.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_37.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..3de6efbf78e5862246f41ce880616b2c0db49949 GIT binary patch literal 703 zcmV;w0zmzq3h-@Y0001%%!9iU0SCm7*60-dUQHFF?4U!Ktm?@c{I1uN&Qi*j`-SK^ zeB^#p*ni#a71ZnpbZ2s4@v+TQQi|pp&)M$IrF&fCO_G@g2~dtzAy2nrR(Za!>z zOD-7=Z}6*T000000001k00{{2q#JM{R;K%}=B3cA+>ai&HS;&K6a5Zo6z^acnqi67 zfnPV;%q&Z-<#z*=DmdW#ibnUgRUb<0mAbf!2cmkIZBzgN0EF!II0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw07g120DO#F!_GWEvny~4yKqUZD4tBq?h#Bg z#ceEC?E$Smv^zR40Ac|E00Ipf@TyEc=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYkFA>ZQs4%@GaWlj*q!v9_eqNW_w0j^ZTvCI>Uz2#0;A+0H;Bd}R#>eA3HMsEQf6 ziN_T2nZdz{w`C_f-RQVe@8?%cca&~Hhs>smD{d=tGU^DK$JTw1t6P)mf=T}YoM(L* z=~_Xa5|T|%K=++!iVo#P_16SXJlV23CMp&i0000000000038MZAbJ4+d>zb9=-$U& zdaH%CXSU4L8q*R*8t=9`24zGK=lk!C@mHYfWyfF4GRSU0LVd?3;+NC`~emO%9?U+0*vWH lS*&<#X!T|D4a5#Rk$f1@weQ&qgHcW3QjQz zFKfm3I9hn3#jP9x7zJ8}5wHIWSIz~tS5xI%mJt`>4K$6?aNbR?FlQ!G1pH7}dc@bq zO-LIU>k5fy000000000p00{{2q!u!*NFI3^L_n*XV(Y4XAC^n(HBJ_X>RHmwj~uVD z+1(3Skg!3wPb~KtaWfjSoGe2$%xof4l z9YKnTH`=YwArE|8=m9{L0dAS*uT!qIG%Ip^rlb>W90+%`3^T{V)}F1f(e922UrLsB zY=H%9PLFyr2(+YI^fVbriP06|sN{fn&vRk&MF0t_W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw07p730DP4{-_F5+QE~sD^a!a2Ibjw;VZHyi ziCUc+VbQ*0a$7nt0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYlM%yPgKX;uM)B%j|Zzr2b#kuThTp2qr2cb!Loe2A*T;I+Ed@_DLBy{ss--f}0000DtQi3SAbJ4+cpc15=-$U&daH%C zXSU4L8q*R*8EVfWyfF4GRSU0MtR33;+NC`~emS%9=X?3|;{Mj5E`j k&LK8P2JCFLXl`O(HPHjj-TM7FLJ#NHx1hvI0sH{~00xpLJ^%m! literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_39.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_39.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..9cbebe9fef2440b789e3de53ac446a2e4472c387 GIT binary patch literal 700 zcmV;t0z>_t3h-@Y0001se`|R>Wx^O}2E}_;I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw07yD40DL0fJ(n`TzWocat{jK~z{*GAO28wK zL9!#2*=YG6Kmj^00Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYlVOC!>>?Ls7;9(IB%#8$TcrMO{*8i*+vmyI9&o0Ofdmw}6=^tMda14eFw5MP&~4 zTBHOs8LZyy{}ZA%TIPxE2q%^*B;y4tVG)4Wf6^R&+PHayzDps`l=+Fg732Q_Gt-&Q zAvQ<`>}<7YZem|G(F4uh`u#XU59imnpu|c60000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*81ahY)6#!EH=<`#QRMxtT+XR@gxpKt*sfB20t?VxiWM zOOHc9)cVf~E`!Yll%?F3mK}2#8^6gP6-)hj9jA5)FAq~r5J0lVdRhUH^MgablzPYS zw-y7xpQ5ov000000000_00{{2s)F;;eU%_=JMSdJ_kbv%^gv4O7#!UW^9JfgD?}}A zx)~!A6Q;_sZDe-G$Rk=|ehGXs)Z69+?u-h@!a?st;*Vhe0YQ0AY<#D43?^1>z}er#W~ zw9%hAGQJ;rvnY;OKNja?Wz)pWKWMU*h0s4GAOHXW00000W(EKN0cINjt^oiDfB^s% z1PE#Z00jj80RRBN{y_kG0RRE0AOrva0OSAw03|vs0DRs?u=4F*a`4W=0!BbP6v<=k znO%G+CG%4&1Yp3OR+Bm}0Ac|E009jeeoz4LfsDf8u6-%g1{Zq@Up6~!BGixZqUefL z<0^jRDYuseM^>>WY(ZGGtcHx<0h5k)c*naB;mY&UQ~uy$f+Vz^Qo8Qeo!}*-spwsZV3*j z+LE0OsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900 z{s92~0RYMY0D#$`*N4Onip;CK)Hx2V^dOfo)8f}Vs#jXGSZM6;rSu0a6bOLB$x$f< z0R%h)1qTEG`~emS%9=X~4pspGj2Y8_ezv9j7`d%L5v5k{&Zd+`?8DkJ=xY)cftr4E IPW%A?0CC73y#N3J literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_40.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_40.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..7a63b458fa01ba849ddc88e991c0e3c001fa3d47 GIT binary patch literal 700 zcmV;t0z>_t3h-@Y0001p<1N~Jk1s(ihg`{9oHMrp^5Ye$i$`@k*YUh-UmuVaPq+|g z8^KmTAPZu(a;<{~x@h3_qv*Q^S~$GFeUMX;p6eFC?WTk7x}Efh^ze?l?W)b1Z!S1N zdv$hSRVyxO000000002~00{{2q?^BQC~U?@x;PrP*@@dmOce$YT^6n(HTBx*HWlAj z^8B$*BJ+43LcShX#o)y{Eel(O6Ef^a5~LWwpkC^{rc?j`0JQ!^(2hLnO{$%~h=>DV zWr5ZRE)~0;On)ueT!A}OUo#Dda?aA07SMlcUSwx{I}dj!5F#I41_tLGG@mt5L|K`N zMl8cwn&R9<=4v3Nhj>X@yYpXOv3Syd0ESIqDgX(qW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw07*J50DO83^_&~nIORhntgI*GV7;I|T4 z8qlajuc~8{+X+wjP#)L~3~#Q=2T}72CBy}&CDiLOpsum<%kTf^M|iiT^Z@?>K{bwM zua#k@U(I><(F<`pOP0g}o?iP29`=%hx-a#J0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8)O7=Oofy7b3X(nc=si2n;`sTdR8C&0RRBDAuKKc literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_41.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_41.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..77fc5a1f5b9128a4a725a083eb36617f6ccdfa73 GIT binary patch literal 702 zcmV;v0zv(r3h-@Y000243~U;v`J_ryn!Mam&=c+=|3EH@Q6l$>(&+1<3zotF53fRp6rAXESV0J)UaLq;GO&a8=AzLEq( z`#S`2`iAWlM2LXtC}`(AdWd1lHXec2F8!w@{hbK<_6OU>HW~%4k`uf!OSzP!2!Hql zqPpREApj}A-5Vrnzy!PM@*M`QHe!)&+*m85`Tz;5W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw07^P60DKouo~jGF*9??7?Q)vS+1dk4q5)ieA&B;U0UO&w;vf$z zu8FR&%>76pOW)sd4m^Hnd7Y&oX944*Y^7c?Oanw>MP_S@AImH*y?^>at3Lk$k%b>+ ztN}S4jqBRJ#7u>g_H#c3C3yEGY?~nbWO`N~0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8%XdZ;+EePNt z*2HT^xYh0sEg5P|vC_$=EG-udfWyfF4GRSU0QfVgHC^^_|9Y4b zZQaCSFW$57R0>)IZOQ12iOZXd7PCyo!!2a;^JJ`1%V27W#T6dROUR4BwhCZ zQC7>hN=mM4000000002e00{{2sy!(mkVZHU>sljH*Htmf$5MK;9n* zeXm%{9zZ*4Dqwwsi)MTx6y!nW_>S=R2?>*T9je+dDh62c!{nB$ZjRt( z<(9K|o{OE6ET0X+P-fr&PFJJS`Nt0ytCG-kod5s;00000W(EKN0cINjt^oiDfB^s% z1PE#Z00jj80RRBN{y_kG0RRE0AOrva0OSAw082V70DROECPFWnl*6jsM9AZ;@1CB# znxZqSE?~5iI$rILAm=(S0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ z07H@nkYkrQuQ)@7X$}E%L4Hj0?CC&zwtcu|ANbQ4UaME zyHv1qtt8`sU|q({K77ZZzJ@{Pl}F7_XAc~-bZgW>0000DtQi3SAbJ4+d>zb9=-$U& zdaH%CXSU4L8q*R*8I2Lu580Tu|#nmY*&RsjHv nV$kE@cJ>bcZW+Z_x65I5UrBvIujjW9EM{pXm|C7G`~d&}2OTsO literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_43.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_43.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..3e8eb3d2aeafb962b87c2c8ef1d750cf1ac806b6 GIT binary patch literal 701 zcmV;u0z&ZonagdO)S|Gv9VWQpMTsR z^YZLaQ$EUU000000002s00{{2q%a+kN0~NRYFDj8m#saJGZqOH>aPFx=Wd}oyHo#l zp08!%QgjM;8O@B;c#?hD8P6!0PyXR}{xKFvErO4R@>Bo-0HG4$#ZrE!b%bUUAG-j7 z@UmfJC`r7pECWV0LW^=`rZ+Q7*EaJn<I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw08Bb80DRwta@A->rx(y!hWgb`4u}W8j&yC> z14yB1s_QD*xDq-q0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYkXE(#M}g@{doiE%IkE_lQz57Hizo$TOg8C)cgUy?vDb7tAstH(%hR&JYy+A2EFj|*5a#0)+FOiQl7w^POKs)~dV$kE@ zcJ>bcZW+Z_x65I5UrBvIujjW9EM{pXm|C7G0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8=|9J6 zb{fKSfv>mQ;`?z7lSOms(v34ItfIkC%vQarQ_vu-n8CF(n(e0lyyO`rS2<3oeiCJ^ zNqr>DFk%F4000000001^00{{2q`Ni7Sac8LqIMjh_phmVIil7k_DaLA)I)T$>_j#b zw~lU3IxW#$>p*qJ`oGC)blAurOVDt31k!i?0?OE1NmKv;0J1Zl+@!d2Qj#k_5uAT0 z1L0NNyTFy@?J_u}u>@A3?=x5+e%iTFFFCZT+Gl$_0SyywjH?SeRm%?vK)BP#z~40v z-R4`AptT_I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw08Kh90DN{Tju-6M4(*Ose24YdOWOccU)o9n=T;O4WKaO(%#KzXh%x^G0xi!E zIO=Yr^7pn8eGliGv&DdWLv8lG+Lf((wB^?u0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8d#vbg@~ zE{e&li*V**(3;olJn#KaFD(}gfWyfF4GRSU1RMng2Lu580Tu|#nmY*&RsjHv7`*}l j)T(`#n-PNtx8MOFowG51pJR`^0A58=%t1^u`~d&}kH|7$ literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_45.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_45.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..fe544a77ae1aeac73bffe75f9bfdda27e547446a GIT binary patch literal 701 zcmV;u0z&%dg|0Hrh0GU^Y3F+T06DS{vMR?B` z8vGHgRKTrek8FgXi=-N0GjSP!pXdRcdhvkyMojwiLKfxN^f3tCcW**z=8&)Oq`tz{ zvs3KQoy&kR6-Ps-%MRdjJWmW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw08TnA0DPZVEE|*}$KXYFM$27dvt!22)*op7`*}l z)T(`#n-PNtx8MOFowG51pJR`^0A58=%t1^u0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*88gh4`L|DwbL9c=#@R&(Y`~d&}??Wyp literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_46.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_46.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..9455c0c00bc0abee672c535157dcce6361b1384f GIT binary patch literal 701 zcmV;u0z&2v=$Yi`^}!T+z7Ag&7^k%z*Lo71-~P4Tt~tzB?H#8E=4F7$h4U ztW&7zDgIDz000000002J00{{2q?ef%w`XMxwaxFoti4)@psD~oc9xGsm^+C}2q|4e z9uo_KPgW!5^7_BtKJdynS*b3#a+{2xqrnA{LM(yzepCPe0F!yOY%zJ>Ar#@?XWKUH z?}e$EaXOc-XhJ{5rIa=iBmfDkW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw08ctB0DKSm31_{$;hmw8G%Qc5mhqu&-ncJO zzY;W}nM}i-U@W!{#Fan?(o?^_O;bihvJR%@~--%jc~$?5R%T_$~$WemVwFX*Z|oBpCuVb z9b?B8?bXtbx_b%!V8dM5BaCU0q{yTM3%yF}_ri^LW9x*&sS1av{?}v3cG&*`#Jw~8 zi;*2AmeVwEq3By>8gh4`L|DwbL9c=#@R&(Y0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8qN#KKa@2vqf&$%XKCR zgl#SV!U+cWv(zD1lHUt`F)bGifWyfF4GRSU1T+N&2Lu580Tu|#nmY*&RsjHvFF#Ow jD1YHreFK##HD3TVkt+#zB(T)(f`<3D1|_l-`~d&}BN;X} literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_47.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_47.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..998b1cdd4abab7d8598b87a7015364299163841c GIT binary patch literal 701 zcmV;u0z&wxy`l2fVag; zxre@wr}NAxtDPJdSeNTnKzn7?5Qv@a$^L@PL+D<}GwV4x338u}XhVTQAE$-n+&LaA z8({|4&3qwn000000002Q00{{2q#FH;$i@(MP}4#^RZVA;{+DuvP9Dy@B4ju^oX_LC z)xG$wyV^jy(=lqBB_rA@8)p({$ohq0Es`J$rkPfsXH)lf?6=nzM7_DWEwb{jQAaauSm!PZ9T zYT}MY0E??c{Xvul9>>$wEfkE}))?gwCFL!7qW}r3W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw08lzC0DK7KT=67|eWy`fDp>fdBc+~O7uzyJ zenzV#tln}e-#t1n0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYj>J&BtSha}(;Y$`JXPGB=kV4*wLBtqhZ|5MqpyCe+%@WE<+eiNaFF#Ow zD1YHreFK##HD3TVkt+#zB(T)(f`<3D1|_l-0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8-u`tvS415ZrnM>x2V2^fxgk1tbjf!`~d&}e7h_A literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_48.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_48.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..95dc1add11a52ba78b85391e2657abb97ee17be1 GIT binary patch literal 701 zcmV;u0z&a#6)6yc2SPIW0a-GMgsp#c5Md5x=V z0u|a^ktC~e000000001s00{{2q}fyT4fPh_hF6EzXN)t1Zk>1eFKnLWcKzh+sTi=Q z5&B_1arOV&tR5yVoxc&Tsg(<{S*Hg&>i`L>W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw08u(D0DL_4)waDZ+Ib?!Ul-u`tvS415ZrnM>x2V2^fxgk1tbjf!0000DtQi3SAbJ4+cpc15=-$U&daH%C zXSU4L8q*R*8pjccvuR z_?g^c9@W#-mj`J^wZCuxGY$C+fWyfF4GRSU1WW}52Lu580Tu|#nmY*&RsjHvje-qC j$DR;wy@1e~zFat6Dm43eK!K)!;{mCbV8^jw`~d&}`a?TQ literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_49.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_49.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..b1b9f4a532087f6d7cc4517810ffd6c1cd54f8cb GIT binary patch literal 701 zcmV;u0z&?2->M?)~ z9jbFE6hQE28kSE7zzbt5ct!AKKe_&)5>8TWzyJxWW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw08%j>}H-YN%x1B$q@Sv`G*c15pyJJEPqtG^KE|(KZ;_1DhgL$E_0I zuf48)IKR+@Kt)UP((H&OU^Qz+iU{S?SbsW;Enc7@>?wRJ#=I9$>g`xY@ksvxje-qC z$DR;wy@1e~zFat6Dm43eK!K)!;{mCbV8^jw0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8)2G%XhlfWyfF4GRSU1Xu+H2Lu580Tu|#nmY*&RsjHv*rQ5H jM=+NHlwNi?BJ*E5n3<{-JgB>3o+s5;o_hp-`~d&}sIDIn literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_5.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_5.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..70322b97f8fb86c1987531cc402998643a9c1144 GIT binary patch literal 670 zcmV;P0%8503h-@Y0001@r(BsIWA!L1{+?>f&i9WiE^{J;Vz=y5)s^{wgg9v2754)Wa+v%Q#%3ZnJ`QN^U1SLz{9x!Ozm5cHeBogZw_}?PW zyD9{oG~)F}000000000G00{{2q_E)z7M+T};Ms3L#9gAjW{3R0Cf2B`R`7jqdm zj%MId73qv=^S(`nQ%Mw7`~V57W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw046#t0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4Lfr_3uqCgmwxxyY+8q&-9a)g%#jdkN8iX!5( zDXHaVzk+XlXGS1@d}F=+PElS)I~L-ejND27LlxjK$|~}T{m!##BPjR$G6@KWc|_dQ zex)3M?+k0y$zK0kc5p?WGXDV?(|~@qrTiGVtw0f_R_@NGlt%2s+A`>C5*2}(esfL@ zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0Dy;{KO1Md>p9UAdE#5}$1t>r?Va_SM?yy+uxsR}$BYOq6bOLB$x$f<0R%_` z1qTEG`~emS%9=X~4pspGjOhE#-7Djw^+4=WaSB?k6s z0XJEk0kOkJaMJA+*0{E$>(Wrl{ee#PUlG&Lc_tV}*BL832i38M>oBU>U_mkR)Q~|) z&;4y;Z=14n000000002#00{{2q!zN}UWk2oqd||P`7yt>YW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw08=_F0DQk&$f&=R=>p%=VAep10e@4^-R&{d zX2DNRb7rB2wnI8E0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYki37Rd>7%9rT*AlJm)5=@pcFZAGX-YL9qTm)c3-fK3aG6W0+1aWgV1+Rk!mO%+* z(KT#g99J~a!5@4l-k+R9&aR|gXDM3o+s5;o_hp-0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8EWN4PIRJ zk#qro+1S-={Ghp~zs!&MH7yqmfWyfF4GRSU1Y`vT2Lu580Tu|#nmY*&RsjHvK(?vB jhqW7k{o?EuEa*D!`VJ!&<`^K8pl=<6%?RpF`~d&}&y**T literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_51.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_51.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..bb247b4edcc7521708fe6bb45bc0d16d04a022f2 GIT binary patch literal 701 zcmV;u0z&95(S)Eu(3SOAC_?SU9TKQ8i+<^ zgodo$1ZQ&!0vCA%N&0}&j$0495RL(x^3xTVJpc)-W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw08~0G0DMf1;OMWqm!~PjOUAkzUIV9~K3Fs* zKR!+b?wxT&mLobZ0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYkF$ZBMWA)~%IlP8)=xU$dl#>V!|wL@i=?)aP(LMBgYwOk?al>z?&K(?vB zhqW7k{o?EuEa*D!`VJ!&<`^K8pl=<6%?RpF0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8A@gG*u=t_S(+w%{|39B0`~d&}a5620 literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_52.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_52.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..4591a85f7ca566f9b866dc2285a81530e41bd803 GIT binary patch literal 701 zcmV;u0z&z;8*)K`S6d%BhZg;t;MH`SX2N20EbDigZj~iMoERRiUsys z4}&v66VJD{77+sDa#w-Wy@{>!dMicp>T{aI(i@y+0TnEI(I$6AD!>Z`%dCW8rBy0c z(mP4#P*PpkNEaS;R0FjuF-_Ieq(l>B%IknEPyh+5W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0986H0DMZ0h|r^?(20yOUR1cK3;v8fzrMqh z|ArbJ@1veh+_pL|0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYk8k%wweG{Ml_Y(#Xd@7h5Q$YMlC3nvLWV+Udqs1%knxp?2MbRG&jUjgssQM0o+n zc{a6yt9PB2ZnMs&KNfATby`>bd3L_aTe2SwP?+F0ejgOt_+Ik`W)?F)meT(LYBpPG z(46*;-?H(*_Gkv>A@gG*u=t_S(+w%{|39B00000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8g{S@4*lHy#15IYQBI}!uEP#$OAfA5i1~a+E4yZq za)$Nm8BDZx000000002V00{{2qy}`F6*OWo+J;Sp!AgUHoq#t=KOsnXg+Ao=o0jbm z{`>5{7CPfx`K-XoG<;EAW{*~i<$=dQu~t@jwX}vwo>Tw;0JKABH>q8IhChmJi0b!b z7k*i%1qiI2ogpeW>vfL5f6IfwvS}l^`RYaJZO)F=I0V~?`R$=O<*HAHrU|QgYpqe! zEYHWNi_9&051bLu+}^y%GFgALY*9S|&b5{^IRFW(W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw09HCI0DMoLLYBHeh2#0WZDyuh`YLzb9=-$U&daH%C zXSU4L8q*R*8n-;_to_c-u6&+tQ-8 zR)#D!1B8w}7X4EZ(8T#aI4u_pfWyfF4GRSU1c(I%2Lu580Tu|#nmY*&RsjHvI!slk j5{ZX=4z+e6rZ8(w$mj7TOWeIZqqr>m-TpZr`~d&}St&M) literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_54.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_54.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..ce039121c6dbb502dc9393f0e540e14bfe7c3752 GIT binary patch literal 701 zcmV;u0z&?ff`EcjkgAVJ}UaMbOsH_oFlx-YZQ~6&n&JP3n*{t*=s!*UvZ>|-G#*pLF zKSr1h|2$m8hc`rp{Ni{=irUS;WNYwg=F_a#8UP8aW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw09QIJ0DNdOUny*M9v=4WdXD+}_y$ZA->#1e zEk%7U+mITma;`cr0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYj|0nLGkkewOv>MdE}0Fy+j1OksFW7!Z!s|7N0%8&2}y$KPjyf-5+2GJ%49&jA1f zmwbukQ%K8p%d!bLX8=|OQN*#1q$|88jfx?4fPfRn!gU2hV2$_?dfIUao+1AMI!slk z5{ZX=4z+e6rZ8(w$mj7TOWeIZqqr>m-TpZr0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8@$t>row|c zvd4@h3IV~3qfWyfF4GRSU1e65@2Lu580Tu|#nmY*&RsjHv>3L5M jpwNrm)vX>y-T*GL#*20`%Rh=_ThLfB5t_2a*}C?DJ!)t42&d zmyIEsk^(Ru92AF(cBK3>;|iyhDs1`o9OX$j78vT49#jAT0IB29iNxMde`GEDYNp*g zMB+5Ju$nE7){#e($u*`xqg0%v@r@MP8I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw09ZOK0DMOA@ByujR0QbYEtEk0qyj%i^t(vv z5c3KJSN+1MrK3780Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYkRswba{Cwy#HYZsj}zM@M$2*pr+3L5M zpwNrm)vX>y-T*Gzb9=-$U&daH%C zXSU4L8q*R*8MIp@)G(U9<1O9Ycd1 zf^}a^d8V=Ya;TWL-2lD9IxQCrfWyfF4GRSU1fT^42Lu580Tu|#nmY*&RsjHv?IE^b jJ(CPNK4&?D%(R0Q?}L8FhyQ@tyyuF0b$E4D`~d&}Ox!IR literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_56.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_56.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..c3ff7830aae5af7f6b40c88eaefb97fc68a0d9be GIT binary patch literal 698 zcmV;r0!96v3h-@Y0001zLBG{UYg(}n{bn}0v;SBJ$ydGPxq3!CZhq8F38QC8<3q#$ z-Ky$H@g?rHm<8Jhk)Y33fSXTE%wD?K%R~h~nAW-;Xe*jfETQR=nfh1*t1!yb19Z;b zY(4;RD&fU>000000000=00{{2r0czpuP$rLYbWsr3*`lDtbb@}CtJdSm6s-gk%oiF zG$?&_d#rvnRu&kF*NM$x<6xq$bZW(J`b}ZJO00ZdB~$9=k0gHI>VtT5W+y_2^2HtN;nCW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw09iUL0DzGP+;eB5kt{p^)b?Pqi(Q1M=+N*C z3enh{hx_AM`FH@D0RR934Jh!WOg`t9o=8@fW|Wwyj2HI~X_>?Z1LE{Eh-m;rk_M1t zfeOjP!vOjMNrO&yWLu(i1C_J5I_4(Kg|%n4 z%+wmw5=9%7igXk3p+fyY)RRXUO8x-={s92~0RYwk0Dv5`{87kn1#+{88P>rWd@a9u zV+)o|toim-U{i!p^y)h;7Yu;I$pH-u1px%C1qBBL0Q>uBbH{f g8e3?ilGbD8)gvvk6&9A88A%A@GS|k-BK!dW05c#ik^lez literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_57.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_57.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..a96e3bc83d59e99f87373b08a011bb3e432de615 GIT binary patch literal 701 zcmV;u0z&_=(353`|@a*t1@xsnIQ5J~J5! zeI~63mH$P0000000000Q00{{2q|4*M=$}9@5tMZ=NiR>4g9se6=f)#$rQNJC&+(L@ zQtUX`7;Zy(s0EWMK>8PEJP1m}j#_U2E z2l~hI0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw09raM0DRe!4%P_5xb^f=x`ygBZTKs5JkO(s zih>DNQ_%I%d^0*P0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYlFkzT>c+6glEnp!wx#$O`_j@8em{y~d%F^x>?F{OodLE$M1|$)1Y{xwTq5(asTY z#%h~!hW=kBQ3HO7M7bCNeJRH*T%~t0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8qc;Ud0Ba`Pu^RqiV<3KG?PW*^~k3=(b`~d&}M%g-9 literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_58.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_58.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..e377414e3f89b59cbe269f5e638f479fc8d42dd5 GIT binary patch literal 705 zcmV;y0zUno3h-@Y0001^0qOitJ%!r@G9NK;@I0Kpi%T=tZSMZzi0H8)b_?kOu(FI`+Dl453 zu5SqtRWrwUpu#G00hs^d4dCQ93Ty^{;xVw(1Y3l0b`-ouGUymc1atz{S*6h_g| zfWu2?KK`pL6FuqM1jx4c6-1;=&bTgjJ_86s!T*sd~!4 zZi52`^@D$31JW4mhnhMs0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ z07H@nkYlqlK(pjttm%W?8=oiJV?Man|CvT~+xKds1<|PC^NeHa8a*5c>`6KfE`o-~ zt*#F4HLVC&k;YwNzcl+9WSZE4D$Et1N;>hYW9{9MgR%s#3CttK!9}QeIT1y1a+Lo8 zW=P$R%M+>qc;Ud0Ba`Pu^RqiV<3KG?PW*^~k3=(b0000DtQi3SAbJ4+d>zb9=-$U& zdaH%CXSU4L8q*R*84;lCi!BBT|Y5yT+yzH7jAVm@z?dR?Pv0z*9$xSz}y>YigL_R8% z$+v;l7x&V9000000000b00{{2q+OAhbFdi_F}c3=GF)1-$xgoNYJpFwc}%(tqqls4 zw9wo;;YxK@UQTnz)*QZq;usxaCse!z`vZ2YtYA$vz*GPL0F+%??__%6jmg^=5mu3B zrBAp{LtO|89;s&=Iy{(Nk+s3s08?F@0bR+&A@PD7j29geGN$ylI8d>j**H(SaIJj8 zgu$@vRK6~BFl*4jFX7RJ2fa*I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw09-mO0DQMqz2%JBJi(+-Ew=i2@^)jN`r#|& z^#&P0gVTCRtZh0k0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYk`l)INz$L*ia{L6ytNc2-*<;_8LSMAX@sw!x4Nsj__8B<4j$n`ch=u7#gZC-V&e zEU+AA$BYD}iyPSmB!Nf|adveufN6;d63KN(L*!F43Y5NDncY>1jLy9cH7EZ8bdm_n zzi7zb9=-$U&daH%C zXSU4L8q*R*8J}nmvfWyfF4GRSU1keQq2Lu580Tu|#nmY*&RsjHvyR4C+ j0Vy;OSgeo3-N5=(-fY}zS!^?9snNj`&OAS}D{u1Njw~*+32fj$=@0XK=LeZ)tY&epIFJ+MF}s)uT%g40IM{m6|H5k##CkGvX}u) z&&ZZI!jV1ZtLOGwM=J0I7CW5v(sZ{mMKeI(Jxsxk7Y&)lC=Q2MzOApfRl+72xFmpW z81q96f`>MN86PuYD30I&02u9el>hq;0HbRj>HrC=W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw04F*u0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4Lfr@iTb_rh0iEF1^NViqSsZ@me;sO6@S3u$m z0yGT?Z77ebUCBr44!%Y36|_WW!4)QXUVaaH-!X>Q--JLPUI@E2oiPV)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0DutRxR!cDxyBq+Z;7HJ)$GYv^B2jvnG9dV! literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_60.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_60.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..c5abd4e70529b3c4a8120619607b3fe5ce924453 GIT binary patch literal 701 zcmV;u0z&~|fW>g;0L^*r$d2wzvrbogO5ZTjm5mW#G0GW`;=<(NrX(`L9Ajv1i zf@!x$%IW<7<7c>F-Z*Ffv49U}T#f;%w82u|_q{si`XQIpQ?-UoE*rS1F&j1OlW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw09`sP0DR|;O_N#mnRbob02Gyf!38BPggC8* z`P5WH;fQ8BKA$=-0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYkwy=TmT?es&7ajoctJKc$V(xVV}>a_?O4eHmcmV)~ug_@?WuluWT&KUdgYl1LL~ zUdJlqtsIRwpmlb+kpR47(-Ch4H(|^qxDhUXJNrPVi%5r%2S0Hgl_yR4C+ z0Vy;OSgeo3-N5=(-fY}zS!^?9snzb9=-$U&daH%C zXSU4L8q*R*8`~d&}Lk23L literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_61.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_61.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..15f0c0eba5e9e45bc71c35dae9fa215844000105 GIT binary patch literal 701 zcmV;u0z&l++C&qi;~g;8E%-;( zXD3zwl~1D}h`~P;ok-tisVY7MIGw&V)NGc82OH|7G)1T8#+fJu*TMqF8$hRnqZ^>3 zZh4d;EoZNO000000002E00{{2q#{YMI0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0A4yQ0DOPf<`*)pu`?S4Z{h$pScpi3MK~ss z-&aDquWC2ZXSg~q0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYk9P_GW9*w6=$oOtY4a1p?pYIh+A+iTAqAj?zdDT1y2*K_DlpVGm#fC?#^XtnC+T zUgh;g&xwK)=O__0Rn*0000DtQi3SAbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8b) z=gL2VT#>Bfh!Abec&XxA_i1i$gQ75R$O~Nx;3HXlNmKv;0I~zJG=nB5l|}Sc7wmw_ zpynJ=QZx!7E<`16b$*4zIk1pL!l`)6o1(XDiC7ApN*PxTaxGtvW1pt|;dtoXr@J2W zw2JOzC@0LB@nIKb*Uoz>!zN}UWk2oqd||P`7yt>YW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0AD&R0DQ51Ngw)>d)0K;t3rF({iou8RlU65 zu*UbePr?5>(Vsdm0Ac|E00Ipf@T5#W=a!yGR+eUzn5c{w_YP^9#0CT6^fQQQ07H@n zkYlYbzb9=-$U&daH%C zXSU4L8q*R*8;j`fVmmVH~ zI45mYl{<$M^iHI%!8}8vK`j>yfWyfF4GRSU1oQ<32Lu580Tu|#nmY*&RsjHv>vRyv jH|%e2Uf29j{;%jrOd1zT4MUwV%;m`Mjt;R;`~d&}*2XOR literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_63.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_63.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..9a788865bc8f94ce6610d3256fcbdf3f9af2b714 GIT binary patch literal 700 zcmV;t0z>_t3h-@Y0002DkP|^)E~05t`jwIrcx0;P2QAhjmu}Q8LmCoSB)ac{u6K0- zava&ZpTtIp@%%>uyJPGxZ7-#BYMfWU6&X2>qNL~PmiG-fU+C3F0!J#~CR}G&z}m2Z z>P;{{L}9Oh000000001-00{{2q%4KIfG8@0^vPW-x0Xd0seh&XkJ&_Tp4G#&-6U;1 z;m4&QOxVYWSJxC>UUeEgwz{tIR*moUzfMkOF$%tk!c+hN0D?G>iOi$vm}O_!Tn3!} zFaaCVIwL%IAm%drv0O&-m1%3f`DVD^CAGy+T)*I(1qr98K_D&(oAK+jeqXy7^fLB6 zQ7!jIEAz|#X{i%@*SaUyiI`dblR7)$!`{+j_W%j2W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0Bm@8e0OSAw0AK(%0RVueI~2)d?3rDBC?)e#D+FM`omP_r4Jdw4 z0PumJ+K0TP={>tCCwfW^oqvHATU+}F*Z6UR&BJ#1n4M5*@M|Uuws+ZHmE0%BJ-wO) z0n_HcDBBWE)xM)WPMd$kSmB%nt%Whshlg@O%paPNf*Z=n$HBLjyvA{pU|Zfv!GFPpJ#1!!EZ;rBGA<-^xhc!0RRBb$uxxk literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_64.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_64.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..6211aef59c989f9d328da84bcd8e3b7ed083ab31 GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y0002BWbjI*Ct?TtN=E8_j(9ohRM)t&>i1+a3Vs6+CQsdbr_)aN zsFpRD7)pI_wTPz$d zO}EXVV}B@#)T2xsgp{zm>y|ed4CLSc)8Koy`{$AR;Zy(s0Ih_M#s9`ja$1Z>b#L(3 zcYUp0_nYy|a;Ky2^K;<5sAH`8D)A3zryK_u)HN=94-CW$u#yqs0MuWRt!x=dhbna3 zbw$b^P}1-dDYriMq_S$XhlJh@=DcdQi-D$ERR9UAW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0AV^T0D#_V^?7=_UDe1{I%YzkQZ8?-ljR6O zfkk#?0oL{ZDH6Wn z#&7?zHBeQ2s(1MuhFTn6L2a9yhwpbcUgc2*O#z`~f(*VbfVPIQ%UX$%C^`R~sP`dZ zvNj%C)@Wn^peDbR`)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfB~uOP@M!WyqWc8LmN!Bo0|I&3J>nSC+6$`YI{EgdP6N22!O-M zQBef}1PlfR2Lu580Tu|#nmY*&RsjHvT^A5u+hP}P;OAg9eno5`{qk|d_{4uCb;pK4 Ls0QmZ`~d&}SBOI3 literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_65.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_65.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..9f9fe3543020c805bb9f604bc39d5f55eb53dee8 GIT binary patch literal 733 zcmV<30wVpM3h-@Y0001&UEVOK9=cQV!MksX1kI`H#TehosUV{*vZeGpZeW4yq>%p( zw9i_r5(eWnxXi5%9OzTqq6ue^?}1%WG#9 z+StSS4otLy000000002t00{{2svR_)GLfKi`h!m@kT z58Pa@)6B;Th|725?X$Go9})1icpG^61H*{UER7gvPE-H@0E$+D`j16M1bcXw5N^Ys zuet}S^ZuGy4Za5R zzdzY9QI7v=9AK2nnMRwcW2hoz)v_nhxG|;w0bLgmUfW_9Zs6x&HGV~GApP=j#Q4O2 zBz4DzK&S@mGXMYp4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0 zlSdg!{s92~0Ra910M-EjfcpJ4Rop2edp%NtSS5kWJ3k~CR#eQUNo3nq@iu|cCPXb4 z2!O-MQBef}1Q-Sd2Lu580Tu|#nmY*&RsjHvUmM$I(eNPN;Oalfz}5bZ*Y(lVwh^1o P_jS#QQMu2+`~d&}jT1yM literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_66.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_66.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..2d8d6410aa1fd6cda7c5b62bceb49abe23e99109 GIT binary patch literal 728 zcmV;}0w?{R3h-@Y00028xyz>P!Hs7w?l`ty%kcvTVR$CRq-K3sL2`!QqN3Tjvma8| z)=rQ4|6WTMX@>U}TD+8brBK|N&D?l#dDREScg_PPcN#}0~iM7NDnm_mu9I0inm z9Wv84SU(T;LaI1Qu%>X1=ZR8AXofF$`|`~9mNoe$o>T#}@Ls0{AdP*R*Q?DXv;`8c{=^@&6BYVh|^LpBeT~L(bg(KMelN5qzoEO@j%pWpMnpE|0dva%` zUq*Uy2g;9GcB@d&II00F2V1ONa4&DVfV$!Mj}G!aQ{lMnF3h$z$x9U3@4d^HVDXV8ESLlLHMX@T8{X ze-=v`JfjYyvJ^|vM-kpcFHz;TG<6CRp>s|o$%l)<+>@zb9=-$U&daH%CXSU4L8q*R*8A|H?rh z;GEsZ(em?Ojj>jAo_`F{CI6)AYRlwA2snq3h+U^$*VR2x45A? z*5SF^wbUL^jwEH(eV;H$LaD}+U~sl+ZX&NQ@{gB7>r?;$0H*D4sp49%^l#c@J@O%<=Nq|As=0`iw=o+YAu?d!t* zU3vtH*ad)_)SC-(d9hoayW&3d&4(1cB!?HKLjVb@W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE090ULW0OSAw06{=50RVt2sI~2)d?3rDBC?)e#D+FM`omP_r4Jh!W zrsRJXOBy_*4x_RZOVLLW-b61^<+e0+3KF4nP9({PkuuQlns;GvQ76+=zLJRdU zVB$VZW+inPnx^JS!swSlTKALJO@Nq$SJ5dh19;?X1h`FSC9exH5NCr|q7!oNDy|LH z5fb?2>&f26UoXCk^A2t&OfSpr9BS_){{f2cfvK=zeW)!UKObRIrCfq~ZppM9QrCUU zY6ixO1GxYI01d1e0RSL+0RVg*%uVRt$6b1>g|%n4%+wmw5=9%7igXk3p+fyY)RRXU zO8x-={s92~0RYwk0Dz9$cpd$!l~_qqA?kY2$h$C9!;e{E+VOpzr3Y=ipmatp7YKmE z$x%@S0R%7x1qTEG`~emS%9=X~4pspGj1xhBXd!HfjuSBq7FLXz)8rW+h$HMWY>LE; M8FYDmw)_DA0C&GZQvd(} literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_68.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_68.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..ba24c242ba05d35f5d6d57c761888f8142896e9c GIT binary patch literal 728 zcmV;}0w?{R3h-@Y0002Ac_gz?&iU|#FLI*VlMC`{2)HD!nMYv*RH2ILGv}UHKPK2+)5}=z4z%8;|ql5 zfXiAHX;z1Y000000001s00{{2q-pe?R7<4{1cR&M@nfGUMQJ_p@o@Ou?IE5Zw`%=L z=(JbRGQN-Ynxu9)Fd7wffX*jV*lB+^xUy?5VF?4?22=n50EwC@<6J0pkoYPP!Xgft zyNB`HTqZc!{ctssNMSjYzM1^){-Dr-7PcBO_&rOv5*hqf4~QrI{>Y`-3JPL)=Eu5- zShF33Hs6TA&YmX3s^8E_FjW>Yfs+t736J4_+W-lxW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0A)HX0Dv2CAy%gQujZxDtlW9%OvlIOe zXcX^Y7n)&-)`0;HFo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F z>LE; z8FYDmwg3PC4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-Eje6+dYQRYlnJo8}e4|%8#Nq9b#4}9K-bWU~5gF7H@@G&6>fWygA zQ3U}6JO%{^1OWU276{6kI|&X}0RW6>{Gu9USU1`QwCn#k%oM*Ek;YNU literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_69.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_69.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..d0ee1bd34d341bd56768744860bd0763a3ec412a GIT binary patch literal 730 zcmV<00ww*P3h-@Y0002EeMiNeDsa?RExgGdbL(A+2Z{!)InZg3i#`2jVaSICrOkA(J~S4(&JbRwWci6? zEm+PNcRhfH000000002;00{{2q`dvxx`QhimD78LmBb-0MR{Z$X-+(l^55P#p?T8S zk=GMAHQ3w5J-R4Jn7CV}UPB>$m*FpHh+VQ(Omjx{@KgW*0I|?8*R@K?V4oSA7Vi6s z$z?LBe-A@Xf^&H8>x&zX;slBLG zi_zN5`PhSevG$B6zC#M@B(zX0LH055o7!0f3IGYKW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0A@NY0Du-Utw@`jn zhw53<&5s+&Kn0m)=ODtQ3GVCF$g}`Dv7n-G{-S#AJ z|5OO-bk(VAch*pyaq)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfPA@K!#DSFrte!fKaHa0F97Bpa1{> literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_7.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_7.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..d0270aab04dc7227092c8005c85ce7d0cec2524f GIT binary patch literal 670 zcmV;P0%8503h-@Y0001)INnzqf2T{1Cg54tM^Y1#kOASXzdV1j@_uHN0VLB(0M+W(WR(XrSm@(4Uf_o2uHZdS;Vxu9q-FK$;8Xwr0IR(~;I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw04O>v0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4Lfw5N@#8Vbim>j;ghu@>aNxEV=e`&=HDMlL$ zDE-%b@7{iXC0ZYOCyjGhDaENIN3s zNWFQR3ximiL=`tE?;v02x&Hx4tX#gBvBR`AuIaNTeR^WSE-P#l5vFGrYi7nqmwu5A zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0DxHEck}c&COMujN>(bPs! E0CkTZb^rhX literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_70.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_70.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..589aaa2bbe3b15e42fe4f839a8f90cb2c93fcaf6 GIT binary patch literal 733 zcmV<30wVpM3h-@Y0001$y`!Z9*cl=6*V@@DGD^-x*2ishmdxsw#q2;WrG{pw%_0?z zdd)uI|0`T$@WTMTVg<+vkyrAuddL+;Gv3P85CIS+;gXx+ zyDDa3K@ppW000000001d00{{2s&@9VV1XxrNq6OXBb^j_w$|M^SApi}?=0H74z`rgcK9hx*Ca}R|! z$a0==J?GuYhBf@UC`}o_mwYp!W4M%5*$HOX@jc*_c?l!9(iR`_5Jtk1uB#LG@6d5h zTxWl(AVw*8MC2P*Oxb|jla}WL#G0pri)m>7;{X5v00000W(EKN0cINjt^oiDfB^s% z1PE#Z00jj80RRBN{y_kG0RRE0AOrva0OSAw0B1TZ0D#BkHn}v)$UxsWtL35NlMjsD zgED8*HfeVGfsCq#`!WFyFo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_ zDDb4FRRy7eF}?jP{F&R$ ze!qw_LwoF3^O~0*29P)TQW4q$h|TEKe9yrD0hD1E2}*8slW=fY_K!7~omuJe*)Ed(gMH`fgbQAEQLj6G0 zlSdg!{s92~0Ra910M-EjfVRcg;pF?%Bh-(j{pW>0`efbg4vGi~i>hk3qj+Rf3GCjX$7|h$vZd-Jmv=L*Bm@4paaD0E5ss{T{h6lkEp?hE47+ zObj}l{+7C?AEqJN`+*g?SyrxT0*c@sx;3U^M@Uu*ITGnG%oH@%G(8^;4`aE=1zEp> zh!|&#iBk}u?=7sPX8Y?TY2xJ0ip;}N;s`J!MgRZ+00000W(EKN0cINjt^oiDfB^s% z1PE#Z00jj80RRBN{y_kG0RRE0AOrva0OSAw0BAZa0DzmnZzycWN4hu~w%Li>Mobk3 z5M36oAvN{d={6PLSMmW3Fo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_ zDDb4Fi9^?US%dgM>0ahk|MUI`6x?_j#@*@Rm1EU|rhg!ky zaD)CnlC4xP+W-In4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0 zlSdg!{s92~0Ra910M-EjfIW3du;Q9pQYcUbGh4k+XJC~coH;5jfqB2fka{2SElMpH z2!O-MQBef}1YiaQ2Lu580Tu|#nmY*&RsjHvP~qN&o{IWXnC!R%Q9d89w@?|~Z~D@B PyU#|G_~Vaf`~d&}lAb-z literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_72.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_72.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..31600d4849beb37e80b6198575ff2eed07220b5a GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y0001(znaNmJ%7)5$`b7MoCXp*zs%KRorv+vP0Elm5a}8t!htvI zIaU#lp!S+HgSYhq>vucSN5mTF-v8!2HGiw0n6rmrC!03iDx;XrjoQppgg6CgM zOcT)8@t;@KQXrcLqiZ697721?f@tt#ueV+EgFtdYuO_|;dvlZ z&wrC?C0p99F&H7%qHHIZ9OjZI;379+1ga}rvH%IIW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0BJfb0D$+4<8c3On;grR__y&Z3o?%gkA!{L z$nc}hIL14W^WOmtFo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F zAu-ayoabRNds*q*0>^0x++UCEUmg+x86-7MKBkXSsNQTJ&pERxhgmNwYGG_@Mx* zy2|s>_1_#E+VYQ|ui@<9G}5Ajhmx%S0Z`%IhMtQ0Qkd+x15rL7ueVSc-EaERc)QO= zllbG0X8-^I4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfR9xPn<0BbC51Y*Uo~v0+jbxRhr@Q^Ux^H8U7gT#mrE@d2!O-M zQBef}1Z)Nc2Lu580Tu|#nmY*&RsjHvUW`~v@=HUj;tR^j;+%~0K&AAKXrVcEI$Lxe Lpswd?`~d&}JJLm~ literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_73.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_73.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..5e2b0eea6af57dc1bc0cc502de1d4d95995d7bfa GIT binary patch literal 733 zcmV<30wVpM3h-@Y0001?v>Huq&T5nPT>G90m&(A1;vcDipPIr7kFKd!9FKIvTUgG!ZxEaX}&PG)l>ig0H7o_9-S5wt_u(mSnkSA zwFjiovlF@_Vn;_^n|^OnV+^c7*36*?mF_?64E(UxA_n{A>Z)J3$u20aG#MBhEA++e zxEF>1 zp@o6i_ce|?1t;q*upU>wBhHYdBQvN-h^FXEaj%cAd zbvj#g9-yx0Y5)KL4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0 zlSdg!{s92~0Ra910M-EjfJ0JpQ-tV6d$s$yV)#EybV@j9bGP`+poQg$s`S_%<2sZi6GCL%^L?rP1A0&L zb5BZ*`urx?B2Fj~;nTwv3LKY9lErYd!P*#`0k*4kxFU{GpsLu8+X(Fq!%}O@MksLM z>XV;Zxse5n000000001K00{{2qy(+AA;~2C%`H6;@W610Vb^0CR|kz$`omR;PE69+ zNS;ozlp;bldq8{P66B*w)Td&Ck^?I|Xd1ON%EW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0Bbrd0Dv$Zkw=*}S!!3ULzk^RkTVtu6zZ=3 z_UCS)I=fT(DlEkZ0QpS#r}Xtg2@lyKTstjk!HtWnJ3`o35vC z!v$CDSFj*){~FSTnefmr2G1}C3X_}v0n(v$I??pq`3NT113U)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfUu6Djaf`*1n0qM%-akb56N*;Ffl~xjgR1Mz+qncsZA{x41mMQ z0SyZU0R)5w1qTEG`~emS%9=X~4pspGj0Wx2w>{1w4*RVBTADQZ8x`SU#PQar<>YR~ MYq3hQ#7X*$!T0me)!ghq9X^#Q*ZCs!7a8;t_XX*Q^&muefBJ zUiyUHv4$v&y#_%5*%gRGW;-4=WD~Y$z~d`_shouJShsO7$ksZrj%NqEdRk^d+dcWy z#eWFvRH538000000000%00{{2s?pK!j{S*j#W%ERuTA$B&ta; z^Weu)B`u$xsmCft<|iI%`;l>ab@f{WC+z4n)PoJ4u2cX30H7o_9-S5wt_u(mSnkSA zwFjiovlF@_Vn;_^n|^OnV+^c7*36*?mF_?64E(UxA_n{A>Z)J3$u20aG#MBhEA++e zxEF>k7F)>iWjs(Lfc%;8hi$iw~&E!)YxE9)1a z)2rhgAw?fYfR~oo;~3mTwGm|e@n42{1w4*RVBTADQZ8x`SU#PQar z<>YR~Yq3)Ed(gMH`fgbQAEQLj6G0 zlSdg!{s92~0Ra910M-EjfR&jX4V;w*)wNU90o|JWp9KU|bTR?ZO^>>rIhv%!Wlk*@ z2!O-MQBef}1ds*=2Lu580Tu|#nmY*&RsjHvuzL%j&U2Z`Twt-*R8DbAmfGnilDPBE Pb-9HJA`ZF?`~d&}Pw+qi literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_76.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_76.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..6f8e00d1a53c75b82c1af086a8f27dad67915044 GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y00020XPUJ^<>N(~INeD*)_20ozZcsP;j&c&W*&59Zq(cs#}(W@ zP{w6y*i{)_9|N@)_ZJj|w&wRqd`eFGQi=f^b8po^+Eo`WGQJJvc2Pb7H1N?0GOP}( zgOId@$=RBX000000000U00{{2q`Y(xj7uHn{RJzfYDT0Oj;_d{Ow?)U4u)m2a&;?V zqzO6$+Yrt_MPjgy)ja4K(b2_$m&IXp3Ulxrk|C`{j5VhaPBm;<7;#YMWEd63J#_|?DP%7B` z!5AyEip>`?50c#!Ts*A>#sCScW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0Bt%f0DzQ5uO7pyfSz ztKB%eB|qGL8%hBUFo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F zKY$OP1Q{CX%@G&ULwk z2_g=<3;+NC4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfM!L^(?KyLs^@71t|I-;RddZ8>c844ZBI4drY|dvtxqi%2!O-M zQBef}1e^v12Lu580Tu|#nmY*&RsjHv@gBs6+)Y&Fhxe!-9HCLm``tv&S~5ITAX3ZO LaBaQn`~d&}Av`%~ literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_77.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_77.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..cc9c4c6f043be0c07c3383dad249cf5ca7ebdd94 GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y0001pvbG&$N)P8YOl+nQibv^69Pt0Uz6I5TaI!4dB%oT4zD=v> z`+%T1u!000000001C00{{2q}VOPZ89%2dC)5XHAlv_&}1($HW9B;vu?#FgFg^A z9#P9i&w$S7cX5B71Ua47y+p*jra)>328Gd$JW?OcK~w+$0J3)`6}??Cf~QHJrjSuy z9@3hDGS;rS?eV;xMaDGf#*hTbC5v_3)UeP^j8w|!m=@_QjsFS8HFZCU*C(tM=&OVD z0EHlilVe}hb`@VHpF1yMpHkP|yOXy)s$3Mo%K!I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0B$-g0Dza77Pn_*47JVgzO21kh@h$fJa(3k zM3_5?O9&}lL>>VRFo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F z8513b3 ze5Uc4DPq}Y3xuz>;iN&^k`j|E-X<~*JPVW;w(Fy|QUZbQaLL7G0UwVPG{0r4KhhTKh5<%jpE9~_}k%lq9#&RQ}&R3K8z z*>G*W>Hq)$4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfJdLca%+U9);@hBu6tIr`qbEN*^$UXK>zkTQ0-IHwook>2!O-M zQBef}1gHiD2Lu580Tu|#nmY*&RsjHvQ3h-@Y0001(uJ3Ux2!Gw#k(+E+ICNV$v47#zAi#o_K<#ewZ?otNB<=fI z7Ek7liHt000000002p00{{2r0)aUPFr06yWe?{l2vHy9QXX$`$T;EZ#N545*K{0 zGy9zG^y$@+J2@Mx=oYBgz&_|w7L8wG8j?VR{7d0&I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0B<@h0Dv0(i^#?hc2LtoJylI-lm3@-g-#yM zydq>cI-JkryVU^=Fo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F z)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfU7XyUPBJ;svJB;P&>oVvjfl|H?Q literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_79.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_79.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..5c0aa21445d5c71ce02a6216b878cc075a0d2752 GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y00027Pfm{V4s)Nst$|Jv?DNQLzc;*Q=wSfbPX9KI8U8%i42uqe zPrb-;nl3A4ukvXRp4oMQ{?PL*D#dd!1}tii zwk;HSs9?RMH6r2AmpeIe3``C4Dmx4dhz#yEs{jeBW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0B|}i0D#$3^$qnF;D%R+*Jq3~gl?U8`7dmq z<#zq#?5P;Arx5`SFo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F zAv+V&>EH8xjt~GBLOswH*Pof_s$|IneG62{|6a8}7O0VezICqK%r&GXy@EDc{b7AkX-{`0nkFTNE20e_2b7QYkz;V;ME_M8vLcmdD?WMl(CozP}z z&b3dZNdN!<4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfFYO@Lai{<4h6;8a82JMybyBDd*dw63ll$Q L9i<@``~d&}{6;_W literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_8.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_8.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..13fa263a79f2564f352e01457fa72ee009427ed8 GIT binary patch literal 670 zcmV;P0%8503h-@Y0001v*|Xs=;PanyotagAYYE@}_H6WK<`ZN}?pOE>_uzxwwIth5 ze4`CA@clV1oZyrbm!W%ZpOLfkz|i4$Ryoa&Jg)_amU1oxSb;{onf={WVN3D;JFm?v zbMQkA+B|1T000000001700{{2q$1xvmomV<{R^?K9EbtH%17Z!z$1`BvLlt*X!##N z0mDVK>J@%~<)?Iml@ZR8=>UEd9hiYg+26R|*?+1wTvPx60I>4bsm5VR;DDMYilL=)t;tyTlAI>ULmq}~q95(jIjF@m- zx-Bl-x3a;PN+?Yf63W6ii13cFKe!Fp?iINJwg3sMW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw04X{w0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4Lfu_hCZqz0K2Q;QXTJk?oH!U<)F%~m)_q`EP zn~7zaA>LJ%wv_hjC1p~FcuK7w;}f>F(!I-!HcpX{3~0F?|7!U}SMcn7_gh@W&+ z!lzLDAx@%F0-3>Svp(L_(EkBqOEA6Pw|rIv#adnHibJA7z2{8;Aqzb1b|`v0PsczF zsWJfo03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0Ducr>|}k0q*75*E_zbfjozL`=(@(-AvEM)+jNxl&4~*w6bOLB$x$f<0R(IV z1qTEG`~emS%9=X~4pspGjDnh*TZ5STHG4fG6nmi&GJQ-s2&;x^*&l*;bNO-Rnfw6& E05#?$1^@s6 literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_80.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_80.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..12f4c18084c5f89bb1d32a0996da152660dc32d9 GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y0001&l6G8sS1*};5L^uigXi$~Gm%YBL%F>uT>&0nBVhlXsPb?K zJzZ&`F)Kc{j$8DZQepkSt=JB0GpR&#|P3j3lZ#z*SLxp@s|Uig|w z&@N`$M_;#*000000001a00{{2q;f9o<8pr9AW1z*GPL0JN20&>>e79GgsUTr1LP zh)-NMuoMxmFf%gyr53`3Y-o_FV!@@x#R6?L2`^8?N)rvKUJ<^^ZDy|=*p8@;Zus*W z2J~4T@I~ih%?4noSU%4}rNa{)meZ=aJQZBK^Z*H~W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0C74j0Dwy|A3w>Pt^=%4HaPm_;|a=1S7g#XLn6(Kwwd%<@mV`&q{ zR~ABwwT-#b0O;LhTYrM)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfaLpVH!JYLpFbuefzw)^>3Rb==cec2$j+8*Uf+ER*;6eS2!O-M zQBef}1k45n2Lu580Tu|#nmY*&RsjHvd(FxtWW?!kjSOh`OXL0QM+fBN@7;)HP6{kz Lv!TD=`~d&}t_DHS literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_81.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_81.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..0625f98e73ceff156fc715e06af9f464749740a8 GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y0001kIl7fU+POp64LD~~IGMkC*0lXr>z>vGnvOT;JO27+OW9bD zx!@Fi=0ckZLFi5yB5IhvM!UYpOlP4(;ggJ#N2`lThEIx58+cxb{-&QE(9iwAii(lp zQyrYs91$Us000000002$00{{2q(G^7su^@;0I!g#*IX03^wLgOc;9I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0CGAk0DygQ%ri~c>I^(*5XVBu6qFnyCLSyR zj1Z;Af6a-dRxJSyFo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F zwP$(N9g^^EZB1XR>=9~?ZGnl zK}1>?J7I`|8LCv5w(ql%C4?q2M2m(00ej8LBV@$saE%OT_)Fvc>_-RWZ-v9sr4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfL^02a+K_87p6rk3|li+#;jh9QI}OKJVhcgQ3h-@Y0002Da?q|t{Qm!x#vwuqu{oRtWBXKgY2(txw=efCd%d=pgamY_PC?w+mJ`Yp_w|6m`$uZa80O7+qlNumB0GW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0CPGl0DxW@C5BB`x;ESQ8eu0bqtn<4b@fa0 zxlOT#5v&rS70Uq)Fo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F z)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfWj+)9XZ^xIZ3()ITj4;cR-Z)onSLMigXRQ-X#B4>s2im2!O-M zQBef}1mp$<2Lu580Tu|#nmY*&RsjHv`QL_vD?vG14lAIogBcS?l6;klZS&honf1Un L+=^@^`~d&}F!42T literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_83.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_83.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..c85e4aa15986167aac21d953763f4cf868212c9a GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y00028JE2JBSZRicjLXq#u|x1c7X6MrtAlq3T3R%`tD^zd4!G^1 zJFmKVBQ?h~&X-UT^Hhz|ZNOP3W_ck27`&f6=4UxF-xE#0rETh8?wTXYF zbGtr*1zlPq7rL>k6ivM9p0u8IF<}rlt^HS9&o?n;=~Ms!0I6DY_m4p5#U2vfFeo6r z!AHD>m4~!MF^#x1sHsfp?%yv1gNWSd)EC(m1)K3@HW+0it}NgE_9w?Bg+{sfOTyh>6NdLwpz7))JPpqxys?*Iv_W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0CYMm0D$3SrlP~IT*3c~&3H}o$FTO}8J0cd z{w{x6OL>br>>vRRFo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F z(^b4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfHIn~<+8q3J>b9gWPV6UK5+rx!^Ey8qTmpbHdJ(@Csr*N2!O-M zQBef}1n>q02Lu580Tu|#nmY*&RsjHvaenGd=QvFlEXc0@nENa3dtDWMOVQ3h-@Y0001`|Ibx6blGZ5N@lz){GwemtZP3X@2(p)qw{b8hNPSaZz*|Y zX=a1NE?07V3F7t>Rv`G)ie4nODMM z=$je9`zmUQ<^_UZ$ypjna9?&x<52j3_dL}DD)097@elN%iHR~My%<$oRAonjyM5N| z5vI0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0ChSn0DuN`niVu+G1`VrguzOKft`RiN)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfI<>0Lz!+$={vK{nMt%J-CUx1Dq-*YPCgz?#+{6v1y?N>2!O-M zQBef}1pEdC2Lu580Tu|#nmY*&RsjHv*YJ9sbP--Q3h-@Y0001~x3}`j8RrbiLM6Qf_rv$4N8l3>PC^XSitjd$8Y$SB=qG$H zzRr?Wb9k}LFT6wvXOJRkV_(PTRy~+UJfjLq#F@1Q1?^2km6b4_0|fEvtSk;FXJKB7 z8qQ;?{xbWP000000001R00{{2r0#tH!O=h&Wh3Vyc`c%rZ_NtgylN&+HJNInUMr%b zIY2VEv^9PkIx}$@8)^4p4h_M6Qaj~%g_B;ESb|O$zf=GK0ILi2b9Uc$kZ;dh!&LEM zLstXEFB_;TpTAeV*`qk*_pg@~h3CSX6^rXruo2Z5dJ8bc`mBIkB^7t^DveY>ytUA4 zKLm2eM(#RLNzWwO#N{ivFulZ$U?F-Q^+B>wLjVb@W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0CqYo0D!Djy8(a#;zeQr~m!ts=Fo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F z`W zQ%0}_OaK4?4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfN{z6)!;JxIR2ro2!O-M zQBef}1PBKO2Lu580Tu|#nmY*&RsjHvV}M&@v$o#}9NhYs8;BvX>&yI3C5HmH$)w7A L+wkZ*`~d&}-{v)Q literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_86.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_86.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..7b3eddf3f8c08f9703860efce15756d0d2e5356a GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y0001k*!WHmAx|EVf;5*jWwECc-aezf){EzpIeu39UU+a4{@f#% z%QX^=UjiTbuv+L1sR5D6$SFQ|Hkfd2s()F%f%P-GBBw6KLmRBk_ui z9J?}k>muQRbvYOwJsi9>QkWx)PSq4k@RdI7D2#q|)KmZf0I1%~9djgXXX_$2CbZXt z6!0qc>drxExH~p?3qco$p;{-0t0*Bg`gZ*^fu*@L*Z`rXuxIufZEe`v3{6W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0Czep0DzOc^tl`rtzuVI*#xalF=Q;gF|&HL zGd)+K66t`d5|;rDFo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F zvY zq$=6Yka^VxwyOcyzK&dNpIvRB?DR zm-0P6;&%R<@yfKv&>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfN{?R+|%sWWx-`D8M)k87P*9950G_@{RJmq_mP4`(pfDR2!O-M zQBef}1QZ7a2Lu580Tu|#nmY*&RsjHv3+zUl;l0a{r!sUY9CtCmCzD;&Gd}Rhk@s`V L+DH(N`~d&}V9G@v literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_87.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_87.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..638bafe5d616e3d8197ea84cbc3597dbe6626a4a GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y0001o_$8}_%OdGh-xi_T=?ay`EiX%IqEDCp^DLKA$VlKqmIg1> zE8hP=OB)E43R=R(wD(Qt4<@KC_y3NYVh4!O z<(N^Atci=e)%;ql=t9%$&HD#B+j}b0YlzQ~IpGQvyi@=H0H(l-P1c&P(8CGFJb3vE z@~#fK`H}#2EG|BH8fltsX-nT0SRw4gRv?n#2W2L1^aP-es*mHE0z&m0g{An3q}^eZ zE=I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0C+kq0D$YgkFPFk%WEg`1`Fi{Y^;B1X(wC4 zft8mgfsuxT$TR^BFo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F zih6j88Bl}T7ril6HNzHP$8J<%`;wfbeJfKM<1VIsns>LfAt+G)qYiQx>k z)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfO}#Q>B=}{_-~<4a>tHuN&TrjMzL?Fn1kXLARh3xVOlL02!O-M zQBef}1Rw_m2Lu580Tu|#nmY*&RsjHvjF~~*r|_w2|C)EhuXa@Yl5C%U0v1gjL literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_88.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_88.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..ef553a34db2d28d0f321bee59269ee0839d13f8b GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y0002Be%vBc`kwm^KduiWA5KCQpZzh1+|9V)Lw6DnfH$cEq~F|$ z>>$1`K{p)EIaBQrzWxq0WUojPH1Q2M<1-0L^U(V|`=Wf_phhtu=&gp*9U4i>g9dLVQ%ien7%!w z@?9=PHdg(;M44#E)pHu(<0FrMi=4n;L@Qy;xom-_} z;r>gCetU;xZ3n`=^=;D#oB^-c6yjg$AMhPtOU-GWiUr?V%q;A;9huR@hO#5kI!2uF z8;MBxpR1t?8Zh+1Vu`VlO~BjK($5Mwwoh_WN&pF~W&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0C_qr0D#Nm!RVhrFA z>wMZZdxr6@V|J5|M6=`s6iR=maO5)Lsvnscr&3fsAF{y#&leVhH*a^&9iQ@K!{E}>+e*zX)c=?zt zO%0OdL;wH)4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfWaJjaWlk3W@JX(Fmo{NQ#2vFBD1UD4^=@DhJ98tFQ3h-@Y0001zEGNqEYHI0ekCKV!FSOqDF{|#u&Kvx47o$HS(usQ@f8i2< z%>0S73b&ALLeVJ>g)RyZr9nled^~aIv}fl@ebWB@)elqolu;emk+=8YBQ9sQ&X=>D z5yO}cAI!0u000000001^00{{2qy=u)WE4FQY_6Mwzq{%=fFVg-R-o)=Ua)#HlaW`* zJ&2-1*(VSXfhQOrV0tiNMl#VwWx!R(D-u#-L14%U8&m)Q0FTMgLpqC*;kDy*R;O}} z&n)9Q$9iRvK;I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0D3ws0DuBE>nCbX6=8SqaZm1Apqt_lqxq5t zmDx@cAsWGpVX*-XFo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F zpF4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfPEI@1i&_PTySeV8{^+TF*cEMYT)FE&$Z%+dIbjTkz6eo2!O-M zQBef}1ULr;2Lu580Tu|#nmY*&RsjHva5=%>l*4EgT3L@AQFs7B^$JZ-f&pK& L%n1A~`~d&}U3fMG literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_9.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_9.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..b4c3dcfd693c1d79bcf3eb9a74a7628d817511a1 GIT binary patch literal 670 zcmV;P0%8503h-@Y0001|@@B?~|kBw*sndhiajEk}jk>PW{eHGEz4NqxKRl<$5IGHwcZ;8tOlLpMf+ zpW3q=`WTu@000000002}00{{2q z%0dQ?;lk9eNPK#q^U`tV=6&c@8n0dsc*Qn((f|poW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw04h2x0DRs?u=4F*a`4W=0!BbP6v<=knO%G+ zCG%4&1Yp3OR+Bm}0Ac|E009jeeoz4LfuLN;thXcBh^QVHkk?{0-zDoB!w#^;B+jgS zo|-Bfd}vgO9?u!b6#{6Ld8PQPAQOJxp#s^Q`EVrZ{p&H_=wRcEiZ_G#aP`w?YFA2h z)Ed(gMH`fgbQAEQLj6G0lSeX50R900{s92~ z0RYMY0Dv<0So?hLYry4tb|d^X!tE1@K0RgO)9?Q1<*FSy%&ZJ86bOLB$x$f<0R(sh z1qTEG`~emS%9=X~4pspGjEEz~7Rk_Y10UMyv;pn53t-lR~dR-XM`}_d_ E0Qwv(O#lD@ literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_90.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_90.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..373746aa8082aed53118498db099661346f1fc4e GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y00025)E5QSNz`Ht7L1PuOzgIx5`Ko5-n%C^4j6QzQtAWzB;s5x z8mnVQ`ct(J&yG(OM5hz~V3~qfH$+`9U46L^Q!P~RU|J!CXvV@klH~YHjc`V?+_D>@ z+xtfZQ<0mS000000000O00{{2q|rmrgCt4;bnSmsJ^*txP7|ZFb7X3j9fLhe2}|wR zyBQc3KoJI0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0DC$t0DxVQmvgWg5;3{H^)g&qv&l}r>S}>c zsd-Gg45PPvfwTb)Fo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F zf{O(we< zKk_Fph44tL-pUE@*H}Q(F_;|@zNrLbm!pmVBDzBl+B$@{t?^Rsm-a%SptA|3{0wx7 zWNq(LaZp)|a-4Y=Z^zKBz1by%uG)tG0dP6N-;~2>6k1<3X$9TBXi<0oLG=nvPl5qo zw9E+nEdT%j4Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfH>Z+UF!>V5bTwav-KQ2!O-M zQBef}1Vje~2Lu580Tu|#nmY*&RsjHv>xYqka1|fb#48r@9)XF$7uo>G2(hicv(GK! LxzPT^`~d&}WzjF; literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_91.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_91.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..fc01404a9c6bf8f97689143522975b56b60eaa63 GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y0001~RBc}d&I6Xo`=XcYr9>5+#JPw`u+Pjv^jxJ+I?+Q7(SCcB zH{2~v5ZG~X;o`#s&`4k-8|!ie?0#i+!J$y*)6)_$pP}uAT;wS`((nu5PK&<8s(2{F zS*b>Ioq8Ue000000002X01XK6q@QUu;^8EQD2`yul->_%-{mXAF^tz15iGm>q-ugS zV)PYA`CYVTL+6~cDo5iEj7IX1rEkO(uk<~H0FODZQ~&?~v@7rk(d;7Nsh6yFQdQyR zsTwG{no#4ugiZS2`JP+?caG%wu8egkdFjEJbNZMl1c%@>^oT-#_OCP=dBLHATpfGX z`_i1eum&_C(VE>s^YDGLl{-I`WedY&plq{F000TBVgUdE0b&{evH<`HfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0DL+u0D!s6bN_-h$3;Jpg-iy#;K$cN22=gk z99~B4-Ln!6`F8;gFo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_DDb4F zb5v16+cG)*w!{CdGRS8DWoym6*(od(-qF4SLSOkDYTh%^caB%U z9(d&p=jvFdN}9#iuccz^MU6lS-5iPk0qcj6esC2Z)x;|n@g9MR!57*9$Oy5mzO&CQ z;)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfVY%IVTP)>INO1BH0L$Ac+mw@a~8fRfkWsh!fujJjb1Gm2!O-M zQBef}1W*SB2Lu580Tu|#nmY*&RsjHv9JPflV5`q>fEP%_tqhC4nr$|>SK_$85=O>v LDca={`~d&}5Hd*J literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_92.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_92.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..cd851715494649a291775d27763f75820058f153 GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y0001{&x_V8@<>eejktlZxC*E_3SS<5B~rL(Y5`~+U$i@%i<127 ztE>x-?uaL%76B9qBckkPx6H9!v9lP5J_+>?;~2sQ`ubdaOgXyp0f4Abs)F9hV!%w| zn-6Mpqt}6*000000002a00{{2q=|G>M+j)<*({M&V2Bd{zsa;MycS#vCG-bH~Ko(62@PK-hE&vIuW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0DU?v0DvM%u;eY7I!r^US1j5FtT)@`g&Dcp zi{ z1{GqWyGDrZ7eHL&+`b8XB%rQ8#Y@z?!&X=aqkKl&9?s4E1s~CGp>!y|GDK5bGQl(Q zewQoHULpv~V8r);Zy7g!OGgKmGAf4u0UWi3Enut9Z-5s_#H|dAzM5?|w^!o0zY<2q zZz)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfX%R6_CGlErHE?c8@MrFmg;vhp?M8ntxqk1$+YS(j9)Dm2!O-M zQBef}1Y8FN2Lu580Tu|#nmY*&RsjHv0h@ToP?_NV+}yy3KQ!?HJ1NkkSN;4|!Hw>4 L>a5;Z`~d&}Rzp1h literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_93.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_93.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..636ade4791feac23ca75865b2cabe4a8e726fc70 GIT binary patch literal 733 zcmV<30wVpM3h-@Y0002E3L_2$gfZ<54xq*^^Ox#W)$5|S)?Ch~m@oxoa!>*e4H?DQ z073Uh+Vww<&lZ{sBgc#g3rV%keV)jo7dWN3^IdCL*lS5(Q6j41!E9vi@5p*y;2Y12 zbcr6e}G zQ2%GnIwsQw`0)0K4@cTD;FY!eVTgwDa=w94FM@_Vu2cX30FU6b2IEUUB^Ww#Bx4PT z_ycv>N^N9KP>;3^ZQilB4!M&y;reGxJZxuCd%xe&j~S6uYH+NWtqnZTMYJ0TEomCy zOo^w99`MHZ-CR7Fj;W9%Nk(8=Eab?>+_VwJCjbBd00000W(EKN0cINjt^oiDfB^s% z1PE#Z00jj80RRBN{y_kG0RRE0AOrva0OSAw0Dd|w0D#{O<#56y4vJuEdyLaj@P#-_ z&(D}c>AZi7k*X`uNaq0!Fo51hu=4F*a`4W=0!BbP6v<=knO%G+CG%4&1Yp3OR+9q_ zDDb4FVr3qNF=AtEQu;uA~RnjarQjEB|Hv>T(icn*yi;SMH>W-3+9tVQGc~1(g`!e_Fh)U8tB$)lFtHw&<}ra{TT80RfwM$55Hz{@mQah(9#(0Xr$sqgVa> zRl$w!aO$kyR{#J24Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0 zlSdg!{s92~0Ra910M-EjfJlp}3?Hq-_Wm%e)(fznNudT#TIQM&2Ox|STFV|cMPMx# z2!O-MQBef}1ZW2Z2Lu580Tu|#nmY*&RsjHv+6EMLq`^m8*|*7;#OlNaJVZ*}q~d3( PSWwrK5^wTd`~d&}vCu({ literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_94.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_94.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..b07de428a139da76fa459fac8f1d311f8c29e06c GIT binary patch literal 729 zcmV;~0w(>Q3h-@Y00021*Sf}-uC5HJATEhMz!H>VL*G|A!SbCLhJj|u(bU|!t_Hwt zA^cE~pQ00{{2q?KIs;txiD?+9S0A|zR2*DbrgL_6m+7&@itGNvO{ ze`EqyN}7W|r6H>*#q=RBS!$|%`f|^aTcCs&JI^^5OjG~>0Jdf`$H-terYc^i=_H_> zI%TU2x^tltSMlhfTS1K9S1G0v6v*qla2{lNXr2M<<{3HjIZlE|DZdEDB@lLgUW9-z zkfSzAnk>-S^yLE4se;QiUnQ<@iQEncF`iH;s{jeBW&r>I0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0AOrva0OSAw0Dn3x0DvroyMQPvg7nEm-=3fI$;`LvJhHB!q zsGhGx9uaEi3uA7fO!x74cFF-aU^F`}h+*mk$~bkS9m7wIN9PeelKJxjs)k7qKIA%x zoJ~`ty4t&PtE3_|)C4`pvC`Y=5)p>~0on!>b)>;ZTG_YBm&EGC1w2Gb-K64YsaR0g zlM-+8T>t<84Xhaf03dn+0DK+HP3YdoU3#m9wP&`>)Ed(gMH`fgbQAEQLj6G0lSdg! z{s92~0Ra910M-EjfQ$mCE-injca#RGB!V{s$ne`2!O-M zQBef}1at=l2Lu580Tu|#nmY*&RsjHvy{H@}Zo0uIwmO>Jxu3=BjUAnt*th)VSdEUT LR>u=8`~d&}$c#YD literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/blocks_95.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/blocks_95.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..7cbf6df9079bbe0ee8518a79da6f7edd5a1f617a GIT binary patch literal 702 zcmV;v0zv(r3h-@Y0001w^BLBS{@H__IQ?A7$G$ckpN>4Dk1O^XZ7fu3Hc{U3jh^@& zMOi3|js>Yro;FGcA*5Gl=C0=PLM#UjAMdFWi!5kQ)edw5$ob@Prhf}$0gH)v-0*** zul7o9y0%xK000000001x00{{2q?p%Qt18=1j*Y*+T!F?Ot}b;|fpMwJIL+l_I9Km} z@Y$w>V*n4EFp@NT{AzwN<(VE_Yj!+CSl}3DK-~4X@>Bo-0F&uqlI#S!R{bfl&Z#~2 zCKfcyWc;%us!>XbqAzMmeF4x@w^%Y)C7n0|$=7faK@YR5L@0<|(O4_Q-Sp5q@&1|x z5V*`JxCYlcRe6?ZWO7GUT)(ltNcRBI0cINjt^oiDfB^s%1PE#Z z00jj80RRBN{y_kG0RRE0Bm@8e0OSAw0Du5C0RVtJ9Q~l7>Ugea#@pd-6DpuIViWgw z_uy?N=|IIoJ~mAP4KI95KIfL6NLH3+l$fZD7xxZnnZyPI;`B3!X#hi#29RR`U;zPs zPyq0Ogq?v@u=!cg`Y$0VDNx~UdjAiC~OlK}Sk?-Q&=7M=ME^wmsxZLB= z6DSjhi5ze*5E8IU$mT(8ANhejt=pfqU106dQJGx4P@jF_orJjdDtoIw12F@M{{g+I z942nM!6&vln%udc#p{h7otfCT{N`AVj;L106D$FyJ^=s#AbJ4+d>zb9=-$U&daH%C zXSU4L8q*R*8pF literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/meta.yaml b/cl/antiquary/tests/test_data/bellatrix/meta.yaml new file mode 100644 index 00000000000..46caff2710c --- /dev/null +++ b/cl/antiquary/tests/test_data/bellatrix/meta.yaml @@ -0,0 +1 @@ +{blocks_count: 96} diff --git a/cl/antiquary/tests/test_data/bellatrix/post.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/post.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..b3bc26c91c2f288a1baed8f408061851e2ba9c45 GIT binary patch literal 182685 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 Y?lJXOYzC{0cV`-6l`vsyvpoCmKgf<@#Q*>R literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/test_data/bellatrix/pre.ssz_snappy b/cl/antiquary/tests/test_data/bellatrix/pre.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..ee9a847b53fa4689e0e47fb09586ee0ba84bdb56 GIT binary patch literal 175634 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 Cn!l(3 literal 0 HcmV?d00001 diff --git a/cl/antiquary/tests/tests.go b/cl/antiquary/tests/tests.go index 98ee2ff043b..1596e16d05b 100644 --- a/cl/antiquary/tests/tests.go +++ b/cl/antiquary/tests/tests.go @@ -2,7 +2,9 @@ package tests import ( "context" + "embed" _ "embed" + "strconv" libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" @@ -37,6 +39,11 @@ var phase0_pre_state_ssz_snappy []byte //go:embed test_data/phase0/post.ssz_snappy var phase0_post_state_ssz_snappy []byte +// bellatrix is long + +//go:embed test_data/bellatrix +var bellatrixFS embed.FS + type MockBlockReader struct { u map[uint64]*cltypes.SignedBeaconBlock } @@ -130,3 +137,38 @@ func GetPhase0Random() ([]*cltypes.SignedBeaconBlock, *state.CachingBeaconState, } return []*cltypes.SignedBeaconBlock{block1, block2}, preState, postState } + +func GetBellatrixRandom() ([]*cltypes.SignedBeaconBlock, *state.CachingBeaconState, *state.CachingBeaconState) { + ret := make([]*cltypes.SignedBeaconBlock, 0, 96) + // format for blocks is blocks_{i}.ssz_snappy where i is the index of the block, starting from 0 to 95 included. + for i := 0; i < 96; i++ { + block := cltypes.NewSignedBeaconBlock(&clparams.MainnetBeaconConfig) + // Lets do te + b, err := bellatrixFS.ReadFile("test_data/bellatrix/blocks_" + strconv.FormatInt(int64(i), 10) + ".ssz_snappy") + if err != nil { + panic(err) + } + if err := utils.DecodeSSZSnappy(block, b, int(clparams.BellatrixVersion)); err != nil { + panic(err) + } + ret = append(ret, block) + } + preState := state.New(&clparams.MainnetBeaconConfig) + b, err := bellatrixFS.ReadFile("test_data/bellatrix/pre.ssz_snappy") + if err != nil { + panic(err) + } + if err := utils.DecodeSSZSnappy(preState, b, int(clparams.BellatrixVersion)); err != nil { + panic(err) + } + postState := state.New(&clparams.MainnetBeaconConfig) + b, err = bellatrixFS.ReadFile("test_data/bellatrix/post.ssz_snappy") + if err != nil { + panic(err) + } + if err := utils.DecodeSSZSnappy(postState, b, int(clparams.BellatrixVersion)); err != nil { + panic(err) + } + return ret, preState, postState + +} diff --git a/cl/cltypes/eth1_block.go b/cl/cltypes/eth1_block.go index ef5819c648c..3d92938f7ee 100644 --- a/cl/cltypes/eth1_block.go +++ b/cl/cltypes/eth1_block.go @@ -94,8 +94,11 @@ func (*Eth1Block) Static() bool { func (b *Eth1Block) PayloadHeader() (*Eth1Header, error) { var err error var transactionsRoot, withdrawalsRoot libcommon.Hash - if transactionsRoot, err = b.Transactions.HashSSZ(); err != nil { - return nil, err + // Corner case: before TTD this is 0, since all fields are 0, a 0 hash check will suffice. + if b.BlockHash != (libcommon.Hash{}) { + if transactionsRoot, err = b.Transactions.HashSSZ(); err != nil { + return nil, err + } } if b.version >= clparams.CapellaVersion { withdrawalsRoot, err = b.Withdrawals.HashSSZ() diff --git a/cl/cltypes/solid/checkpoint.go b/cl/cltypes/solid/checkpoint.go index 8db388792ce..87ce50436aa 100644 --- a/cl/cltypes/solid/checkpoint.go +++ b/cl/cltypes/solid/checkpoint.go @@ -13,7 +13,7 @@ import ( ) // Constants to represent the size and layout of a Checkpoint -const checkpointSize = 32 + 8 // BlockRoot(32 bytes) + Epoch(8 bytes) +const CheckpointSize = 32 + 8 // BlockRoot(32 bytes) + Epoch(8 bytes) type Checkpoint []byte // Define Checkpoint as a byte slice @@ -22,7 +22,7 @@ func NewCheckpointFromParameters( blockRoot libcommon.Hash, // A hash representing the block root epoch uint64, // An unsigned 64-bit integer representing the epoch ) Checkpoint { - var c Checkpoint = make([]byte, checkpointSize) + var c Checkpoint = make([]byte, CheckpointSize) c.SetBlockRoot(blockRoot) c.SetEpoch(epoch) return c @@ -30,7 +30,7 @@ func NewCheckpointFromParameters( // NewCheckpoint returns a new Checkpoint with the underlying byte slice initialized to zeros func NewCheckpoint() Checkpoint { - return make([]byte, checkpointSize) + return make([]byte, CheckpointSize) } func (c Checkpoint) MarshalJSON() ([]byte, error) { @@ -92,7 +92,7 @@ func (c Checkpoint) BlockRoot() (o libcommon.Hash) { // EncodingSizeSSZ returns the size of the Checkpoint object when encoded as SSZ. func (Checkpoint) EncodingSizeSSZ() int { - return checkpointSize + return CheckpointSize } // DecodeSSZ decodes the Checkpoint object from SSZ-encoded data. diff --git a/cl/cltypes/solid/uint64slice_byte.go b/cl/cltypes/solid/uint64slice_byte.go index ce102e81f2b..a642c6278c1 100644 --- a/cl/cltypes/solid/uint64slice_byte.go +++ b/cl/cltypes/solid/uint64slice_byte.go @@ -81,7 +81,7 @@ func (arr *byteBasedUint64Slice) CopyTo(target *byteBasedUint64Slice) { func (arr *byteBasedUint64Slice) MarshalJSON() ([]byte, error) { list := make([]uint64, arr.l) for i := 0; i < arr.l; i++ { - list[0] = arr.Get(i) + list[i] = arr.Get(i) } return json.Marshal(list) } diff --git a/cl/cltypes/solid/validator_set.go b/cl/cltypes/solid/validator_set.go index c8241fe0880..eb5b6e170d1 100644 --- a/cl/cltypes/solid/validator_set.go +++ b/cl/cltypes/solid/validator_set.go @@ -58,6 +58,8 @@ func NewValidatorSetWithLength(c int, l int) *ValidatorSet { l: l, buffer: make([]byte, l*validatorSize), treeCacheBuffer: make([]byte, getTreeCacheSize(l, validatorTreeCacheGroupLayer)*length.Hash), + phase0Data: make([]Phase0Data, l), + attesterBits: make([]byte, l), } } diff --git a/cl/persistence/base_encoding/uint64_diff.go b/cl/persistence/base_encoding/uint64_diff.go index 4c242cc9623..1e3496082e9 100644 --- a/cl/persistence/base_encoding/uint64_diff.go +++ b/cl/persistence/base_encoding/uint64_diff.go @@ -9,6 +9,7 @@ import ( "sync" "github.com/klauspost/compress/zstd" + "github.com/ledgerwatch/erigon/cl/utils" ) // make a sync.pool of compressors (zstd) @@ -211,7 +212,7 @@ func ApplyCompressedSerializedUint64ListDiff(old, out []byte, diff []byte) ([]by temp := make([]byte, 8) currIndex := 0 for i := 0; i < int(length); i++ { - n, err := decompressor.Read(temp[:4]) + n, err := utils.ReadZSTD(decompressor, temp[:4]) if err != nil && !errors.Is(err, io.EOF) { return nil, err } @@ -219,7 +220,8 @@ func ApplyCompressedSerializedUint64ListDiff(old, out []byte, diff []byte) ([]by return nil, io.EOF } entry.count = binary.BigEndian.Uint32(temp[:4]) - n, err = decompressor.Read(temp) + + n, err = utils.ReadZSTD(decompressor, temp) if err != nil && !errors.Is(err, io.EOF) { return nil, err } diff --git a/cl/persistence/state/historical_states_reader/historical_states_reader.go b/cl/persistence/state/historical_states_reader/historical_states_reader.go index 380f1992d72..1290f27fb1e 100644 --- a/cl/persistence/state/historical_states_reader/historical_states_reader.go +++ b/cl/persistence/state/historical_states_reader/historical_states_reader.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "io" + "sync" "github.com/klauspost/compress/zstd" "github.com/ledgerwatch/erigon-lib/common" @@ -18,6 +19,7 @@ import ( state_accessors "github.com/ledgerwatch/erigon/cl/persistence/state" "github.com/ledgerwatch/erigon/cl/phase1/core/state" "github.com/ledgerwatch/erigon/cl/phase1/core/state/lru" + "github.com/ledgerwatch/erigon/cl/utils" "github.com/ledgerwatch/erigon/turbo/snapshotsync/freezeblocks" "github.com/spf13/afero" "golang.org/x/exp/slices" @@ -106,12 +108,12 @@ func (r *HistoricalStatesReader) ReadHistoricalState(ctx context.Context, tx kv. ret.SetLatestBlockHeader(blockHeader) if err := r.readHistoryHashVector(tx, r.genesisState.BlockRoots(), slot, r.cfg.SlotsPerHistoricalRoot, kv.BlockRoot, blockRoots); err != nil { - return nil, err + return nil, fmt.Errorf("failed to read block roots: %w", err) } ret.SetBlockRoots(blockRoots) if err := r.readHistoryHashVector(tx, r.genesisState.StateRoots(), slot, r.cfg.SlotsPerHistoricalRoot, kv.StateRoot, stateRoots); err != nil { - return nil, err + return nil, fmt.Errorf("failed to read state roots: %w", err) } ret.SetStateRoots(stateRoots) @@ -120,13 +122,13 @@ func (r *HistoricalStatesReader) ReadHistoricalState(ctx context.Context, tx kv. historicalRoots.Append(root) return nil }); err != nil { - return nil, err + return nil, fmt.Errorf("failed to read historical roots: %w", err) } ret.SetHistoricalRoots(historicalRoots) // Eth1 - eth1DataVotes := solid.NewDynamicListSSZ[*cltypes.Eth1Data](int(r.cfg.Eth1DataVotesLength())) - if err := r.readEth1DataVotes(tx, slot, eth1DataVotes); err != nil { + eth1DataVotes := solid.NewStaticListSSZ[*cltypes.Eth1Data](int(r.cfg.Eth1DataVotesLength()), 72) + if err := r.readEth1DataVotes(tx, minimalBeaconState.Eth1DataLength, slot, eth1DataVotes); err != nil { return nil, err } ret.SetEth1DataVotes(eth1DataVotes) @@ -135,30 +137,29 @@ func (r *HistoricalStatesReader) ReadHistoricalState(ctx context.Context, tx kv. // Registry (Validators + Balances) balancesBytes, err := r.reconstructDiffedUint64List(tx, slot, kv.ValidatorBalance, "balances") if err != nil { - return nil, err + return nil, fmt.Errorf("failed to read validator balances: %w", err) } balances := solid.NewUint64ListSSZ(int(r.cfg.ValidatorRegistryLimit)) if err := balances.DecodeSSZ(balancesBytes, 0); err != nil { - return nil, err + return nil, fmt.Errorf("failed to decode validator balances: %w", err) } ret.SetBalances(balances) validatorSet, currActiveIdxs, prevActiveIdxs, err := r.readValidatorsForHistoricalState(tx, slot, minimalBeaconState.ValidatorLength) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to read validators: %w", err) } ret.SetValidators(validatorSet) - // Randomness randaoMixes := solid.NewHashVector(int(r.cfg.EpochsPerHistoricalVector)) if err := r.readRandaoMixes(tx, slot, randaoMixes); err != nil { - return nil, err + return nil, fmt.Errorf("failed to read randao mixes: %w", err) } ret.SetRandaoMixes(randaoMixes) // Slashings slashings, err := r.reconstructDiffedUint64Vector(tx, slot, kv.ValidatorSlashings, int(r.cfg.EpochsPerSlashingsVector)) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to read slashings: %w", err) } ret.SetSlashings(slashings) @@ -180,43 +181,41 @@ func (r *HistoricalStatesReader) ReadHistoricalState(ctx context.Context, tx kv. ret.SetPreviousJustifiedCheckpoint(previousCheckpoint) ret.SetCurrentJustifiedCheckpoint(currentCheckpoint) ret.SetFinalizedCheckpoint(finalizedCheckpoint) - // Participation if ret.Version() == clparams.Phase0Version { currentAtts, previousAtts, err := r.readPendingEpochs(tx, slot, minimalBeaconState.CurrentEpochAttestationsLength, minimalBeaconState.PreviousEpochAttestationsLength) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to read pending attestations: %w", err) } ret.SetCurrentEpochAttestations(currentAtts) ret.SetPreviousEpochAttestations(previousAtts) } else { currentIdxs, previousIdxs, err := r.readPartecipations(tx, slot, minimalBeaconState.ValidatorLength, currActiveIdxs, prevActiveIdxs, ret, currentCheckpoint, previousCheckpoint) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to read participations: %w", err) } ret.SetCurrentEpochParticipation(currentIdxs) ret.SetPreviousEpochParticipation(previousIdxs) } if ret.Version() < clparams.AltairVersion { - return ret, nil + return ret, ret.InitBeaconState() } // Inactivity inactivityScoresBytes, err := r.reconstructDiffedUint64List(tx, slot, kv.InactivityScores, "inactivity_scores") if err != nil { - return nil, err + return nil, fmt.Errorf("failed to read inactivity scores: %w", err) } inactivityScores := solid.NewUint64ListSSZ(int(r.cfg.ValidatorRegistryLimit)) if err := inactivityScores.DecodeSSZ(inactivityScoresBytes, 0); err != nil { - return nil, err + return nil, fmt.Errorf("failed to decode inactivity scores: %w", err) } ret.SetInactivityScoresRaw(inactivityScores) - // Sync syncCommitteeSlot := r.cfg.RoundSlotToSyncCommitteePeriod(slot) currentSyncCommittee, err := state_accessors.ReadCurrentSyncCommittee(tx, syncCommitteeSlot) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to read current sync committee: %w", err) } if currentSyncCommittee == nil { currentSyncCommittee = r.genesisState.CurrentSyncCommittee() @@ -224,7 +223,7 @@ func (r *HistoricalStatesReader) ReadHistoricalState(ctx context.Context, tx kv. nextSyncCommittee, err := state_accessors.ReadNextSyncCommittee(tx, syncCommitteeSlot) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to read next sync committee: %w", err) } if nextSyncCommittee == nil { nextSyncCommittee = r.genesisState.NextSyncCommittee() @@ -233,30 +232,30 @@ func (r *HistoricalStatesReader) ReadHistoricalState(ctx context.Context, tx kv. ret.SetNextSyncCommittee(nextSyncCommittee) // Execution if ret.Version() < clparams.BellatrixVersion { - return ret, nil + return ret, ret.InitBeaconState() } payloadHeader, err := block.Block.Body.ExecutionPayload.PayloadHeader() if err != nil { - return nil, err + return nil, fmt.Errorf("failed to read payload header: %w", err) } ret.SetLatestExecutionPayloadHeader(payloadHeader) if ret.Version() < clparams.CapellaVersion { - return ret, nil + return ret, ret.InitBeaconState() } // Withdrawals ret.SetNextWithdrawalIndex(minimalBeaconState.NextWithdrawalIndex) ret.SetNextWithdrawalValidatorIndex(minimalBeaconState.NextWithdrawalValidatorIndex) // Deep history valid from Capella onwards - historicalSummaries := solid.NewDynamicListSSZ[*cltypes.HistoricalSummary](int(r.cfg.HistoricalRootsLimit)) + historicalSummaries := solid.NewStaticListSSZ[*cltypes.HistoricalSummary](int(r.cfg.HistoricalRootsLimit), 64) if err := state_accessors.ReadHistoricalSummaries(tx, minimalBeaconState.HistoricalSummariesLength, func(idx int, historicalSummary *cltypes.HistoricalSummary) error { historicalSummaries.Append(historicalSummary) return nil }); err != nil { - return nil, err + return nil, fmt.Errorf("failed to read historical summaries: %w", err) } ret.SetHistoricalSummaries(historicalSummaries) - return ret, nil + return ret, ret.InitBeaconState() } func (r *HistoricalStatesReader) readHistoryHashVector(tx kv.Tx, genesisVector solid.HashVectorSSZ, slot, size uint64, table string, out solid.HashVectorSSZ) (err error) { @@ -290,7 +289,7 @@ func (r *HistoricalStatesReader) readHistoryHashVector(tx kv.Tx, genesisVector s return nil } -func (r *HistoricalStatesReader) readEth1DataVotes(tx kv.Tx, slot uint64, out *solid.ListSSZ[*cltypes.Eth1Data]) error { +func (r *HistoricalStatesReader) readEth1DataVotes(tx kv.Tx, eth1DataVotesLength, slot uint64, out *solid.ListSSZ[*cltypes.Eth1Data]) error { initialSlot := r.cfg.RoundSlotToVotePeriod(slot) initialKey := base_encoding.Encode64ToBytes4(initialSlot) cursor, err := tx.Cursor(kv.Eth1DataVotes) @@ -302,17 +301,19 @@ func (r *HistoricalStatesReader) readEth1DataVotes(tx kv.Tx, slot uint64, out *s if err != nil { return err } - for initialSlot > base_encoding.Decode64FromBytes4(k) { - k, v, err = cursor.Next() - if err != nil { - return err - } - if k == nil { - return fmt.Errorf("eth1 data votes not found for slot %d", slot) + if initialSlot <= r.genesisState.Slot() { + // We need to prepend the genesis votes + for i := 0; i < r.genesisState.Eth1DataVotes().Len(); i++ { + out.Append(r.genesisState.Eth1DataVotes().Get(i)) } } + endSlot := r.cfg.RoundSlotToVotePeriod(slot + r.cfg.SlotsPerEpoch*r.cfg.EpochsPerEth1VotingPeriod) + for k != nil && base_encoding.Decode64FromBytes4(k) < endSlot { + if out.Len() >= int(eth1DataVotesLength) { + break + } eth1Data := &cltypes.Eth1Data{} if err := eth1Data.DecodeSSZ(v, 0); err != nil { return err @@ -394,13 +395,10 @@ func (r *HistoricalStatesReader) reconstructDiffedUint64List(tx kv.Tx, slot uint } currentList := make([]byte, lenRaw) - if _, err := zstdReader.Read(currentList); err != nil { + if _, err = utils.ReadZSTD(zstdReader, currentList); err != nil { return nil, err } - if freshDumpSlot == slot { - return currentList, nil - } // now start diffing diffCursor, err := tx.Cursor(diffBucket) if err != nil { @@ -453,20 +451,16 @@ func (r *HistoricalStatesReader) reconstructDiffedUint64Vector(tx kv.Tx, slot ui return nil, err } defer zstdReader.Close() - currentList := make([]byte, size*8) var n int - if n, err = zstdReader.Read(currentList); err != nil && !errors.Is(err, io.EOF) { - return nil, err + + if n, err = utils.ReadZSTD(zstdReader, currentList); err != nil && !errors.Is(err, io.EOF) { + return nil, fmt.Errorf("failed to read dump: %w, len: %d", err, len(v)) } if n != size*8 { return nil, err } - if freshDumpSlot == slot { - return out, out.DecodeSSZ(currentList, 0) - } - for k, v, err := diffCursor.Next(); err == nil && k != nil && base_encoding.Decode64FromBytes4(k) <= slot; k, v, err = diffCursor.Next() { if len(k) != 4 { return nil, fmt.Errorf("invalid key %x", k) @@ -509,6 +503,8 @@ func (r *HistoricalStatesReader) readValidatorsForHistoricalState(tx kv.Tx, slot } return true }) + // Read the balances + bytesEffectiveBalances, err := r.reconstructDiffedUint64List(tx, slot, kv.ValidatorEffectiveBalance, "effective_balances") if err != nil { return nil, nil, nil, err @@ -550,6 +546,22 @@ func (r *HistoricalStatesReader) readPartecipations(tx kv.Tx, slot uint64, valid if err != nil { return nil, nil, err } + // trigger the cache for shuffled sets in parallel + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + _, _ = r.computeCommittee(ret.RandaoMixes(), currentActiveIndicies, slot, r.cfg.TargetCommitteeSize, 0) + }() + if slot > r.cfg.SlotsPerEpoch { + wg.Add(1) + go func() { + defer wg.Done() + _, _ = r.computeCommittee(ret.RandaoMixes(), previousActiveIndicies, slot-r.cfg.SlotsPerEpoch, r.cfg.TargetCommitteeSize, 0) + }() + } + wg.Wait() + // Read the previous idxs for i := beginSlot; i <= slot; i++ { // Read the block @@ -560,6 +572,7 @@ func (r *HistoricalStatesReader) readPartecipations(tx kv.Tx, slot uint64, valid if block == nil { continue } + ret.SetSlot(i) currentEpoch := slot / r.cfg.SlotsPerEpoch // Read the participation flags block.Block.Body.Attestations.Range(func(index int, attestation *solid.Attestation, length int) bool { @@ -630,7 +643,7 @@ func (r *HistoricalStatesReader) readPreviousPartecipation(slot, validatorLength return nil, err } - if _, err = zstdReader.Read(out); err != nil && !errors.Is(err, io.EOF) { + if _, err = utils.ReadZSTD(zstdReader, out); err != nil && !errors.Is(err, io.EOF) { return nil, err } ret := solid.NewBitList(0, int(r.cfg.ValidatorRegistryLimit)) diff --git a/cl/persistence/state/historical_states_reader/historical_states_reader_test.go b/cl/persistence/state/historical_states_reader/historical_states_reader_test.go index 970b928fe15..13b51fbf1d5 100644 --- a/cl/persistence/state/historical_states_reader/historical_states_reader_test.go +++ b/cl/persistence/state/historical_states_reader/historical_states_reader_test.go @@ -28,13 +28,15 @@ func runTest(t *testing.T, blocks []*cltypes.SignedBeaconBlock, preState, postSt f := afero.NewMemMapFs() a := antiquary.NewAntiquary(ctx, preState, vt, &clparams.MainnetBeaconConfig, datadir.New("/tmp"), nil, db, nil, reader, nil, log.New(), true, f) require.NoError(t, a.IncrementBeaconState(ctx, blocks[len(blocks)-1].Block.Slot+33)) - // Now lets test it against the reader - hr := historical_states_reader.NewHistoricalStatesReader(&clparams.MainnetBeaconConfig, reader, vt, f, preState) tx, err := db.BeginRw(ctx) require.NoError(t, err) defer tx.Rollback() + vt = state_accessors.NewStaticValidatorTable() + require.NoError(t, state_accessors.ReadValidatorsTable(tx, vt)) + hr := historical_states_reader.NewHistoricalStatesReader(&clparams.MainnetBeaconConfig, reader, vt, f, preState) + s, err := hr.ReadHistoricalState(ctx, tx, blocks[len(blocks)-1].Block.Slot) require.NoError(t, err) @@ -43,17 +45,22 @@ func runTest(t *testing.T, blocks []*cltypes.SignedBeaconBlock, preState, postSt postHash2, err := postState.HashSSZ() require.NoError(t, err) require.Equal(t, libcommon.Hash(postHash2), libcommon.Hash(postHash)) - } func TestStateAntiquaryCapella(t *testing.T) { - t.Skip() + //t.Skip() blocks, preState, postState := tests.GetCapellaRandom() runTest(t, blocks, preState, postState) } func TestStateAntiquaryPhase0(t *testing.T) { - t.Skip() + // t.Skip() blocks, preState, postState := tests.GetPhase0Random() runTest(t, blocks, preState, postState) } + +func TestStateAntiquaryBellatrix(t *testing.T) { + // t.Skip() + blocks, preState, postState := tests.GetBellatrixRandom() + runTest(t, blocks, preState, postState) +} diff --git a/cl/persistence/state/state_accessors.go b/cl/persistence/state/state_accessors.go index d5301323e8c..6155bde3371 100644 --- a/cl/persistence/state/state_accessors.go +++ b/cl/persistence/state/state_accessors.go @@ -265,3 +265,34 @@ func ReadPreviousEpochAttestations(tx kv.Tx, slot uint64, limit int) (*solid.Lis } return attestations, nil } + +func ReadValidatorsTable(tx kv.Tx, out *StaticValidatorTable) error { + cursor, err := tx.Cursor(kv.StaticValidators) + if err != nil { + return err + } + defer cursor.Close() + + var buf bytes.Buffer + for k, v, err := cursor.First(); err == nil && k != nil; k, v, err = cursor.Next() { + staticValidator := &StaticValidator{} + buf.Reset() + if _, err := buf.Write(v); err != nil { + return err + } + if err := staticValidator.ReadFrom(&buf); err != nil { + return err + } + out.validatorTable = append(out.validatorTable, staticValidator) + } + if err != nil { + return err + } + slot, err := GetStateProcessingProgress(tx) + if err != nil { + return err + } + out.slot = slot + return err + +} diff --git a/cl/persistence/state/static_validator_table.go b/cl/persistence/state/static_validator_table.go index f1f327ed054..5e32b890e2a 100644 --- a/cl/persistence/state/static_validator_table.go +++ b/cl/persistence/state/static_validator_table.go @@ -226,6 +226,9 @@ func NewStaticValidatorTable() *StaticValidatorTable { func (s *StaticValidatorTable) AddValidator(v solid.Validator, validatorIndex, slot uint64) error { s.sync.Lock() defer s.sync.Unlock() + if slot <= s.slot && s.slot != 0 { + return nil + } s.validatorTable = append(s.validatorTable, NewStaticValidatorFromValidator(v, slot)) if validatorIndex >= uint64(len(s.validatorTable)) { return fmt.Errorf("validator index mismatch") @@ -236,6 +239,9 @@ func (s *StaticValidatorTable) AddValidator(v solid.Validator, validatorIndex, s func (s *StaticValidatorTable) AddWithdrawalCredentials(validatorIndex, slot uint64, withdrawalCredentials libcommon.Hash) error { s.sync.Lock() defer s.sync.Unlock() + if slot <= s.slot && s.slot != 0 { + return nil + } if validatorIndex >= uint64(len(s.validatorTable)) { return fmt.Errorf("validator index mismatch") } @@ -246,6 +252,9 @@ func (s *StaticValidatorTable) AddWithdrawalCredentials(validatorIndex, slot uin func (s *StaticValidatorTable) AddSlashed(validatorIndex, slot uint64, slashed bool) error { s.sync.Lock() defer s.sync.Unlock() + if slot <= s.slot && s.slot != 0 { + return nil + } if validatorIndex >= uint64(len(s.validatorTable)) { return fmt.Errorf("validator index mismatch") } @@ -256,6 +265,9 @@ func (s *StaticValidatorTable) AddSlashed(validatorIndex, slot uint64, slashed b func (s *StaticValidatorTable) AddActivationEligibility(validatorIndex, slot uint64, activationEligibility uint64) error { s.sync.Lock() defer s.sync.Unlock() + if slot <= s.slot && s.slot != 0 { + return nil + } if validatorIndex >= uint64(len(s.validatorTable)) { return fmt.Errorf("validator index mismatch") } @@ -266,6 +278,9 @@ func (s *StaticValidatorTable) AddActivationEligibility(validatorIndex, slot uin func (s *StaticValidatorTable) AddActivationEpoch(validatorIndex, slot uint64, activationEpoch uint64) error { s.sync.Lock() defer s.sync.Unlock() + if slot <= s.slot && s.slot != 0 { + return nil + } if validatorIndex >= uint64(len(s.validatorTable)) { return fmt.Errorf("validator index mismatch") } @@ -276,6 +291,9 @@ func (s *StaticValidatorTable) AddActivationEpoch(validatorIndex, slot uint64, a func (s *StaticValidatorTable) AddExitEpoch(validatorIndex, slot uint64, exitEpoch uint64) error { s.sync.Lock() defer s.sync.Unlock() + if slot <= s.slot && s.slot != 0 { + return nil + } if validatorIndex >= uint64(len(s.validatorTable)) { return fmt.Errorf("validator index mismatch") } @@ -286,6 +304,9 @@ func (s *StaticValidatorTable) AddExitEpoch(validatorIndex, slot uint64, exitEpo func (s *StaticValidatorTable) AddWithdrawableEpoch(validatorIndex, slot uint64, withdrawableEpoch uint64) error { s.sync.Lock() defer s.sync.Unlock() + if slot <= s.slot && s.slot != 0 { + return nil + } if validatorIndex >= uint64(len(s.validatorTable)) { return fmt.Errorf("validator index mismatch") } @@ -355,6 +376,9 @@ func (s *StaticValidatorTable) GetStaticValidator(validatorIndex uint64) *Static func (s *StaticValidatorTable) SetSlot(slot uint64) { s.sync.Lock() defer s.sync.Unlock() + if slot <= s.slot && s.slot != 0 { + return + } s.slot = slot } diff --git a/cl/persistence/state/validator_events_test.go b/cl/persistence/state/validator_events_test.go index 893c7a78640..b36be719f5a 100644 --- a/cl/persistence/state/validator_events_test.go +++ b/cl/persistence/state/validator_events_test.go @@ -1,7 +1,6 @@ package state_accessors import ( - "fmt" "testing" libcommon "github.com/ledgerwatch/erigon-lib/common" @@ -28,7 +27,6 @@ func TestStateEvents(t *testing.T) { events.ChangeSlashed(2, true) // Ok now lets replay it. ReplayEvents(func(validatorIndex uint64, validator solid.Validator) error { - fmt.Println(validator) require.Equal(t, validator, solid.NewValidator()) return nil }, func(validatorIndex, exitEpoch uint64) error { diff --git a/cl/phase1/core/state/cache.go b/cl/phase1/core/state/cache.go index b69956fe741..fcd410f080d 100644 --- a/cl/phase1/core/state/cache.go +++ b/cl/phase1/core/state/cache.go @@ -45,7 +45,7 @@ func New(cfg *clparams.BeaconChainConfig) *CachingBeaconState { state := &CachingBeaconState{ BeaconState: raw.New(cfg), } - state.initBeaconState() + state.InitBeaconState() return state } @@ -53,7 +53,7 @@ func NewFromRaw(r *raw.BeaconState) *CachingBeaconState { state := &CachingBeaconState{ BeaconState: r, } - state.initBeaconState() + state.InitBeaconState() return state } @@ -216,7 +216,7 @@ func (b *CachingBeaconState) initCaches() error { return nil } -func (b *CachingBeaconState) initBeaconState() error { +func (b *CachingBeaconState) InitBeaconState() error { b._refreshActiveBalances() b.publicKeyIndicies = make(map[[48]byte]uint64) diff --git a/cl/phase1/core/state/cache_accessors.go b/cl/phase1/core/state/cache_accessors.go index f777dacac5c..df6c7d53085 100644 --- a/cl/phase1/core/state/cache_accessors.go +++ b/cl/phase1/core/state/cache_accessors.go @@ -146,7 +146,16 @@ func (b *CachingBeaconState) GetAttestationParticipationFlagIndicies(data solid. } // Matching roots if !data.Source().Equal(justifiedCheckpoint) { - return nil, fmt.Errorf("GetAttestationParticipationFlagIndicies: source does not match") + // jsonify the data.Source and justifiedCheckpoint + jsonSource, err := data.Source().MarshalJSON() + if err != nil { + return nil, err + } + jsonJustifiedCheckpoint, err := justifiedCheckpoint.MarshalJSON() + if err != nil { + return nil, err + } + return nil, fmt.Errorf("GetAttestationParticipationFlagIndicies: source does not match. source: %s, justifiedCheckpoint: %s", jsonSource, jsonJustifiedCheckpoint) } targetRoot, err := GetBlockRoot(b, data.Target().Epoch()) if err != nil { diff --git a/cl/phase1/core/state/copy.go b/cl/phase1/core/state/copy.go index ebf0a111b53..de4ecd63538 100644 --- a/cl/phase1/core/state/copy.go +++ b/cl/phase1/core/state/copy.go @@ -22,7 +22,7 @@ func (b *CachingBeaconState) CopyInto(bs *CachingBeaconState) (err error) { func (b *CachingBeaconState) copyCachesInto(bs *CachingBeaconState) error { if b.Version() == clparams.Phase0Version { - return bs.initBeaconState() + return bs.InitBeaconState() } if bs.publicKeyIndicies == nil { bs.publicKeyIndicies = make(map[[48]byte]uint64) diff --git a/cl/phase1/core/state/raw/copy.go b/cl/phase1/core/state/raw/copy.go index f491ea1f5e4..86aa9e5e75a 100644 --- a/cl/phase1/core/state/raw/copy.go +++ b/cl/phase1/core/state/raw/copy.go @@ -16,7 +16,7 @@ func (b *BeaconState) CopyInto(dst *BeaconState) error { b.stateRoots.CopyTo(dst.stateRoots) b.historicalRoots.CopyTo(dst.historicalRoots) dst.eth1Data = b.eth1Data.Copy() - dst.eth1DataVotes = solid.NewDynamicListSSZ[*cltypes.Eth1Data](int(b.beaconConfig.Eth1DataVotesLength())) + dst.eth1DataVotes = solid.NewStaticListSSZ[*cltypes.Eth1Data](int(b.beaconConfig.Eth1DataVotesLength()), 72) b.eth1DataVotes.Range(func(index int, value *cltypes.Eth1Data, length int) bool { dst.eth1DataVotes.Append(value.Copy()) return true diff --git a/cl/phase1/core/state/ssz.go b/cl/phase1/core/state/ssz.go index 81b09c748e0..057666abfa9 100644 --- a/cl/phase1/core/state/ssz.go +++ b/cl/phase1/core/state/ssz.go @@ -25,7 +25,7 @@ func (b *CachingBeaconState) DecodeSSZ(buf []byte, version int) error { sz := metrics.NewHistTimer("decode_ssz_beacon_state_size") sz.Observe(float64(len(buf))) h.PutSince() - return b.initBeaconState() + return b.InitBeaconState() } // SSZ size of the Beacon State diff --git a/cl/rpc/rpc.go b/cl/rpc/rpc.go index c71501dbb1e..0ada88e8115 100644 --- a/cl/rpc/rpc.go +++ b/cl/rpc/rpc.go @@ -143,7 +143,7 @@ func (b *BeaconRpcP2P) SendBeaconBlocksByRangeReq(ctx context.Context, start, co // SendBeaconBlocksByRootReq retrieves blocks by root from beacon chain. func (b *BeaconRpcP2P) SendBeaconBlocksByRootReq(ctx context.Context, roots [][32]byte) ([]*cltypes.SignedBeaconBlock, string, error) { - var req solid.HashListSSZ = solid.NewHashList(69696969) + var req solid.HashListSSZ = solid.NewHashList(69696969) // The number is used for hashing, it is innofensive here. for _, root := range roots { req.Append(root) } diff --git a/cl/spectest/consensus_tests/finality.go b/cl/spectest/consensus_tests/finality.go index a313c8a72ab..9a1de019a58 100644 --- a/cl/spectest/consensus_tests/finality.go +++ b/cl/spectest/consensus_tests/finality.go @@ -2,11 +2,12 @@ package consensus_tests import ( "fmt" - "github.com/ledgerwatch/erigon/cl/transition/machine" - "github.com/ledgerwatch/erigon/spectest" "io/fs" "testing" + "github.com/ledgerwatch/erigon/cl/transition/machine" + "github.com/ledgerwatch/erigon/spectest" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/cl/spectest/consensus_tests/ssz_static.go b/cl/spectest/consensus_tests/ssz_static.go index 939078efe19..a1512837d44 100644 --- a/cl/spectest/consensus_tests/ssz_static.go +++ b/cl/spectest/consensus_tests/ssz_static.go @@ -57,7 +57,6 @@ func getSSZStaticConsensusTest[T unmarshalerMarshalerHashable](ref T) spectest.H require.NoError(t, err) require.EqualValues(t, expectedRoot, haveRoot) // Cannot test it without a config. - // TODO: parse and use config if isBeaconState { return nil } diff --git a/cl/ssz/decode.go b/cl/ssz/decode.go index 1cd1b2e46c4..1308081adf7 100644 --- a/cl/ssz/decode.go +++ b/cl/ssz/decode.go @@ -42,7 +42,6 @@ func UnmarshalSSZ(buf []byte, version int, schema ...interface{}) (err error) { // err = fmt.Errorf("panic while decoding: %v", err2) // } // }() - position := 0 offsets := []int{} dynamicObjs := []SizedObjectSSZ{} diff --git a/cl/ssz/encode.go b/cl/ssz/encode.go index 2f851f1d208..38b57a8a11c 100644 --- a/cl/ssz/encode.go +++ b/cl/ssz/encode.go @@ -57,6 +57,7 @@ func MarshalSSZ(buf []byte, schema ...any) (dst []byte, err error) { err = fmt.Errorf("panic while encoding: %v", err2) } }() + dst = buf currentOffset := 0 dynamicComponents := []SizedObjectSSZ{} diff --git a/cl/transition/impl/eth2/operations.go b/cl/transition/impl/eth2/operations.go index 1a1ea5224ad..e872cbe45d1 100644 --- a/cl/transition/impl/eth2/operations.go +++ b/cl/transition/impl/eth2/operations.go @@ -365,7 +365,7 @@ func processSyncAggregate(s abstract.BeaconState, sync *cltypes.SyncAggregate) ( vIdx, exists := s.ValidatorIndexByPubkey(committeeKeys[currPubKeyIndex]) // Impossible scenario. if !exists { - return nil, errors.New("validator public key does not exist in state") + return nil, fmt.Errorf("validator public key does not exist in state: %x", committeeKeys[currPubKeyIndex]) } if syncAggregateBits[i]&byte(bit) > 0 { votedKeys = append(votedKeys, committeeKeys[currPubKeyIndex][:]) diff --git a/cl/utils/bytes.go b/cl/utils/bytes.go index 417fe4b583c..387bad6f5de 100644 --- a/cl/utils/bytes.go +++ b/cl/utils/bytes.go @@ -15,6 +15,7 @@ package utils import ( "encoding/binary" + "io" "math/bits" "github.com/ledgerwatch/erigon-lib/types/ssz" @@ -103,3 +104,17 @@ func GetBitlistLength(b []byte) int { // bit. Subtract this value by 1 to determine the length of the bitlist. return 8*(len(b)-1) + msb - 1 } + +func ReadZSTD(r io.Reader, out []byte) (int, error) { + n := 0 + var err error + for n != len(out) { + var m int + m, err = r.Read(out[n:]) + n += m + if err != nil { + return n, err + } + } + return n, nil +} diff --git a/cmd/capcli/cli.go b/cmd/capcli/cli.go index bfbd85bcb57..30ff9186fb1 100644 --- a/cmd/capcli/cli.go +++ b/cmd/capcli/cli.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "math" + "os" "strings" "time" @@ -11,6 +12,7 @@ import ( "github.com/ledgerwatch/erigon/turbo/debug" lg "github.com/anacrolix/log" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/direct" downloader3 "github.com/ledgerwatch/erigon-lib/downloader" "github.com/ledgerwatch/erigon-lib/metrics" @@ -23,6 +25,7 @@ import ( "github.com/ledgerwatch/erigon/cl/abstract" "github.com/ledgerwatch/erigon/cl/antiquary" "github.com/ledgerwatch/erigon/cl/clparams" + "github.com/ledgerwatch/erigon/cl/clparams/initial_state" "github.com/ledgerwatch/erigon/cl/cltypes" persistence2 "github.com/ledgerwatch/erigon/cl/persistence" "github.com/ledgerwatch/erigon/cmd/caplin/caplin1" @@ -40,6 +43,9 @@ import ( "github.com/ledgerwatch/erigon/cl/persistence/beacon_indicies" "github.com/ledgerwatch/erigon/cl/persistence/db_config" "github.com/ledgerwatch/erigon/cl/persistence/format/snapshot_format" + "github.com/ledgerwatch/erigon/cl/persistence/format/snapshot_format/getters" + state_accessors "github.com/ledgerwatch/erigon/cl/persistence/state" + "github.com/ledgerwatch/erigon/cl/persistence/state/historical_states_reader" "github.com/ledgerwatch/erigon/cl/phase1/core" "github.com/ledgerwatch/erigon/cl/phase1/core/state" "github.com/ledgerwatch/erigon/cl/phase1/network" @@ -64,11 +70,12 @@ var CLI struct { Blocks Blocks `cmd:"" help:"download blocks from reqresp network"` Epochs Epochs `cmd:"" help:"download epochs from reqresp network"` - Chain Chain `cmd:"" help:"download the entire chain from reqresp network"` - DumpSnapshots DumpSnapshots `cmd:"" help:"generate caplin snapshots"` - CheckSnapshots CheckSnapshots `cmd:"" help:"check snapshot folder against content of chain data"` - DownloadSnapshots DownloadSnapshots `cmd:"" help:"download snapshots from webseed"` - LoopSnapshots LoopSnapshots `cmd:"" help:"loop over snapshots"` + Chain Chain `cmd:"" help:"download the entire chain from reqresp network"` + DumpSnapshots DumpSnapshots `cmd:"" help:"generate caplin snapshots"` + CheckSnapshots CheckSnapshots `cmd:"" help:"check snapshot folder against content of chain data"` + DownloadSnapshots DownloadSnapshots `cmd:"" help:"download snapshots from webseed"` + LoopSnapshots LoopSnapshots `cmd:"" help:"loop over snapshots"` + RetrieveHistoricalState RetrieveHistoricalState `cmd:"" help:"retrieve historical state from db"` } type chainCfg struct { @@ -650,3 +657,97 @@ func (d *DownloadSnapshots) Run(ctx *Context) error { } return snapshotsync.WaitForDownloader("CapCliDownloader", ctx, false, snapshotsync.OnlyCaplin, s, tx, freezeblocks.NewBlockReader(freezeblocks.NewRoSnapshots(ethconfig.NewSnapCfg(false, false, false), dirs.Snap, log.Root()), freezeblocks.NewBorRoSnapshots(ethconfig.NewSnapCfg(false, false, false), dirs.Snap, log.Root())), nil, params.ChainConfigByChainName(d.Chain), direct.NewDownloaderClient(bittorrentServer)) } + +type RetrieveHistoricalState struct { + chainCfg + outputFolder + CompareFile string `help:"compare file" default:""` + CompareSlot uint64 `help:"compare slot" default:"0"` +} + +func (r *RetrieveHistoricalState) Run(ctx *Context) error { + vt := state_accessors.NewStaticValidatorTable() + _, _, beaconConfig, t, err := clparams.GetConfigsByNetworkName(r.Chain) + if err != nil { + return err + } + dirs := datadir.New(r.Datadir) + rawDB, fs := persistence.AferoRawBeaconBlockChainFromOsPath(beaconConfig, dirs.CaplinHistory) + beaconDB, db, err := caplin1.OpenCaplinDatabase(ctx, db_config.DatabaseConfiguration{PruneDepth: math.MaxUint64}, beaconConfig, rawDB, dirs.CaplinIndexing, nil, false) + if err != nil { + return err + } + log.Root().SetHandler(log.LvlFilterHandler(log.LvlDebug, log.StderrHandler)) + + tx, err := db.BeginRo(ctx) + if err != nil { + return err + } + defer tx.Rollback() + allSnapshots := freezeblocks.NewRoSnapshots(ethconfig.BlocksFreezing{}, dirs.Snap, log.Root()) + if err := allSnapshots.ReopenFolder(); err != nil { + return err + } + if err := state_accessors.ReadValidatorsTable(tx, vt); err != nil { + return err + } + fmt.Println(allSnapshots.BlocksAvailable(), allSnapshots.Dir()) + + var bor *freezeblocks.BorRoSnapshots + blockReader := freezeblocks.NewBlockReader(allSnapshots, bor) + eth1Getter := getters.NewExecutionSnapshotReader(ctx, blockReader, db) + csn := freezeblocks.NewCaplinSnapshots(ethconfig.BlocksFreezing{}, dirs.Snap, log.Root()) + if err := csn.ReopenFolder(); err != nil { + return err + } + snr := freezeblocks.NewBeaconSnapshotReader(csn, eth1Getter, beaconDB, beaconConfig) + gSpot, err := initial_state.GetGenesisState(t) + if err != nil { + return err + } + + hr := historical_states_reader.NewHistoricalStatesReader(beaconConfig, snr, vt, fs, gSpot) + start := time.Now() + haveState, err := hr.ReadHistoricalState(ctx, tx, r.CompareSlot) + if err != nil { + return err + } + + v := haveState.Version() + // encode and decode the state + enc, err := haveState.EncodeSSZ(nil) + if err != nil { + return err + } + haveState = state.New(beaconConfig) + if err := haveState.DecodeSSZ(enc, int(v)); err != nil { + return err + } + endTime := time.Since(start) + hRoot, err := haveState.HashSSZ() + if err != nil { + return err + } + log.Info("Got state", "slot", haveState.Slot(), "root", libcommon.Hash(hRoot), "elapsed", endTime) + if r.CompareFile == "" { + return nil + } + // Read the content of CompareFile in a []byte without afero + rawBytes, err := os.ReadFile(r.CompareFile) + if err != nil { + return err + } + // Decode the []byte into a state + wantState := state.New(beaconConfig) + if err := wantState.DecodeSSZ(rawBytes, int(haveState.Version())); err != nil { + return err + } + wRoot, err := wantState.HashSSZ() + if err != nil { + return err + } + if hRoot != wRoot { + return fmt.Errorf("state mismatch: got %s, want %s", libcommon.Hash(hRoot), libcommon.Hash(wRoot)) + } + return nil +} diff --git a/cmd/caplin/caplin1/run.go b/cmd/caplin/caplin1/run.go index be09dab6c74..0aba101d066 100644 --- a/cmd/caplin/caplin1/run.go +++ b/cmd/caplin/caplin1/run.go @@ -109,22 +109,6 @@ func RunCaplinPhase1(ctx context.Context, sentinel sentinel.SentinelClient, engi } } - vTables := state_accessors.NewStaticValidatorTable() - // get the initial state - genesisState, err := initial_state.GetGenesisState(clparams.NetworkType(beaconConfig.DepositNetworkID)) - if err != nil { - return err - } - antiq := antiquary.NewAntiquary(ctx, genesisState, vTables, beaconConfig, dirs, snDownloader, db, csn, rcsn, beaconDB, logger, states, af) - // Create the antiquary - if backfilling { - go func() { - if err := antiq.Loop(); err != nil { - logger.Error("Antiquary failed", "err", err) - } - }() - } - pool := pool.NewOperationsPool(beaconConfig) caplinFcuPath := path.Join(dirs.Tmp, "caplin-forkchoice") @@ -218,6 +202,26 @@ func RunCaplinPhase1(ctx context.Context, sentinel sentinel.SentinelClient, engi return err } + vTables := state_accessors.NewStaticValidatorTable() + // Read the the current table + if states { + if err := state_accessors.ReadValidatorsTable(tx, vTables); err != nil { + return err + } + } + // get the initial state + genesisState, err := initial_state.GetGenesisState(clparams.NetworkType(beaconConfig.DepositNetworkID)) + if err != nil { + return err + } + antiq := antiquary.NewAntiquary(ctx, genesisState, vTables, beaconConfig, dirs, snDownloader, db, csn, rcsn, beaconDB, logger, states, af) + // Create the antiquary + go func() { + if err := antiq.Loop(); err != nil { + logger.Error("Antiquary failed", "err", err) + } + }() + if err := tx.Commit(); err != nil { return err }