Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

eth_accRange: set upper bound #12609

Open
wants to merge 100 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 62 commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
7e31d31
save
AskAlexSharov Nov 4, 2024
f4746f9
save
AskAlexSharov Nov 4, 2024
fe2cab2
save
AskAlexSharov Nov 4, 2024
24a1b8e
save
AskAlexSharov Nov 4, 2024
3f489fb
save
AskAlexSharov Nov 4, 2024
eeb7d17
save
AskAlexSharov Nov 4, 2024
9580d17
save
AskAlexSharov Nov 4, 2024
998f1c9
save
AskAlexSharov Nov 4, 2024
b9bc6d2
save
AskAlexSharov Nov 4, 2024
8e396c2
save
AskAlexSharov Nov 4, 2024
4bbd903
save
AskAlexSharov Nov 4, 2024
c420190
save
AskAlexSharov Nov 4, 2024
fa66df4
save
AskAlexSharov Nov 4, 2024
b044a4e
save
AskAlexSharov Nov 4, 2024
4945272
save
AskAlexSharov Nov 4, 2024
346ad3c
save
AskAlexSharov Nov 4, 2024
64e61b2
save
AskAlexSharov Nov 4, 2024
dc4b274
save
AskAlexSharov Nov 4, 2024
8eed437
save
AskAlexSharov Nov 4, 2024
ca40ad6
save
AskAlexSharov Nov 4, 2024
056026c
save
AskAlexSharov Nov 4, 2024
f991aa8
save
AskAlexSharov Nov 4, 2024
7cf18e5
save
AskAlexSharov Nov 4, 2024
6540736
save
AskAlexSharov Nov 4, 2024
ce530c0
save
AskAlexSharov Nov 4, 2024
329ed1e
save
AskAlexSharov Nov 4, 2024
f7c44c8
save
AskAlexSharov Nov 4, 2024
5ab67cf
save
AskAlexSharov Nov 4, 2024
f2737e8
save
AskAlexSharov Nov 4, 2024
b3e4937
save
AskAlexSharov Nov 4, 2024
405fb89
save
AskAlexSharov Nov 4, 2024
239b672
save
AskAlexSharov Nov 4, 2024
8357e72
Merge branch 'main' into eth_rpc_acc_range
AskAlexSharov Nov 5, 2024
2764da8
save
AskAlexSharov Nov 5, 2024
edfdaec
save
AskAlexSharov Nov 5, 2024
6a1d322
save
AskAlexSharov Nov 5, 2024
61e3a99
save
AskAlexSharov Nov 5, 2024
ca6ab92
save
AskAlexSharov Nov 5, 2024
98e95f1
save
AskAlexSharov Nov 5, 2024
5325c47
save
AskAlexSharov Nov 5, 2024
2b52e70
save
AskAlexSharov Nov 5, 2024
f1725ea
save
AskAlexSharov Nov 5, 2024
29be11e
save
AskAlexSharov Nov 5, 2024
fc3a6ff
save
AskAlexSharov Nov 5, 2024
a8be6b4
save
AskAlexSharov Nov 5, 2024
320a5f4
save
AskAlexSharov Nov 5, 2024
6d7e2ab
save
AskAlexSharov Nov 5, 2024
0eb4604
save
AskAlexSharov Nov 5, 2024
8f263d7
save
AskAlexSharov Nov 5, 2024
d6bf3f7
save
AskAlexSharov Nov 5, 2024
530bfeb
save
AskAlexSharov Nov 5, 2024
3c2d682
save
AskAlexSharov Nov 5, 2024
9397464
save
AskAlexSharov Nov 5, 2024
1d57b1a
save
AskAlexSharov Nov 5, 2024
d800dab
save
AskAlexSharov Nov 5, 2024
3277c68
save
AskAlexSharov Nov 5, 2024
33e3aaa
save
AskAlexSharov Nov 5, 2024
c262466
save
AskAlexSharov Nov 5, 2024
bfe7a99
save
AskAlexSharov Nov 5, 2024
1ea4559
save
AskAlexSharov Nov 5, 2024
9b2f9a6
save
AskAlexSharov Nov 5, 2024
fe2a714
save
AskAlexSharov Nov 5, 2024
50c468d
save
AskAlexSharov Nov 5, 2024
6029d89
save
AskAlexSharov Nov 5, 2024
b79682e
save
AskAlexSharov Nov 5, 2024
be6699d
save
AskAlexSharov Nov 5, 2024
e03b745
save
AskAlexSharov Nov 5, 2024
963dbca
save
AskAlexSharov Nov 5, 2024
5f44189
save
AskAlexSharov Nov 5, 2024
3b88d2d
save
AskAlexSharov Nov 5, 2024
fb32f84
save
AskAlexSharov Nov 5, 2024
394fbf3
save
AskAlexSharov Nov 5, 2024
15d7195
save
AskAlexSharov Nov 5, 2024
4b67a52
save
AskAlexSharov Nov 5, 2024
6b06087
save
AskAlexSharov Nov 5, 2024
a7e5382
save
AskAlexSharov Nov 6, 2024
ceb153f
save
AskAlexSharov Nov 6, 2024
cf43ae6
save
AskAlexSharov Nov 6, 2024
7b1806c
save
AskAlexSharov Nov 6, 2024
8dd0c27
save
AskAlexSharov Nov 6, 2024
4efd96b
Merge branch 'main' into eth_rpc_acc_range
AskAlexSharov Nov 6, 2024
37e4bf6
save
AskAlexSharov Nov 6, 2024
0f7293e
save
AskAlexSharov Nov 6, 2024
13c83cd
save
AskAlexSharov Nov 6, 2024
46e4da7
save
AskAlexSharov Nov 6, 2024
b11c89d
Merge branch 'main' into eth_rpc_acc_range
AskAlexSharov Nov 6, 2024
1021f83
save
AskAlexSharov Nov 6, 2024
8e8a0e8
save
AskAlexSharov Nov 6, 2024
1436827
Merge branch 'main' into eth_rpc_acc_range
AskAlexSharov Nov 7, 2024
8d5f89a
save
AskAlexSharov Nov 7, 2024
9c828f3
save
AskAlexSharov Nov 7, 2024
ccb381f
save
AskAlexSharov Nov 7, 2024
906ccfc
save
AskAlexSharov Nov 7, 2024
0c4e0ad
save
AskAlexSharov Nov 7, 2024
49f96cd
save
AskAlexSharov Nov 7, 2024
5ef790f
save
AskAlexSharov Nov 7, 2024
1be1647
save
AskAlexSharov Nov 7, 2024
92f174f
save
AskAlexSharov Nov 7, 2024
dad88ab
save
AskAlexSharov Nov 7, 2024
ca58912
save
AskAlexSharov Nov 7, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/qa-rpc-integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ jobs:

# Run RPC integration test runner via http
python3 ./run_tests.py -p 8545 --continue -f --json-diff -x \
debug_accountRange,debug_getModifiedAccountsByHash,debug_getModifiedAccountsByNumber,debug_storageRangeAt,debug_traceBlockByHash,\
debug_getModifiedAccountsByHash,debug_getModifiedAccountsByNumber,debug_storageRangeAt,debug_traceBlockByHash,\
debug_traceCallMany/test_02.tar,debug_traceCallMany/test_04.tar,debug_traceCallMany/test_05.tar,debug_traceCallMany/test_06.tar,debug_traceCallMany/test_07.tar,debug_traceCallMany/test_09.json,debug_traceCallMany/test_10.tar,\
debug_traceBlockByNumber/test_05.tar,debug_traceBlockByNumber/test_08.tar,debug_traceBlockByNumber/test_09.tar,debug_traceBlockByNumber/test_10.tar,debug_traceBlockByNumber/test_11.tar,debug_traceBlockByNumber/test_12.tar,\
debug_traceTransaction,\
Expand Down
25 changes: 25 additions & 0 deletions core/state/dump.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ package state
import (
"encoding/json"
"fmt"
"time"

libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/common/hexutility"
Expand Down Expand Up @@ -135,6 +136,10 @@ func NewDumper(db kv.Tx, txNumsReader rawdbv3.TxNumsReader, blockNumber uint64)
}
}

var TooMuchIterations = fmt.Errorf("[rpc] Dumper: too much iterations protection triggered")

const DumperIterationsHardLimit = 10_000_000

func (d *Dumper) DumpToCollector(c DumpCollector, excludeCode, excludeStorage bool, startAddress libcommon.Address, maxResults int) ([]byte, error) {
var emptyCodeHash = crypto.Keccak256Hash(nil)
var emptyHash = libcommon.Hash{}
Expand All @@ -148,6 +153,7 @@ func (d *Dumper) DumpToCollector(c DumpCollector, excludeCode, excludeStorage bo

c.OnRoot(emptyHash) // We do not calculate the root

fmt.Printf("[dbg] DumpToCollector limits: %t, %t, %d\n", excludeCode, excludeStorage, maxResults)
ttx := d.db.(kv.TemporalTx)
txNum, err := d.txNumsReader.Min(ttx, d.blockNumber+1)
if err != nil {
Expand All @@ -158,11 +164,15 @@ func (d *Dumper) DumpToCollector(c DumpCollector, excludeCode, excludeStorage bo
return nil, err
}

var hardLimit = DumperIterationsHardLimit

t := time.Now()
var nextKey []byte
it, err := ttx.DomainRange(kv.AccountsDomain, startAddress[:], nil, txNum, order.Asc, maxResults)
if err != nil {
return nil, err
}
fmt.Printf("[dbg] after DomainRange: %s\n", time.Since(t))
defer it.Close()
for it.HasNext() {
k, v, err := it.Next()
Expand All @@ -171,11 +181,13 @@ func (d *Dumper) DumpToCollector(c DumpCollector, excludeCode, excludeStorage bo
}
if maxResults > 0 && numberOfResults >= maxResults {
nextKey = append(nextKey[:0], k...)
fmt.Printf("[dbg] dumper iter acc. break: nextKey %x\n", nextKey)
break
}
if len(v) == 0 {
continue
}
fmt.Printf("[dbg] dumper iter acc: %x\n", k)

if e := accounts.DeserialiseV3(&acc, v); e != nil {
return nil, fmt.Errorf("decoding %x for %x: %w", v, k, e)
Expand Down Expand Up @@ -204,7 +216,14 @@ func (d *Dumper) DumpToCollector(c DumpCollector, excludeCode, excludeStorage bo
addrList = append(addrList, libcommon.BytesToAddress(k))

numberOfResults++

if hardLimit--; hardLimit < 0 {
return nil, TooMuchIterations
}
}
it.Close()

fmt.Printf("[dbg] first loop done: %d\n", len(addrList))

for i, addr := range addrList {
account := accountList[i]
Expand All @@ -226,10 +245,16 @@ func (d *Dumper) DumpToCollector(c DumpCollector, excludeCode, excludeStorage bo
continue // Skip deleted entries
}
loc := k[20:]
fmt.Printf("[dbg] dumper iter storage: %x, %x\n", k[:20], k[20:])
account.Storage[libcommon.BytesToHash(loc).String()] = common.Bytes2Hex(vs)
h, _ := libcommon.HashData(loc)
t.Update(h.Bytes(), libcommon.Copy(vs))

if hardLimit--; hardLimit < 0 {
return nil, TooMuchIterations
}
}
r.Close()

account.Root = t.Hash().Bytes()
}
Expand Down
31 changes: 28 additions & 3 deletions erigon-lib/seg/decompress.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,17 @@ import (
"fmt"
"os"
"path/filepath"
"sort"
"strconv"
"sync/atomic"
"time"
"unsafe"

"github.com/erigontech/erigon-lib/common/assert"
"github.com/erigontech/erigon-lib/log/v3"

"github.com/c2h5oh/datasize"

"github.com/erigontech/erigon-lib/common/assert"
"github.com/erigontech/erigon-lib/common/dbg"
"github.com/erigontech/erigon-lib/log/v3"
"github.com/erigontech/erigon-lib/mmap"
)

Expand Down Expand Up @@ -1064,3 +1064,28 @@ func (g *Getter) FastNext(buf []byte) ([]byte, uint64) {
g.dataBit = 0
return buf[:wordLen], postLoopPos
}

// BinarySearch - !expecting sorted file - does Seek `g` to key which >= `fromPrefix` by using BinarySearch - means unoptimal and touching many places in file
// use `.Next` to read found
// at `ok = false` leaving `g` in unpredictible state
func (g *Getter) BinarySearch(seek []byte, count int, getOffset func(i uint64) (offset uint64)) (foundOffset uint64, ok bool) {
var key []byte
foundItem := sort.Search(count, func(i int) bool {
offset := getOffset(uint64(i))
g.Reset(offset)
if g.HasNext() {
key, _ = g.Next(key[:0])
return bytes.Compare(key, seek) >= 0
}
return false
})
if foundItem == count { // `Search` returns `n` if not found
return 0, false
}
foundOffset = getOffset(uint64(foundItem))
g.Reset(foundOffset)
if !g.HasNext() {
return 0, false
}
return foundOffset, true
}
87 changes: 68 additions & 19 deletions erigon-lib/seg/decompress_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"math/rand"
"os"
"path/filepath"
"slices"
"strings"
"testing"
"time"
Expand Down Expand Up @@ -257,22 +258,23 @@ func prepareLoremDictUncompressed(t *testing.T) *Decompressor {
cfg.MinPatternScore = 1
cfg.Workers = 2
c, err := NewCompressor(context.Background(), t.Name(), file, tmpDir, cfg, log.LvlDebug, logger)
if err != nil {
t.Fatal(err)
}
require.NoError(t, err)
defer c.Close()
slices.Sort(loremStrings)
for k, w := range loremStrings {
if err = c.AddUncompressedWord([]byte(fmt.Sprintf("%s %d", w, k))); err != nil {
t.Fatal(err)
if len(w) == 0 {
err = c.AddUncompressedWord([]byte(w))
require.NoError(t, err)
continue
}
err = c.AddUncompressedWord([]byte(fmt.Sprintf("%s %d", w, k)))
require.NoError(t, err)
}
if err = c.Compress(); err != nil {
t.Fatal(err)
}
var d *Decompressor
if d, err = NewDecompressor(file); err != nil {
t.Fatal(err)
}
err = c.Compress()
require.NoError(t, err)
d, err := NewDecompressor(file)
require.NoError(t, err)
t.Cleanup(d.Close)
return d
}

Expand All @@ -281,16 +283,60 @@ func TestUncompressed(t *testing.T) {
defer d.Close()
g := d.MakeGetter()
i := 0
var offsets []uint64
offsets = append(offsets, 0)
for g.HasNext() {
w := loremStrings[i]
expected := []byte(fmt.Sprintf("%s %d", w, i+1))
expected = expected[:len(expected)/2]
actual, _ := g.NextUncompressed()
actual, offset := g.NextUncompressed()
if bytes.Equal(expected, actual) {
t.Errorf("expected %s, actual %s", expected, actual)
}
i++
}
offsets = append(offsets, offset)
}

t.Run("BinarySearch middle", func(t *testing.T) {
require := require.New(t)
_, ok := g.BinarySearch([]byte("ipsum"), d.Count(), func(i uint64) (offset uint64) { return offsets[i] })
require.True(ok)
k, _ := g.Next(nil)
require.Equal("ipsum 38", string(k))
_, ok = g.BinarySearch([]byte("ipsu"), d.Count(), func(i uint64) (offset uint64) { return offsets[i] })
require.True(ok)
k, _ = g.Next(nil)
require.Equal("ipsum 38", string(k))
})
t.Run("BinarySearch end of file", func(t *testing.T) {
require := require.New(t)
//last word is `voluptate`
_, ok := g.BinarySearch([]byte("voluptate"), d.Count(), func(i uint64) (offset uint64) { return offsets[i] })
require.True(ok)
k, _ := g.Next(nil)
require.Equal("voluptate 69", string(k))
_, ok = g.BinarySearch([]byte("voluptat"), d.Count(), func(i uint64) (offset uint64) { return offsets[i] })
require.True(ok)
k, _ = g.Next(nil)
require.Equal("voluptate 69", string(k))
_, ok = g.BinarySearch([]byte("voluptatez"), d.Count(), func(i uint64) (offset uint64) { return offsets[i] })
require.False(ok)
})

t.Run("BinarySearch begin of file", func(t *testing.T) {
require := require.New(t)
//first word is ``
_, ok := g.BinarySearch([]byte(""), d.Count(), func(i uint64) (offset uint64) { return offsets[i] })
require.True(ok)
k, _ := g.Next(nil)
require.Equal("", string(k))

_, ok = g.BinarySearch(nil, d.Count(), func(i uint64) (offset uint64) { return offsets[i] })
require.True(ok)
k, _ = g.Next(nil)
require.Equal("", string(k))
})

}

func TestDecompressor_OpenCorrupted(t *testing.T) {
Expand Down Expand Up @@ -461,12 +507,15 @@ func TestDecompressor_OpenCorrupted(t *testing.T) {
})
}

const lorem = `Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et
dolore magna aliqua Ut enim ad minim veniam quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur
Excepteur sint occaecat cupidatat non proident sunt in culpa qui officia deserunt mollit anim id est laborum`
const lorem = `lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et
dolore magna aliqua ut enim ad minim veniam quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur
excepteur sint occaecat cupidatat non proident sunt in culpa qui officia deserunt mollit anim id est laborum`

var loremStrings = strings.Split(lorem, " ")
var loremStrings = append(strings.Split(rmNewLine(lorem), " "), "") // including emtpy string - to trigger corner cases
func rmNewLine(s string) string {
return strings.ReplaceAll(strings.ReplaceAll(s, "\n", " "), "\r", "")
}

func TestDecompressTorrent(t *testing.T) {
t.Skip()
Expand Down
20 changes: 10 additions & 10 deletions erigon-lib/state/aggregator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import (
"encoding/binary"
"encoding/hex"
"fmt"
"github.com/erigontech/erigon-lib/commitment"
"math"
"math/rand"
"os"
Expand All @@ -33,10 +32,11 @@ import (
"testing"
"time"

"github.com/erigontech/erigon-lib/common/background"

"github.com/c2h5oh/datasize"

"github.com/erigontech/erigon-lib/commitment"
"github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/common/background"
"github.com/erigontech/erigon-lib/common/datadir"
"github.com/erigontech/erigon-lib/common/length"
"github.com/erigontech/erigon-lib/etl"
Expand Down Expand Up @@ -249,7 +249,7 @@ func TestAggregatorV3_PruneSmallBatches(t *testing.T) {
maxTx := aggStep * 5
t.Logf("step=%d tx_count=%d\n", aggStep, maxTx)

rnd := rand.New(rand.NewSource(0))
rnd := newRnd(0)

generateSharedDomainsUpdates(t, domains, maxTx, rnd, 20, 10, aggStep/2)

Expand Down Expand Up @@ -429,7 +429,7 @@ func fillRawdbTxNumsIndexForSharedDomains(t *testing.T, rwTx kv.RwTx, maxTx, com
}
}

func generateSharedDomainsUpdates(t *testing.T, domains *SharedDomains, maxTxNum uint64, rnd *rand.Rand, keyMaxLen, keysCount, commitEvery uint64) map[string]struct{} {
func generateSharedDomainsUpdates(t *testing.T, domains *SharedDomains, maxTxNum uint64, rnd *rnd, keyMaxLen, keysCount, commitEvery uint64) map[string]struct{} {
t.Helper()
usedKeys := make(map[string]struct{}, keysCount*maxTxNum)
for txNum := uint64(1); txNum <= maxTxNum; txNum++ {
Expand All @@ -445,14 +445,14 @@ func generateSharedDomainsUpdates(t *testing.T, domains *SharedDomains, maxTxNum
return usedKeys
}

func generateSharedDomainsUpdatesForTx(t *testing.T, domains *SharedDomains, txNum uint64, rnd *rand.Rand, prevKeys map[string]struct{}, keyMaxLen, keysCount uint64) map[string]struct{} {
func generateSharedDomainsUpdatesForTx(t *testing.T, domains *SharedDomains, txNum uint64, rnd *rnd, prevKeys map[string]struct{}, keyMaxLen, keysCount uint64) map[string]struct{} {
t.Helper()
domains.SetTxNum(txNum)

getKey := func() ([]byte, bool) {
r := rnd.Intn(100)
r := int(rnd.Uint64N(100))
if r < 50 && len(prevKeys) > 0 {
ri := rnd.Intn(len(prevKeys))
ri := int(rnd.Uint64N(uint64(len(prevKeys))))
for k := range prevKeys {
if ri == 0 {
return []byte(k), true
Expand All @@ -471,7 +471,7 @@ func generateSharedDomainsUpdatesForTx(t *testing.T, domains *SharedDomains, txN
for j := uint64(0); j < keysCount; j++ {
key, existed := getKey()

r := rnd.Intn(101)
r := int(rnd.Uint64N(101))
switch {
case r <= 33:
buf := types.EncodeAccountBytesV3(txNum, uint256.NewInt(txNum*100_000), nil, 0)
Expand All @@ -484,7 +484,7 @@ func generateSharedDomainsUpdatesForTx(t *testing.T, domains *SharedDomains, txN
require.NoError(t, err)

case r > 33 && r <= 66:
codeUpd := make([]byte, rnd.Intn(24576))
codeUpd := make([]byte, int(rnd.Uint64N(24576)))
_, err := rnd.Read(codeUpd)
require.NoError(t, err)
for limit := 1000; len(key) > length.Addr && limit > 0; limit-- {
Expand Down
4 changes: 3 additions & 1 deletion erigon-lib/state/domain.go
Original file line number Diff line number Diff line change
Expand Up @@ -1962,10 +1962,12 @@ func (dt *DomainRoTx) DomainRange(ctx context.Context, tx kv.Tx, fromKey, toKey
//if err != nil {
// return nil, err
//}
histStateIt, err := dt.ht.WalkAsOf(ctx, ts, fromKey, toKey, tx, limit)
fmt.Printf("[dbg] DomainRange 1: %s, %x, %x\n", dt.d.name, fromKey, toKey)
histStateIt, err := dt.ht.WalkAsOf(ctx, ts, fromKey, toKey, asc, limit, tx)
if err != nil {
return nil, err
}
fmt.Printf("[dbg] DomainRange 2: %s\n", dt.d.name)
lastestStateIt, err := dt.DomainRangeLatest(tx, fromKey, toKey, limit)
if err != nil {
return nil, err
Expand Down
5 changes: 2 additions & 3 deletions erigon-lib/state/domain_shared_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,10 @@ import (
"github.com/holiman/uint256"
"github.com/stretchr/testify/require"

"github.com/erigontech/erigon-lib/common/length"
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/kv/rawdbv3"
"github.com/erigontech/erigon-lib/log/v3"

"github.com/erigontech/erigon-lib/common/length"
"github.com/erigontech/erigon-lib/types"
)

Expand All @@ -53,7 +52,7 @@ func TestSharedDomain_CommitmentKeyReplacement(t *testing.T) {
require.NoError(t, err)
defer domains.Close()

rnd := rand.New(rand.NewSource(2342))
rnd := newRnd(2342)
maxTx := stepSize * 8

// 1. generate data
Expand Down
Loading
Loading