diff --git a/go.mod b/go.mod index 3ca152a..77391b2 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/cenkalti/backoff/v5 v5.0.3 github.com/chuckpreslar/emission v0.0.0-20170206194824-a7ddd980baf9 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 - github.com/ethereum/go-ethereum v1.17.3 + github.com/ethereum/go-ethereum v1.17.3-0.20260507223249-73944e329925 github.com/ethpandaops/beacon v0.69.0 github.com/ethpandaops/ethereum-package-go v0.10.0 github.com/ethpandaops/ethwallclock v0.4.0 diff --git a/go.sum b/go.sum index 5e86b87..9505c4b 100644 --- a/go.sum +++ b/go.sum @@ -204,8 +204,8 @@ github.com/ethereum/c-kzg-4844/v2 v2.1.6 h1:xQymkKCT5E2Jiaoqf3v4wsNgjZLY0lRSkZn2 github.com/ethereum/c-kzg-4844/v2 v2.1.6/go.mod h1:8HMkUZ5JRv4hpw/XUrYWSQNAUzhHMg2UDb/U+5m+XNw= 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.17.3 h1:Ev/sQHH+UdKZHWjuVzhu2pxhi/sXaPZl23Q+Q5LDd4Q= -github.com/ethereum/go-ethereum v1.17.3/go.mod h1:f2EhRwqewIZkGoQekywI2Y2RZAMTSavLNkD9qItFy1A= +github.com/ethereum/go-ethereum v1.17.3-0.20260507223249-73944e329925 h1:d0kQnVKgCER1xIEYB0ucuNLfq4PtBZw+abMceZKUO8g= +github.com/ethereum/go-ethereum v1.17.3-0.20260507223249-73944e329925/go.mod h1:f2EhRwqewIZkGoQekywI2Y2RZAMTSavLNkD9qItFy1A= github.com/ethpandaops/beacon v0.69.0 h1:qGfy9y+zp8qLna6dgxvzLfAsAdGez0JL8BFJjr1Zudo= github.com/ethpandaops/beacon v0.69.0/go.mod h1:TSvV8MOrn2kfWgWEFOg5b3AvlMLF5BWbkpsMPPGf4/I= github.com/ethpandaops/ethereum-package-go v0.10.0 h1:q/TTZGWMjZmcuweASv14TEXxdPczCXMV2dAgCldQieA= diff --git a/pkg/ethereum/fork_test.go b/pkg/ethereum/fork_test.go index 857dd71..7a012e1 100644 --- a/pkg/ethereum/fork_test.go +++ b/pkg/ethereum/fork_test.go @@ -143,3 +143,39 @@ func TestComputeForkDigest_WithBlobParams(t *testing.T) { t.Logf("Digest with blobs (epoch=0, max=6): 0x%x", digestWithBlobs) t.Logf("Digest with blobs (epoch=10, max=8): 0x%x", digestWithDifferentBlobs) } + +func TestComputeForkDigest_Gloas(t *testing.T) { + // Test Gloas (Glamsterdam) fork digest computation with blob parameters. + // Gloas continues the blob schedule behavior from Fulu, so the digest + // should incorporate blob parameters via XOR with the blob param hash. + genesisValidatorsRoot := phase0.Root{0xe6, 0xf9, 0x2d, 0x48, 0x6d, 0x5d, 0x64, 0xc6, 0xd4, 0x43, 0x42, 0x90, 0x6b, 0x56, 0x74, 0x13, 0x77, 0x33, 0xa4, 0x8b, 0xae, 0x65, 0xa6, 0xe0, 0xd7, 0x5d, 0xc4, 0xfb, 0x4d, 0xec, 0x03, 0x0d} + + // Hypothetical Gloas fork version (following pattern: Electra 0x60, Fulu 0x70, Gloas 0x80) + gloasForkVersion := [4]byte{0x80, 0x93, 0x75, 0x44} + + // Without blob parameters + digestWithoutBlobs := ComputeForkDigest(genesisValidatorsRoot, gloasForkVersion, nil) + + // With blob parameters (Gloas inherits blob schedule from Fulu) + blobParams := &BlobScheduleEntry{ + Epoch: 0, + MaxBlobsPerBlock: 6, + } + digestWithBlobs := ComputeForkDigest(genesisValidatorsRoot, gloasForkVersion, blobParams) + + // Blob parameters should modify the digest + assert.NotEqual(t, digestWithoutBlobs, digestWithBlobs, "Gloas fork digest should be different with blob parameters") + + // Gloas digest should differ from Fulu with the same blob parameters + fuluForkVersion := [4]byte{0x70, 0x93, 0x75, 0x44} + fuluDigestWithBlobs := ComputeForkDigest(genesisValidatorsRoot, fuluForkVersion, blobParams) + assert.NotEqual(t, fuluDigestWithBlobs, digestWithBlobs, "Gloas and Fulu fork digests should differ even with same blob parameters") + + // Determinism check + digestWithBlobs2 := ComputeForkDigest(genesisValidatorsRoot, gloasForkVersion, blobParams) + assert.Equal(t, digestWithBlobs, digestWithBlobs2, "Gloas fork digest should be deterministic") + + t.Logf("Gloas digest without blobs: 0x%x", digestWithoutBlobs) + t.Logf("Gloas digest with blobs (epoch=0, max=6): 0x%x", digestWithBlobs) + t.Logf("Fulu digest with blobs (epoch=0, max=6): 0x%x", fuluDigestWithBlobs) +} diff --git a/pkg/execution/mimicry/client.go b/pkg/execution/mimicry/client.go index 07aea3d..3efd05e 100644 --- a/pkg/execution/mimicry/client.go +++ b/pkg/execution/mimicry/client.go @@ -107,6 +107,9 @@ func (c *Client) Start(ctx context.Context) error { _, msgPipe := p2p.MsgPipe() c.msgPipe = msgPipe + // chainConfig is fork-aware (Amsterdam timestamp check inside go-ethereum); pass nil + // because the mimicry client only observes Status handshakes and doesn't drive + // Amsterdam-aware behavior. go-ethereum's peer code handles nil defensively. c.ethPeer = eth.NewPeer(maxETHProtocolVersion, c.peer, c.msgPipe, nil, nil) address := c.nodeRecord.IP().String() + ":" + strconv.Itoa(c.nodeRecord.TCP())