|
|
|
|
@@ -29,58 +29,22 @@ func TestLightClient_NewLightClientOptimisticUpdateFromBeaconState(t *testing.T)
|
|
|
|
|
cfg.CapellaForkEpoch = 3
|
|
|
|
|
cfg.DenebForkEpoch = 4
|
|
|
|
|
cfg.ElectraForkEpoch = 5
|
|
|
|
|
cfg.FuluForkEpoch = 6
|
|
|
|
|
params.OverrideBeaconConfig(cfg)
|
|
|
|
|
|
|
|
|
|
t.Run("Altair", func(t *testing.T) {
|
|
|
|
|
l := util.NewTestLightClient(t, version.Altair)
|
|
|
|
|
for _, testVersion := range version.All()[1:] {
|
|
|
|
|
t.Run(version.String(testVersion), func(t *testing.T) {
|
|
|
|
|
l := util.NewTestLightClient(t, testVersion)
|
|
|
|
|
|
|
|
|
|
update, err := lightClient.NewLightClientOptimisticUpdateFromBeaconState(l.Ctx, l.State, l.Block, l.AttestedState, l.AttestedBlock)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.NotNil(t, update, "update is nil")
|
|
|
|
|
require.Equal(t, l.Block.Block().Slot(), update.SignatureSlot(), "Signature slot is not equal")
|
|
|
|
|
update, err := lightClient.NewLightClientOptimisticUpdateFromBeaconState(l.Ctx, l.State, l.Block, l.AttestedState, l.AttestedBlock)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.NotNil(t, update, "update is nil")
|
|
|
|
|
require.Equal(t, l.Block.Block().Slot(), update.SignatureSlot(), "Signature slot is not equal")
|
|
|
|
|
|
|
|
|
|
l.CheckSyncAggregate(update.SyncAggregate())
|
|
|
|
|
l.CheckAttestedHeader(update.AttestedHeader())
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("Capella", func(t *testing.T) {
|
|
|
|
|
l := util.NewTestLightClient(t, version.Capella)
|
|
|
|
|
|
|
|
|
|
update, err := lightClient.NewLightClientOptimisticUpdateFromBeaconState(l.Ctx, l.State, l.Block, l.AttestedState, l.AttestedBlock)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.NotNil(t, update, "update is nil")
|
|
|
|
|
|
|
|
|
|
require.Equal(t, l.Block.Block().Slot(), update.SignatureSlot(), "Signature slot is not equal")
|
|
|
|
|
|
|
|
|
|
l.CheckSyncAggregate(update.SyncAggregate())
|
|
|
|
|
l.CheckAttestedHeader(update.AttestedHeader())
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("Deneb", func(t *testing.T) {
|
|
|
|
|
l := util.NewTestLightClient(t, version.Deneb)
|
|
|
|
|
|
|
|
|
|
update, err := lightClient.NewLightClientOptimisticUpdateFromBeaconState(l.Ctx, l.State, l.Block, l.AttestedState, l.AttestedBlock)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.NotNil(t, update, "update is nil")
|
|
|
|
|
|
|
|
|
|
require.Equal(t, l.Block.Block().Slot(), update.SignatureSlot(), "Signature slot is not equal")
|
|
|
|
|
|
|
|
|
|
l.CheckSyncAggregate(update.SyncAggregate())
|
|
|
|
|
l.CheckAttestedHeader(update.AttestedHeader())
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("Electra", func(t *testing.T) {
|
|
|
|
|
l := util.NewTestLightClient(t, version.Electra)
|
|
|
|
|
|
|
|
|
|
update, err := lightClient.NewLightClientOptimisticUpdateFromBeaconState(l.Ctx, l.State, l.Block, l.AttestedState, l.AttestedBlock)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.NotNil(t, update, "update is nil")
|
|
|
|
|
|
|
|
|
|
require.Equal(t, l.Block.Block().Slot(), update.SignatureSlot(), "Signature slot is not equal")
|
|
|
|
|
|
|
|
|
|
l.CheckSyncAggregate(update.SyncAggregate())
|
|
|
|
|
l.CheckAttestedHeader(update.AttestedHeader())
|
|
|
|
|
})
|
|
|
|
|
l.CheckSyncAggregate(update.SyncAggregate())
|
|
|
|
|
l.CheckAttestedHeader(update.AttestedHeader())
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestLightClient_NewLightClientFinalityUpdateFromBeaconState(t *testing.T) {
|
|
|
|
|
@@ -91,6 +55,7 @@ func TestLightClient_NewLightClientFinalityUpdateFromBeaconState(t *testing.T) {
|
|
|
|
|
cfg.CapellaForkEpoch = 3
|
|
|
|
|
cfg.DenebForkEpoch = 4
|
|
|
|
|
cfg.ElectraForkEpoch = 5
|
|
|
|
|
cfg.FuluForkEpoch = 6
|
|
|
|
|
params.OverrideBeaconConfig(cfg)
|
|
|
|
|
|
|
|
|
|
t.Run("Altair", func(t *testing.T) {
|
|
|
|
|
@@ -538,6 +503,157 @@ func TestLightClient_NewLightClientFinalityUpdateFromBeaconState(t *testing.T) {
|
|
|
|
|
require.DeepSSZEqual(t, execution, updateExecution.Proto(), "Finalized Block Execution is not equal")
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("Fulu", func(t *testing.T) {
|
|
|
|
|
t.Run("FinalizedBlock Not Nil", func(t *testing.T) {
|
|
|
|
|
l := util.NewTestLightClient(t, version.Fulu)
|
|
|
|
|
|
|
|
|
|
update, err := lightClient.NewLightClientFinalityUpdateFromBeaconState(l.Ctx, l.State, l.Block, l.AttestedState, l.AttestedBlock, l.FinalizedBlock)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.NotNil(t, update, "update is nil")
|
|
|
|
|
|
|
|
|
|
require.Equal(t, l.Block.Block().Slot(), update.SignatureSlot(), "Signature slot is not equal")
|
|
|
|
|
|
|
|
|
|
l.CheckSyncAggregate(update.SyncAggregate())
|
|
|
|
|
l.CheckAttestedHeader(update.AttestedHeader())
|
|
|
|
|
|
|
|
|
|
//zeroHash := params.BeaconConfig().ZeroHash[:]
|
|
|
|
|
finalizedBlockHeader, err := l.FinalizedBlock.Header()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.NotNil(t, update.FinalizedHeader(), "Finalized header is nil")
|
|
|
|
|
updateFinalizedHeaderBeacon := update.FinalizedHeader().Beacon()
|
|
|
|
|
require.Equal(t, finalizedBlockHeader.Header.Slot, updateFinalizedHeaderBeacon.Slot, "Finalized header slot is not equal")
|
|
|
|
|
require.Equal(t, finalizedBlockHeader.Header.ProposerIndex, updateFinalizedHeaderBeacon.ProposerIndex, "Finalized header proposer index is not equal")
|
|
|
|
|
require.DeepSSZEqual(t, finalizedBlockHeader.Header.ParentRoot, updateFinalizedHeaderBeacon.ParentRoot, "Finalized header parent root is not equal")
|
|
|
|
|
require.DeepSSZEqual(t, finalizedBlockHeader.Header.StateRoot, updateFinalizedHeaderBeacon.StateRoot, "Finalized header state root is not equal")
|
|
|
|
|
require.DeepSSZEqual(t, finalizedBlockHeader.Header.BodyRoot, updateFinalizedHeaderBeacon.BodyRoot, "Finalized header body root is not equal")
|
|
|
|
|
fb, err := update.FinalityBranchElectra()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
proof, err := l.AttestedState.FinalizedRootProof(l.Ctx)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
for i, leaf := range fb {
|
|
|
|
|
require.DeepSSZEqual(t, proof[i], leaf[:], "Leaf is not equal")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check Execution BlockHash
|
|
|
|
|
payloadInterface, err := l.FinalizedBlock.Block().Body().Execution()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
transactionsRoot, err := payloadInterface.TransactionsRoot()
|
|
|
|
|
if errors.Is(err, consensustypes.ErrUnsupportedField) {
|
|
|
|
|
transactions, err := payloadInterface.Transactions()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
transactionsRootArray, err := ssz.TransactionsRoot(transactions)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
transactionsRoot = transactionsRootArray[:]
|
|
|
|
|
} else {
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
}
|
|
|
|
|
withdrawalsRoot, err := payloadInterface.WithdrawalsRoot()
|
|
|
|
|
if errors.Is(err, consensustypes.ErrUnsupportedField) {
|
|
|
|
|
withdrawals, err := payloadInterface.Withdrawals()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
withdrawalsRootArray, err := ssz.WithdrawalSliceRoot(withdrawals, fieldparams.MaxWithdrawalsPerPayload)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
withdrawalsRoot = withdrawalsRootArray[:]
|
|
|
|
|
} else {
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
}
|
|
|
|
|
execution := &v11.ExecutionPayloadHeaderDeneb{
|
|
|
|
|
ParentHash: payloadInterface.ParentHash(),
|
|
|
|
|
FeeRecipient: payloadInterface.FeeRecipient(),
|
|
|
|
|
StateRoot: payloadInterface.StateRoot(),
|
|
|
|
|
ReceiptsRoot: payloadInterface.ReceiptsRoot(),
|
|
|
|
|
LogsBloom: payloadInterface.LogsBloom(),
|
|
|
|
|
PrevRandao: payloadInterface.PrevRandao(),
|
|
|
|
|
BlockNumber: payloadInterface.BlockNumber(),
|
|
|
|
|
GasLimit: payloadInterface.GasLimit(),
|
|
|
|
|
GasUsed: payloadInterface.GasUsed(),
|
|
|
|
|
Timestamp: payloadInterface.Timestamp(),
|
|
|
|
|
ExtraData: payloadInterface.ExtraData(),
|
|
|
|
|
BaseFeePerGas: payloadInterface.BaseFeePerGas(),
|
|
|
|
|
BlockHash: payloadInterface.BlockHash(),
|
|
|
|
|
TransactionsRoot: transactionsRoot,
|
|
|
|
|
WithdrawalsRoot: withdrawalsRoot,
|
|
|
|
|
}
|
|
|
|
|
updateExecution, err := update.FinalizedHeader().Execution()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.DeepSSZEqual(t, execution, updateExecution.Proto(), "Finalized Block Execution is not equal")
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("FinalizedBlock In Previous Fork", func(t *testing.T) {
|
|
|
|
|
l := util.NewTestLightClient(t, version.Fulu, util.WithFinalizedCheckpointInPrevFork())
|
|
|
|
|
|
|
|
|
|
update, err := lightClient.NewLightClientFinalityUpdateFromBeaconState(l.Ctx, l.State, l.Block, l.AttestedState, l.AttestedBlock, l.FinalizedBlock)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.NotNil(t, update, "update is nil")
|
|
|
|
|
|
|
|
|
|
require.Equal(t, l.Block.Block().Slot(), update.SignatureSlot(), "Signature slot is not equal")
|
|
|
|
|
|
|
|
|
|
l.CheckSyncAggregate(update.SyncAggregate())
|
|
|
|
|
l.CheckAttestedHeader(update.AttestedHeader())
|
|
|
|
|
|
|
|
|
|
finalizedBlockHeader, err := l.FinalizedBlock.Header()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.NotNil(t, update.FinalizedHeader(), "Finalized header is nil")
|
|
|
|
|
updateFinalizedHeaderBeacon := update.FinalizedHeader().Beacon()
|
|
|
|
|
require.Equal(t, finalizedBlockHeader.Header.Slot, updateFinalizedHeaderBeacon.Slot, "Finalized header slot is not equal")
|
|
|
|
|
require.Equal(t, finalizedBlockHeader.Header.ProposerIndex, updateFinalizedHeaderBeacon.ProposerIndex, "Finalized header proposer index is not equal")
|
|
|
|
|
require.DeepSSZEqual(t, finalizedBlockHeader.Header.ParentRoot, updateFinalizedHeaderBeacon.ParentRoot, "Finalized header parent root is not equal")
|
|
|
|
|
require.DeepSSZEqual(t, finalizedBlockHeader.Header.StateRoot, updateFinalizedHeaderBeacon.StateRoot, "Finalized header state root is not equal")
|
|
|
|
|
require.DeepSSZEqual(t, finalizedBlockHeader.Header.BodyRoot, updateFinalizedHeaderBeacon.BodyRoot, "Finalized header body root is not equal")
|
|
|
|
|
fb, err := update.FinalityBranchElectra()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
proof, err := l.AttestedState.FinalizedRootProof(l.Ctx)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
for i, leaf := range fb {
|
|
|
|
|
require.DeepSSZEqual(t, proof[i], leaf[:], "Leaf is not equal")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check Execution BlockHash
|
|
|
|
|
payloadInterface, err := l.FinalizedBlock.Block().Body().Execution()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
transactionsRoot, err := payloadInterface.TransactionsRoot()
|
|
|
|
|
if errors.Is(err, consensustypes.ErrUnsupportedField) {
|
|
|
|
|
transactions, err := payloadInterface.Transactions()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
transactionsRootArray, err := ssz.TransactionsRoot(transactions)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
transactionsRoot = transactionsRootArray[:]
|
|
|
|
|
} else {
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
}
|
|
|
|
|
withdrawalsRoot, err := payloadInterface.WithdrawalsRoot()
|
|
|
|
|
if errors.Is(err, consensustypes.ErrUnsupportedField) {
|
|
|
|
|
withdrawals, err := payloadInterface.Withdrawals()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
withdrawalsRootArray, err := ssz.WithdrawalSliceRoot(withdrawals, fieldparams.MaxWithdrawalsPerPayload)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
withdrawalsRoot = withdrawalsRootArray[:]
|
|
|
|
|
} else {
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
}
|
|
|
|
|
execution := &v11.ExecutionPayloadHeaderDeneb{
|
|
|
|
|
ParentHash: payloadInterface.ParentHash(),
|
|
|
|
|
FeeRecipient: payloadInterface.FeeRecipient(),
|
|
|
|
|
StateRoot: payloadInterface.StateRoot(),
|
|
|
|
|
ReceiptsRoot: payloadInterface.ReceiptsRoot(),
|
|
|
|
|
LogsBloom: payloadInterface.LogsBloom(),
|
|
|
|
|
PrevRandao: payloadInterface.PrevRandao(),
|
|
|
|
|
BlockNumber: payloadInterface.BlockNumber(),
|
|
|
|
|
GasLimit: payloadInterface.GasLimit(),
|
|
|
|
|
GasUsed: payloadInterface.GasUsed(),
|
|
|
|
|
Timestamp: payloadInterface.Timestamp(),
|
|
|
|
|
ExtraData: payloadInterface.ExtraData(),
|
|
|
|
|
BaseFeePerGas: payloadInterface.BaseFeePerGas(),
|
|
|
|
|
BlockHash: payloadInterface.BlockHash(),
|
|
|
|
|
TransactionsRoot: transactionsRoot,
|
|
|
|
|
WithdrawalsRoot: withdrawalsRoot,
|
|
|
|
|
}
|
|
|
|
|
updateExecution, err := update.FinalizedHeader().Execution()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.DeepSSZEqual(t, execution, updateExecution.Proto(), "Finalized Block Execution is not equal")
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestLightClient_BlockToLightClientHeader(t *testing.T) {
|
|
|
|
|
@@ -983,6 +1099,138 @@ func TestLightClient_BlockToLightClientHeader(t *testing.T) {
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("Fulu", func(t *testing.T) {
|
|
|
|
|
t.Run("Non-Blinded Beacon Block", func(t *testing.T) {
|
|
|
|
|
l := util.NewTestLightClient(t, version.Fulu)
|
|
|
|
|
|
|
|
|
|
header, err := lightClient.BlockToLightClientHeader(l.Ctx, version.Fulu, l.Block)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.NotNil(t, header, "header is nil")
|
|
|
|
|
|
|
|
|
|
parentRoot := l.Block.Block().ParentRoot()
|
|
|
|
|
stateRoot := l.Block.Block().StateRoot()
|
|
|
|
|
bodyRoot, err := l.Block.Block().Body().HashTreeRoot()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
payload, err := l.Block.Block().Body().Execution()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
transactionsRoot, err := lightClient.ComputeTransactionsRoot(payload)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
withdrawalsRoot, err := lightClient.ComputeWithdrawalsRoot(payload)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
blobGasUsed, err := payload.BlobGasUsed()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
excessBlobGas, err := payload.ExcessBlobGas()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
executionHeader := &v11.ExecutionPayloadHeaderDeneb{
|
|
|
|
|
ParentHash: payload.ParentHash(),
|
|
|
|
|
FeeRecipient: payload.FeeRecipient(),
|
|
|
|
|
StateRoot: payload.StateRoot(),
|
|
|
|
|
ReceiptsRoot: payload.ReceiptsRoot(),
|
|
|
|
|
LogsBloom: payload.LogsBloom(),
|
|
|
|
|
PrevRandao: payload.PrevRandao(),
|
|
|
|
|
BlockNumber: payload.BlockNumber(),
|
|
|
|
|
GasLimit: payload.GasLimit(),
|
|
|
|
|
GasUsed: payload.GasUsed(),
|
|
|
|
|
Timestamp: payload.Timestamp(),
|
|
|
|
|
ExtraData: payload.ExtraData(),
|
|
|
|
|
BaseFeePerGas: payload.BaseFeePerGas(),
|
|
|
|
|
BlockHash: payload.BlockHash(),
|
|
|
|
|
TransactionsRoot: transactionsRoot,
|
|
|
|
|
WithdrawalsRoot: withdrawalsRoot,
|
|
|
|
|
BlobGasUsed: blobGasUsed,
|
|
|
|
|
ExcessBlobGas: excessBlobGas,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
executionPayloadProof, err := blocks.PayloadProof(l.Ctx, l.Block.Block())
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
require.Equal(t, l.Block.Block().Slot(), header.Beacon().Slot, "Slot is not equal")
|
|
|
|
|
require.Equal(t, l.Block.Block().ProposerIndex(), header.Beacon().ProposerIndex, "Proposer index is not equal")
|
|
|
|
|
require.DeepSSZEqual(t, parentRoot[:], header.Beacon().ParentRoot, "Parent root is not equal")
|
|
|
|
|
require.DeepSSZEqual(t, stateRoot[:], header.Beacon().StateRoot, "State root is not equal")
|
|
|
|
|
require.DeepSSZEqual(t, bodyRoot[:], header.Beacon().BodyRoot, "Body root is not equal")
|
|
|
|
|
|
|
|
|
|
headerExecution, err := header.Execution()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.DeepSSZEqual(t, executionHeader, headerExecution.Proto(), "Execution headers are not equal")
|
|
|
|
|
|
|
|
|
|
headerExecutionBranch, err := header.ExecutionBranch()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.DeepSSZEqual(t, executionPayloadProof, convertArrayToSlice(headerExecutionBranch), "Execution payload proofs are not equal")
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("Blinded Beacon Block", func(t *testing.T) {
|
|
|
|
|
l := util.NewTestLightClient(t, version.Fulu, util.WithBlinded())
|
|
|
|
|
|
|
|
|
|
header, err := lightClient.BlockToLightClientHeader(l.Ctx, version.Fulu, l.Block)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.NotNil(t, header, "header is nil")
|
|
|
|
|
|
|
|
|
|
parentRoot := l.Block.Block().ParentRoot()
|
|
|
|
|
stateRoot := l.Block.Block().StateRoot()
|
|
|
|
|
bodyRoot, err := l.Block.Block().Body().HashTreeRoot()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
payload, err := l.Block.Block().Body().Execution()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
transactionsRoot, err := payload.TransactionsRoot()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
withdrawalsRoot, err := payload.WithdrawalsRoot()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
blobGasUsed, err := payload.BlobGasUsed()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
excessBlobGas, err := payload.ExcessBlobGas()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
executionHeader := &v11.ExecutionPayloadHeaderDeneb{
|
|
|
|
|
ParentHash: payload.ParentHash(),
|
|
|
|
|
FeeRecipient: payload.FeeRecipient(),
|
|
|
|
|
StateRoot: payload.StateRoot(),
|
|
|
|
|
ReceiptsRoot: payload.ReceiptsRoot(),
|
|
|
|
|
LogsBloom: payload.LogsBloom(),
|
|
|
|
|
PrevRandao: payload.PrevRandao(),
|
|
|
|
|
BlockNumber: payload.BlockNumber(),
|
|
|
|
|
GasLimit: payload.GasLimit(),
|
|
|
|
|
GasUsed: payload.GasUsed(),
|
|
|
|
|
Timestamp: payload.Timestamp(),
|
|
|
|
|
ExtraData: payload.ExtraData(),
|
|
|
|
|
BaseFeePerGas: payload.BaseFeePerGas(),
|
|
|
|
|
BlockHash: payload.BlockHash(),
|
|
|
|
|
TransactionsRoot: transactionsRoot,
|
|
|
|
|
WithdrawalsRoot: withdrawalsRoot,
|
|
|
|
|
BlobGasUsed: blobGasUsed,
|
|
|
|
|
ExcessBlobGas: excessBlobGas,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
executionPayloadProof, err := blocks.PayloadProof(l.Ctx, l.Block.Block())
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
require.Equal(t, l.Block.Block().Slot(), header.Beacon().Slot, "Slot is not equal")
|
|
|
|
|
require.Equal(t, l.Block.Block().ProposerIndex(), header.Beacon().ProposerIndex, "Proposer index is not equal")
|
|
|
|
|
require.DeepSSZEqual(t, parentRoot[:], header.Beacon().ParentRoot, "Parent root is not equal")
|
|
|
|
|
require.DeepSSZEqual(t, stateRoot[:], header.Beacon().StateRoot, "State root is not equal")
|
|
|
|
|
require.DeepSSZEqual(t, bodyRoot[:], header.Beacon().BodyRoot, "Body root is not equal")
|
|
|
|
|
|
|
|
|
|
headerExecution, err := header.Execution()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.DeepSSZEqual(t, executionHeader, headerExecution.Proto(), "Execution headers are not equal")
|
|
|
|
|
|
|
|
|
|
headerExecutionBranch, err := header.ExecutionBranch()
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.DeepSSZEqual(t, executionPayloadProof, convertArrayToSlice(headerExecutionBranch), "Execution payload proofs are not equal")
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("Capella fork with Altair block", func(t *testing.T) {
|
|
|
|
|
l := util.NewTestLightClient(t, version.Altair)
|
|
|
|
|
|
|
|
|
|
|