mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-10 13:58:09 -05:00
Compare commits
86 Commits
fulu-bcn-c
...
fix-earlie
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a6f470dd2 | ||
|
|
4e0bfada17 | ||
|
|
8a37575407 | ||
|
|
0b1d4c485d | ||
|
|
0d04013443 | ||
|
|
2fbcbea550 | ||
|
|
5a49dcabb6 | ||
|
|
d0580debf6 | ||
|
|
869a6586ff | ||
|
|
0b47ac51f7 | ||
|
|
75916243f2 | ||
|
|
b499186483 | ||
|
|
cb28503b5f | ||
|
|
48fd9509ef | ||
|
|
316f0932ff | ||
|
|
7f321a5835 | ||
|
|
1b302219a8 | ||
|
|
e36c7ec26e | ||
|
|
8df746cead | ||
|
|
4294025eed | ||
|
|
41e336d373 | ||
|
|
86cb003b8e | ||
|
|
853d64f8f9 | ||
|
|
6dd11aaa2d | ||
|
|
f1d4f6d136 | ||
|
|
c5690a7eb6 | ||
|
|
edf60e6e33 | ||
|
|
ad022eead9 | ||
|
|
409b48940d | ||
|
|
64324211b8 | ||
|
|
5531014a75 | ||
|
|
80dc3d953d | ||
|
|
d175bd93ba | ||
|
|
4419a36cc2 | ||
|
|
0176706fad | ||
|
|
df307544c9 | ||
|
|
10821dc451 | ||
|
|
4706b758dd | ||
|
|
9f59b78cec | ||
|
|
75d8a2bdb6 | ||
|
|
ca4ae35f6e | ||
|
|
3245b884cf | ||
|
|
00e66ccab6 | ||
|
|
ed1885be8a | ||
|
|
fad101c4a0 | ||
|
|
1c0107812b | ||
|
|
fd710886c8 | ||
|
|
20d6bacfe9 | ||
|
|
1140141aaa | ||
|
|
7402efad2d | ||
|
|
f6cd1d9f7f | ||
|
|
a4751b057d | ||
|
|
eb5e2a5094 | ||
|
|
626830ff9c | ||
|
|
6f20ac57d4 | ||
|
|
cf4095cf3b | ||
|
|
39b3dba946 | ||
|
|
fa7e0b6e50 | ||
|
|
4aed113dea | ||
|
|
20ffd4c523 | ||
|
|
1cd3c3cc2d | ||
|
|
15e2e6b85e | ||
|
|
203a098076 | ||
|
|
9e5b7b00f3 | ||
|
|
1fcf3c7f30 | ||
|
|
ccf81ed33c | ||
|
|
382934fd30 | ||
|
|
c31f0435c6 | ||
|
|
59dc0263f2 | ||
|
|
de7ea1f72c | ||
|
|
2fc7a5af82 | ||
|
|
76d137198b | ||
|
|
05d8ce15af | ||
|
|
2715cd3fc7 | ||
|
|
7aa79a420c | ||
|
|
b3dc7e4afb | ||
|
|
db794db4ee | ||
|
|
f9bc42eed4 | ||
|
|
f97082df32 | ||
|
|
0d55b61b3d | ||
|
|
d487e5c109 | ||
|
|
7ffbf77b87 | ||
|
|
f103267f10 | ||
|
|
6f0ffa2a20 | ||
|
|
bcb5add346 | ||
|
|
a43fc50015 |
@@ -521,6 +521,13 @@ func (s *Service) updateCustodyInfoInDB(slot primitives.Slot) (primitives.Slot,
|
||||
return 0, 0, errors.Wrap(err, "update custody info")
|
||||
}
|
||||
|
||||
log.WithFields(logrus.Fields{
|
||||
"earliestAvailableSlot": earliestAvailableSlot,
|
||||
"custodyGroupCount": actualCustodyGroupCount,
|
||||
"inputSlot": slot,
|
||||
"targetCustodyGroups": targetCustodyGroupCount,
|
||||
}).Info("Updated custody info in database")
|
||||
|
||||
if isSupernode {
|
||||
log.WithFields(logrus.Fields{
|
||||
"current": actualCustodyGroupCount,
|
||||
|
||||
@@ -15,7 +15,8 @@ import (
|
||||
)
|
||||
|
||||
// UpdateCustodyInfo atomically updates the custody group count only if it is greater than the stored one.
|
||||
// In this case, it also updates the earliest available slot with the provided value.
|
||||
// When the custody group count increases, the earliest available slot is set to the maximum of the
|
||||
// incoming value and the stored value, ensuring the slot never decreases when increasing custody.
|
||||
// It returns the (potentially updated) custody group count and earliest available slot.
|
||||
func (s *Store) UpdateCustodyInfo(ctx context.Context, earliestAvailableSlot primitives.Slot, custodyGroupCount uint64) (primitives.Slot, uint64, error) {
|
||||
_, span := trace.StartSpan(ctx, "BeaconDB.UpdateCustodyInfo")
|
||||
@@ -41,25 +42,39 @@ func (s *Store) UpdateCustodyInfo(ctx context.Context, earliestAvailableSlot pri
|
||||
storedEarliestAvailableSlot = primitives.Slot(bytesutil.BytesToUint64BigEndian(storedEarliestAvailableSlotBytes))
|
||||
}
|
||||
|
||||
log.WithFields(logrus.Fields{
|
||||
"incomingSlot": earliestAvailableSlot,
|
||||
"incomingGroupCount": custodyGroupCount,
|
||||
"storedSlot": storedEarliestAvailableSlot,
|
||||
"storedGroupCount": storedGroupCount,
|
||||
"storedSlotBytesLen": len(storedEarliestAvailableSlotBytes),
|
||||
"storedGroupCountBytesLen": len(storedGroupCountBytes),
|
||||
}).Debug("UpdateCustodyInfo: comparing incoming vs stored values")
|
||||
|
||||
// Exit early if the new custody group count is lower than or equal to the stored one.
|
||||
if custodyGroupCount <= storedGroupCount {
|
||||
log.Debug("UpdateCustodyInfo: exiting early, custody group count not increasing")
|
||||
return nil
|
||||
}
|
||||
|
||||
storedGroupCount, storedEarliestAvailableSlot = custodyGroupCount, earliestAvailableSlot
|
||||
|
||||
// Store the earliest available slot.
|
||||
bytes := bytesutil.Uint64ToBytesBigEndian(uint64(earliestAvailableSlot))
|
||||
if err := bucket.Put(earliestAvailableSlotKey, bytes); err != nil {
|
||||
return errors.Wrap(err, "put earliest available slot")
|
||||
}
|
||||
|
||||
// Store the custody group count.
|
||||
bytes = bytesutil.Uint64ToBytesBigEndian(custodyGroupCount)
|
||||
// Update the custody group count.
|
||||
storedGroupCount = custodyGroupCount
|
||||
bytes := bytesutil.Uint64ToBytesBigEndian(custodyGroupCount)
|
||||
if err := bucket.Put(groupCountKey, bytes); err != nil {
|
||||
return errors.Wrap(err, "put custody group count")
|
||||
}
|
||||
|
||||
// Only update earliestAvailableSlot if the incoming value is higher.
|
||||
// This prevents losing availability for data we already have when switching modes
|
||||
// (e.g., from normal to semi-supernode or supernode).
|
||||
if earliestAvailableSlot > storedEarliestAvailableSlot {
|
||||
storedEarliestAvailableSlot = earliestAvailableSlot
|
||||
bytes = bytesutil.Uint64ToBytesBigEndian(uint64(earliestAvailableSlot))
|
||||
if err := bucket.Put(earliestAvailableSlotKey, bytes); err != nil {
|
||||
return errors.Wrap(err, "put earliest available slot")
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}); err != nil {
|
||||
return 0, 0, err
|
||||
|
||||
@@ -89,7 +89,7 @@ func TestUpdateCustodyInfo(t *testing.T) {
|
||||
require.Equal(t, groupCount, storedCount)
|
||||
})
|
||||
|
||||
t.Run("update with higher group count", func(t *testing.T) {
|
||||
t.Run("update with higher group count and higher slot", func(t *testing.T) {
|
||||
const (
|
||||
initialSlot = primitives.Slot(100)
|
||||
initialCount = uint64(5)
|
||||
@@ -112,6 +112,150 @@ func TestUpdateCustodyInfo(t *testing.T) {
|
||||
require.Equal(t, groupCount, storedCount)
|
||||
})
|
||||
|
||||
t.Run("update with higher group count and lower slot should preserve higher slot", func(t *testing.T) {
|
||||
// This is the bug scenario: when switching from normal mode to semi-supernode,
|
||||
// the incoming slot might be lower than the stored slot, but we should preserve
|
||||
// the higher stored slot to avoid advertising that we can serve data we don't have.
|
||||
const (
|
||||
initialSlot = primitives.Slot(1835523) // Higher stored slot
|
||||
initialCount = uint64(10)
|
||||
earliestSlot = primitives.Slot(1835456) // Lower incoming slot (e.g., from head slot)
|
||||
groupCount = uint64(64) // Increasing custody (e.g., semi-supernode)
|
||||
)
|
||||
|
||||
db := setupDB(t)
|
||||
|
||||
_, _, err := db.UpdateCustodyInfo(ctx, initialSlot, initialCount)
|
||||
require.NoError(t, err)
|
||||
|
||||
// When custody count increases but slot is lower, the higher slot should be preserved
|
||||
slot, count, err := db.UpdateCustodyInfo(ctx, earliestSlot, groupCount)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, initialSlot, slot, "earliestAvailableSlot should not decrease when custody group count increases")
|
||||
require.Equal(t, groupCount, count)
|
||||
|
||||
// Verify in the database
|
||||
storedSlot, storedCount := getCustodyInfoFromDB(t, db)
|
||||
require.Equal(t, initialSlot, storedSlot, "stored slot should be the higher value")
|
||||
require.Equal(t, groupCount, storedCount)
|
||||
})
|
||||
|
||||
t.Run("pre-fulu scenario: checkpoint sync before fork, restart with semi-supernode", func(t *testing.T) {
|
||||
// This test covers the pre-Fulu bug scenario:
|
||||
// 1. Node starts with checkpoint sync BEFORE Fulu fork - uses EarliestSlot() (checkpoint block slot)
|
||||
// 2. Validators connect after Fulu activates - maintainCustodyInfo() updates to head slot (higher)
|
||||
// 3. Node restarts with --semi-supernode - updateCustodyInfoInDB uses EarliestSlot() again
|
||||
// The bug was that step 3 would overwrite the higher slot from step 2.
|
||||
params.SetupTestConfigCleanup(t)
|
||||
cfg := params.BeaconConfig()
|
||||
cfg.FuluForkEpoch = 100
|
||||
params.OverrideBeaconConfig(cfg)
|
||||
|
||||
fuluForkSlot, err := slots.EpochStart(cfg.FuluForkEpoch)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Derive slot values relative to Fulu fork
|
||||
checkpointBlockSlot := fuluForkSlot - 10 // Checkpoint sync happened before Fulu
|
||||
headSlot := fuluForkSlot + 5 // Head slot after Fulu activates
|
||||
defaultCustody := cfg.CustodyRequirement // Default custody from config
|
||||
validatorCustody := cfg.CustodyRequirement + 6 // Custody after validators connect
|
||||
semiSupernodeCustody := cfg.NumberOfCustodyGroups // Semi-supernode custodies all groups
|
||||
|
||||
// Verify our test setup: checkpoint is pre-Fulu, head is post-Fulu
|
||||
require.Equal(t, true, checkpointBlockSlot < fuluForkSlot, "checkpoint must be before Fulu fork")
|
||||
require.Equal(t, true, headSlot >= fuluForkSlot, "head must be at or after Fulu fork")
|
||||
|
||||
db := setupDB(t)
|
||||
|
||||
// Step 1: Node starts with checkpoint sync (pre-Fulu)
|
||||
// updateCustodyInfoInDB sees saved.Slot() < fuluForkSlot, so uses EarliestSlot()
|
||||
slot, count, err := db.UpdateCustodyInfo(ctx, checkpointBlockSlot, defaultCustody)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, checkpointBlockSlot, slot)
|
||||
require.Equal(t, defaultCustody, count)
|
||||
|
||||
// Step 2: Validators connect after Fulu activates, maintainCustodyInfo() runs
|
||||
// Uses headSlot which is higher than checkpointBlockSlot
|
||||
slot, count, err = db.UpdateCustodyInfo(ctx, headSlot, validatorCustody)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, headSlot, slot, "should update to head slot")
|
||||
require.Equal(t, validatorCustody, count)
|
||||
|
||||
// Verify step 2 stored correctly
|
||||
storedSlot, storedCount := getCustodyInfoFromDB(t, db)
|
||||
require.Equal(t, headSlot, storedSlot)
|
||||
require.Equal(t, validatorCustody, storedCount)
|
||||
|
||||
// Step 3: Restart with --semi-supernode
|
||||
// updateCustodyInfoInDB sees saved.Slot() < fuluForkSlot, so uses EarliestSlot() again
|
||||
slot, count, err = db.UpdateCustodyInfo(ctx, checkpointBlockSlot, semiSupernodeCustody)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, headSlot, slot, "earliestAvailableSlot should NOT decrease back to checkpoint slot")
|
||||
require.Equal(t, semiSupernodeCustody, count)
|
||||
|
||||
// Verify the database preserved the higher slot
|
||||
storedSlot, storedCount = getCustodyInfoFromDB(t, db)
|
||||
require.Equal(t, headSlot, storedSlot, "stored slot should remain at head slot, not checkpoint slot")
|
||||
require.Equal(t, semiSupernodeCustody, storedCount)
|
||||
})
|
||||
|
||||
t.Run("post-fulu scenario: finalized slot lower than stored head slot", func(t *testing.T) {
|
||||
// This test covers the post-Fulu bug scenario:
|
||||
// Post-fork, updateCustodyInfoInDB uses saved.Slot() (finalized slot) directly,
|
||||
// not EarliestSlot(). But the same bug can occur because:
|
||||
// - maintainCustodyInfo() stores headSlot (higher)
|
||||
// - Restart uses finalized slot (lower than head)
|
||||
// Our fix ensures earliestAvailableSlot never decreases.
|
||||
params.SetupTestConfigCleanup(t)
|
||||
cfg := params.BeaconConfig()
|
||||
cfg.FuluForkEpoch = 100
|
||||
params.OverrideBeaconConfig(cfg)
|
||||
|
||||
fuluForkSlot, err := slots.EpochStart(cfg.FuluForkEpoch)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Derive slot values relative to Fulu fork - all slots are AFTER Fulu
|
||||
finalizedSlotAtStart := fuluForkSlot + 100 // Finalized slot at first start (post-Fulu)
|
||||
headSlot := fuluForkSlot + 200 // Head slot when validators connect
|
||||
finalizedSlotRestart := fuluForkSlot + 150 // Finalized slot at restart (< headSlot)
|
||||
defaultCustody := cfg.CustodyRequirement // Default custody from config
|
||||
validatorCustody := cfg.CustodyRequirement + 6 // Custody after validators connect
|
||||
semiSupernodeCustody := cfg.NumberOfCustodyGroups // Semi-supernode custodies all groups
|
||||
|
||||
// Verify our test setup: all slots are post-Fulu
|
||||
require.Equal(t, true, finalizedSlotAtStart >= fuluForkSlot, "finalized slot must be at or after Fulu fork")
|
||||
require.Equal(t, true, headSlot >= fuluForkSlot, "head slot must be at or after Fulu fork")
|
||||
require.Equal(t, true, finalizedSlotRestart >= fuluForkSlot, "restart finalized slot must be at or after Fulu fork")
|
||||
require.Equal(t, true, finalizedSlotRestart < headSlot, "restart finalized slot must be less than head slot")
|
||||
|
||||
db := setupDB(t)
|
||||
|
||||
// Step 1: Node starts post-Fulu
|
||||
// updateCustodyInfoInDB sees saved.Slot() >= fuluForkSlot, so uses saved.Slot() directly
|
||||
slot, count, err := db.UpdateCustodyInfo(ctx, finalizedSlotAtStart, defaultCustody)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, finalizedSlotAtStart, slot)
|
||||
require.Equal(t, defaultCustody, count)
|
||||
|
||||
// Step 2: Validators connect, maintainCustodyInfo() uses head slot
|
||||
slot, count, err = db.UpdateCustodyInfo(ctx, headSlot, validatorCustody)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, headSlot, slot)
|
||||
require.Equal(t, validatorCustody, count)
|
||||
|
||||
// Step 3: Restart with --semi-supernode
|
||||
// updateCustodyInfoInDB uses finalized slot which is lower than stored head slot
|
||||
slot, count, err = db.UpdateCustodyInfo(ctx, finalizedSlotRestart, semiSupernodeCustody)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, headSlot, slot, "earliestAvailableSlot should NOT decrease to finalized slot")
|
||||
require.Equal(t, semiSupernodeCustody, count)
|
||||
|
||||
// Verify database preserved the higher slot
|
||||
storedSlot, storedCount := getCustodyInfoFromDB(t, db)
|
||||
require.Equal(t, headSlot, storedSlot)
|
||||
require.Equal(t, semiSupernodeCustody, storedCount)
|
||||
})
|
||||
|
||||
t.Run("update with lower group count should not update", func(t *testing.T) {
|
||||
const (
|
||||
initialSlot = primitives.Slot(200)
|
||||
|
||||
@@ -84,6 +84,13 @@ func (s *Service) updateCustodyInfoIfNeeded() error {
|
||||
return errors.Wrap(err, "beacon db update custody info")
|
||||
}
|
||||
|
||||
log.WithFields(logrus.Fields{
|
||||
"earliestAvailableSlot": storedEarliestSlot,
|
||||
"custodyGroupCount": storedGroupCount,
|
||||
"headSlot": headSlot,
|
||||
"targetCustodyGroups": targetCustodyGroupCount,
|
||||
}).Debug("Maintained custody info")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
3
changelog/james-prysm_fix-backward-earliest-slot.md
Normal file
3
changelog/james-prysm_fix-backward-earliest-slot.md
Normal file
@@ -0,0 +1,3 @@
|
||||
### Fixed
|
||||
|
||||
- Fixes earliest slot should never go backwards when setting semi-supernode or supernode flags
|
||||
11
changelog/james-prysm_fulu-e2e.md
Normal file
11
changelog/james-prysm_fulu-e2e.md
Normal file
@@ -0,0 +1,11 @@
|
||||
### Added
|
||||
|
||||
- Adding basic fulu fork transition support for mainnet and minimal e2e tests (multi scenario is not included)
|
||||
|
||||
### Changed
|
||||
|
||||
- updated go ethereum to 1.16.7
|
||||
|
||||
### Removed
|
||||
|
||||
- removed github.com/MariusVanDerWijden/FuzzyVM and github.com/MariusVanDerWijden/tx-fuzz due to lack of support post 1.16.7, only used in e2e for transaction fuzzing
|
||||
4
config/params/testdata/e2e_config.yaml
vendored
4
config/params/testdata/e2e_config.yaml
vendored
@@ -49,7 +49,7 @@ ELECTRA_FORK_VERSION: 0x050000fd
|
||||
ELECTRA_FORK_EPOCH: 14
|
||||
# Fulu
|
||||
FULU_FORK_VERSION: 0x060000fd
|
||||
FULU_FORK_EPOCH: 18446744073709551615
|
||||
FULU_FORK_EPOCH: 16
|
||||
|
||||
|
||||
# Time parameters
|
||||
@@ -122,7 +122,7 @@ MIN_SYNC_COMMITTEE_PARTICIPANTS: 1
|
||||
# Other e2e overrides
|
||||
# ---------------------------------------------------------------
|
||||
CONFIG_NAME: "end-to-end"
|
||||
SLOTS_PER_EPOCH: 6
|
||||
SLOTS_PER_EPOCH: 8
|
||||
EPOCHS_PER_ETH1_VOTING_PERIOD: 2
|
||||
MAX_SEED_LOOKAHEAD: 1
|
||||
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
package params
|
||||
|
||||
import "math"
|
||||
|
||||
const (
|
||||
AltairE2EForkEpoch = 6
|
||||
BellatrixE2EForkEpoch = 8
|
||||
CapellaE2EForkEpoch = 10
|
||||
DenebE2EForkEpoch = 12
|
||||
ElectraE2EForkEpoch = 14
|
||||
FuluE2EForkEpoch = math.MaxUint64
|
||||
FuluE2EForkEpoch = 16
|
||||
)
|
||||
|
||||
// E2ETestConfig retrieves the configurations made specifically for E2E testing.
|
||||
@@ -28,7 +26,7 @@ func E2ETestConfig() *BeaconChainConfig {
|
||||
// Time parameters.
|
||||
e2eConfig.SecondsPerSlot = 10
|
||||
e2eConfig.SlotDurationMilliseconds = 10000
|
||||
e2eConfig.SlotsPerEpoch = 6
|
||||
e2eConfig.SlotsPerEpoch = 8
|
||||
e2eConfig.SqrRootSlotsPerEpoch = 2
|
||||
e2eConfig.SecondsPerETH1Block = 2
|
||||
e2eConfig.EpochsPerEth1VotingPeriod = 2
|
||||
|
||||
166
deps.bzl
166
deps.bzl
@@ -301,8 +301,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_bits_and_blooms_bitset",
|
||||
importpath = "github.com/bits-and-blooms/bitset",
|
||||
sum = "h1:1X2TS7aHz1ELcC0yU1y2stUs/0ig5oMU6STFZGrhvHI=",
|
||||
version = "v1.17.0",
|
||||
sum = "h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4=",
|
||||
version = "v1.22.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_bradfitz_go_smtpd",
|
||||
@@ -482,8 +482,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_cockroachdb_pebble",
|
||||
importpath = "github.com/cockroachdb/pebble",
|
||||
sum = "h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA=",
|
||||
version = "v1.1.2",
|
||||
sum = "h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw=",
|
||||
version = "v1.1.5",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_cockroachdb_redact",
|
||||
@@ -512,14 +512,16 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_consensys_bavard",
|
||||
importpath = "github.com/consensys/bavard",
|
||||
sum = "h1:Uw2CGvbXSZWhqK59X0VG/zOjpTFuOMcPLStrp1ihI0A=",
|
||||
version = "v0.1.22",
|
||||
sum = "h1:dTlIwEdFQmldzFf5F6bbTcYWhvnAgZai2g8eq3Wwxqg=",
|
||||
version = "v0.1.31-0.20250406004941-2db259e4b582",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_consensys_gnark_crypto",
|
||||
importpath = "github.com/consensys/gnark-crypto",
|
||||
sum = "h1:DDBdl4HaBtdQsq/wfMwJvZNE80sHidrK3Nfrefatm0E=",
|
||||
version = "v0.14.0",
|
||||
patch_args = ["-p1"],
|
||||
patches = ["//third_party:com_github_consensys_gnark_crypto.patch"],
|
||||
sum = "h1:vIye/FqI50VeAr0B3dx+YjeIvmc3LWz4yEfbWBpTUf0=",
|
||||
version = "v0.18.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_containerd_cgroups",
|
||||
@@ -555,8 +557,14 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_cpuguy83_go_md2man_v2",
|
||||
importpath = "github.com/cpuguy83/go-md2man/v2",
|
||||
sum = "h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=",
|
||||
version = "v2.0.5",
|
||||
sum = "h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=",
|
||||
version = "v2.0.7",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_crate_crypto_go_eth_kzg",
|
||||
importpath = "github.com/crate-crypto/go-eth-kzg",
|
||||
sum = "h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg=",
|
||||
version = "v1.4.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_crate_crypto_go_ipa",
|
||||
@@ -591,8 +599,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_datadog_zstd",
|
||||
importpath = "github.com/DataDog/zstd",
|
||||
sum = "h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ=",
|
||||
version = "v1.5.5",
|
||||
sum = "h1:ybO8RBeh29qrxIhCA9E8gKY6xfONU9T6G6aP9DTKfLE=",
|
||||
version = "v1.5.7",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_davecgh_go_spew",
|
||||
@@ -606,23 +614,29 @@ def prysm_deps():
|
||||
sum = "h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU=",
|
||||
version = "v0.0.0-20200604182044-b73af7476f6c",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_dchest_siphash",
|
||||
importpath = "github.com/dchest/siphash",
|
||||
sum = "h1:QXwFc8cFOR2dSa/gE6o/HokBMWtLUaNDVd+22aKHeEA=",
|
||||
version = "v1.2.3",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_deckarep_golang_set_v2",
|
||||
importpath = "github.com/deckarep/golang-set/v2",
|
||||
sum = "h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM=",
|
||||
version = "v2.6.0",
|
||||
sum = "h1:swm0rlPCmdWn9mESxKOjWk8hXSqoxOp+ZlfuyaAdFlQ=",
|
||||
version = "v2.8.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_decred_dcrd_crypto_blake256",
|
||||
importpath = "github.com/decred/dcrd/crypto/blake256",
|
||||
sum = "h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=",
|
||||
version = "v1.0.1",
|
||||
sum = "h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8=",
|
||||
version = "v1.1.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_decred_dcrd_dcrec_secp256k1_v4",
|
||||
importpath = "github.com/decred/dcrd/dcrec/secp256k1/v4",
|
||||
sum = "h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg=",
|
||||
version = "v4.3.0",
|
||||
sum = "h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc=",
|
||||
version = "v4.4.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_deepmap_oapi_codegen",
|
||||
@@ -735,8 +749,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_emicklei_dot",
|
||||
importpath = "github.com/emicklei/dot",
|
||||
sum = "h1:Ase39UD9T9fRBOb5ptgpixrxfx8abVzNWZi2+lr53PI=",
|
||||
version = "v0.11.0",
|
||||
sum = "h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A=",
|
||||
version = "v1.6.2",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_emicklei_go_restful_v3",
|
||||
@@ -779,6 +793,12 @@ def prysm_deps():
|
||||
sum = "h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s=",
|
||||
version = "v2.1.5",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_ethereum_go_bigmodexpfix",
|
||||
importpath = "github.com/ethereum/go-bigmodexpfix",
|
||||
sum = "h1:rvv6MJhy07IMfEKuARQ9TKojGqLVNxQajaXEp/BoqSk=",
|
||||
version = "v0.0.0-20250911101455-f9e208c548ab",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_ethereum_go_ethereum",
|
||||
build_directives = [
|
||||
@@ -790,8 +810,8 @@ def prysm_deps():
|
||||
patches = [
|
||||
"//third_party:com_github_ethereum_go_ethereum_secp256k1.patch",
|
||||
],
|
||||
sum = "h1:bRra1zi+/q+qyXZ6fylZOrlaF8kDdnlTtzNTmNHfX+g=",
|
||||
version = "v1.15.9",
|
||||
sum = "h1:qeM4TvbrWK0UC0tgkZ7NiRsmBGwsjqc64BHo20U59UQ=",
|
||||
version = "v1.16.7",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_ethereum_go_verkle",
|
||||
@@ -832,8 +852,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_ferranbt_fastssz",
|
||||
importpath = "github.com/ferranbt/fastssz",
|
||||
sum = "h1:ZI+z3JH05h4kgmFXdHuR1aWYsgrg7o+Fw7/NCzM16Mo=",
|
||||
version = "v0.1.3",
|
||||
sum = "h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeDY=",
|
||||
version = "v0.1.4",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_fjl_gencodec",
|
||||
@@ -919,12 +939,6 @@ def prysm_deps():
|
||||
sum = "h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays=",
|
||||
version = "v0.0.0-20191108122812-4678299bea08",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_gballet_go_verkle",
|
||||
importpath = "github.com/gballet/go-verkle",
|
||||
sum = "h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE=",
|
||||
version = "v0.1.1-0.20231031103413-a67434b50f46",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_gdamore_encoding",
|
||||
importpath = "github.com/gdamore/encoding",
|
||||
@@ -1132,8 +1146,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_gofrs_flock",
|
||||
importpath = "github.com/gofrs/flock",
|
||||
sum = "h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=",
|
||||
version = "v0.8.1",
|
||||
sum = "h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=",
|
||||
version = "v0.12.1",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_gogo_googleapis",
|
||||
@@ -1200,8 +1214,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_golang_snappy",
|
||||
importpath = "github.com/golang/snappy",
|
||||
sum = "h1:4bw4WeyTYPp0smaXiJZCNnLrvVBqirQVreixayXezGc=",
|
||||
version = "v0.0.5-0.20231225225746-43d5d4cd4e0e",
|
||||
sum = "h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=",
|
||||
version = "v1.0.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_golangci_lint_1",
|
||||
@@ -1275,12 +1289,6 @@ def prysm_deps():
|
||||
sum = "h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA=",
|
||||
version = "v0.1.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_google_subcommands",
|
||||
importpath = "github.com/google/subcommands",
|
||||
sum = "h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE=",
|
||||
version = "v1.2.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_google_uuid",
|
||||
importpath = "github.com/google/uuid",
|
||||
@@ -1542,8 +1550,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_holiman_billy",
|
||||
importpath = "github.com/holiman/billy",
|
||||
sum = "h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4=",
|
||||
version = "v0.0.0-20240216141850-2abb0c79d3c4",
|
||||
sum = "h1:IZUYC/xb3giYwBLMnr8d0TGTzPKFGNTCGgGLoyeX330=",
|
||||
version = "v0.0.0-20250707135307-f2f9b9aae7db",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_holiman_bloomfilter_v2",
|
||||
@@ -1554,8 +1562,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_holiman_goevmlab",
|
||||
importpath = "github.com/holiman/goevmlab",
|
||||
sum = "h1:JHZ8k9n9G9KXIo1qrvK5Cxah6ax5BR0qVTA9bFYl1oM=",
|
||||
version = "v0.0.0-20241121133100-cfa6b078c8c4",
|
||||
sum = "h1:krEMViaomzuBfH/L1V4b8w2lVfsEpUbxH1ZJQpUaT6E=",
|
||||
version = "v0.0.0-20250515153315-ab84907ebdb2",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_holiman_uint256",
|
||||
@@ -1850,8 +1858,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_klauspost_compress",
|
||||
importpath = "github.com/klauspost/compress",
|
||||
sum = "h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=",
|
||||
version = "v1.17.11",
|
||||
sum = "h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=",
|
||||
version = "v1.18.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_klauspost_cpuid",
|
||||
@@ -2104,18 +2112,6 @@ def prysm_deps():
|
||||
sum = "h1:3l11YT8tm9MnwGFQ4kETwkzpAwY2Jt9lCrumCUW4+z4=",
|
||||
version = "v0.7.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_mariusvanderwijden_fuzzyvm",
|
||||
importpath = "github.com/MariusVanDerWijden/FuzzyVM",
|
||||
sum = "h1:RQtzNvriR3Yu5CvVBTJPwDmfItBT90TWZ3fFondhc08=",
|
||||
version = "v0.0.0-20240516070431-7828990cad7d",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_mariusvanderwijden_tx_fuzz",
|
||||
importpath = "github.com/MariusVanDerWijden/tx-fuzz",
|
||||
sum = "h1:Tq4lXivsR8mtoP4RpasUDIUpDLHfN1YhFge/kzrzK78=",
|
||||
version = "v1.4.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_marten_seemann_tcp",
|
||||
importpath = "github.com/marten-seemann/tcp",
|
||||
@@ -2143,8 +2139,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_mattn_go_runewidth",
|
||||
importpath = "github.com/mattn/go-runewidth",
|
||||
sum = "h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=",
|
||||
version = "v0.0.15",
|
||||
sum = "h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=",
|
||||
version = "v0.0.16",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_matttproud_golang_protobuf_extensions",
|
||||
@@ -2257,8 +2253,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_mitchellh_mapstructure",
|
||||
importpath = "github.com/mitchellh/mapstructure",
|
||||
sum = "h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=",
|
||||
version = "v1.4.1",
|
||||
sum = "h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=",
|
||||
version = "v1.5.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_mitchellh_pointerstructure",
|
||||
@@ -2272,12 +2268,6 @@ def prysm_deps():
|
||||
sum = "h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY=",
|
||||
version = "v0.4.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_mmcloughlin_profile",
|
||||
importpath = "github.com/mmcloughlin/profile",
|
||||
sum = "h1:jhDmAqPyebOsVDOCICJoINoLb/AnLBaUw58nFzxWS2w=",
|
||||
version = "v0.1.1",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_moby_spdystream",
|
||||
importpath = "github.com/moby/spdystream",
|
||||
@@ -2821,6 +2811,12 @@ def prysm_deps():
|
||||
sum = "h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=",
|
||||
version = "v1.1.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_projectzkm_ziren_crates_go_runtime_zkvm_runtime",
|
||||
importpath = "github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime",
|
||||
sum = "h1:1zYrtlhrZ6/b6SAjLSfKzWtdgqK0U+HtH/VcBWh1BaU=",
|
||||
version = "v0.0.0-20251001021608-1fe7b43fc4d6",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_prometheus_client_golang",
|
||||
importpath = "github.com/prometheus/client_golang",
|
||||
@@ -3267,8 +3263,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_spf13_pflag",
|
||||
importpath = "github.com/spf13/pflag",
|
||||
sum = "h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=",
|
||||
version = "v1.0.5",
|
||||
sum = "h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=",
|
||||
version = "v1.0.6",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_spf13_viper",
|
||||
@@ -3384,14 +3380,14 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_tklauser_go_sysconf",
|
||||
importpath = "github.com/tklauser/go-sysconf",
|
||||
sum = "h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4=",
|
||||
version = "v0.3.13",
|
||||
sum = "h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4=",
|
||||
version = "v0.3.15",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_tklauser_numcpus",
|
||||
importpath = "github.com/tklauser/numcpus",
|
||||
sum = "h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4=",
|
||||
version = "v0.7.0",
|
||||
sum = "h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso=",
|
||||
version = "v0.10.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_tmc_grpc_websocket_proxy",
|
||||
@@ -3411,12 +3407,6 @@ def prysm_deps():
|
||||
sum = "h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=",
|
||||
version = "v1.2.7",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_umbracle_gohashtree",
|
||||
importpath = "github.com/umbracle/gohashtree",
|
||||
sum = "h1:CQh33pStIp/E30b7TxDlXfM0145bn2e8boI30IxAhTg=",
|
||||
version = "v0.0.2-alpha.0.20230207094856-5b775a815c10",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_urfave_cli",
|
||||
importpath = "github.com/urfave/cli",
|
||||
@@ -3426,8 +3416,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_urfave_cli_v2",
|
||||
importpath = "github.com/urfave/cli/v2",
|
||||
sum = "h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w=",
|
||||
version = "v2.27.5",
|
||||
sum = "h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g=",
|
||||
version = "v2.27.6",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_urfave_negroni",
|
||||
@@ -3474,8 +3464,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_victoriametrics_fastcache",
|
||||
importpath = "github.com/VictoriaMetrics/fastcache",
|
||||
sum = "h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI=",
|
||||
version = "v1.12.2",
|
||||
sum = "h1:AW4mheMR5Vd9FkAPUv+NH6Nhw+fmbTMGMsNAoA/+4G0=",
|
||||
version = "v1.13.0",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_github_vividcortex_gohistogram",
|
||||
@@ -3597,8 +3587,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "com_github_yusufpapurcu_wmi",
|
||||
importpath = "github.com/yusufpapurcu/wmi",
|
||||
sum = "h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=",
|
||||
version = "v1.2.3",
|
||||
sum = "h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=",
|
||||
version = "v1.2.4",
|
||||
)
|
||||
go_repository(
|
||||
name = "com_google_cloud_go",
|
||||
@@ -4784,8 +4774,8 @@ def prysm_deps():
|
||||
go_repository(
|
||||
name = "org_golang_x_exp",
|
||||
importpath = "golang.org/x/exp",
|
||||
sum = "h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc=",
|
||||
version = "v0.0.0-20250128182459-e0ece0dbea4c",
|
||||
sum = "h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=",
|
||||
version = "v0.0.0-20250506013437-ce4c2cf36ca6",
|
||||
)
|
||||
go_repository(
|
||||
name = "org_golang_x_exp_typeparams",
|
||||
|
||||
55
go.mod
55
go.mod
@@ -3,20 +3,18 @@ module github.com/OffchainLabs/prysm/v7
|
||||
go 1.25.1
|
||||
|
||||
require (
|
||||
github.com/MariusVanDerWijden/FuzzyVM v0.0.0-20240516070431-7828990cad7d
|
||||
github.com/MariusVanDerWijden/tx-fuzz v1.4.0
|
||||
github.com/OffchainLabs/go-bitfield v0.0.0-20251031151322-f427d04d8506
|
||||
github.com/aristanetworks/goarista v0.0.0-20200805130819-fd197cf57d96
|
||||
github.com/bazelbuild/rules_go v0.23.2
|
||||
github.com/btcsuite/btcd/btcec/v2 v2.3.4
|
||||
github.com/consensys/gnark-crypto v0.14.0
|
||||
github.com/consensys/gnark-crypto v0.18.0
|
||||
github.com/crate-crypto/go-kzg-4844 v1.1.0
|
||||
github.com/d4l3k/messagediff v1.2.1
|
||||
github.com/dgraph-io/ristretto/v2 v2.2.0
|
||||
github.com/dustin/go-humanize v1.0.1
|
||||
github.com/emicklei/dot v0.11.0
|
||||
github.com/emicklei/dot v1.6.2
|
||||
github.com/ethereum/c-kzg-4844/v2 v2.1.5
|
||||
github.com/ethereum/go-ethereum v1.15.9
|
||||
github.com/ethereum/go-ethereum v1.16.7
|
||||
github.com/fsnotify/fsnotify v1.6.0
|
||||
github.com/ghodss/yaml v1.0.0
|
||||
github.com/go-yaml/yaml v2.1.0+incompatible
|
||||
@@ -24,7 +22,7 @@ require (
|
||||
github.com/golang-jwt/jwt/v4 v4.5.2
|
||||
github.com/golang/gddo v0.0.0-20200528160355-8d077c1d8f4c
|
||||
github.com/golang/protobuf v1.5.4
|
||||
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e
|
||||
github.com/golang/snappy v1.0.0
|
||||
github.com/google/go-cmp v0.7.0
|
||||
github.com/google/gofuzz v1.2.0
|
||||
github.com/google/uuid v1.6.0
|
||||
@@ -74,7 +72,7 @@ require (
|
||||
github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e
|
||||
github.com/trailofbits/go-mutexasserts v0.0.0-20250212181730-4c2b8e9e784b
|
||||
github.com/tyler-smith/go-bip39 v1.1.0
|
||||
github.com/urfave/cli/v2 v2.27.5
|
||||
github.com/urfave/cli/v2 v2.27.6
|
||||
github.com/uudashr/gocognit v1.0.5
|
||||
github.com/wealdtech/go-bytesutil v1.1.1
|
||||
github.com/wealdtech/go-eth2-util v1.6.3
|
||||
@@ -89,7 +87,7 @@ require (
|
||||
go.uber.org/automaxprocs v1.5.2
|
||||
go.uber.org/mock v0.5.2
|
||||
golang.org/x/crypto v0.44.0
|
||||
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c
|
||||
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6
|
||||
golang.org/x/sync v0.18.0
|
||||
golang.org/x/tools v0.39.0
|
||||
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1
|
||||
@@ -105,12 +103,13 @@ require (
|
||||
|
||||
require (
|
||||
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect
|
||||
github.com/DataDog/zstd v1.5.5 // indirect
|
||||
github.com/DataDog/zstd v1.5.7 // indirect
|
||||
github.com/Microsoft/go-winio v0.6.2 // indirect
|
||||
github.com/VictoriaMetrics/fastcache v1.12.2 // indirect
|
||||
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect
|
||||
github.com/VictoriaMetrics/fastcache v1.13.0 // indirect
|
||||
github.com/benbjohnson/clock v1.3.5 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/bits-and-blooms/bitset v1.17.0 // indirect
|
||||
github.com/bits-and-blooms/bitset v1.22.0 // indirect
|
||||
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
|
||||
github.com/cespare/cp v1.1.1 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||
@@ -118,27 +117,28 @@ require (
|
||||
github.com/cockroachdb/errors v1.11.3 // indirect
|
||||
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
|
||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
|
||||
github.com/cockroachdb/pebble v1.1.2 // indirect
|
||||
github.com/cockroachdb/pebble v1.1.5 // indirect
|
||||
github.com/cockroachdb/redact v1.1.5 // indirect
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
|
||||
github.com/consensys/bavard v0.1.22 // indirect
|
||||
github.com/containerd/cgroups v1.1.0 // indirect
|
||||
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
|
||||
github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect
|
||||
github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect
|
||||
github.com/deckarep/golang-set/v2 v2.6.0 // indirect
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
|
||||
github.com/dchest/siphash v1.2.3 // indirect
|
||||
github.com/deckarep/golang-set/v2 v2.8.0 // indirect
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
|
||||
github.com/deepmap/oapi-codegen v1.8.2 // indirect
|
||||
github.com/dlclark/regexp2 v1.7.0 // indirect
|
||||
github.com/docker/go-units v0.5.0 // indirect
|
||||
github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 // indirect
|
||||
github.com/elastic/gosigar v0.14.3 // indirect
|
||||
github.com/ethereum/c-kzg-4844 v1.0.0 // indirect
|
||||
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab // indirect
|
||||
github.com/ethereum/go-verkle v0.2.2 // indirect
|
||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||
github.com/ferranbt/fastssz v0.1.3 // indirect
|
||||
github.com/ferranbt/fastssz v0.1.4 // indirect
|
||||
github.com/flynn/noise v1.1.0 // indirect
|
||||
github.com/francoispqt/gojay v1.2.13 // indirect
|
||||
github.com/getsentry/sentry-go v0.27.0 // indirect
|
||||
@@ -148,7 +148,7 @@ require (
|
||||
github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
||||
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
||||
github.com/gofrs/flock v0.8.1 // indirect
|
||||
github.com/gofrs/flock v0.12.1 // indirect
|
||||
github.com/google/gopacket v1.1.19 // indirect
|
||||
github.com/google/pprof v0.0.0-20250202011525-fc3143867406 // indirect
|
||||
github.com/gorilla/websocket v1.5.3 // indirect
|
||||
@@ -156,9 +156,8 @@ require (
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect
|
||||
github.com/hashicorp/go-bexpr v0.1.10 // indirect
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
||||
github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect
|
||||
github.com/holiman/billy v0.0.0-20250707135307-f2f9b9aae7db // indirect
|
||||
github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
|
||||
github.com/holiman/goevmlab v0.0.0-20241121133100-cfa6b078c8c4 // indirect
|
||||
github.com/huin/goupnp v1.3.0 // indirect
|
||||
github.com/influxdata/influxdb-client-go/v2 v2.4.0 // indirect
|
||||
github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c // indirect
|
||||
@@ -167,7 +166,7 @@ require (
|
||||
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
|
||||
github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect
|
||||
github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a // indirect
|
||||
github.com/klauspost/compress v1.17.11 // indirect
|
||||
github.com/klauspost/compress v1.18.0 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
|
||||
github.com/koron/go-ssdp v0.0.5 // indirect
|
||||
github.com/kr/text v0.2.0 // indirect
|
||||
@@ -184,15 +183,14 @@ require (
|
||||
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.15 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.16 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||
github.com/miekg/dns v1.1.63 // indirect
|
||||
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
|
||||
github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect
|
||||
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
|
||||
github.com/mitchellh/mapstructure v1.4.1 // indirect
|
||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/mitchellh/pointerstructure v1.2.0 // indirect
|
||||
github.com/mmcloughlin/addchain v0.4.0 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/mr-tron/base58 v1.2.0 // indirect
|
||||
@@ -248,12 +246,12 @@ require (
|
||||
github.com/spaolacci/murmur3 v1.1.0 // indirect
|
||||
github.com/stretchr/objx v0.5.2 // indirect
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect
|
||||
github.com/tklauser/go-sysconf v0.3.13 // indirect
|
||||
github.com/tklauser/numcpus v0.7.0 // indirect
|
||||
github.com/tklauser/go-sysconf v0.3.15 // indirect
|
||||
github.com/tklauser/numcpus v0.10.0 // indirect
|
||||
github.com/wealdtech/go-eth2-types/v2 v2.8.2 // indirect
|
||||
github.com/wlynxg/anet v0.0.5 // indirect
|
||||
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.3 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
||||
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
|
||||
go.opentelemetry.io/otel/metric v1.35.0 // indirect
|
||||
@@ -275,7 +273,6 @@ require (
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
|
||||
lukechampine.com/blake3 v1.3.0 // indirect
|
||||
rsc.io/tmplfunc v0.0.3 // indirect
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
|
||||
sigs.k8s.io/yaml v1.3.0 // indirect
|
||||
|
||||
126
go.sum
126
go.sum
@@ -48,22 +48,20 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
|
||||
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/kWtOwnv/G+AzdKuy2ZrqINhenH4HyNs=
|
||||
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ=
|
||||
github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
|
||||
github.com/DataDog/zstd v1.5.7 h1:ybO8RBeh29qrxIhCA9E8gKY6xfONU9T6G6aP9DTKfLE=
|
||||
github.com/DataDog/zstd v1.5.7/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
|
||||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
|
||||
github.com/MariusVanDerWijden/FuzzyVM v0.0.0-20240516070431-7828990cad7d h1:RQtzNvriR3Yu5CvVBTJPwDmfItBT90TWZ3fFondhc08=
|
||||
github.com/MariusVanDerWijden/FuzzyVM v0.0.0-20240516070431-7828990cad7d/go.mod h1:gWTykV/ZinShgltWofTEJY4TsletuvGhB6l4+Ai2F+E=
|
||||
github.com/MariusVanDerWijden/tx-fuzz v1.4.0 h1:Tq4lXivsR8mtoP4RpasUDIUpDLHfN1YhFge/kzrzK78=
|
||||
github.com/MariusVanDerWijden/tx-fuzz v1.4.0/go.mod h1:gmOVECg7o5FY5VU3DQ/fY0zTk/ExBdMkUGz0vA8qqms=
|
||||
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
|
||||
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
|
||||
github.com/OffchainLabs/go-bitfield v0.0.0-20251031151322-f427d04d8506 h1:d/SJkN8/9Ca+1YmuDiUJxAiV4w/a9S8NcsG7GMQSrVI=
|
||||
github.com/OffchainLabs/go-bitfield v0.0.0-20251031151322-f427d04d8506/go.mod h1:6TZI4FU6zT8x6ZfWa1J8YQ2NgW0wLV/W3fHRca8ISBo=
|
||||
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 h1:1zYrtlhrZ6/b6SAjLSfKzWtdgqK0U+HtH/VcBWh1BaU=
|
||||
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI=
|
||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
|
||||
github.com/Shopify/sarama v1.26.1/go.mod h1:NbSGBSSndYaIhRcBtY9V0U7AyH+x71bG668AuWys/yU=
|
||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
|
||||
github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI=
|
||||
github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI=
|
||||
github.com/VictoriaMetrics/fastcache v1.13.0 h1:AW4mheMR5Vd9FkAPUv+NH6Nhw+fmbTMGMsNAoA/+4G0=
|
||||
github.com/VictoriaMetrics/fastcache v1.13.0/go.mod h1:hHXhl4DA2fTL2HTZDJFXWgW0LNjo6B+4aj2Wmng3TjU=
|
||||
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
|
||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
@@ -71,9 +69,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8=
|
||||
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
|
||||
github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc=
|
||||
github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
|
||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
||||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
@@ -100,8 +97,8 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||
github.com/bits-and-blooms/bitset v1.17.0 h1:1X2TS7aHz1ELcC0yU1y2stUs/0ig5oMU6STFZGrhvHI=
|
||||
github.com/bits-and-blooms/bitset v1.17.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
|
||||
github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4=
|
||||
github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
|
||||
github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
|
||||
github.com/bradfitz/gomemcache v0.0.0-20170208213004-1952afaa557d/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
|
||||
github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ=
|
||||
@@ -115,7 +112,6 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA
|
||||
github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU=
|
||||
github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
@@ -145,17 +141,15 @@ github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/e
|
||||
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M=
|
||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
|
||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
|
||||
github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA=
|
||||
github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU=
|
||||
github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw=
|
||||
github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo=
|
||||
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
|
||||
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
|
||||
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
||||
github.com/consensys/bavard v0.1.22 h1:Uw2CGvbXSZWhqK59X0VG/zOjpTFuOMcPLStrp1ihI0A=
|
||||
github.com/consensys/bavard v0.1.22/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs=
|
||||
github.com/consensys/gnark-crypto v0.14.0 h1:DDBdl4HaBtdQsq/wfMwJvZNE80sHidrK3Nfrefatm0E=
|
||||
github.com/consensys/gnark-crypto v0.14.0/go.mod h1:CU4UijNPsHawiVGNxe9co07FkzCeWHHrb1li/n1XoU0=
|
||||
github.com/consensys/gnark-crypto v0.18.0 h1:vIye/FqI50VeAr0B3dx+YjeIvmc3LWz4yEfbWBpTUf0=
|
||||
github.com/consensys/gnark-crypto v0.18.0/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c=
|
||||
github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
|
||||
github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
|
||||
github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw=
|
||||
@@ -170,8 +164,10 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV
|
||||
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||
github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg=
|
||||
github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI=
|
||||
github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg=
|
||||
github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM=
|
||||
github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4=
|
||||
@@ -186,12 +182,14 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU=
|
||||
github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U=
|
||||
github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM=
|
||||
github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
|
||||
github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
|
||||
github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg=
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
|
||||
github.com/dchest/siphash v1.2.3 h1:QXwFc8cFOR2dSa/gE6o/HokBMWtLUaNDVd+22aKHeEA=
|
||||
github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc=
|
||||
github.com/deckarep/golang-set/v2 v2.8.0 h1:swm0rlPCmdWn9mESxKOjWk8hXSqoxOp+ZlfuyaAdFlQ=
|
||||
github.com/deckarep/golang-set/v2 v2.8.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
|
||||
github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8=
|
||||
github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo=
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc=
|
||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
|
||||
github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M=
|
||||
github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU=
|
||||
github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw=
|
||||
@@ -223,8 +221,8 @@ github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaB
|
||||
github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
|
||||
github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo=
|
||||
github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
|
||||
github.com/emicklei/dot v0.11.0 h1:Ase39UD9T9fRBOb5ptgpixrxfx8abVzNWZi2+lr53PI=
|
||||
github.com/emicklei/dot v0.11.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s=
|
||||
github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A=
|
||||
github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s=
|
||||
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
|
||||
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
|
||||
@@ -234,12 +232,12 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
|
||||
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
|
||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA=
|
||||
github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
|
||||
github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s=
|
||||
github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs=
|
||||
github.com/ethereum/go-ethereum v1.15.9 h1:bRra1zi+/q+qyXZ6fylZOrlaF8kDdnlTtzNTmNHfX+g=
|
||||
github.com/ethereum/go-ethereum v1.15.9/go.mod h1:+S9k+jFzlyVTNcYGvqFhzN/SFhI6vA+aOY4T5tLSPL0=
|
||||
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab h1:rvv6MJhy07IMfEKuARQ9TKojGqLVNxQajaXEp/BoqSk=
|
||||
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab/go.mod h1:IuLm4IsPipXKF7CW5Lzf68PIbZ5yl7FFd74l/E0o9A8=
|
||||
github.com/ethereum/go-ethereum v1.16.7 h1:qeM4TvbrWK0UC0tgkZ7NiRsmBGwsjqc64BHo20U59UQ=
|
||||
github.com/ethereum/go-ethereum v1.16.7/go.mod h1:Fs6QebQbavneQTYcA39PEKv2+zIjX7rPUZ14DER46wk=
|
||||
github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8=
|
||||
github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
@@ -248,8 +246,8 @@ github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4Nij
|
||||
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
|
||||
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||
github.com/ferranbt/fastssz v0.0.0-20210120143747-11b9eff30ea9/go.mod h1:DyEu2iuLBnb/T51BlsiO3yLYdJC6UbGMrIkqK1KmQxM=
|
||||
github.com/ferranbt/fastssz v0.1.3 h1:ZI+z3JH05h4kgmFXdHuR1aWYsgrg7o+Fw7/NCzM16Mo=
|
||||
github.com/ferranbt/fastssz v0.1.3/go.mod h1:0Y9TEd/9XuFlh7mskMPfXiI2Dkw4Ddg9EyXt1W7MRvE=
|
||||
github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeDY=
|
||||
github.com/ferranbt/fastssz v0.1.4/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg=
|
||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||
github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg=
|
||||
github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag=
|
||||
@@ -325,8 +323,8 @@ github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x
|
||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
||||
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
|
||||
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
||||
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
|
||||
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
|
||||
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
@@ -373,8 +371,8 @@ github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8l
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e h1:4bw4WeyTYPp0smaXiJZCNnLrvVBqirQVreixayXezGc=
|
||||
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
|
||||
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
@@ -418,7 +416,6 @@ github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8q
|
||||
github.com/google/pprof v0.0.0-20250202011525-fc3143867406 h1:wlQI2cYY0BsWmmPPAnxfQ8SDW0S3Jasn+4B8kXFxprg=
|
||||
github.com/google/pprof v0.0.0-20250202011525-fc3143867406/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
|
||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
@@ -486,12 +483,10 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J
|
||||
github.com/herumi/bls-eth-go-binary v0.0.0-20210130185500-57372fb27371/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U=
|
||||
github.com/herumi/bls-eth-go-binary v1.31.0 h1:9eeW3EA4epCb7FIHt2luENpAW69MvKGL5jieHlBiP+w=
|
||||
github.com/herumi/bls-eth-go-binary v1.31.0/go.mod h1:luAnRm3OsMQeokhGzpYmc0ZKwawY7o87PUEP11Z7r7U=
|
||||
github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4=
|
||||
github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc=
|
||||
github.com/holiman/billy v0.0.0-20250707135307-f2f9b9aae7db h1:IZUYC/xb3giYwBLMnr8d0TGTzPKFGNTCGgGLoyeX330=
|
||||
github.com/holiman/billy v0.0.0-20250707135307-f2f9b9aae7db/go.mod h1:xTEYN9KCHxuYHs+NmrmzFcnvHMzLLNiGFafCb1n3Mfg=
|
||||
github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
|
||||
github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
|
||||
github.com/holiman/goevmlab v0.0.0-20241121133100-cfa6b078c8c4 h1:JHZ8k9n9G9KXIo1qrvK5Cxah6ax5BR0qVTA9bFYl1oM=
|
||||
github.com/holiman/goevmlab v0.0.0-20241121133100-cfa6b078c8c4/go.mod h1:+DBd7lup47uusCYWbkJPfHRG4LYjBHvyXU0c+z26/U4=
|
||||
github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA=
|
||||
github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
@@ -549,8 +544,8 @@ github.com/kisielk/errcheck v1.8.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
|
||||
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
|
||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||
github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
|
||||
github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
|
||||
@@ -646,8 +641,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D
|
||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
|
||||
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
|
||||
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||
@@ -681,13 +676,11 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F
|
||||
github.com/mitchellh/mapstructure v0.0.0-20170523030023-d0303fe80992/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
|
||||
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A=
|
||||
github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4=
|
||||
github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY=
|
||||
github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU=
|
||||
github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
@@ -995,8 +988,8 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3
|
||||
github.com/spf13/jwalterweatherman v0.0.0-20170901151539-12bd96e66386/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/pflag v1.0.1-0.20170901120850-7aff26db30c1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
|
||||
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.0.0/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
|
||||
github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA=
|
||||
github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg=
|
||||
@@ -1033,20 +1026,18 @@ github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:
|
||||
github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e h1:cR8/SYRgyQCt5cNCMniB/ZScMkhI9nk8U5C7SbISXjo=
|
||||
github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e/go.mod h1:Tu4lItkATkonrYuvtVjG0/rhy15qrNGNTjPdaphtZ/8=
|
||||
github.com/tjfoc/gmsm v1.3.0/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
|
||||
github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4=
|
||||
github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0=
|
||||
github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4=
|
||||
github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY=
|
||||
github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4=
|
||||
github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4=
|
||||
github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso=
|
||||
github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ=
|
||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||
github.com/trailofbits/go-mutexasserts v0.0.0-20250212181730-4c2b8e9e784b h1:EBoYk5zHOfuHDBqLFx4eSPRVcbnW+L3aFJzoCi8zRnk=
|
||||
github.com/trailofbits/go-mutexasserts v0.0.0-20250212181730-4c2b8e9e784b/go.mod h1:4R6Qam+w871wOlyRq59zRLjhb5x9/De/wgPeaCTaCwI=
|
||||
github.com/umbracle/gohashtree v0.0.2-alpha.0.20230207094856-5b775a815c10 h1:CQh33pStIp/E30b7TxDlXfM0145bn2e8boI30IxAhTg=
|
||||
github.com/umbracle/gohashtree v0.0.2-alpha.0.20230207094856-5b775a815c10/go.mod h1:x/Pa0FF5Te9kdrlZKJK82YmAkvL8+f989USgz6Jiw7M=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||
github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
|
||||
github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w=
|
||||
github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
|
||||
github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g=
|
||||
github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
|
||||
github.com/uudashr/gocognit v1.0.5 h1:rrSex7oHr3/pPLQ0xoWq108XMU8s678FJcQ+aSfOHa4=
|
||||
github.com/uudashr/gocognit v1.0.5/go.mod h1:wgYz0mitoKOTysqxTDMOUXg+Jb5SvtihkfmugIZYpEA=
|
||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||
@@ -1081,8 +1072,8 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
|
||||
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
|
||||
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
||||
go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=
|
||||
@@ -1184,8 +1175,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
|
||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
|
||||
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc=
|
||||
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
|
||||
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
|
||||
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
|
||||
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 h1:1P7xPZEwZMoBoz0Yze5Nx2/4pxj6nw9ZqHWXqP0iRgQ=
|
||||
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
@@ -1391,7 +1382,6 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
||||
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
@@ -1693,8 +1683,6 @@ lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1
|
||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||
rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU=
|
||||
rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
|
||||
|
||||
@@ -99,7 +99,7 @@ func GethCancunTime(genesisTime time.Time, cfg *clparams.BeaconChainConfig) *uin
|
||||
}
|
||||
|
||||
// GethPragueTime calculates the absolute time of the prague (aka electra) fork block
|
||||
// by adding the relative time of the capella the fork epoch to the given genesis timestamp.
|
||||
// by adding the relative time of the electra fork epoch to the given genesis timestamp.
|
||||
func GethPragueTime(genesisTime time.Time, cfg *clparams.BeaconChainConfig) *uint64 {
|
||||
var pragueTime *uint64
|
||||
if cfg.ElectraForkEpoch != math.MaxUint64 {
|
||||
@@ -173,15 +173,23 @@ func GethTestnetGenesis(genesis time.Time, cfg *clparams.BeaconChainConfig) *cor
|
||||
OsakaTime: osakaTime,
|
||||
DepositContractAddress: common.HexToAddress(cfg.DepositContractAddress),
|
||||
BlobScheduleConfig: ¶ms.BlobScheduleConfig{
|
||||
Cancun: ¶ms.BlobConfig{
|
||||
Target: 3,
|
||||
Max: 6,
|
||||
UpdateFraction: 3338477,
|
||||
Cancun: params.DefaultCancunBlobConfig,
|
||||
Prague: params.DefaultPragueBlobConfig,
|
||||
Osaka: params.DefaultOsakaBlobConfig,
|
||||
BPO1: ¶ms.BlobConfig{
|
||||
Target: 9,
|
||||
Max: 14,
|
||||
UpdateFraction: 8832827,
|
||||
},
|
||||
Prague: ¶ms.BlobConfig{
|
||||
Target: 6,
|
||||
Max: 9,
|
||||
UpdateFraction: 5007716,
|
||||
BPO2: ¶ms.BlobConfig{
|
||||
Target: 14,
|
||||
Max: 21,
|
||||
UpdateFraction: 13739630,
|
||||
},
|
||||
BPO3: ¶ms.BlobConfig{
|
||||
Target: 21,
|
||||
Max: 32,
|
||||
UpdateFraction: 20609697,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ common_deps = [
|
||||
# gazelle:ignore
|
||||
go_test(
|
||||
name = "go_default_test",
|
||||
size = "large",
|
||||
size = "enormous",
|
||||
testonly = True,
|
||||
srcs = [
|
||||
"component_handler_test.go",
|
||||
@@ -241,6 +241,7 @@ go_test(
|
||||
],
|
||||
eth_network = "minimal",
|
||||
flaky = True,
|
||||
local = True, # Disable sandboxing so DB modifications persist across process restarts
|
||||
shard_count = 2,
|
||||
tags = [
|
||||
"exclusive",
|
||||
|
||||
@@ -29,7 +29,9 @@ go_library(
|
||||
"//config/features:go_default_library",
|
||||
"//config/fieldparams:go_default_library",
|
||||
"//config/params:go_default_library",
|
||||
"//consensus-types/primitives:go_default_library",
|
||||
"//crypto/bls:go_default_library",
|
||||
"//encoding/bytesutil:go_default_library",
|
||||
"//io/file:go_default_library",
|
||||
"//proto/prysm/v1alpha1/validator-client:go_default_library",
|
||||
"//runtime/interop:go_default_library",
|
||||
@@ -46,6 +48,7 @@ go_library(
|
||||
"@com_github_wealdtech_go_eth2_wallet_encryptor_keystorev4//:go_default_library",
|
||||
"@in_gopkg_yaml_v2//:go_default_library",
|
||||
"@io_bazel_rules_go//go/tools/bazel:go_default_library",
|
||||
"@io_etcd_go_bbolt//:go_default_library",
|
||||
"@org_golang_x_sync//errgroup:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
@@ -8,9 +8,12 @@ import (
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"slices"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/OffchainLabs/prysm/v7/beacon-chain/state"
|
||||
cmdshared "github.com/OffchainLabs/prysm/v7/cmd"
|
||||
@@ -18,6 +21,8 @@ import (
|
||||
"github.com/OffchainLabs/prysm/v7/cmd/beacon-chain/genesis"
|
||||
"github.com/OffchainLabs/prysm/v7/config/features"
|
||||
"github.com/OffchainLabs/prysm/v7/config/params"
|
||||
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
|
||||
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
|
||||
"github.com/OffchainLabs/prysm/v7/io/file"
|
||||
"github.com/OffchainLabs/prysm/v7/runtime/interop"
|
||||
"github.com/OffchainLabs/prysm/v7/testing/endtoend/helpers"
|
||||
@@ -25,12 +30,14 @@ import (
|
||||
e2etypes "github.com/OffchainLabs/prysm/v7/testing/endtoend/types"
|
||||
"github.com/bazelbuild/rules_go/go/tools/bazel"
|
||||
"github.com/pkg/errors"
|
||||
bolt "go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
var _ e2etypes.ComponentRunner = (*BeaconNode)(nil)
|
||||
var _ e2etypes.ComponentRunner = (*BeaconNodeSet)(nil)
|
||||
var _ e2etypes.MultipleComponentRunners = (*BeaconNodeSet)(nil)
|
||||
var _ e2etypes.BeaconNodeSet = (*BeaconNodeSet)(nil)
|
||||
var _ e2etypes.RestartableBeaconNodeSet = (*BeaconNodeSet)(nil)
|
||||
|
||||
// BeaconNodeSet represents set of beacon nodes.
|
||||
type BeaconNodeSet struct {
|
||||
@@ -149,24 +156,180 @@ func (s *BeaconNodeSet) ComponentAtIndex(i int) (e2etypes.ComponentRunner, error
|
||||
return s.nodes[i], nil
|
||||
}
|
||||
|
||||
// RestartAtIndex stops the beacon node at the given index and restarts it
|
||||
// with the provided extra flags appended to the existing configuration.
|
||||
// The restarted node preserves its data directory (does not clear DB).
|
||||
func (s *BeaconNodeSet) RestartAtIndex(ctx context.Context, i int, extraFlags []string) error {
|
||||
if i >= len(s.nodes) {
|
||||
return errors.Errorf("provided index exceeds slice size: %d >= %d", i, len(s.nodes))
|
||||
}
|
||||
|
||||
// Get the existing node to extract its configuration
|
||||
oldNode, ok := s.nodes[i].(*BeaconNode)
|
||||
if !ok {
|
||||
return errors.New("node at index is not a BeaconNode")
|
||||
}
|
||||
|
||||
// Backup the log file before restart so we don't lose pre-restart logs
|
||||
oldLogPath := path.Join(e2e.TestParams.LogPath, fmt.Sprintf(e2e.BeaconNodeLogFileName, i))
|
||||
backupLogPath := path.Join(e2e.TestParams.LogPath, fmt.Sprintf("beacon-%d-pre-restart.log", i))
|
||||
if err := copyFile(oldLogPath, backupLogPath); err != nil {
|
||||
log.WithError(err).Warnf("Failed to backup log file before restart (non-fatal)")
|
||||
} else {
|
||||
log.Infof("Backed up beacon node %d log to %s", i, backupLogPath)
|
||||
}
|
||||
|
||||
// Stop the node for restart (sets restarting flag to prevent errgroup failure)
|
||||
log.Infof("Stopping beacon node %d for restart", i)
|
||||
if err := oldNode.StopForRestart(); err != nil {
|
||||
return errors.Wrap(err, "failed to stop node for restart")
|
||||
}
|
||||
|
||||
// Wait a moment for the process to fully terminate
|
||||
time.Sleep(2 * time.Second)
|
||||
|
||||
// Create a new config with extra flags
|
||||
newConfig := *s.config
|
||||
newConfig.BeaconFlags = append(slices.Clone(s.config.BeaconFlags), extraFlags...)
|
||||
|
||||
// Create a new node that will preserve the data directory
|
||||
newNode := NewBeaconNodeForRestart(&newConfig, oldNode.index, oldNode.enr)
|
||||
s.nodes[i] = newNode
|
||||
|
||||
// Start the new node in a goroutine
|
||||
startErrCh := make(chan error, 1)
|
||||
go func() {
|
||||
if err := newNode.Start(ctx); err != nil {
|
||||
// Only report error if context wasn't cancelled
|
||||
if ctx.Err() == nil {
|
||||
startErrCh <- err
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
// Wait for node to start or timeout
|
||||
select {
|
||||
case <-newNode.Started():
|
||||
log.Infof("Beacon node %d restarted successfully with extra flags: %v", i, extraFlags)
|
||||
return nil
|
||||
case err := <-startErrCh:
|
||||
return errors.Wrap(err, "failed to start restarted beacon node")
|
||||
case <-time.After(2 * time.Minute):
|
||||
return errors.New("timeout waiting for restarted beacon node to start")
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
}
|
||||
}
|
||||
|
||||
// PreRestartHook is a function called after stopping a node but before restarting it.
|
||||
// It receives the BeaconNodeSet and node index, allowing modification of the node's database.
|
||||
type PreRestartHook func(s *BeaconNodeSet, nodeIndex int) error
|
||||
|
||||
// RestartAtIndexWithPreHook is like RestartAtIndex but calls the provided hook function
|
||||
// after stopping the node and before restarting it. This allows modification of the
|
||||
// node's database (e.g., setting custody info) while the node is stopped.
|
||||
func (s *BeaconNodeSet) RestartAtIndexWithPreHook(ctx context.Context, i int, extraFlags []string, preHook PreRestartHook) error {
|
||||
if i >= len(s.nodes) {
|
||||
return errors.Errorf("provided index exceeds slice size: %d >= %d", i, len(s.nodes))
|
||||
}
|
||||
|
||||
// Get the existing node to extract its configuration
|
||||
oldNode, ok := s.nodes[i].(*BeaconNode)
|
||||
if !ok {
|
||||
return errors.New("node at index is not a BeaconNode")
|
||||
}
|
||||
|
||||
// Backup the log file before restart so we don't lose pre-restart logs
|
||||
oldLogPath := path.Join(e2e.TestParams.LogPath, fmt.Sprintf(e2e.BeaconNodeLogFileName, i))
|
||||
backupLogPath := path.Join(e2e.TestParams.LogPath, fmt.Sprintf("beacon-%d-pre-restart.log", i))
|
||||
if err := copyFile(oldLogPath, backupLogPath); err != nil {
|
||||
log.WithError(err).Warnf("Failed to backup log file before restart (non-fatal)")
|
||||
} else {
|
||||
log.Infof("Backed up beacon node %d log to %s", i, backupLogPath)
|
||||
}
|
||||
|
||||
// Stop the node for restart (sets restarting flag to prevent errgroup failure)
|
||||
log.Infof("Stopping beacon node %d for restart", i)
|
||||
if err := oldNode.StopForRestart(); err != nil {
|
||||
return errors.Wrap(err, "failed to stop node for restart")
|
||||
}
|
||||
|
||||
// Wait a moment for the process to fully terminate
|
||||
time.Sleep(2 * time.Second)
|
||||
|
||||
// Execute the pre-restart hook if provided
|
||||
if preHook != nil {
|
||||
log.Infof("Executing pre-restart hook for beacon node %d", i)
|
||||
if err := preHook(s, i); err != nil {
|
||||
return errors.Wrap(err, "pre-restart hook failed")
|
||||
}
|
||||
}
|
||||
|
||||
// Create a new config with extra flags
|
||||
newConfig := *s.config
|
||||
newConfig.BeaconFlags = append(slices.Clone(s.config.BeaconFlags), extraFlags...)
|
||||
|
||||
// Create a new node that will preserve the data directory
|
||||
newNode := NewBeaconNodeForRestart(&newConfig, oldNode.index, oldNode.enr)
|
||||
s.nodes[i] = newNode
|
||||
|
||||
// Start the new node in a goroutine
|
||||
startErrCh := make(chan error, 1)
|
||||
go func() {
|
||||
if err := newNode.Start(ctx); err != nil {
|
||||
// Only report error if context wasn't cancelled
|
||||
if ctx.Err() == nil {
|
||||
startErrCh <- err
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
// Wait for node to start or timeout
|
||||
select {
|
||||
case <-newNode.Started():
|
||||
log.Infof("Beacon node %d restarted successfully with extra flags: %v", i, extraFlags)
|
||||
return nil
|
||||
case err := <-startErrCh:
|
||||
return errors.Wrap(err, "failed to start restarted beacon node")
|
||||
case <-time.After(2 * time.Minute):
|
||||
return errors.New("timeout waiting for restarted beacon node to start")
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
}
|
||||
}
|
||||
|
||||
// BeaconNode represents beacon node.
|
||||
type BeaconNode struct {
|
||||
e2etypes.ComponentRunner
|
||||
config *e2etypes.E2EConfig
|
||||
started chan struct{}
|
||||
index int
|
||||
enr string
|
||||
peerID string
|
||||
cmd *exec.Cmd
|
||||
config *e2etypes.E2EConfig
|
||||
started chan struct{}
|
||||
index int
|
||||
enr string
|
||||
peerID string
|
||||
cmd *exec.Cmd
|
||||
isRestart bool // If true, don't clear DB on start
|
||||
restarting atomic.Bool // Set to true when being intentionally stopped for restart
|
||||
}
|
||||
|
||||
// NewBeaconNode creates and returns a beacon node.
|
||||
func NewBeaconNode(config *e2etypes.E2EConfig, index int, enr string) *BeaconNode {
|
||||
return &BeaconNode{
|
||||
config: config,
|
||||
index: index,
|
||||
enr: enr,
|
||||
started: make(chan struct{}, 1),
|
||||
config: config,
|
||||
index: index,
|
||||
enr: enr,
|
||||
started: make(chan struct{}, 1),
|
||||
isRestart: false,
|
||||
}
|
||||
}
|
||||
|
||||
// NewBeaconNodeForRestart creates a beacon node configured for restart (preserves DB).
|
||||
func NewBeaconNodeForRestart(config *e2etypes.E2EConfig, index int, enr string) *BeaconNode {
|
||||
return &BeaconNode{
|
||||
config: config,
|
||||
index: index,
|
||||
enr: enr,
|
||||
started: make(chan struct{}, 1),
|
||||
isRestart: true,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -273,9 +436,12 @@ func (node *BeaconNode) Start(ctx context.Context) error {
|
||||
fmt.Sprintf("--%s=%s", cmdshared.ChainConfigFileFlag.Name, cfgPath),
|
||||
"--" + cmdshared.ValidatorMonitorIndicesFlag.Name + "=1",
|
||||
"--" + cmdshared.ValidatorMonitorIndicesFlag.Name + "=2",
|
||||
"--" + cmdshared.ForceClearDB.Name,
|
||||
"--" + cmdshared.AcceptTosFlag.Name,
|
||||
}
|
||||
// Only clear DB on initial start, not on restart
|
||||
if !node.isRestart {
|
||||
args = append(args, "--"+cmdshared.ForceClearDB.Name)
|
||||
}
|
||||
if config.UsePprof {
|
||||
args = append(args, "--pprof", fmt.Sprintf("--pprofport=%d", e2e.TestParams.Ports.PrysmBeaconNodePprofPort+index))
|
||||
}
|
||||
@@ -324,7 +490,14 @@ func (node *BeaconNode) Start(ctx context.Context) error {
|
||||
close(node.started)
|
||||
|
||||
node.cmd = cmd
|
||||
return cmd.Wait()
|
||||
err = cmd.Wait()
|
||||
// If the node was intentionally stopped for restart, don't propagate the error
|
||||
// to avoid failing the errgroup
|
||||
if err != nil && node.restarting.Load() {
|
||||
log.Infof("Beacon node %d stopped for restart (not an error)", index)
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// Started checks whether beacon node is started and ready to be queried.
|
||||
@@ -347,6 +520,18 @@ func (node *BeaconNode) Stop() error {
|
||||
return node.cmd.Process.Kill()
|
||||
}
|
||||
|
||||
// StopForRestart stops the component for restart, setting a flag so the errgroup knows
|
||||
// this is an intentional stop and shouldn't fail the test.
|
||||
func (node *BeaconNode) StopForRestart() error {
|
||||
node.restarting.Store(true)
|
||||
return node.cmd.Process.Kill()
|
||||
}
|
||||
|
||||
// IsRestarting returns true if the node was intentionally stopped for restart.
|
||||
func (node *BeaconNode) IsRestarting() bool {
|
||||
return node.restarting.Load()
|
||||
}
|
||||
|
||||
func (node *BeaconNode) UnderlyingProcess() *os.Process {
|
||||
return node.cmd.Process
|
||||
}
|
||||
@@ -362,3 +547,159 @@ func GenerateGenesis(ctx context.Context) (state.BeaconState, error) {
|
||||
version := e2etypes.GenesisFork()
|
||||
return interop.NewPreminedGenesis(ctx, t, nvals, pcreds, version, gb)
|
||||
}
|
||||
|
||||
// copyFile copies a file from src to dst.
|
||||
func copyFile(src, dst string) error {
|
||||
input, err := os.ReadFile(src)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return os.WriteFile(dst, input, 0644)
|
||||
}
|
||||
|
||||
// Bucket and key names for custody info in BoltDB - must match beacon-chain/db/kv/schema.go
|
||||
var (
|
||||
custodyBucket = []byte("custody")
|
||||
groupCountKey = []byte("group-count")
|
||||
earliestAvailableSlotKey = []byte("earliest-available-slot")
|
||||
)
|
||||
|
||||
// SetEarliestSlotForNode directly sets the earliestAvailableSlot in a beacon node's database
|
||||
// without modifying the custody group count. The node MUST be stopped before calling this function.
|
||||
// This is used for testing to verify that earliestAvailableSlot never decreases.
|
||||
func (s *BeaconNodeSet) SetEarliestSlotForNode(nodeIndex int, earliestSlot primitives.Slot) error {
|
||||
if nodeIndex >= len(s.nodes) {
|
||||
return errors.Errorf("node index %d out of range (max %d)", nodeIndex, len(s.nodes)-1)
|
||||
}
|
||||
|
||||
// Construct the path to the beacon node's database
|
||||
// The beacon node stores its DB in a "beaconchaindata" subdirectory
|
||||
dataDir := fmt.Sprintf("%s/eth2-beacon-node-%d", e2e.TestParams.TestPath, nodeIndex)
|
||||
dbPath := path.Join(dataDir, "beaconchaindata", "beaconchain.db")
|
||||
|
||||
// Open the BoltDB database
|
||||
db, err := bolt.Open(dbPath, 0600, &bolt.Options{Timeout: 5 * time.Second})
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to open beacon node database")
|
||||
}
|
||||
defer func() {
|
||||
if closeErr := db.Close(); closeErr != nil {
|
||||
log.WithError(closeErr).Error("Failed to close beacon node database")
|
||||
}
|
||||
}()
|
||||
|
||||
// Update only the earliest available slot
|
||||
if err := db.Update(func(tx *bolt.Tx) error {
|
||||
bucket, err := tx.CreateBucketIfNotExists(custodyBucket)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "create custody bucket")
|
||||
}
|
||||
|
||||
// Store the earliest available slot
|
||||
slotBytes := bytesutil.Uint64ToBytesBigEndian(uint64(earliestSlot))
|
||||
if err := bucket.Put(earliestAvailableSlotKey, slotBytes); err != nil {
|
||||
return errors.Wrap(err, "put earliest available slot")
|
||||
}
|
||||
|
||||
return nil
|
||||
}); err != nil {
|
||||
return errors.Wrap(err, "update earliest slot in database")
|
||||
}
|
||||
|
||||
log.WithFields(map[string]any{
|
||||
"nodeIndex": nodeIndex,
|
||||
"earliestAvailableSlot": earliestSlot,
|
||||
"dbPath": dbPath,
|
||||
}).Info("Set earliest available slot directly in beacon node database")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetCustodyInfoForNode directly modifies the custody info in a beacon node's database.
|
||||
// The node MUST be stopped before calling this function.
|
||||
// This is used for testing to simulate the state where maintainCustodyInfo() has updated
|
||||
// the earliestAvailableSlot to a higher value.
|
||||
func (s *BeaconNodeSet) SetCustodyInfoForNode(nodeIndex int, earliestSlot primitives.Slot, custodyGroupCount uint64) error {
|
||||
if nodeIndex >= len(s.nodes) {
|
||||
return errors.Errorf("node index %d out of range (max %d)", nodeIndex, len(s.nodes)-1)
|
||||
}
|
||||
|
||||
// Construct the path to the beacon node's database
|
||||
// The beacon node stores its DB in a "beaconchaindata" subdirectory
|
||||
dataDir := fmt.Sprintf("%s/eth2-beacon-node-%d", e2e.TestParams.TestPath, nodeIndex)
|
||||
dbPath := path.Join(dataDir, "beaconchaindata", "beaconchain.db")
|
||||
|
||||
// Open the BoltDB database
|
||||
db, err := bolt.Open(dbPath, 0600, &bolt.Options{Timeout: 5 * time.Second})
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to open beacon node database")
|
||||
}
|
||||
defer func() {
|
||||
if closeErr := db.Close(); closeErr != nil {
|
||||
log.WithError(closeErr).Error("Failed to close beacon node database")
|
||||
}
|
||||
}()
|
||||
|
||||
// Update the custody info
|
||||
if err := db.Update(func(tx *bolt.Tx) error {
|
||||
bucket, err := tx.CreateBucketIfNotExists(custodyBucket)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "create custody bucket")
|
||||
}
|
||||
|
||||
// Store the earliest available slot
|
||||
slotBytes := bytesutil.Uint64ToBytesBigEndian(uint64(earliestSlot))
|
||||
if err := bucket.Put(earliestAvailableSlotKey, slotBytes); err != nil {
|
||||
return errors.Wrap(err, "put earliest available slot")
|
||||
}
|
||||
|
||||
// Store the custody group count
|
||||
countBytes := bytesutil.Uint64ToBytesBigEndian(custodyGroupCount)
|
||||
if err := bucket.Put(groupCountKey, countBytes); err != nil {
|
||||
return errors.Wrap(err, "put custody group count")
|
||||
}
|
||||
|
||||
return nil
|
||||
}); err != nil {
|
||||
return errors.Wrap(err, "update custody info in database")
|
||||
}
|
||||
|
||||
// Verify the write by reading back the values
|
||||
var verifiedSlot, verifiedCount uint64
|
||||
if err := db.View(func(tx *bolt.Tx) error {
|
||||
bucket := tx.Bucket(custodyBucket)
|
||||
if bucket == nil {
|
||||
return errors.New("custody bucket not found after write")
|
||||
}
|
||||
|
||||
slotBytes := bucket.Get(earliestAvailableSlotKey)
|
||||
if slotBytes != nil {
|
||||
verifiedSlot = bytesutil.BytesToUint64BigEndian(slotBytes)
|
||||
}
|
||||
|
||||
countBytes := bucket.Get(groupCountKey)
|
||||
if countBytes != nil {
|
||||
verifiedCount = bytesutil.BytesToUint64BigEndian(countBytes)
|
||||
}
|
||||
|
||||
return nil
|
||||
}); err != nil {
|
||||
return errors.Wrap(err, "verify custody info after write")
|
||||
}
|
||||
|
||||
log.WithFields(map[string]any{
|
||||
"nodeIndex": nodeIndex,
|
||||
"earliestAvailableSlot": earliestSlot,
|
||||
"custodyGroupCount": custodyGroupCount,
|
||||
"verifiedSlot": verifiedSlot,
|
||||
"verifiedCount": verifiedCount,
|
||||
"dbPath": dbPath,
|
||||
}).Info("Set custody info directly in beacon node database")
|
||||
|
||||
if verifiedSlot != uint64(earliestSlot) || verifiedCount != custodyGroupCount {
|
||||
return errors.Errorf("verification failed: wrote slot=%d count=%d, read slot=%d count=%d",
|
||||
earliestSlot, custodyGroupCount, verifiedSlot, verifiedCount)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ go_library(
|
||||
"//testing/endtoend/types:go_default_library",
|
||||
"//testing/middleware/engine-api-proxy:go_default_library",
|
||||
"//testing/util:go_default_library",
|
||||
"//time/slots:go_default_library",
|
||||
"@com_github_ethereum_go_ethereum//:go_default_library",
|
||||
"@com_github_ethereum_go_ethereum//accounts/abi/bind:go_default_library",
|
||||
"@com_github_ethereum_go_ethereum//accounts/keystore:go_default_library",
|
||||
@@ -38,8 +39,6 @@ go_library(
|
||||
"@com_github_ethereum_go_ethereum//ethclient/gethclient:go_default_library",
|
||||
"@com_github_ethereum_go_ethereum//rpc:go_default_library",
|
||||
"@com_github_holiman_uint256//:go_default_library",
|
||||
"@com_github_mariusvanderwijden_fuzzyvm//filler:go_default_library",
|
||||
"@com_github_mariusvanderwijden_tx_fuzz//:go_default_library",
|
||||
"@com_github_pkg_errors//:go_default_library",
|
||||
"@com_github_sirupsen_logrus//:go_default_library",
|
||||
"@io_bazel_rules_go//go/tools/bazel:go_default_library",
|
||||
|
||||
@@ -267,6 +267,10 @@ func (d *Depositor) txops(ctx context.Context) (*bind.TransactOpts, error) {
|
||||
return nil, err
|
||||
}
|
||||
txo.Nonce = big.NewInt(0).SetUint64(nonce)
|
||||
// Set a high gas price to ensure deposit transactions can replace any pending
|
||||
// transactions from the transaction generator that may be using the same nonce.
|
||||
// The transaction generator uses 1e11 (100 Gwei), so we use 2e11 (200 Gwei).
|
||||
txo.GasPrice = big.NewInt(2e11)
|
||||
return txo, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -10,12 +10,11 @@ import (
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/MariusVanDerWijden/FuzzyVM/filler"
|
||||
txfuzz "github.com/MariusVanDerWijden/tx-fuzz"
|
||||
fieldparams "github.com/OffchainLabs/prysm/v7/config/fieldparams"
|
||||
"github.com/OffchainLabs/prysm/v7/config/params"
|
||||
"github.com/OffchainLabs/prysm/v7/crypto/rand"
|
||||
e2e "github.com/OffchainLabs/prysm/v7/testing/endtoend/params"
|
||||
"github.com/OffchainLabs/prysm/v7/time/slots"
|
||||
"github.com/ethereum/go-ethereum"
|
||||
"github.com/ethereum/go-ethereum/accounts/keystore"
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
@@ -67,7 +66,7 @@ func (t *TransactionGenerator) Start(ctx context.Context) error {
|
||||
newGen := rand.NewDeterministicGenerator()
|
||||
if seed == 0 {
|
||||
seed = newGen.Int63()
|
||||
logrus.Infof("Seed for transaction generator is: %d", seed)
|
||||
logrus.WithField("Seed", seed).Info("Transaction generator")
|
||||
}
|
||||
// Set seed so that all transactions can be
|
||||
// deterministically generated.
|
||||
@@ -86,12 +85,21 @@ func (t *TransactionGenerator) Start(ctx context.Context) error {
|
||||
return err
|
||||
}
|
||||
fundedAccount = newKey
|
||||
rnd := make([]byte, 10000)
|
||||
_, err = mathRand.Read(rnd) // #nosec G404
|
||||
if err != nil {
|
||||
// Ensure funding tx is mined before generating txs that rely on balance.
|
||||
// Mine 1 block using the miner key to include the funding transfer.
|
||||
backend := ethclient.NewClient(client)
|
||||
defer backend.Close()
|
||||
|
||||
if err := WaitForBlocks(ctx, backend, mineKey, 1); err != nil {
|
||||
return errors.Wrap(err, "failed to mine block for funding tx")
|
||||
}
|
||||
|
||||
// Ensure the funded account has a comfortable minimum balance for blob and fuzzed txs.
|
||||
minWei := new(big.Int).Mul(big.NewInt(1000), big.NewInt(0).SetUint64(params.BeaconConfig().GweiPerEth))
|
||||
minWei.Mul(minWei, big.NewInt(1e9)) // 1000 ETH in wei
|
||||
if err := ensureMinBalance(ctx, client, backend, mineKey, fundedAccount, minWei); err != nil {
|
||||
return err
|
||||
}
|
||||
f := filler.NewFiller(rnd)
|
||||
// Broadcast Transactions every slot
|
||||
txPeriod := time.Duration(params.BeaconConfig().SecondsPerSlot) * time.Second
|
||||
ticker := time.NewTicker(txPeriod)
|
||||
@@ -105,7 +113,7 @@ func (t *TransactionGenerator) Start(ctx context.Context) error {
|
||||
continue
|
||||
}
|
||||
backend := ethclient.NewClient(client)
|
||||
err = SendTransaction(client, mineKey.PrivateKey, f, gasPrice, mineKey.Address.String(), txCount, backend, false)
|
||||
err = SendTransaction(client, mineKey.PrivateKey, gasPrice, mineKey.Address.String(), txCount, backend, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -119,7 +127,7 @@ func (s *TransactionGenerator) Started() <-chan struct{} {
|
||||
return s.started
|
||||
}
|
||||
|
||||
func SendTransaction(client *rpc.Client, key *ecdsa.PrivateKey, f *filler.Filler, gasPrice *big.Int, addr string, N uint64, backend *ethclient.Client, al bool) error {
|
||||
func SendTransaction(client *rpc.Client, key *ecdsa.PrivateKey, gasPrice *big.Int, addr string, txCount uint64, backend *ethclient.Client, al bool) error {
|
||||
sender := common.HexToAddress(addr)
|
||||
nonce, err := backend.PendingNonceAt(context.Background(), fundedAccount.Address)
|
||||
if err != nil {
|
||||
@@ -136,30 +144,65 @@ func SendTransaction(client *rpc.Client, key *ecdsa.PrivateKey, f *filler.Filler
|
||||
if expectedPrice.Cmp(gasPrice) > 0 {
|
||||
gasPrice = expectedPrice
|
||||
}
|
||||
|
||||
// Check if we're post-Fulu fork
|
||||
currentSlot := slots.CurrentSlot(e2e.TestParams.CLGenesisTime)
|
||||
currentEpoch := slots.ToEpoch(currentSlot)
|
||||
fuluForkEpoch := params.BeaconConfig().FuluForkEpoch
|
||||
isPostFulu := currentEpoch >= fuluForkEpoch
|
||||
|
||||
g, _ := errgroup.WithContext(context.Background())
|
||||
txs := make([]*types.Transaction, 10)
|
||||
for i := range uint64(10) {
|
||||
index := i
|
||||
g.Go(func() error {
|
||||
tx, err := RandomBlobTx(client, f, fundedAccount.Address, nonce+index, gasPrice, chainid, al)
|
||||
if err != nil {
|
||||
logrus.WithError(err).Error("Could not create blob tx")
|
||||
// In the event the transaction constructed is not valid, we continue with the routine
|
||||
// rather than complete stop it.
|
||||
//nolint:nilerr
|
||||
|
||||
// Send blob transactions - use different versions pre/post Fulu
|
||||
if isPostFulu {
|
||||
logrus.Info("Sending blob transactions with cell proofs")
|
||||
// Reduced from 10 to 5 to conserve funds during extended test runs
|
||||
for index := range uint64(5) {
|
||||
|
||||
g.Go(func() error {
|
||||
tx, err := RandomBlobCellTx(client, fundedAccount.Address, nonce+index, gasPrice, chainid, al)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Could not create blob cell tx")
|
||||
}
|
||||
|
||||
signedTx, err := types.SignTx(tx, types.NewCancunSigner(chainid), fundedAccount.PrivateKey)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Could not sign blob cell tx")
|
||||
}
|
||||
|
||||
txs[index] = signedTx
|
||||
return nil
|
||||
}
|
||||
signedTx, err := types.SignTx(tx, types.NewCancunSigner(chainid), fundedAccount.PrivateKey)
|
||||
if err != nil {
|
||||
logrus.WithError(err).Error("Could not sign blob tx")
|
||||
// We continue on in the event there is a reason we can't sign this
|
||||
// transaction(unlikely).
|
||||
//nolint:nilerr
|
||||
})
|
||||
}
|
||||
} else {
|
||||
logrus.Info("Sending blob transactions with sidecars")
|
||||
// Reduced from 10 to 5 to conserve funds during extended test runs
|
||||
for index := range uint64(5) {
|
||||
|
||||
g.Go(func() error {
|
||||
tx, err := RandomBlobTx(client, fundedAccount.Address, nonce+index, gasPrice, chainid, al)
|
||||
if err != nil {
|
||||
logrus.WithError(err).Error("Could not create blob tx")
|
||||
// In the event the transaction constructed is not valid, we continue with the routine
|
||||
// rather than complete stop it.
|
||||
//nolint:nilerr
|
||||
return nil
|
||||
}
|
||||
|
||||
signedTx, err := types.SignTx(tx, types.NewCancunSigner(chainid), fundedAccount.PrivateKey)
|
||||
if err != nil {
|
||||
logrus.WithError(err).Error("Could not sign blob tx")
|
||||
// We continue on in the event there is a reason we can't sign this
|
||||
// transaction(unlikely).
|
||||
//nolint:nilerr
|
||||
return nil
|
||||
}
|
||||
|
||||
txs[index] = signedTx
|
||||
return nil
|
||||
}
|
||||
txs[index] = signedTx
|
||||
return nil
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if err := g.Wait(); err != nil {
|
||||
@@ -169,6 +212,7 @@ func SendTransaction(client *rpc.Client, key *ecdsa.PrivateKey, f *filler.Filler
|
||||
if tx == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
err = backend.SendTransaction(context.Background(), tx)
|
||||
if err != nil {
|
||||
// Do nothing
|
||||
@@ -181,17 +225,20 @@ func SendTransaction(client *rpc.Client, key *ecdsa.PrivateKey, f *filler.Filler
|
||||
return err
|
||||
}
|
||||
|
||||
txs = make([]*types.Transaction, N)
|
||||
for i := range N {
|
||||
index := i
|
||||
txs = make([]*types.Transaction, txCount)
|
||||
for index := range txCount {
|
||||
|
||||
g.Go(func() error {
|
||||
tx, err := txfuzz.RandomValidTx(client, f, sender, nonce+index, gasPrice, chainid, al)
|
||||
tx, err := randomValidTx(sender, nonce+index, gasPrice, chainid, al)
|
||||
if err != nil {
|
||||
// In the event the transaction constructed is not valid, we continue with the routine
|
||||
// rather than complete stop it.
|
||||
//nolint:nilerr
|
||||
return nil
|
||||
}
|
||||
// Clamp gas to avoid exceeding common EL per-tx gas caps (e.g. 16,777,216) due to EIP-7825: Transaction Gas Limit Cap
|
||||
tx = clampTxGas(tx, 16_000_000)
|
||||
|
||||
signedTx, err := types.SignTx(tx, types.NewLondonSigner(chainid), key)
|
||||
if err != nil {
|
||||
// We continue on in the event there is a reason we can't sign this
|
||||
@@ -237,11 +284,13 @@ func (t *TransactionGenerator) Stop() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func RandomBlobTx(rpc *rpc.Client, f *filler.Filler, sender common.Address, nonce uint64, gasPrice, chainID *big.Int, al bool) (*types.Transaction, error) {
|
||||
func RandomBlobCellTx(rpc *rpc.Client, sender common.Address, nonce uint64, gasPrice, chainID *big.Int, al bool) (*types.Transaction, error) {
|
||||
// Set fields if non-nil
|
||||
if rpc != nil {
|
||||
client := ethclient.NewClient(rpc)
|
||||
|
||||
var err error
|
||||
|
||||
if gasPrice == nil {
|
||||
gasPrice, err = client.SuggestGasPrice(context.Background())
|
||||
if err != nil {
|
||||
@@ -255,24 +304,113 @@ func RandomBlobTx(rpc *rpc.Client, f *filler.Filler, sender common.Address, nonc
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gas := uint64(100000)
|
||||
to := randomAddress()
|
||||
code := txfuzz.RandomCode(f)
|
||||
// Generate random EVM bytecode (similar to what tx-fuzz RandomCode did)
|
||||
code := generateRandomEVMCode(mathRand.Intn(128)) // #nosec G404
|
||||
value := big.NewInt(0)
|
||||
if len(code) > 128 {
|
||||
code = code[:128]
|
||||
}
|
||||
|
||||
mod := 2
|
||||
if al {
|
||||
mod = 1
|
||||
}
|
||||
switch f.Byte() % byte(mod) {
|
||||
|
||||
// #nosec G404 -- Test code uses deterministic randomness
|
||||
switch mathRand.Intn(mod) {
|
||||
case 0:
|
||||
// 4844 transaction without AL
|
||||
// Blob transaction with cell proofs (Version 1 sidecar)
|
||||
tip, feecap, err := getCaps(rpc, gasPrice)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "getCaps")
|
||||
}
|
||||
|
||||
data, err := randomBlobData()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "randomBlobData")
|
||||
}
|
||||
|
||||
return New4844CellTx(nonce, &to, gas, chainID, tip, feecap, value, code, big.NewInt(1000000), data, make(types.AccessList, 0))
|
||||
case 1:
|
||||
// Blob transaction with cell proofs and access list
|
||||
tx := types.NewTx(&types.LegacyTx{
|
||||
Nonce: nonce,
|
||||
To: &to,
|
||||
Value: value,
|
||||
Gas: gas,
|
||||
GasPrice: gasPrice,
|
||||
Data: code,
|
||||
})
|
||||
|
||||
// Use legacy GasPrice for access list simulation to satisfy post-London requirement.
|
||||
msg := ethereum.CallMsg{
|
||||
From: sender,
|
||||
To: tx.To(),
|
||||
Gas: tx.Gas(),
|
||||
GasPrice: gasPrice,
|
||||
Value: tx.Value(),
|
||||
Data: tx.Data(),
|
||||
AccessList: nil,
|
||||
}
|
||||
geth := gethclient.New(rpc)
|
||||
|
||||
al, _, _, err := geth.CreateAccessList(context.Background(), msg)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "CreateAccessList")
|
||||
}
|
||||
tip, feecap, err := getCaps(rpc, gasPrice)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "getCaps")
|
||||
}
|
||||
data, err := randomBlobData()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "randomBlobData")
|
||||
}
|
||||
|
||||
return New4844CellTx(nonce, &to, gas, chainID, tip, feecap, value, code, big.NewInt(1000000), data, *al)
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func RandomBlobTx(rpc *rpc.Client, sender common.Address, nonce uint64, gasPrice, chainID *big.Int, al bool) (*types.Transaction, error) {
|
||||
// Set fields if non-nil
|
||||
if rpc != nil {
|
||||
client := ethclient.NewClient(rpc)
|
||||
var err error
|
||||
if gasPrice == nil {
|
||||
gasPrice, err = client.SuggestGasPrice(context.Background())
|
||||
if err != nil {
|
||||
gasPrice = big.NewInt(1)
|
||||
}
|
||||
}
|
||||
|
||||
if chainID == nil {
|
||||
chainID, err = client.ChainID(context.Background())
|
||||
if err != nil {
|
||||
chainID = big.NewInt(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
gas := uint64(100000)
|
||||
to := randomAddress()
|
||||
// Generate random EVM bytecode (similar to what tx-fuzz RandomCode did)
|
||||
code := generateRandomEVMCode(mathRand.Intn(128)) // #nosec G404
|
||||
value := big.NewInt(0)
|
||||
mod := 2
|
||||
if al {
|
||||
mod = 1
|
||||
}
|
||||
// #nosec G404 -- Test code uses deterministic randomness
|
||||
switch mathRand.Intn(mod) {
|
||||
case 0:
|
||||
// 4844 transaction without AL
|
||||
|
||||
tip, feecap, err := getCaps(rpc, gasPrice)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "getCaps")
|
||||
}
|
||||
|
||||
data, err := randomBlobData()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "randomBlobData")
|
||||
@@ -289,18 +427,18 @@ func RandomBlobTx(rpc *rpc.Client, f *filler.Filler, sender common.Address, nonc
|
||||
Data: code,
|
||||
})
|
||||
|
||||
// TODO: replace call with al, err := txfuzz.CreateAccessList(rpc, tx, sender) when txfuzz is fixed in new release
|
||||
// an error occurs mentioning error="CreateAccessList: both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified"
|
||||
// Use legacy GasPrice for access list simulation to satisfy post-London requirement.
|
||||
msg := ethereum.CallMsg{
|
||||
From: sender,
|
||||
To: tx.To(),
|
||||
Gas: tx.Gas(),
|
||||
GasPrice: tx.GasPrice(),
|
||||
GasPrice: gasPrice,
|
||||
Value: tx.Value(),
|
||||
Data: tx.Data(),
|
||||
AccessList: nil,
|
||||
}
|
||||
geth := gethclient.New(rpc)
|
||||
|
||||
al, _, _, err := geth.CreateAccessList(context.Background(), msg)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "CreateAccessList")
|
||||
@@ -318,6 +456,43 @@ func RandomBlobTx(rpc *rpc.Client, f *filler.Filler, sender common.Address, nonc
|
||||
return nil, errors.New("asdf")
|
||||
}
|
||||
|
||||
func New4844CellTx(nonce uint64, to *common.Address, gasLimit uint64, chainID, tip, feeCap, value *big.Int, code []byte, blobFeeCap *big.Int, blobData []byte, al types.AccessList) (*types.Transaction, error) {
|
||||
blobs, comms, _, versionedHashes, err := EncodeBlobs(blobData)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to encode blobs")
|
||||
}
|
||||
|
||||
// Create a Version 0 sidecar first
|
||||
sidecar := &types.BlobTxSidecar{
|
||||
Version: types.BlobSidecarVersion0,
|
||||
Blobs: blobs,
|
||||
Commitments: comms,
|
||||
Proofs: make([]kzg4844.Proof, len(blobs)), // Placeholder, will be replaced by ToV1
|
||||
}
|
||||
|
||||
// Convert to Version 1 which will compute and attach cell proofs
|
||||
if err := sidecar.ToV1(); err != nil {
|
||||
return nil, errors.Wrap(err, "failed to convert sidecar to V1")
|
||||
}
|
||||
|
||||
tx := types.NewTx(&types.BlobTx{
|
||||
ChainID: uint256.MustFromBig(chainID),
|
||||
Nonce: nonce,
|
||||
GasTipCap: uint256.MustFromBig(tip),
|
||||
GasFeeCap: uint256.MustFromBig(feeCap),
|
||||
Gas: gasLimit,
|
||||
To: *to,
|
||||
Value: uint256.MustFromBig(value),
|
||||
Data: code,
|
||||
AccessList: al,
|
||||
BlobFeeCap: uint256.MustFromBig(blobFeeCap),
|
||||
BlobHashes: versionedHashes,
|
||||
Sidecar: sidecar,
|
||||
})
|
||||
|
||||
return tx, nil
|
||||
}
|
||||
|
||||
func New4844Tx(nonce uint64, to *common.Address, gasLimit uint64, chainID, tip, feeCap, value *big.Int, code []byte, blobFeeCap *big.Int, blobData []byte, al types.AccessList) *types.Transaction {
|
||||
blobs, comms, proofs, versionedHashes, err := EncodeBlobs(blobData)
|
||||
if err != nil {
|
||||
@@ -344,6 +519,78 @@ func New4844Tx(nonce uint64, to *common.Address, gasLimit uint64, chainID, tip,
|
||||
return tx
|
||||
}
|
||||
|
||||
// clampTxGas returns a copy of tx with Gas reduced to cap if it exceeds cap.
|
||||
// This avoids EL errors like "transaction gas limit too high" on networks with
|
||||
// per-transaction gas caps (commonly ~16,777,216).
|
||||
func clampTxGas(tx *types.Transaction, gasCap uint64) *types.Transaction {
|
||||
if tx == nil || tx.Gas() <= gasCap {
|
||||
return tx
|
||||
}
|
||||
|
||||
to := tx.To()
|
||||
switch tx.Type() {
|
||||
case types.LegacyTxType:
|
||||
return types.NewTx(&types.LegacyTx{
|
||||
Nonce: tx.Nonce(),
|
||||
To: to,
|
||||
Value: tx.Value(),
|
||||
Gas: gasCap,
|
||||
GasPrice: tx.GasPrice(),
|
||||
Data: tx.Data(),
|
||||
})
|
||||
case types.AccessListTxType:
|
||||
return types.NewTx(&types.AccessListTx{
|
||||
ChainID: tx.ChainId(),
|
||||
Nonce: tx.Nonce(),
|
||||
To: to,
|
||||
Value: tx.Value(),
|
||||
Gas: gasCap,
|
||||
GasPrice: tx.GasPrice(),
|
||||
Data: tx.Data(),
|
||||
AccessList: tx.AccessList(),
|
||||
})
|
||||
case types.DynamicFeeTxType:
|
||||
return types.NewTx(&types.DynamicFeeTx{
|
||||
ChainID: tx.ChainId(),
|
||||
Nonce: tx.Nonce(),
|
||||
To: to,
|
||||
Value: tx.Value(),
|
||||
Gas: gasCap,
|
||||
Data: tx.Data(),
|
||||
AccessList: tx.AccessList(),
|
||||
GasTipCap: tx.GasTipCap(),
|
||||
GasFeeCap: tx.GasFeeCap(),
|
||||
})
|
||||
case types.BlobTxType:
|
||||
// Leave blob txs unchanged here; blob tx construction paths set gas explicitly.
|
||||
return tx
|
||||
default:
|
||||
return tx
|
||||
}
|
||||
}
|
||||
|
||||
// ensureMinBalance tops up dest account from miner if its balance is below minWei.
|
||||
func ensureMinBalance(ctx context.Context, rpcCli *rpc.Client, backend *ethclient.Client, minerKey, destKey *keystore.Key, minWei *big.Int) error {
|
||||
bal, err := backend.BalanceAt(ctx, destKey.Address, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if bal.Cmp(minWei) >= 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := fundAccount(rpcCli, minerKey, destKey); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := WaitForBlocks(ctx, backend, minerKey, 1); err != nil {
|
||||
return errors.Wrap(err, "failed to mine block for top-up tx")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func encodeBlobs(data []byte) []kzg4844.Blob {
|
||||
blobs := []kzg4844.Blob{{}}
|
||||
blobIndex := 0
|
||||
@@ -468,7 +715,8 @@ func fundAccount(client *rpc.Client, sourceKey, destKey *keystore.Key) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
val, ok := big.NewInt(0).SetString("10000000000000000000000000", 10)
|
||||
// Increased funding to 100 million ETH to handle extended test runs with blob transactions
|
||||
val, ok := big.NewInt(0).SetString("100000000000000000000000000", 10)
|
||||
if !ok {
|
||||
return errors.New("could not set big int for value")
|
||||
}
|
||||
@@ -479,3 +727,132 @@ func fundAccount(client *rpc.Client, sourceKey, destKey *keystore.Key) error {
|
||||
}
|
||||
return backend.SendTransaction(context.Background(), signedTx)
|
||||
}
|
||||
|
||||
// generateRandomEVMCode generates random but valid-looking EVM bytecode
|
||||
// This mimics what tx-fuzz's RandomCode did (which used FuzzyVM's generator)
|
||||
func generateRandomEVMCode(maxLen int) []byte {
|
||||
if maxLen == 0 {
|
||||
return []byte{}
|
||||
}
|
||||
|
||||
// Common EVM opcodes that are safe for testing
|
||||
// Including: PUSH, DUP, SWAP, arithmetic, logic, and STOP
|
||||
safeOpcodes := []byte{
|
||||
0x00, // STOP
|
||||
0x01, // ADD
|
||||
0x02, // MUL
|
||||
0x03, // SUB
|
||||
0x04, // DIV
|
||||
0x10, // LT
|
||||
0x11, // GT
|
||||
0x14, // EQ
|
||||
0x16, // AND
|
||||
0x17, // OR
|
||||
0x18, // XOR
|
||||
0x50, // POP
|
||||
0x52, // MSTORE
|
||||
0x54, // SLOAD
|
||||
0x55, // SSTORE
|
||||
0x56, // JUMP
|
||||
0x57, // JUMPI
|
||||
0x58, // PC
|
||||
0x59, // MSIZE
|
||||
0x5A, // GAS
|
||||
0x60, // PUSH1
|
||||
0x80, // DUP1
|
||||
0x90, // SWAP1
|
||||
}
|
||||
|
||||
code := make([]byte, 0, maxLen)
|
||||
for i := 0; i < maxLen; i++ {
|
||||
opcode := safeOpcodes[mathRand.Intn(len(safeOpcodes))] // #nosec G404
|
||||
code = append(code, opcode)
|
||||
|
||||
// If PUSH1, add a random byte
|
||||
if opcode == 0x60 && i+1 < maxLen {
|
||||
code = append(code, byte(mathRand.Intn(256))) // #nosec G404
|
||||
i++
|
||||
}
|
||||
}
|
||||
|
||||
return code
|
||||
}
|
||||
|
||||
// randomValidTx generates a random valid transaction
|
||||
// This replaces tx-fuzz's RandomValidTx functionality
|
||||
func randomValidTx(sender common.Address, nonce uint64, gasPrice, chainID *big.Int, forceAccessList bool) (*types.Transaction, error) {
|
||||
gas := uint64(21000 + mathRand.Intn(100000)) // #nosec G404
|
||||
to := randomAddress()
|
||||
code := generateRandomEVMCode(mathRand.Intn(256)) // #nosec G404
|
||||
value := big.NewInt(0)
|
||||
|
||||
// Randomly choose transaction type
|
||||
// 0: Legacy, 1: AccessList, 2: DynamicFee
|
||||
txType := mathRand.Intn(3) // #nosec G404
|
||||
if forceAccessList {
|
||||
txType = 1 // Force AccessList type
|
||||
}
|
||||
|
||||
switch txType {
|
||||
case 0:
|
||||
// Legacy transaction
|
||||
return types.NewTx(&types.LegacyTx{
|
||||
Nonce: nonce,
|
||||
To: &to,
|
||||
Value: value,
|
||||
Gas: gas,
|
||||
GasPrice: gasPrice,
|
||||
Data: code,
|
||||
}), nil
|
||||
case 1:
|
||||
// AccessList transaction
|
||||
accessList := make(types.AccessList, 0)
|
||||
// Optionally add some random access list entries
|
||||
// #nosec G404 -- Test code uses deterministic randomness
|
||||
if mathRand.Intn(2) == 0 {
|
||||
// #nosec G404 -- Test code uses deterministic randomness
|
||||
numEntries := mathRand.Intn(3) + 1
|
||||
for range numEntries {
|
||||
addr := randomAddress()
|
||||
storageKeys := make([]common.Hash, mathRand.Intn(3)) // #nosec G404
|
||||
for j := range storageKeys {
|
||||
b := make([]byte, 32)
|
||||
_, _ = mathRand.Read(b) // #nosec G404
|
||||
storageKeys[j] = common.BytesToHash(b)
|
||||
}
|
||||
accessList = append(accessList, types.AccessTuple{
|
||||
Address: addr,
|
||||
StorageKeys: storageKeys,
|
||||
})
|
||||
}
|
||||
}
|
||||
return types.NewTx(&types.AccessListTx{
|
||||
ChainID: chainID,
|
||||
Nonce: nonce,
|
||||
To: &to,
|
||||
Value: value,
|
||||
Gas: gas,
|
||||
GasPrice: gasPrice,
|
||||
Data: code,
|
||||
AccessList: accessList,
|
||||
}), nil
|
||||
case 2:
|
||||
// DynamicFee transaction (EIP-1559)
|
||||
tip := new(big.Int).Div(gasPrice, big.NewInt(10)) // 10% tip
|
||||
feeCap := new(big.Int).Add(gasPrice, tip)
|
||||
accessList := make(types.AccessList, 0)
|
||||
return types.NewTx(&types.DynamicFeeTx{
|
||||
ChainID: chainID,
|
||||
Nonce: nonce,
|
||||
To: &to,
|
||||
Value: value,
|
||||
Gas: gas,
|
||||
GasTipCap: tip,
|
||||
GasFeeCap: feeCap,
|
||||
Data: code,
|
||||
AccessList: accessList,
|
||||
}), nil
|
||||
}
|
||||
|
||||
return nil, errors.New("invalid transaction type")
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ func e2eMinimal(t *testing.T, cfg *params.BeaconChainConfig, cfgo ...types.E2ECo
|
||||
require.NoError(t, e2eParams.Init(t, e2eParams.StandardBeaconCount))
|
||||
|
||||
var err error
|
||||
epochsToRun := 16
|
||||
epochsToRun := 18
|
||||
epochStr, longRunning := os.LookupEnv("E2E_EPOCHS")
|
||||
if longRunning {
|
||||
epochsToRun, err = strconv.Atoi(epochStr)
|
||||
@@ -64,6 +64,7 @@ func e2eMinimal(t *testing.T, cfg *params.BeaconChainConfig, cfgo ...types.E2ECo
|
||||
evals = addIfForkSet(evals, cfg.CapellaForkEpoch, ev.CapellaForkTransition)
|
||||
evals = addIfForkSet(evals, cfg.DenebForkEpoch, ev.DenebForkTransition)
|
||||
evals = addIfForkSet(evals, cfg.ElectraForkEpoch, ev.ElectraForkTransition)
|
||||
evals = addIfForkSet(evals, cfg.FuluForkEpoch, ev.FuluForkTransition)
|
||||
|
||||
testConfig := &types.E2EConfig{
|
||||
BeaconFlags: []string{
|
||||
|
||||
@@ -195,11 +195,12 @@ func (r *testRunner) runEvaluators(ec *e2etypes.EvaluationContext, conns []*grpc
|
||||
secondsPerEpoch := uint64(params.BeaconConfig().SlotsPerEpoch.Mul(params.BeaconConfig().SecondsPerSlot))
|
||||
ticker := helpers.NewEpochTicker(tickingStartTime, secondsPerEpoch)
|
||||
for currentEpoch := range ticker.C() {
|
||||
if config.EvalInterceptor(ec, currentEpoch, conns) {
|
||||
continue
|
||||
intercepted := config.EvalInterceptor(ec, currentEpoch, conns)
|
||||
if !intercepted {
|
||||
r.executeProvidedEvaluators(ec, currentEpoch, conns, config.Evaluators)
|
||||
}
|
||||
r.executeProvidedEvaluators(ec, currentEpoch, conns, config.Evaluators)
|
||||
|
||||
// Check termination condition regardless of whether evaluators were intercepted
|
||||
if t.Failed() || currentEpoch >= config.EpochsToRun-1 {
|
||||
ticker.Done()
|
||||
if t.Failed() {
|
||||
@@ -225,9 +226,9 @@ func (r *testRunner) testDepositsAndTx(ctx context.Context, g *errgroup.Group,
|
||||
if err := helpers.ComponentsStarted(ctx, []e2etypes.ComponentRunner{r.depositor}); err != nil {
|
||||
return errors.Wrap(err, "testDepositsAndTx unable to run, depositor did not Start")
|
||||
}
|
||||
go func() {
|
||||
if r.config.TestDeposits {
|
||||
log.Info("Running deposit tests")
|
||||
go func() {
|
||||
if r.config.TestDeposits {
|
||||
log.Info("Running deposit tests")
|
||||
// The validators with an index < minGenesisActiveCount all have deposits already from the chain start.
|
||||
// Skip all of those chain start validators by seeking to minGenesisActiveCount in the validator list
|
||||
// for further deposit testing.
|
||||
@@ -238,9 +239,12 @@ func (r *testRunner) testDepositsAndTx(ctx context.Context, g *errgroup.Group,
|
||||
r.t.Error(errors.Wrap(err, "depositor.SendAndMine failed"))
|
||||
}
|
||||
}
|
||||
}
|
||||
r.testTxGeneration(ctx, g, keystorePath, []e2etypes.ComponentRunner{})
|
||||
}()
|
||||
}
|
||||
// Only generate background transactions when relevant for the test.
|
||||
if r.config.TestDeposits || r.config.TestFeature || r.config.UseBuilder {
|
||||
r.testTxGeneration(ctx, g, keystorePath, []e2etypes.ComponentRunner{})
|
||||
}
|
||||
}()
|
||||
if r.config.TestDeposits {
|
||||
return depositCheckValidator.Start(ctx)
|
||||
}
|
||||
@@ -849,3 +853,148 @@ func (r *testRunner) multiScenario(ec *e2etypes.EvaluationContext, epoch uint64,
|
||||
func defaultInterceptor(_ *e2etypes.EvaluationContext, _ uint64, _ []*grpc.ClientConn) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// preFuluSemiSupernodeRestart tests the custody info bug where restarting with
|
||||
// --semi-supernode before the Fulu fork causes earliestAvailableSlot to decrease.
|
||||
//
|
||||
// The bug scenario:
|
||||
// 1. Node starts - Fulu scheduled but not active, earliestAvailableSlot set from EarliestSlot()
|
||||
// 2. Validators connect - maintainCustodyInfo() updates earliestAvailableSlot to headSlot
|
||||
// 3. Restart with --semi-supernode (still before Fulu) - EarliestSlot() returns checkpoint slot
|
||||
// BUG: The lower checkpoint slot overwrites the higher headSlot value
|
||||
//
|
||||
// This interceptor:
|
||||
// - Phase 1 (epoch fuluFork-3): Record initial custody info
|
||||
// - Phase 2 (epoch fuluFork-2): Let validators connect, custody info updates to headSlot
|
||||
// - Phase 3 (epoch fuluFork-1): Restart node 0 with --semi-supernode
|
||||
// - Phase 4 (epoch fuluFork): Verify earliestAvailableSlot did NOT decrease
|
||||
func (r *testRunner) preFuluSemiSupernodeRestart(ec *e2etypes.EvaluationContext, epoch uint64, conns []*grpc.ClientConn) bool {
|
||||
fuluForkEpoch := params.BeaconConfig().FuluForkEpoch
|
||||
if fuluForkEpoch == params.BeaconConfig().FarFutureEpoch {
|
||||
// Fulu not scheduled, skip this scenario
|
||||
return false
|
||||
}
|
||||
|
||||
// Define epoch phases relative to Fulu fork
|
||||
// We need at least 3 epochs before Fulu to run the full scenario
|
||||
recordInitialEpoch := fuluForkEpoch - 3
|
||||
validatorsConnectedEpoch := fuluForkEpoch - 2
|
||||
restartEpoch := fuluForkEpoch - 1
|
||||
verifyEpoch := fuluForkEpoch
|
||||
// After verifyEpoch, we're in recovery - skip standard evaluators
|
||||
|
||||
epochVal := primitives.Epoch(epoch)
|
||||
|
||||
// Warmup period: epochs 0-2 are used for chain startup and validator initialization
|
||||
// Skip standard evaluators during this time to avoid flaky failures
|
||||
if epochVal < recordInitialEpoch {
|
||||
log.WithField("epoch", epoch).Info("Pre-Fulu Semi-Supernode Test - Warmup period: waiting for chain to stabilize")
|
||||
return true
|
||||
}
|
||||
|
||||
switch epochVal {
|
||||
case recordInitialEpoch:
|
||||
log.Info("Pre-Fulu Semi-Supernode Test - Phase 1: Recording initial custody info")
|
||||
// Run custody info evaluator to capture initial state
|
||||
evs := []e2etypes.Evaluator{ev.CustodyInfoNonDecreasing}
|
||||
r.executeProvidedEvaluators(ec, epoch, conns, evs)
|
||||
return true
|
||||
|
||||
case validatorsConnectedEpoch:
|
||||
log.Info("Pre-Fulu Semi-Supernode Test - Phase 2: Validators connected, checking custody info updated")
|
||||
// At this point, maintainCustodyInfo() should have run and updated earliestAvailableSlot
|
||||
// Run evaluator to verify and capture updated state
|
||||
evs := []e2etypes.Evaluator{ev.CustodyInfoNonDecreasing}
|
||||
r.executeProvidedEvaluators(ec, epoch, conns, evs)
|
||||
return true
|
||||
|
||||
case restartEpoch:
|
||||
log.Info("Pre-Fulu Semi-Supernode Test - Phase 3: Restarting beacon node 0 with --semi-supernode")
|
||||
|
||||
// Get the beacon node set with restart capability
|
||||
beaconNodes, ok := r.comHandler.beaconNodes.(*components.BeaconNodeSet)
|
||||
if !ok {
|
||||
r.t.Error("Failed to get BeaconNodeSet for restart")
|
||||
return true
|
||||
}
|
||||
|
||||
// The simulated slot value that maintainCustodyInfo() would have set.
|
||||
// This must be higher than what EarliestSlot() returns (which is 0 from genesis).
|
||||
const simulatedHigherSlot = 100
|
||||
// Set custody group count to 4 (the base requirement). When semi-supernode starts,
|
||||
// it will want to increase this (but not to 128+ which validators might require).
|
||||
// This triggers the update code path where the fix should protect the slot.
|
||||
const initialCustodyGroupCount = 4
|
||||
|
||||
// Pre-restart hook: Set custody info in the DB before restart.
|
||||
// We set a higher earliestAvailableSlot with a low custody group count.
|
||||
// After restart with --semi-supernode, custody may increase, triggering UpdateCustodyInfo.
|
||||
// The fix should ensure earliestAvailableSlot doesn't decrease when custody increases.
|
||||
preRestartHook := func(s *components.BeaconNodeSet, nodeIndex int) error {
|
||||
log.WithFields(log.Fields{
|
||||
"nodeIndex": nodeIndex,
|
||||
"simulatedEarliestAvailSlot": simulatedHigherSlot,
|
||||
"custodyGroupCount": initialCustodyGroupCount,
|
||||
}).Info("Pre-restart hook: Setting earliestAvailableSlot and custodyGroupCount")
|
||||
return s.SetCustodyInfoForNode(nodeIndex, simulatedHigherSlot, initialCustodyGroupCount)
|
||||
}
|
||||
|
||||
// Restart node 0 with --semi-supernode flag
|
||||
ctx := r.comHandler.ctx
|
||||
if err := beaconNodes.RestartAtIndexWithPreHook(ctx, 0, []string{"--semi-supernode"}, preRestartHook); err != nil {
|
||||
r.t.Errorf("Failed to restart beacon node with --semi-supernode: %v", err)
|
||||
return true
|
||||
}
|
||||
|
||||
log.Info("Pre-Fulu Semi-Supernode Test - Beacon node 0 restarted successfully")
|
||||
return true
|
||||
|
||||
case verifyEpoch:
|
||||
log.Info("Pre-Fulu Semi-Supernode Test - Phase 4: Verifying earliestAvailableSlot did not decrease")
|
||||
|
||||
// This is the critical assertion - if the bug exists, earliestAvailableSlot will have decreased
|
||||
evs := []e2etypes.Evaluator{ev.CustodyInfoNonDecreasing}
|
||||
r.executeProvidedEvaluators(ec, epoch, conns, evs)
|
||||
|
||||
// Also do a full monotonicity check on all log entries
|
||||
logPath := path.Join(e2e.TestParams.LogPath, fmt.Sprintf(e2e.BeaconNodeLogFileName, 0))
|
||||
if err := ev.VerifyCustodyInfoMonotonicity(logPath); err != nil {
|
||||
r.t.Errorf("Custody info monotonicity check failed: %v", err)
|
||||
}
|
||||
|
||||
// Critical bug detection: Check that post-restart earliestAvailableSlot is >= 100 (what we set in the hook)
|
||||
// The pre-restart hook sets earliestAvailableSlot=100 directly in the DB.
|
||||
// If the bug exists, the post-restart value will be 0 (from EarliestSlot()).
|
||||
// If the fix is applied, the post-restart value should be >= 100 (max of stored vs incoming).
|
||||
const expectedMinSlot = 100
|
||||
latestCustodyInfo, err := ev.ParseCustodyInfoFromLog(logPath)
|
||||
if err != nil {
|
||||
r.t.Errorf("Failed to parse custody info from log: %v", err)
|
||||
} else if latestCustodyInfo.EarliestAvailableSlot < expectedMinSlot {
|
||||
r.t.Errorf("BUG DETECTED: earliestAvailableSlot decreased from %d (set by hook) to %d (post-restart). "+
|
||||
"This confirms the bug where UpdateCustodyInfo overwrites without using max().",
|
||||
expectedMinSlot, latestCustodyInfo.EarliestAvailableSlot)
|
||||
} else {
|
||||
log.WithFields(log.Fields{
|
||||
"expectedMinSlot": expectedMinSlot,
|
||||
"actualSlot": latestCustodyInfo.EarliestAvailableSlot,
|
||||
"custodyGroupCount": latestCustodyInfo.CustodyGroupCount,
|
||||
}).Info("Post-restart earliestAvailableSlot is correct (>= expected minimum)")
|
||||
}
|
||||
|
||||
return true
|
||||
|
||||
default:
|
||||
// Recovery period: after restart, give the beacon node time to sync
|
||||
// Skip normal evaluators that would fail due to syncing node
|
||||
if epochVal > verifyEpoch {
|
||||
log.WithField("epoch", epoch).Info("Pre-Fulu Semi-Supernode Test - Recovery period: skipping normal evaluators while node syncs")
|
||||
// Still run custody evaluator to ensure earliestAvailableSlot remains stable
|
||||
evs := []e2etypes.Evaluator{ev.CustodyInfoNonDecreasing}
|
||||
r.executeProvidedEvaluators(ec, epoch, conns, evs)
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ go_library(
|
||||
testonly = True,
|
||||
srcs = [
|
||||
"builder.go",
|
||||
"custody.go",
|
||||
"data.go",
|
||||
"execution_engine.go",
|
||||
"fee_recipient.go",
|
||||
|
||||
222
testing/endtoend/evaluators/custody.go
Normal file
222
testing/endtoend/evaluators/custody.go
Normal file
@@ -0,0 +1,222 @@
|
||||
package evaluators
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"path"
|
||||
"regexp"
|
||||
"strconv"
|
||||
|
||||
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
|
||||
e2e "github.com/OffchainLabs/prysm/v7/testing/endtoend/params"
|
||||
"github.com/OffchainLabs/prysm/v7/testing/endtoend/policies"
|
||||
e2etypes "github.com/OffchainLabs/prysm/v7/testing/endtoend/types"
|
||||
"github.com/pkg/errors"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
// CustodyInfoNonDecreasing verifies that earliestAvailableSlot never decreases
|
||||
// across custody info updates. This is used to detect the bug where restarting
|
||||
// with --semi-supernode before Fulu fork overwrites a higher slot with a lower one.
|
||||
var CustodyInfoNonDecreasing = e2etypes.Evaluator{
|
||||
Name: "custody_info_non_decreasing_%d",
|
||||
Policy: policies.AllEpochs,
|
||||
Evaluation: custodyInfoNonDecreasing,
|
||||
}
|
||||
|
||||
// custodyInfoNonDecreasing parses beacon node logs for custody info updates
|
||||
// and verifies that earliestAvailableSlot never decreases.
|
||||
func custodyInfoNonDecreasing(ec *e2etypes.EvaluationContext, _ ...*grpc.ClientConn) error {
|
||||
for i := 0; i < e2e.TestParams.BeaconNodeCount; i++ {
|
||||
logPath := path.Join(e2e.TestParams.LogPath, fmt.Sprintf(e2e.BeaconNodeLogFileName, i))
|
||||
custodyInfo, err := ParseCustodyInfoFromLog(logPath)
|
||||
if err != nil {
|
||||
// If we can't find custody info, that's OK - just means Fulu isn't enabled or no updates yet
|
||||
continue
|
||||
}
|
||||
|
||||
// Check if we have a previous value
|
||||
if prev, exists := ec.CustodyInfo[i]; exists {
|
||||
if custodyInfo.EarliestAvailableSlot < prev.EarliestAvailableSlot {
|
||||
return fmt.Errorf(
|
||||
"node %d: earliestAvailableSlot decreased from %d to %d (bug detected!)",
|
||||
i, prev.EarliestAvailableSlot, custodyInfo.EarliestAvailableSlot,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// Update the stored value
|
||||
ec.CustodyInfo[i] = custodyInfo
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// ParseCustodyInfoFromLog parses custody info from beacon node log file.
|
||||
// It looks for log lines containing "Updated custody info in database" and extracts
|
||||
// the earliestAvailableSlot and custodyGroupCount values.
|
||||
// Returns the most recent custody info found in the log.
|
||||
func ParseCustodyInfoFromLog(logPath string) (*e2etypes.CustodyInfoState, error) {
|
||||
file, err := os.Open(logPath)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to open log file")
|
||||
}
|
||||
defer func() {
|
||||
if err := file.Close(); err != nil {
|
||||
log.WithError(err).Error("Failed to close log file")
|
||||
}
|
||||
}()
|
||||
|
||||
// Pattern to match: earliestAvailableSlot=1234 custodyGroupCount=64
|
||||
// Log format: time="..." level=info msg="Updated custody info in database" earliestAvailableSlot=123 custodyGroupCount=64 ...
|
||||
slotPattern := regexp.MustCompile(`earliestAvailableSlot=(\d+)`)
|
||||
countPattern := regexp.MustCompile(`custodyGroupCount=(\d+)`)
|
||||
updatePattern := regexp.MustCompile(`Updated custody info in database`)
|
||||
|
||||
var latestInfo *e2etypes.CustodyInfoState
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
|
||||
// Only process lines with custody info updates
|
||||
if !updatePattern.MatchString(line) {
|
||||
continue
|
||||
}
|
||||
|
||||
slotMatch := slotPattern.FindStringSubmatch(line)
|
||||
countMatch := countPattern.FindStringSubmatch(line)
|
||||
|
||||
if len(slotMatch) < 2 || len(countMatch) < 2 {
|
||||
continue
|
||||
}
|
||||
|
||||
slot, err := strconv.ParseUint(slotMatch[1], 10, 64)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
count, err := strconv.ParseUint(countMatch[1], 10, 64)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
latestInfo = &e2etypes.CustodyInfoState{
|
||||
EarliestAvailableSlot: primitives.Slot(slot),
|
||||
CustodyGroupCount: count,
|
||||
}
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, errors.Wrap(err, "error reading log file")
|
||||
}
|
||||
|
||||
if latestInfo == nil {
|
||||
return nil, errors.New("no custody info found in log")
|
||||
}
|
||||
|
||||
return latestInfo, nil
|
||||
}
|
||||
|
||||
// ParseAllCustodyInfoFromLog parses all custody info entries from beacon node log file.
|
||||
// Returns a slice of all custody info states in chronological order.
|
||||
func ParseAllCustodyInfoFromLog(logPath string) ([]*e2etypes.CustodyInfoState, error) {
|
||||
file, err := os.Open(logPath)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to open log file")
|
||||
}
|
||||
defer func() {
|
||||
if err := file.Close(); err != nil {
|
||||
log.WithError(err).Error("Failed to close log file")
|
||||
}
|
||||
}()
|
||||
|
||||
slotPattern := regexp.MustCompile(`earliestAvailableSlot=(\d+)`)
|
||||
countPattern := regexp.MustCompile(`custodyGroupCount=(\d+)`)
|
||||
updatePattern := regexp.MustCompile(`Updated custody info in database`)
|
||||
|
||||
var allInfo []*e2etypes.CustodyInfoState
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
|
||||
if !updatePattern.MatchString(line) {
|
||||
continue
|
||||
}
|
||||
|
||||
slotMatch := slotPattern.FindStringSubmatch(line)
|
||||
countMatch := countPattern.FindStringSubmatch(line)
|
||||
|
||||
if len(slotMatch) < 2 || len(countMatch) < 2 {
|
||||
continue
|
||||
}
|
||||
|
||||
slot, err := strconv.ParseUint(slotMatch[1], 10, 64)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
count, err := strconv.ParseUint(countMatch[1], 10, 64)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
allInfo = append(allInfo, &e2etypes.CustodyInfoState{
|
||||
EarliestAvailableSlot: primitives.Slot(slot),
|
||||
CustodyGroupCount: count,
|
||||
})
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, errors.Wrap(err, "error reading log file")
|
||||
}
|
||||
|
||||
return allInfo, nil
|
||||
}
|
||||
|
||||
// VerifyCustodyInfoMonotonicity checks that earliestAvailableSlot is monotonically
|
||||
// non-decreasing across all custody info updates for a given node.
|
||||
// It checks both the current log file and any backup log file (from before restart).
|
||||
func VerifyCustodyInfoMonotonicity(logPath string) error {
|
||||
var allInfo []*e2etypes.CustodyInfoState
|
||||
|
||||
// First, try to parse from the pre-restart backup log if it exists
|
||||
// The backup log path follows the pattern: beacon-N-pre-restart.log
|
||||
backupLogPath := logPath[:len(logPath)-4] + "-pre-restart.log" // Replace .log with -pre-restart.log
|
||||
preRestartInfo, err := ParseAllCustodyInfoFromLog(backupLogPath)
|
||||
if err == nil && len(preRestartInfo) > 0 {
|
||||
log.WithField("count", len(preRestartInfo)).Info("Found pre-restart custody info entries")
|
||||
allInfo = append(allInfo, preRestartInfo...)
|
||||
}
|
||||
|
||||
// Then parse from the current log file
|
||||
currentInfo, err := ParseAllCustodyInfoFromLog(logPath)
|
||||
if err != nil {
|
||||
if len(allInfo) == 0 {
|
||||
return err
|
||||
}
|
||||
// If we have pre-restart info but no current info, that's OK
|
||||
} else {
|
||||
allInfo = append(allInfo, currentInfo...)
|
||||
}
|
||||
|
||||
if len(allInfo) < 2 {
|
||||
return nil // Not enough data points to check monotonicity
|
||||
}
|
||||
|
||||
log.WithField("totalEntries", len(allInfo)).Info("Checking custody info monotonicity")
|
||||
|
||||
for i := 1; i < len(allInfo); i++ {
|
||||
if allInfo[i].EarliestAvailableSlot < allInfo[i-1].EarliestAvailableSlot {
|
||||
return fmt.Errorf(
|
||||
"earliestAvailableSlot decreased at update %d: %d -> %d (pre-restart entries: %d)",
|
||||
i, allInfo[i-1].EarliestAvailableSlot, allInfo[i].EarliestAvailableSlot, len(preRestartInfo),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -88,11 +88,28 @@ var ElectraForkTransition = e2etypes.Evaluator{
|
||||
Evaluation: electraForkOccurs,
|
||||
}
|
||||
|
||||
// FuluForkTransition ensures that the fulu hard fork has occurred successfully
|
||||
var FuluForkTransition = e2etypes.Evaluator{
|
||||
Name: "fulu_fork_transition_%d",
|
||||
Policy: func(e primitives.Epoch) bool {
|
||||
// Only run if we started before Fulu
|
||||
if e2etypes.GenesisFork() >= version.Fulu {
|
||||
return false
|
||||
}
|
||||
fEpoch := params.BeaconConfig().FuluForkEpoch
|
||||
return policies.OnEpoch(fEpoch)(e)
|
||||
},
|
||||
Evaluation: fuluForkOccurs,
|
||||
}
|
||||
|
||||
func altairForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn) error {
|
||||
|
||||
conn := conns[0]
|
||||
client := ethpb.NewBeaconNodeValidatorClient(conn)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), streamDeadline)
|
||||
defer cancel()
|
||||
|
||||
stream, err := client.StreamBlocksAltair(ctx, ðpb.StreamBlocksRequest{VerifiedOnly: true})
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to get stream")
|
||||
@@ -101,6 +118,7 @@ func altairForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if errors.Is(ctx.Err(), context.Canceled) {
|
||||
return errors.New("context canceled prematurely")
|
||||
}
|
||||
@@ -121,20 +139,24 @@ func altairForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := blocks.BeaconBlockIsNil(blk); err != nil {
|
||||
return err
|
||||
}
|
||||
if blk.Block().Slot() < fSlot {
|
||||
return errors.Errorf("wanted a block >= %d but received %d", fSlot, blk.Block().Slot())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func bellatrixForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn) error {
|
||||
conn := conns[0]
|
||||
client := ethpb.NewBeaconNodeValidatorClient(conn)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), streamDeadline)
|
||||
defer cancel()
|
||||
|
||||
stream, err := client.StreamBlocksAltair(ctx, ðpb.StreamBlocksRequest{VerifiedOnly: true})
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to get stream")
|
||||
@@ -143,6 +165,7 @@ func bellatrixForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientCon
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if errors.Is(ctx.Err(), context.Canceled) {
|
||||
return errors.New("context canceled prematurely")
|
||||
}
|
||||
@@ -166,6 +189,7 @@ func bellatrixForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientCon
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := blocks.BeaconBlockIsNil(blk); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -188,6 +212,7 @@ func capellaForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if errors.Is(ctx.Err(), context.Canceled) {
|
||||
return errors.New("context canceled prematurely")
|
||||
}
|
||||
@@ -209,6 +234,7 @@ func capellaForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := blocks.BeaconBlockIsNil(blk); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -231,6 +257,7 @@ func denebForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn) e
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if errors.Is(ctx.Err(), context.Canceled) {
|
||||
return errors.New("context canceled prematurely")
|
||||
}
|
||||
@@ -252,6 +279,7 @@ func denebForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn) e
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := blocks.BeaconBlockIsNil(blk); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -274,6 +302,7 @@ func electraForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if errors.Is(ctx.Err(), context.Canceled) {
|
||||
return errors.New("context canceled prematurely")
|
||||
}
|
||||
@@ -295,6 +324,7 @@ func electraForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := blocks.BeaconBlockIsNil(blk); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -303,3 +333,57 @@ func electraForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func fuluForkOccurs(_ *e2etypes.EvaluationContext, conns ...*grpc.ClientConn) error {
|
||||
conn := conns[0]
|
||||
client := ethpb.NewBeaconNodeValidatorClient(conn)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), streamDeadline)
|
||||
defer cancel()
|
||||
|
||||
stream, err := client.StreamBlocksAltair(ctx, ðpb.StreamBlocksRequest{VerifiedOnly: true})
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to get stream")
|
||||
}
|
||||
|
||||
fSlot, err := slots.EpochStart(params.BeaconConfig().FuluForkEpoch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if errors.Is(ctx.Err(), context.Canceled) {
|
||||
return errors.New("context canceled prematurely")
|
||||
}
|
||||
|
||||
res, err := stream.Recv()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if res == nil || res.Block == nil {
|
||||
return errors.New("nil block returned by beacon node")
|
||||
}
|
||||
|
||||
if res.GetBlock() == nil {
|
||||
return errors.New("nil block returned by beacon node")
|
||||
}
|
||||
|
||||
if res.GetFuluBlock() == nil {
|
||||
return errors.Errorf("non-fulu block returned after the fork with type %T", res.Block)
|
||||
}
|
||||
|
||||
blk, err := blocks.NewSignedBeaconBlock(res.GetFuluBlock())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := blocks.BeaconBlockIsNil(blk); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if blk.Block().Slot() < fSlot {
|
||||
return errors.Errorf("wanted a block at slot >= %d but received %d", fSlot, blk.Block().Slot())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -132,7 +132,13 @@ var ValidatorsHaveWithdrawn = e2etypes.Evaluator{
|
||||
// If Capella is disabled (starting at Deneb+), run after withdrawal submission
|
||||
var validWithdrawnEpoch primitives.Epoch
|
||||
if e2etypes.GenesisFork() >= version.Deneb {
|
||||
validWithdrawnEpoch = exitSubmissionEpoch + 2
|
||||
// Exit submitted at exitSubmissionEpoch (7)
|
||||
// Exit epoch = exitSubmissionEpoch + 1 + MAX_SEED_LOOKAHEAD
|
||||
// Withdrawable epoch = exit epoch + MIN_VALIDATOR_WITHDRAWABILITY_DELAY
|
||||
// Add 1 more epoch for the sweep to process
|
||||
exitEpoch := exitSubmissionEpoch + 1 + primitives.Epoch(params.BeaconConfig().MaxSeedLookahead)
|
||||
withdrawableEpoch := exitEpoch + primitives.Epoch(params.BeaconConfig().MinValidatorWithdrawabilityDelay)
|
||||
validWithdrawnEpoch = withdrawableEpoch + 1
|
||||
} else {
|
||||
validWithdrawnEpoch = fEpoch + 1
|
||||
}
|
||||
@@ -567,6 +573,14 @@ func validatorsVoteWithTheMajority(ec *e2etypes.EvaluationContext, conns ...*grp
|
||||
b := blk.GetBlindedElectraBlock().Message
|
||||
slot = b.Slot
|
||||
vote = b.Body.Eth1Data.BlockHash
|
||||
case *ethpb.BeaconBlockContainer_FuluBlock:
|
||||
b := blk.GetFuluBlock().Block
|
||||
slot = b.Slot
|
||||
vote = b.Body.Eth1Data.BlockHash
|
||||
case *ethpb.BeaconBlockContainer_BlindedFuluBlock:
|
||||
b := blk.GetBlindedFuluBlock().Message
|
||||
slot = b.Slot
|
||||
vote = b.Body.Eth1Data.BlockHash
|
||||
default:
|
||||
return fmt.Errorf("block of type %T is unknown", blk.Block)
|
||||
}
|
||||
@@ -644,8 +658,12 @@ func submitWithdrawal(ec *e2etypes.EvaluationContext, conns ...*grpc.ClientConn)
|
||||
}
|
||||
changes := make([]*structs.SignedBLSToExecutionChange, 0)
|
||||
// Only send half the number of changes each time, to allow us to test
|
||||
// at the fork boundary.
|
||||
// at the fork boundary. When starting from Deneb+ at genesis, there's no
|
||||
// fork boundary to test so we send all changes.
|
||||
wantedChanges := numOfExits / 2
|
||||
if e2etypes.GenesisFork() >= version.Deneb {
|
||||
wantedChanges = numOfExits
|
||||
}
|
||||
for _, idx := range exitedIndices {
|
||||
// Exit sending more change messages.
|
||||
if len(changes) >= wantedChanges {
|
||||
|
||||
@@ -353,6 +353,14 @@ func syncCompatibleBlockFromCtr(container *ethpb.BeaconBlockContainer) (interfac
|
||||
if container.GetBlindedElectraBlock() != nil {
|
||||
return blocks.NewSignedBeaconBlock(container.GetBlindedElectraBlock())
|
||||
}
|
||||
|
||||
if container.GetFuluBlock() != nil {
|
||||
return blocks.NewSignedBeaconBlock(container.GetFuluBlock())
|
||||
}
|
||||
|
||||
if container.GetBlindedFuluBlock() != nil {
|
||||
return blocks.NewSignedBeaconBlock(container.GetBlindedFuluBlock())
|
||||
}
|
||||
return nil, errors.New("no supported block type in container")
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,6 @@ import (
|
||||
)
|
||||
|
||||
func TestEndToEnd_MinimalConfig(t *testing.T) {
|
||||
r := e2eMinimal(t, types.InitForkCfg(version.Bellatrix, version.Electra, params.E2ETestConfig()), types.WithCheckpointSync())
|
||||
r := e2eMinimal(t, types.InitForkCfg(version.Bellatrix, version.Fulu, params.E2ETestConfig()), types.WithCheckpointSync())
|
||||
r.run()
|
||||
}
|
||||
@@ -47,3 +47,34 @@ func TestEndToEnd_ScenarioRun_EEOffline(t *testing.T) {
|
||||
runner.config.EvalInterceptor = runner.eeOffline
|
||||
runner.scenarioRunner()
|
||||
}
|
||||
|
||||
// TestEndToEnd_PreFuluSemiSupernodeRestart tests the bug where restarting a beacon node
|
||||
// with --semi-supernode flag before the Fulu fork causes earliestAvailableSlot to decrease.
|
||||
//
|
||||
// Bug scenario being tested:
|
||||
// 1. Node starts with Fulu scheduled but not active - uses EarliestSlot() for earliestAvailableSlot
|
||||
// 2. Validators connect - maintainCustodyInfo() updates earliestAvailableSlot to headSlot (higher)
|
||||
// 3. Restart with --semi-supernode (still before Fulu) - EarliestSlot() returns checkpoint slot
|
||||
// BUG: The lower checkpoint slot should NOT overwrite the higher headSlot value
|
||||
//
|
||||
// The test verifies that earliestAvailableSlot is monotonically non-decreasing.
|
||||
func TestEndToEnd_PreFuluSemiSupernodeRestart(t *testing.T) {
|
||||
// Configure with Fulu scheduled at epoch 6
|
||||
// This gives us epochs 0-5 to run the scenario before Fulu activates:
|
||||
// - Epoch 3: Record initial custody info
|
||||
// - Epoch 4: Validators connected, custody info updated
|
||||
// - Epoch 5: Restart with --semi-supernode
|
||||
// - Epoch 6: Fulu activates, verify earliestAvailableSlot did not decrease
|
||||
const fuluForkEpoch = 6
|
||||
cfg := types.InitForkCfgWithFuluAt(version.Electra, fuluForkEpoch, params.E2ETestConfig())
|
||||
|
||||
// Run for enough epochs to complete the test (through Fulu fork + 1 recovery epoch)
|
||||
// Epochs 0-2: warmup, 3-5: scenario phases, 6: verify, 7: recovery
|
||||
// Use checkpoint sync so earliestAvailableSlot starts at a non-zero value
|
||||
runner := e2eMinimal(t, cfg, types.WithEpochs(8), types.WithCheckpointSync())
|
||||
|
||||
// Override for this specific scenario test
|
||||
runner.config.Evaluators = scenarioEvals(cfg)
|
||||
runner.config.EvalInterceptor = runner.preFuluSemiSupernodeRestart
|
||||
runner.scenarioRunner()
|
||||
}
|
||||
|
||||
@@ -5,10 +5,56 @@ import (
|
||||
"math"
|
||||
|
||||
"github.com/OffchainLabs/prysm/v7/config/params"
|
||||
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
|
||||
"github.com/OffchainLabs/prysm/v7/runtime/version"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// InitForkCfgWithFuluAt creates a fork config where Fulu is scheduled at a specific epoch.
|
||||
// This is used for testing behavior before Fulu activates while still having Fulu scheduled.
|
||||
func InitForkCfgWithFuluAt(start int, fuluEpoch primitives.Epoch, c *params.BeaconChainConfig) *params.BeaconChainConfig {
|
||||
c = c.Copy()
|
||||
if start < version.Bellatrix {
|
||||
log.Fatal("E2e tests require starting from Bellatrix or later (pre-merge forks are not supported)")
|
||||
}
|
||||
if start >= version.Altair {
|
||||
c.AltairForkEpoch = 0
|
||||
}
|
||||
if start >= version.Bellatrix {
|
||||
c.BellatrixForkEpoch = 0
|
||||
}
|
||||
if start >= version.Capella {
|
||||
c.CapellaForkEpoch = 0
|
||||
}
|
||||
if start >= version.Deneb {
|
||||
c.DenebForkEpoch = 0
|
||||
}
|
||||
if start >= version.Electra {
|
||||
c.ElectraForkEpoch = 0
|
||||
}
|
||||
// Fulu is scheduled at a specific epoch, not from genesis
|
||||
c.FuluForkEpoch = fuluEpoch
|
||||
|
||||
// Time TTD to line up roughly with the bellatrix fork epoch.
|
||||
ttd := uint64(c.BellatrixForkEpoch) * uint64(c.SlotsPerEpoch) * c.SecondsPerSlot
|
||||
c.TerminalTotalDifficulty = fmt.Sprintf("%d", ttd)
|
||||
|
||||
// Update blob schedule
|
||||
c.BlobSchedule = nil
|
||||
if c.DenebForkEpoch != math.MaxUint64 {
|
||||
c.BlobSchedule = append(c.BlobSchedule, params.BlobScheduleEntry{
|
||||
Epoch: c.DenebForkEpoch, MaxBlobsPerBlock: uint64(c.DeprecatedMaxBlobsPerBlock),
|
||||
})
|
||||
}
|
||||
if c.ElectraForkEpoch != math.MaxUint64 {
|
||||
c.BlobSchedule = append(c.BlobSchedule, params.BlobScheduleEntry{
|
||||
Epoch: c.ElectraForkEpoch, MaxBlobsPerBlock: uint64(c.DeprecatedMaxBlobsPerBlockElectra),
|
||||
})
|
||||
}
|
||||
c.InitializeForkSchedule()
|
||||
return c
|
||||
}
|
||||
|
||||
func InitForkCfg(start, end int, c *params.BeaconChainConfig) *params.BeaconChainConfig {
|
||||
c = c.Copy()
|
||||
if end < start {
|
||||
|
||||
@@ -95,6 +95,9 @@ type E2EConfig struct {
|
||||
func GenesisFork() int {
|
||||
cfg := params.BeaconConfig()
|
||||
// Check from highest fork to lowest to find the genesis fork.
|
||||
if cfg.FuluForkEpoch == 0 {
|
||||
return version.Fulu
|
||||
}
|
||||
if cfg.ElectraForkEpoch == 0 {
|
||||
return version.Electra
|
||||
}
|
||||
@@ -149,6 +152,14 @@ type EvaluationContext struct {
|
||||
ExitedVals map[[48]byte]bool
|
||||
SeenVotes map[primitives.Slot][]byte
|
||||
ExpectedEth1DataVote []byte
|
||||
// CustodyInfo tracks custody info state for each node index
|
||||
CustodyInfo map[int]*CustodyInfoState
|
||||
}
|
||||
|
||||
// CustodyInfoState tracks custody info for verification in e2e tests.
|
||||
type CustodyInfoState struct {
|
||||
EarliestAvailableSlot primitives.Slot
|
||||
CustodyGroupCount uint64
|
||||
}
|
||||
|
||||
// NewEvaluationContext handles initializing internal datastructures (like maps) provided by the EvaluationContext.
|
||||
@@ -157,6 +168,7 @@ func NewEvaluationContext(d DepositBalancer) *EvaluationContext {
|
||||
DepositBalancer: d,
|
||||
ExitedVals: make(map[[48]byte]bool),
|
||||
SeenVotes: make(map[primitives.Slot][]byte),
|
||||
CustodyInfo: make(map[int]*CustodyInfoState),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,3 +217,13 @@ type BeaconNodeSet interface {
|
||||
// SetENR provides the relevant bootnode's enr to the beacon nodes.
|
||||
SetENR(enr string)
|
||||
}
|
||||
|
||||
// RestartableBeaconNodeSet extends BeaconNodeSet with the ability to restart
|
||||
// individual nodes with different flags.
|
||||
type RestartableBeaconNodeSet interface {
|
||||
MultipleComponentRunners
|
||||
BeaconNodeSet
|
||||
// RestartAtIndex stops the beacon node at the given index and restarts it
|
||||
// with the provided extra flags appended to the existing configuration.
|
||||
RestartAtIndex(ctx context.Context, i int, extraFlags []string) error
|
||||
}
|
||||
|
||||
171
third_party/com_github_consensys_gnark_crypto.patch
vendored
Normal file
171
third_party/com_github_consensys_gnark_crypto.patch
vendored
Normal file
@@ -0,0 +1,171 @@
|
||||
diff --git a/ecc/bls12-381/fp/BUILD.bazel b/ecc/bls12-381/fp/BUILD.bazel
|
||||
index 4d57841..5b1dec4 100644
|
||||
--- a/ecc/bls12-381/fp/BUILD.bazel
|
||||
+++ b/ecc/bls12-381/fp/BUILD.bazel
|
||||
@@ -7,15 +7,21 @@ go_library(
|
||||
"arith.go",
|
||||
"doc.go",
|
||||
"element.go",
|
||||
- "element_amd64.go",
|
||||
- "element_amd64.s",
|
||||
- "element_arm64.go",
|
||||
- "element_arm64.s",
|
||||
"element_exp.go",
|
||||
"element_purego.go",
|
||||
"vector.go",
|
||||
"vector_purego.go",
|
||||
- ],
|
||||
+ ] + select({
|
||||
+ "@io_bazel_rules_go//go/platform:amd64": [
|
||||
+ "element_amd64.go",
|
||||
+ "//field/asm/element_6w:element_6w_amd64"
|
||||
+ ],
|
||||
+ "@io_bazel_rules_go//go/platform:arm64": [
|
||||
+ "element_arm64.go",
|
||||
+ "//field/asm/element_6w:element_6w_arm64"
|
||||
+ ],
|
||||
+ "//conditions:default": [],
|
||||
+ }),
|
||||
importpath = "github.com/consensys/gnark-crypto/ecc/bls12-381/fp",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
diff --git a/ecc/bls12-381/fr/BUILD.bazel b/ecc/bls12-381/fr/BUILD.bazel
|
||||
index e24b29b..6beeb04 100644
|
||||
--- a/ecc/bls12-381/fr/BUILD.bazel
|
||||
+++ b/ecc/bls12-381/fr/BUILD.bazel
|
||||
@@ -7,17 +7,24 @@ go_library(
|
||||
"arith.go",
|
||||
"doc.go",
|
||||
"element.go",
|
||||
- "element_amd64.go",
|
||||
- "element_amd64.s",
|
||||
- "element_arm64.go",
|
||||
- "element_arm64.s",
|
||||
"element_exp.go",
|
||||
"element_purego.go",
|
||||
"generator.go",
|
||||
"vector.go",
|
||||
- "vector_amd64.go",
|
||||
"vector_purego.go",
|
||||
- ],
|
||||
+ ] + select({
|
||||
+ "@io_bazel_rules_go//go/platform:amd64": [
|
||||
+ "element_amd64.go",
|
||||
+ "//field/asm/element_4w:element_4w_amd64",
|
||||
+ "vector_amd64.go",
|
||||
+ ],
|
||||
+ "@io_bazel_rules_go//go/platform:arm64": [
|
||||
+ "element_arm64.go",
|
||||
+ "//field/asm/element_4w:element_4w_arm64"
|
||||
+ ],
|
||||
+ "//conditions:default": [],
|
||||
+ }),
|
||||
+
|
||||
importpath = "github.com/consensys/gnark-crypto/ecc/bls12-381/fr",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
diff --git a/field/asm/element_4w/BUILD.bazel b/field/asm/element_4w/BUILD.bazel
|
||||
index ef0882d..975e6f9 100644
|
||||
--- a/field/asm/element_4w/BUILD.bazel
|
||||
+++ b/field/asm/element_4w/BUILD.bazel
|
||||
@@ -16,3 +16,15 @@ alias(
|
||||
actual = ":element_4w",
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
+
|
||||
+filegroup(
|
||||
+ name = "element_4w_amd64",
|
||||
+ srcs = ["element_4w_amd64.s"],
|
||||
+ visibility = ["//visibility:public"],
|
||||
+)
|
||||
+
|
||||
+filegroup(
|
||||
+ name = "element_4w_arm64",
|
||||
+ srcs = ["element_4w_arm64.s"],
|
||||
+ visibility = ["//visibility:public"],
|
||||
+)
|
||||
diff --git a/field/asm/element_6w/BUILD.bazel b/field/asm/element_6w/BUILD.bazel
|
||||
index fbbe81c..fd99a62 100644
|
||||
--- a/field/asm/element_6w/BUILD.bazel
|
||||
+++ b/field/asm/element_6w/BUILD.bazel
|
||||
@@ -16,3 +16,15 @@ alias(
|
||||
actual = ":element_6w",
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
+
|
||||
+filegroup(
|
||||
+ name = "element_6w_amd64",
|
||||
+ srcs = ["element_6w_amd64.s"],
|
||||
+ visibility = ["//visibility:public"],
|
||||
+)
|
||||
+
|
||||
+filegroup(
|
||||
+ name = "element_6w_arm64",
|
||||
+ srcs = ["element_6w_arm64.s"],
|
||||
+ visibility = ["//visibility:public"],
|
||||
+)
|
||||
diff -urN gnark-patch-a/ecc/bn254/fp/BUILD.bazel gnark-patch-b/ecc/bn254/fp/BUILD.bazel
|
||||
--- gnark-patch-a/ecc/bn254/fp/BUILD.bazel 2025-11-19 13:10:39
|
||||
+++ gnark-patch-b/ecc/bn254/fp/BUILD.bazel 2025-11-19 13:08:50
|
||||
@@ -7,16 +7,22 @@
|
||||
"arith.go",
|
||||
"doc.go",
|
||||
"element.go",
|
||||
- "element_amd64.go",
|
||||
- "element_amd64.s",
|
||||
- "element_arm64.go",
|
||||
- "element_arm64.s",
|
||||
"element_exp.go",
|
||||
"element_purego.go",
|
||||
"vector.go",
|
||||
- "vector_amd64.go",
|
||||
"vector_purego.go",
|
||||
- ],
|
||||
+ ] + select({
|
||||
+ "@io_bazel_rules_go//go/platform:amd64": [
|
||||
+ "element_amd64.go",
|
||||
+ "//field/asm/element_4w:element_4w_amd64",
|
||||
+ "vector_amd64.go",
|
||||
+ ],
|
||||
+ "@io_bazel_rules_go//go/platform:arm64": [
|
||||
+ "element_arm64.go",
|
||||
+ "//field/asm/element_4w:element_4w_arm64",
|
||||
+ ],
|
||||
+ "//conditions:default": [],
|
||||
+ }),
|
||||
importpath = "github.com/consensys/gnark-crypto/ecc/bn254/fp",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
diff -urN gnark-patch-a/ecc/bn254/fr/BUILD.bazel gnark-patch-b/ecc/bn254/fr/BUILD.bazel
|
||||
--- gnark-patch-a/ecc/bn254/fr/BUILD.bazel 2025-11-19 13:10:39
|
||||
+++ gnark-patch-b/ecc/bn254/fr/BUILD.bazel 2025-11-19 13:08:55
|
||||
@@ -7,17 +7,23 @@
|
||||
"arith.go",
|
||||
"doc.go",
|
||||
"element.go",
|
||||
- "element_amd64.go",
|
||||
- "element_amd64.s",
|
||||
- "element_arm64.go",
|
||||
- "element_arm64.s",
|
||||
"element_exp.go",
|
||||
"element_purego.go",
|
||||
"generator.go",
|
||||
"vector.go",
|
||||
- "vector_amd64.go",
|
||||
"vector_purego.go",
|
||||
- ],
|
||||
+ ] + select({
|
||||
+ "@io_bazel_rules_go//go/platform:amd64": [
|
||||
+ "element_amd64.go",
|
||||
+ "//field/asm/element_4w:element_4w_amd64",
|
||||
+ "vector_amd64.go",
|
||||
+ ],
|
||||
+ "@io_bazel_rules_go//go/platform:arm64": [
|
||||
+ "element_arm64.go",
|
||||
+ "//field/asm/element_4w:element_4w_arm64",
|
||||
+ ],
|
||||
+ "//conditions:default": [],
|
||||
+ }),
|
||||
importpath = "github.com/consensys/gnark-crypto/ecc/bn254/fr",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
@@ -8,7 +8,7 @@ def _go_test_transition_impl(settings, attr):
|
||||
|
||||
if attr.eth_network == "minimal":
|
||||
settings["//proto:network"] = "minimal"
|
||||
settings["@io_bazel_rules_go//go/config:tags"] = ["minimal"] + settings["@io_bazel_rules_go//go/config:tags"]
|
||||
settings["@io_bazel_rules_go//go/config:tags"] = ["minimal"] + settings["@io_bazel_rules_go//go/config:tags"]
|
||||
elif attr.eth_network == "mainnet": # Default / optional
|
||||
settings["//proto:network"] = "mainnet"
|
||||
settings["@io_bazel_rules_go//go/config:tags"] = ["mainnet"] + settings["@io_bazel_rules_go//go/config:tags"]
|
||||
|
||||
Reference in New Issue
Block a user