mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-08 21:08:10 -05:00
* updating the goethereum dependency * fixing dependencies * reverting workspace * more fixes, work in progress * trying with upgraded geth version * fixing deprecated functions except for the time related ones on eth1 distance due to time issues * fixing time issues * gaz * fixing test and upgrading some dependencies and reverting others * Disable cgo in hid, delete old vendored usb library * changelog * rolling back dependencies * fixing go mod tidy * Geth v1.13.6 * fix tests * Add ping interval, set to 500ms for tests. This didnt work * Update to v1.14.8 * Spread it out to different bootnodes * Fix it * Remove Memsize * Update all out of date dependencies * Fix geth body change * Fix Test * Fix Build * Fix Tests * Fix Tests Again * Fix Tests Again * Fix Tests * Fix Test * Copy USB Package for HID * Push it up * Finally fix all tests with felix's changes * updating geth dependency * Update go-ethereum to v1.14.11 * fixing import * reverting blob change * fixing Implicit memory aliasing in for loop. * WIP changes * wip getting a little further on e2e runs * getting a little further * getting a little further * setting everything to capella * more partial fixes * more fixes but still WIP * fixing access list transactions" * some cleanup * making configs dynamic * reverting time * skip lower bound in builder * updating to geth v1.14.12 * fixing verify blob to pointer * go mod tidy * fixing linting * missed removing another terminal difficulty item * another missed update * updating more dependencies to fix cicd * fixing holiman dependency update * downgrading geth to 1.14.11 due to p2p loop issue * reverting builder middleware caused by downgrade * fixing more rollback issues * upgrading back to 1.14.12 after discussing with preston * mod tidy * gofmt * partial review feedback * trying to start e2e from bellatrix instead * reverting some changes --------- Co-authored-by: Preston Van Loon <preston@pvl.dev> Co-authored-by: nisdas <nishdas93@gmail.com>
340 lines
11 KiB
Go
340 lines
11 KiB
Go
package execution
|
|
|
|
import (
|
|
"context"
|
|
"math/big"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
|
gethTypes "github.com/ethereum/go-ethereum/core/types"
|
|
dbutil "github.com/prysmaticlabs/prysm/v5/beacon-chain/db/testing"
|
|
mockExecution "github.com/prysmaticlabs/prysm/v5/beacon-chain/execution/testing"
|
|
"github.com/prysmaticlabs/prysm/v5/beacon-chain/execution/types"
|
|
"github.com/prysmaticlabs/prysm/v5/config/params"
|
|
contracts "github.com/prysmaticlabs/prysm/v5/contracts/deposit"
|
|
"github.com/prysmaticlabs/prysm/v5/contracts/deposit/mock"
|
|
"github.com/prysmaticlabs/prysm/v5/testing/assert"
|
|
"github.com/prysmaticlabs/prysm/v5/testing/require"
|
|
)
|
|
|
|
func setDefaultMocks(service *Service) *Service {
|
|
service.httpLogger = &goodLogger{}
|
|
service.cfg.stateNotifier = &goodNotifier{}
|
|
return service
|
|
}
|
|
|
|
func TestLatestMainchainInfo_OK(t *testing.T) {
|
|
testAcc, err := mock.Setup()
|
|
require.NoError(t, err, "Unable to set up simulated backend")
|
|
|
|
beaconDB := dbutil.SetupDB(t)
|
|
server, endpoint, err := mockExecution.SetupRPCServer()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
server.Stop()
|
|
})
|
|
web3Service, err := NewService(context.Background(),
|
|
WithHttpEndpoint(endpoint),
|
|
WithDepositContractAddress(testAcc.ContractAddr),
|
|
WithDatabase(beaconDB),
|
|
)
|
|
require.NoError(t, err, "Unable to setup web3 ETH1.0 chain service")
|
|
|
|
web3Service = setDefaultMocks(web3Service)
|
|
web3Service.rpcClient = &mockExecution.RPCClient{Backend: testAcc.Backend}
|
|
|
|
web3Service.depositContractCaller, err = contracts.NewDepositContractCaller(testAcc.ContractAddr, testAcc.Backend.Client())
|
|
require.NoError(t, err)
|
|
testAcc.Backend.Commit()
|
|
|
|
tickerChan := make(chan time.Time)
|
|
web3Service.eth1HeadTicker = &time.Ticker{C: tickerChan}
|
|
exitRoutine := make(chan bool)
|
|
|
|
go func() {
|
|
web3Service.run(web3Service.ctx.Done())
|
|
<-exitRoutine
|
|
}()
|
|
|
|
header, err := web3Service.HeaderByNumber(web3Service.ctx, nil)
|
|
require.NoError(t, err)
|
|
|
|
tickerChan <- time.Now()
|
|
web3Service.cancel()
|
|
exitRoutine <- true
|
|
|
|
assert.Equal(t, web3Service.latestEth1Data.BlockHeight, header.Number.Uint64())
|
|
assert.Equal(t, hexutil.Encode(web3Service.latestEth1Data.BlockHash), header.Hash.Hex())
|
|
assert.Equal(t, web3Service.latestEth1Data.BlockTime, header.Time)
|
|
}
|
|
|
|
func TestBlockHashByHeight_ReturnsHash(t *testing.T) {
|
|
beaconDB := dbutil.SetupDB(t)
|
|
server, endpoint, err := mockExecution.SetupRPCServer()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
server.Stop()
|
|
})
|
|
web3Service, err := NewService(context.Background(),
|
|
WithHttpEndpoint(endpoint),
|
|
WithDatabase(beaconDB),
|
|
)
|
|
require.NoError(t, err, "unable to setup web3 ETH1.0 chain service")
|
|
|
|
web3Service = setDefaultMocks(web3Service)
|
|
web3Service.rpcClient = &mockExecution.RPCClient{}
|
|
ctx := context.Background()
|
|
|
|
header := &gethTypes.Header{
|
|
Number: big.NewInt(15),
|
|
Time: 150,
|
|
}
|
|
|
|
wanted := header.Hash()
|
|
|
|
hash, err := web3Service.BlockHashByHeight(ctx, big.NewInt(0))
|
|
require.NoError(t, err, "Could not get block hash with given height")
|
|
require.DeepEqual(t, wanted.Bytes(), hash.Bytes(), "Block hash did not equal expected hash")
|
|
|
|
exists, _, err := web3Service.headerCache.HeaderInfoByHash(wanted)
|
|
require.NoError(t, err)
|
|
require.Equal(t, true, exists, "Expected block info to be cached")
|
|
}
|
|
|
|
func TestBlockHashByHeight_ReturnsError_WhenNoEth1Client(t *testing.T) {
|
|
beaconDB := dbutil.SetupDB(t)
|
|
server, endpoint, err := mockExecution.SetupRPCServer()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
server.Stop()
|
|
})
|
|
web3Service, err := NewService(context.Background(),
|
|
WithHttpEndpoint(endpoint),
|
|
WithDatabase(beaconDB),
|
|
)
|
|
require.NoError(t, err, "unable to setup web3 ETH1.0 chain service")
|
|
|
|
web3Service = setDefaultMocks(web3Service)
|
|
web3Service.rpcClient = nil
|
|
ctx := context.Background()
|
|
|
|
_, err = web3Service.BlockHashByHeight(ctx, big.NewInt(0))
|
|
require.ErrorContains(t, "nil rpc client", err)
|
|
}
|
|
|
|
func TestBlockExists_ValidHash(t *testing.T) {
|
|
beaconDB := dbutil.SetupDB(t)
|
|
testAcc, err := mock.Setup()
|
|
require.NoError(t, err, "Unable to set up simulated backend")
|
|
server, endpoint, err := mockExecution.SetupRPCServer()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
server.Stop()
|
|
})
|
|
web3Service, err := NewService(context.Background(),
|
|
WithHttpEndpoint(endpoint),
|
|
WithDatabase(beaconDB),
|
|
)
|
|
require.NoError(t, err, "unable to setup web3 ETH1.0 chain service")
|
|
|
|
web3Service = setDefaultMocks(web3Service)
|
|
web3Service.rpcClient = &mockExecution.RPCClient{Backend: testAcc.Backend}
|
|
testAcc.Backend.Commit()
|
|
block, err := testAcc.Backend.Client().BlockByNumber(context.Background(), big.NewInt(0))
|
|
assert.NoError(t, err)
|
|
|
|
exists, height, err := web3Service.BlockExists(context.Background(), block.Hash())
|
|
require.NoError(t, err, "Could not get block hash with given height")
|
|
require.Equal(t, true, exists)
|
|
require.Equal(t, 0, height.Cmp(block.Number()))
|
|
|
|
exists, _, err = web3Service.headerCache.HeaderInfoByHeight(height)
|
|
require.NoError(t, err)
|
|
require.Equal(t, true, exists, "Expected block to be cached")
|
|
|
|
}
|
|
|
|
func TestBlockExists_InvalidHash(t *testing.T) {
|
|
beaconDB := dbutil.SetupDB(t)
|
|
server, endpoint, err := mockExecution.SetupRPCServer()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
server.Stop()
|
|
})
|
|
web3Service, err := NewService(context.Background(),
|
|
WithHttpEndpoint(endpoint),
|
|
WithDatabase(beaconDB),
|
|
)
|
|
require.NoError(t, err, "unable to setup web3 ETH1.0 chain service")
|
|
|
|
web3Service = setDefaultMocks(web3Service)
|
|
|
|
_, _, err = web3Service.BlockExists(context.Background(), common.BytesToHash([]byte{0}))
|
|
require.NotNil(t, err, "Expected BlockExists to error with invalid hash")
|
|
}
|
|
|
|
func TestBlockExists_UsesCachedBlockInfo(t *testing.T) {
|
|
beaconDB := dbutil.SetupDB(t)
|
|
server, endpoint, err := mockExecution.SetupRPCServer()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
server.Stop()
|
|
})
|
|
web3Service, err := NewService(context.Background(),
|
|
WithHttpEndpoint(endpoint),
|
|
WithDatabase(beaconDB),
|
|
)
|
|
require.NoError(t, err, "unable to setup web3 ETH1.0 chain service")
|
|
|
|
header := &types.HeaderInfo{
|
|
Number: big.NewInt(0),
|
|
}
|
|
|
|
err = web3Service.headerCache.AddHeader(header)
|
|
require.NoError(t, err)
|
|
|
|
exists, height, err := web3Service.BlockExists(context.Background(), header.Hash)
|
|
require.NoError(t, err, "Could not get block hash with given height")
|
|
require.Equal(t, true, exists)
|
|
require.Equal(t, 0, height.Cmp(header.Number))
|
|
}
|
|
|
|
func TestService_BlockNumberByTimestamp(t *testing.T) {
|
|
ctx := context.Background()
|
|
beaconDB := dbutil.SetupDB(t)
|
|
testAcc, err := mock.Setup()
|
|
|
|
require.NoError(t, err, "Unable to set up simulated backend")
|
|
server, endpoint, err := mockExecution.SetupRPCServer()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
server.Stop()
|
|
})
|
|
web3Service, err := NewService(context.Background(),
|
|
WithHttpEndpoint(endpoint),
|
|
WithDatabase(beaconDB),
|
|
)
|
|
require.NoError(t, err)
|
|
web3Service = setDefaultMocks(web3Service)
|
|
web3Service.rpcClient = &mockExecution.RPCClient{Backend: testAcc.Backend}
|
|
// simulated backend sets eth1 block
|
|
params.SetupTestConfigCleanup(t)
|
|
conf := params.BeaconConfig().Copy()
|
|
conf.SecondsPerETH1Block = 1
|
|
params.OverrideBeaconConfig(conf)
|
|
initialHead, err := testAcc.Backend.Client().HeaderByNumber(ctx, nil)
|
|
require.NoError(t, err)
|
|
for i := 0; i < 200; i++ {
|
|
testAcc.Backend.Commit()
|
|
}
|
|
|
|
hd, err := testAcc.Backend.Client().HeaderByNumber(ctx, nil)
|
|
require.NoError(t, err)
|
|
web3Service.latestEth1Data.BlockTime = hd.Time
|
|
web3Service.latestEth1Data.BlockHeight = hd.Number.Uint64()
|
|
blk, err := web3Service.BlockByTimestamp(ctx, initialHead.Time+100 /* time */)
|
|
require.NoError(t, err)
|
|
if blk.Number.Cmp(big.NewInt(0)) == 0 {
|
|
t.Error("Returned a block with zero number, expected to be non zero")
|
|
}
|
|
}
|
|
|
|
func TestService_BlockNumberByTimestampLessTargetTime(t *testing.T) {
|
|
beaconDB := dbutil.SetupDB(t)
|
|
testAcc, err := mock.Setup()
|
|
require.NoError(t, err, "Unable to set up simulated backend")
|
|
server, endpoint, err := mockExecution.SetupRPCServer()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
server.Stop()
|
|
})
|
|
web3Service, err := NewService(context.Background(),
|
|
WithHttpEndpoint(endpoint),
|
|
WithDatabase(beaconDB),
|
|
)
|
|
require.NoError(t, err)
|
|
web3Service = setDefaultMocks(web3Service)
|
|
web3Service.rpcClient = &mockExecution.RPCClient{Backend: testAcc.Backend}
|
|
|
|
for i := 0; i < 200; i++ {
|
|
testAcc.Backend.Commit()
|
|
}
|
|
ctx := context.Background()
|
|
hd, err := testAcc.Backend.Client().HeaderByNumber(ctx, nil)
|
|
require.NoError(t, err)
|
|
web3Service.latestEth1Data.BlockTime = hd.Time
|
|
// Use extremely small deadline to illustrate that context deadlines are respected.
|
|
ctx, cancel := context.WithTimeout(ctx, 100*time.Nanosecond)
|
|
defer cancel()
|
|
|
|
// Provide an unattainable target time
|
|
_, err = web3Service.findMaxTargetEth1Block(ctx, hd.Number, hd.Time/2)
|
|
require.ErrorContains(t, context.DeadlineExceeded.Error(), err)
|
|
|
|
// Provide an attainable target time
|
|
blk, err := web3Service.findMaxTargetEth1Block(context.Background(), hd.Number, hd.Time-5)
|
|
require.NoError(t, err)
|
|
require.NotEqual(t, hd.Number.Uint64(), blk.Number.Uint64(), "retrieved block is not less than the head")
|
|
}
|
|
|
|
func TestService_BlockNumberByTimestampMoreTargetTime(t *testing.T) {
|
|
beaconDB := dbutil.SetupDB(t)
|
|
testAcc, err := mock.Setup()
|
|
require.NoError(t, err, "Unable to set up simulated backend")
|
|
server, endpoint, err := mockExecution.SetupRPCServer()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
server.Stop()
|
|
})
|
|
web3Service, err := NewService(context.Background(),
|
|
WithHttpEndpoint(endpoint),
|
|
WithDatabase(beaconDB),
|
|
)
|
|
require.NoError(t, err)
|
|
web3Service = setDefaultMocks(web3Service)
|
|
web3Service.rpcClient = &mockExecution.RPCClient{Backend: testAcc.Backend}
|
|
|
|
for i := 0; i < 200; i++ {
|
|
testAcc.Backend.Commit()
|
|
}
|
|
ctx := context.Background()
|
|
hd, err := testAcc.Backend.Client().HeaderByNumber(ctx, nil)
|
|
require.NoError(t, err)
|
|
web3Service.latestEth1Data.BlockTime = hd.Time
|
|
// Use extremely small deadline to illustrate that context deadlines are respected.
|
|
ctx, cancel := context.WithTimeout(ctx, 100*time.Nanosecond)
|
|
defer cancel()
|
|
|
|
// Provide an unattainable target time with respect to head
|
|
_, err = web3Service.findMinTargetEth1Block(ctx, big.NewInt(0).Div(hd.Number, big.NewInt(2)), hd.Time)
|
|
require.ErrorContains(t, context.DeadlineExceeded.Error(), err)
|
|
|
|
// Provide an attainable target time with respect to head
|
|
blk, err := web3Service.findMinTargetEth1Block(context.Background(), big.NewInt(0).Sub(hd.Number, big.NewInt(5)), hd.Time)
|
|
require.NoError(t, err)
|
|
require.Equal(t, hd.Number.Uint64(), blk.Number.Uint64(), "retrieved block is not equal to the head")
|
|
}
|
|
|
|
func TestService_BlockTimeByHeight_ReturnsError_WhenNoEth1Client(t *testing.T) {
|
|
beaconDB := dbutil.SetupDB(t)
|
|
server, endpoint, err := mockExecution.SetupRPCServer()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
server.Stop()
|
|
})
|
|
web3Service, err := NewService(context.Background(),
|
|
WithHttpEndpoint(endpoint),
|
|
WithDatabase(beaconDB),
|
|
)
|
|
require.NoError(t, err, "unable to setup web3 ETH1.0 chain service")
|
|
|
|
web3Service = setDefaultMocks(web3Service)
|
|
web3Service.rpcClient = nil
|
|
ctx := context.Background()
|
|
|
|
_, err = web3Service.BlockTimeByHeight(ctx, big.NewInt(0))
|
|
require.ErrorContains(t, "nil rpc client", err)
|
|
}
|