Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions aggsender/aggsender.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ type AggSender struct {
cfg config.Config

status *types.AggsenderStatus
flow types.AggsenderFlow
flow types.AggsenderBuilderFlow

l2OriginNetwork uint32
}
Expand Down Expand Up @@ -92,7 +92,7 @@ func New(
return nil, err
}

flowManager, err := flows.NewFlow(
flowManager, err := flows.NewBuilderFlow(
ctx,
cfg,
logger,
Expand Down Expand Up @@ -132,12 +132,22 @@ func New(
aggLayerClient,
)

verifierFlow, err := flows.NewLocalVerifier(
ctx,
cfg,
l1Client,
flowManager,
)
if err != nil {
return nil, fmt.Errorf("error creating verifier flow: %w", err)
}

localValidator := validator.NewLocalValidator(
logger,
storage,
validator.NewAggsenderValidator(
logger,
flowManager,
verifierFlow,
query.NewL1InfoTreeDataQuerier(l1Client, l1InfoTreeSyncer),
certQuerier,
query.NewLERDataQuerier(cfg.RollupCreationBlockL1, rollupDataQuerier),
Expand Down
44 changes: 22 additions & 22 deletions aggsender/aggsender_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ func TestSendCertificate_NoClaims(t *testing.T) {
cfg: config.Config{},
validatorPoller: mockValidatorPoller,
localValidator: mockLocalValidator,
flow: flows.NewPPFlow(logger,
flow: flows.NewPPBuilderFlow(logger,
flows.NewBaseFlow(logger, mockL2BridgeQuerier, mockStorage,
mockL1Querier, mockLERQuerier, flows.NewBaseFlowConfigDefault()),
mockStorage, mockL1Querier, mockL2BridgeQuerier, signer, true, 0),
Expand Down Expand Up @@ -281,14 +281,14 @@ func TestSendCertificate(t *testing.T) {

testCases := []struct {
name string
mockFn func(*mocks.AggSenderStorage, *mocks.AggsenderFlow, *agglayermocks.AgglayerClientMock)
mockFn func(*mocks.AggSenderStorage, *mocks.AggsenderBuilderFlow, *agglayermocks.AgglayerClientMock)
mockValidatorFn func() (*mocks.ValidatorPoller, *mocks.CertificateValidateAndSigner)
expectedError string
}{
{
name: "error getting certificate build params",
mockFn: func(mockStorage *mocks.AggSenderStorage,
mockFlow *mocks.AggsenderFlow,
mockFlow *mocks.AggsenderBuilderFlow,
mockAgglayerClient *agglayermocks.AgglayerClientMock) {
mockFlow.EXPECT().GetCertificateBuildParams(mock.Anything).Return(nil, errors.New("some error")).Once()
},
Expand All @@ -297,15 +297,15 @@ func TestSendCertificate(t *testing.T) {
{
name: "no new blocks consumed",
mockFn: func(mockStorage *mocks.AggSenderStorage,
mockFlow *mocks.AggsenderFlow,
mockFlow *mocks.AggsenderBuilderFlow,
mockAgglayerClient *agglayermocks.AgglayerClientMock) {
mockFlow.EXPECT().GetCertificateBuildParams(mock.Anything).Return(nil, nil).Once()
},
},
{
name: "error building certificate",
mockFn: func(mockStorage *mocks.AggSenderStorage,
mockFlow *mocks.AggsenderFlow,
mockFlow *mocks.AggsenderBuilderFlow,
mockAgglayerClient *agglayermocks.AgglayerClientMock) {
mockFlow.EXPECT().GetCertificateBuildParams(mock.Anything).Return(&aggsendertypes.CertificateBuildParams{
Bridges: []bridgesync.Bridge{{}},
Expand All @@ -317,7 +317,7 @@ func TestSendCertificate(t *testing.T) {
{
name: "error sending certificate",
mockFn: func(mockStorage *mocks.AggSenderStorage,
mockFlow *mocks.AggsenderFlow,
mockFlow *mocks.AggsenderBuilderFlow,
mockAgglayerClient *agglayermocks.AgglayerClientMock) {
mockFlow.EXPECT().GetCertificateBuildParams(mock.Anything).Return(&aggsendertypes.CertificateBuildParams{
Bridges: []bridgesync.Bridge{{}},
Expand Down Expand Up @@ -347,7 +347,7 @@ func TestSendCertificate(t *testing.T) {
{
name: "error saving certificate to storage",
mockFn: func(mockStorage *mocks.AggSenderStorage,
mockFlow *mocks.AggsenderFlow,
mockFlow *mocks.AggsenderBuilderFlow,
mockAgglayerClient *agglayermocks.AgglayerClientMock) {
mockFlow.EXPECT().GetCertificateBuildParams(mock.Anything).Return(&aggsendertypes.CertificateBuildParams{
Bridges: []bridgesync.Bridge{{}},
Expand Down Expand Up @@ -377,7 +377,7 @@ func TestSendCertificate(t *testing.T) {
{
name: "error getting validator signature",
mockFn: func(mockStorage *mocks.AggSenderStorage,
mockFlow *mocks.AggsenderFlow,
mockFlow *mocks.AggsenderBuilderFlow,
mockAgglayerClient *agglayermocks.AgglayerClientMock) {
mockFlow.EXPECT().GetCertificateBuildParams(mock.Anything).Return(&aggsendertypes.CertificateBuildParams{
Bridges: []bridgesync.Bridge{{}},
Expand All @@ -403,7 +403,7 @@ func TestSendCertificate(t *testing.T) {
{
name: "successful validation and sending of a certificate",
mockFn: func(mockStorage *mocks.AggSenderStorage,
mockFlow *mocks.AggsenderFlow,
mockFlow *mocks.AggsenderBuilderFlow,
mockAgglayerClient *agglayermocks.AgglayerClientMock) {
mockFlow.EXPECT().GetCertificateBuildParams(mock.Anything).Return(&aggsendertypes.CertificateBuildParams{
Bridges: []bridgesync.Bridge{{}},
Expand Down Expand Up @@ -432,7 +432,7 @@ func TestSendCertificate(t *testing.T) {
{
name: "successful sending and saving of a certificate",
mockFn: func(mockStorage *mocks.AggSenderStorage,
mockFlow *mocks.AggsenderFlow,
mockFlow *mocks.AggsenderBuilderFlow,
mockAgglayerClient *agglayermocks.AgglayerClientMock) {
mockFlow.EXPECT().GetCertificateBuildParams(mock.Anything).Return(&aggsendertypes.CertificateBuildParams{
Bridges: []bridgesync.Bridge{{}},
Expand Down Expand Up @@ -465,7 +465,7 @@ func TestSendCertificate(t *testing.T) {
t.Parallel()

mockStorage := mocks.NewAggSenderStorage(t)
mockAggsenderFlow := mocks.NewAggsenderFlow(t)
mockAggsenderFlow := mocks.NewAggsenderBuilderFlow(t)
mockAgglayerClient := agglayermocks.NewAgglayerClientMock(t)
mockEpochNotifier := mocks.NewEpochNotifier(t)
tt.mockFn(mockStorage, mockAggsenderFlow, mockAgglayerClient)
Expand Down Expand Up @@ -560,7 +560,7 @@ func TestSendCertificatesRetry(t *testing.T) {
mockCertStatusChecker := mocks.NewCertificateStatusChecker(t)
mockEpochNotifier := mocks.NewEpochNotifier(t)
mockStorage := mocks.NewAggSenderStorage(t)
mockFlow := mocks.NewAggsenderFlow(t)
mockFlow := mocks.NewAggsenderBuilderFlow(t)

logger := log.WithFields("aggsender-test", "TestSendCertificatesRetry")
aggSender := &AggSender{
Expand Down Expand Up @@ -612,20 +612,20 @@ func TestSendCertificates(t *testing.T) {

tests := []struct {
name string
mockFn func(*mocks.CertificateStatusChecker, *mocks.EpochNotifier, *mocks.AggSenderStorage, *mocks.AggsenderFlow)
mockFn func(*mocks.CertificateStatusChecker, *mocks.EpochNotifier, *mocks.AggSenderStorage, *mocks.AggsenderBuilderFlow)
returnAfterNIterations int
certStatusCheckInterval time.Duration
}{
{
name: "context canceled",
mockFn: func(mockCertStatusChecker *mocks.CertificateStatusChecker, mockEpochNotifier *mocks.EpochNotifier, mockStorage *mocks.AggSenderStorage, mockFlow *mocks.AggsenderFlow) {
mockFn: func(mockCertStatusChecker *mocks.CertificateStatusChecker, mockEpochNotifier *mocks.EpochNotifier, mockStorage *mocks.AggSenderStorage, mockFlow *mocks.AggsenderBuilderFlow) {
mockEpochNotifier.EXPECT().Subscribe("aggsender").Return(make(chan aggsendertypes.EpochEvent)).Once()
},
returnAfterNIterations: 0,
},
{
name: "retry certificate after in-error",
mockFn: func(mockCertStatusChecker *mocks.CertificateStatusChecker, mockEpochNotifier *mocks.EpochNotifier, mockStorage *mocks.AggSenderStorage, mockFlow *mocks.AggsenderFlow) {
mockFn: func(mockCertStatusChecker *mocks.CertificateStatusChecker, mockEpochNotifier *mocks.EpochNotifier, mockStorage *mocks.AggSenderStorage, mockFlow *mocks.AggsenderBuilderFlow) {
mockCertStatusChecker.EXPECT().CheckPendingCertificatesStatus(mock.Anything).Return(aggsendertypes.CertStatus{
ExistPendingCerts: false,
ExistNewInErrorCert: true,
Expand All @@ -639,7 +639,7 @@ func TestSendCertificates(t *testing.T) {
},
{
name: "epoch received with no pending certificates",
mockFn: func(mockCertStatusChecker *mocks.CertificateStatusChecker, mockEpochNotifier *mocks.EpochNotifier, mockStorage *mocks.AggSenderStorage, mockFlow *mocks.AggsenderFlow) {
mockFn: func(mockCertStatusChecker *mocks.CertificateStatusChecker, mockEpochNotifier *mocks.EpochNotifier, mockStorage *mocks.AggSenderStorage, mockFlow *mocks.AggsenderBuilderFlow) {
chEpoch := make(chan aggsendertypes.EpochEvent, 1)
chEpoch <- aggsendertypes.EpochEvent{Epoch: 1}
mockEpochNotifier.EXPECT().Subscribe("aggsender").Return(chEpoch).Once()
Expand All @@ -653,7 +653,7 @@ func TestSendCertificates(t *testing.T) {
},
{
name: "epoch received with pending certificates",
mockFn: func(mockCertStatusChecker *mocks.CertificateStatusChecker, mockEpochNotifier *mocks.EpochNotifier, mockStorage *mocks.AggSenderStorage, mockFlow *mocks.AggsenderFlow) {
mockFn: func(mockCertStatusChecker *mocks.CertificateStatusChecker, mockEpochNotifier *mocks.EpochNotifier, mockStorage *mocks.AggSenderStorage, mockFlow *mocks.AggsenderBuilderFlow) {
chEpoch := make(chan aggsendertypes.EpochEvent, 1)
chEpoch <- aggsendertypes.EpochEvent{Epoch: 1}
mockEpochNotifier.EXPECT().Subscribe("aggsender").Return(chEpoch).Once()
Expand All @@ -674,7 +674,7 @@ func TestSendCertificates(t *testing.T) {
mockCertStatusChecker := mocks.NewCertificateStatusChecker(t)
mockEpochNotifier := mocks.NewEpochNotifier(t)
mockStorage := mocks.NewAggSenderStorage(t)
mockFlow := mocks.NewAggsenderFlow(t)
mockFlow := mocks.NewAggsenderBuilderFlow(t)

tt.mockFn(mockCertStatusChecker, mockEpochNotifier, mockStorage, mockFlow)

Expand Down Expand Up @@ -727,7 +727,7 @@ type aggsenderTestData struct {
l2BridgeQuerier *mocks.BridgeQuerier
storageMock *mocks.AggSenderStorage
epochNotifierMock *mocks.EpochNotifier
flowMock *mocks.AggsenderFlow
flowMock *mocks.AggsenderBuilderFlow
compatibilityChekerMock *mocksdb.CompatibilityChecker
certStatusCheckerMock *mocks.CertificateStatusChecker
sut *AggSender
Expand Down Expand Up @@ -805,14 +805,14 @@ func newAggsenderTestData(t *testing.T, creationFlags testDataFlags) *aggsenderT
DelayBetweenRetries: types.Duration{Duration: time.Millisecond},
},
epochNotifier: epochNotifierMock,
flow: flows.NewPPFlow(logger,
flow: flows.NewPPBuilderFlow(logger,
flows.NewBaseFlow(logger, l2BridgeQuerier, storage,
l1InfoTreeQuerierMock, lerQuerier, flows.NewBaseFlowConfigDefault()),
storage, l1InfoTreeQuerierMock, l2BridgeQuerier, signer, true, 0),
}
var flowMock *mocks.AggsenderFlow
var flowMock *mocks.AggsenderBuilderFlow
if creationFlags&testDataFlagMockFlow != 0 {
flowMock = mocks.NewAggsenderFlow(t)
flowMock = mocks.NewAggsenderBuilderFlow(t)
sut.flow = flowMock
}

Expand Down
3 changes: 2 additions & 1 deletion aggsender/aggsender_validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,11 @@ type AggsenderValidator struct {
func NewAggsenderValidator(ctx context.Context,
logger aggkitcommon.Logger,
cfg validator.Config,
flow validator.FlowInterface,
flow types.AggsenderVerifierFlow,
l1InfoTreeDataQuerier validator.L1InfoTreeRootByLeafQuerier,
aggLayerClient agglayer.AggLayerClientCertificateIDQuerier,
certQuerier types.CertificateQuerier,
aggchainFEPQuerier types.AggchainFEPRollupQuerier,
lerQuerier types.LERQuerier,
signer signertypes.Signer) (*AggsenderValidator, error) {
validatorCert := validator.NewAggsenderValidator(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ import (
"github.com/ethereum/go-ethereum/common"
)

var _ types.AggsenderFlow = (*AggchainProverFlow)(nil)
var _ types.AggsenderBuilderFlow = (*AggchainProverBuilderFlow)(nil)

// AggchainProverFlow is a struct that holds the logic for the AggchainProver prover type flow
type AggchainProverFlow struct {
// AggchainProverBuilderFlow is a struct that holds the logic for the AggchainProver prover type flow
type AggchainProverBuilderFlow struct {
baseFlow types.AggsenderFlowBaser

log types.Logger
Expand Down Expand Up @@ -69,9 +69,9 @@ func NewAggchainProverFlowConfig(
}
}

// NewAggchainProverFlow returns a new instance of the AggchainProverFlow injecting baseFlow instead of
// NewAggchainProverBuilderFlow returns a new instance of the AggchainProverBuilderFlow injecting baseFlow instead of
// creating it
func NewAggchainProverFlow(
func NewAggchainProverBuilderFlow(
log types.Logger,
aggChainProverConfig AggchainProverFlowConfig,
baseFlow types.AggsenderFlowBaser,
Expand All @@ -82,14 +82,14 @@ func NewAggchainProverFlow(
signer signertypes.Signer,
optimisticModeQuerier types.OptimisticModeQuerier,
aggchainProofQuerier types.AggchainProofQuerier,
) *AggchainProverFlow {
) *AggchainProverBuilderFlow {
feature := NewMaxL2BlockNumberLimiter(
aggChainProverConfig.maxL2BlockNumber,
log,
false, // AggchainProverFlow allows to resize retry certs
false, // AggchainProverFlow allows to send no bridges certs
)
return &AggchainProverFlow{
return &AggchainProverBuilderFlow{
log: log,
storage: storage,
l1InfoTreeDataQuerier: l1InfoTreeQuerier,
Expand All @@ -105,7 +105,7 @@ func NewAggchainProverFlow(

// CheckInitialStatus checks that initial status is correct.
// For AggchainProverFlow checks that starting block and last certificate match
func (a *AggchainProverFlow) CheckInitialStatus(ctx context.Context) error {
func (a *AggchainProverBuilderFlow) CheckInitialStatus(ctx context.Context) error {
lastSentCertificate, err := a.storage.GetLastSentCertificateHeader()
if err != nil {
return fmt.Errorf("aggchainProverFlow - error getting last sent certificate: %w", err)
Expand All @@ -130,7 +130,7 @@ func (a *AggchainProverFlow) CheckInitialStatus(ctx context.Context) error {
}

// getCertificateTypeToGenerate returns the type of certificate to generate
func (a *AggchainProverFlow) getCertificateTypeToGenerate() (types.CertificateType, error) {
func (a *AggchainProverBuilderFlow) getCertificateTypeToGenerate() (types.CertificateType, error) {
// AggchainProverFlow only supports FEP certificates
optimisticMode, err := a.optimisticModeQuerier.IsOptimisticModeOn()
if err != nil {
Expand All @@ -145,7 +145,7 @@ func (a *AggchainProverFlow) getCertificateTypeToGenerate() (types.CertificateTy

// GeneratePreBuildParams generates the pre-build parameters for the AggchainProverFlow
// Only used in aggsender validator
func (a *AggchainProverFlow) GenerateBuildParams(ctx context.Context,
func (a *AggchainProverBuilderFlow) GenerateBuildParams(ctx context.Context,
preParams *types.CertificatePreBuildParams) (*types.CertificateBuildParams, error) {
if preParams == nil {
return nil, fmt.Errorf("aggchainProverFlow - preParams is nil")
Expand All @@ -169,7 +169,8 @@ func (a *AggchainProverFlow) GenerateBuildParams(ctx context.Context,
// What differentiates this function from the regular PP flow is that,
// if the last sent certificate is in error, we need to resend the exact same certificate
// also, it calls the aggchain prover to get the aggchain proof
func (a *AggchainProverFlow) GetCertificateBuildParams(ctx context.Context) (*types.CertificateBuildParams, error) {
func (a *AggchainProverBuilderFlow) GetCertificateBuildParams(
ctx context.Context) (*types.CertificateBuildParams, error) {
lastSentCert, proof, err := a.storage.GetLastSentCertificateHeaderWithProofIfInError(ctx)
if err != nil {
return nil, fmt.Errorf("aggchainProverFlow - error checking if last sent certificate is InError: %w", err)
Expand Down Expand Up @@ -269,7 +270,7 @@ func (a *AggchainProverFlow) GetCertificateBuildParams(ctx context.Context) (*ty

// verifyBuildParams verifies the certificate build params and returns an error if they are not valid
// it also calls the prover to get the aggchain proof
func (a *AggchainProverFlow) verifyBuildParamsAndGenerateProof(
func (a *AggchainProverBuilderFlow) verifyBuildParamsAndGenerateProof(
ctx context.Context, buildParams *types.CertificateBuildParams) (*types.CertificateBuildParams, error) {
if err := a.baseFlow.VerifyBuildParams(ctx, buildParams); err != nil {
return nil, fmt.Errorf("aggchainProverFlow - error verifying build params: %w", err)
Expand Down Expand Up @@ -304,7 +305,7 @@ func (a *AggchainProverFlow) verifyBuildParamsAndGenerateProof(

// BuildCertificate builds a certificate based on the buildParams
// this function is the implementation of the FlowManager interface
func (a *AggchainProverFlow) BuildCertificate(ctx context.Context,
func (a *AggchainProverBuilderFlow) BuildCertificate(ctx context.Context,
buildParams *types.CertificateBuildParams) (*agglayertypes.Certificate, error) {
cert, err := a.baseFlow.BuildCertificate(ctx, buildParams, buildParams.LastSentCertificate, true)
if err != nil {
Expand All @@ -329,7 +330,7 @@ func (a *AggchainProverFlow) BuildCertificate(ctx context.Context,
}

// UpdateAggchainData updates the AggchainData field in certificate with the multisig if provided.
func (a *AggchainProverFlow) UpdateAggchainData(
func (a *AggchainProverBuilderFlow) UpdateAggchainData(
cert *agglayertypes.Certificate,
multisig *agglayertypes.Multisig,
) error {
Expand Down Expand Up @@ -373,7 +374,8 @@ func adjustBlockRange(buildParams *types.CertificateBuildParams,
return buildParams, nil
}

func (a *AggchainProverFlow) getLastProvenBlock(fromBlock uint64, lastCertificate *types.CertificateHeader) uint64 {
func (a *AggchainProverBuilderFlow) getLastProvenBlock(
fromBlock uint64, lastCertificate *types.CertificateHeader) uint64 {
if fromBlock == 0 {
// if this is the first certificate, we need to start from the starting L2 block
// that we got from the sovereign rollup
Expand All @@ -398,6 +400,6 @@ func (a *AggchainProverFlow) getLastProvenBlock(fromBlock uint64, lastCertificat
}

// Signer returns the signer used to sign the certificate
func (a *AggchainProverFlow) Signer() signertypes.Signer {
func (a *AggchainProverBuilderFlow) Signer() signertypes.Signer {
return a.certificateSigner
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ type AggchainProverFlowTestData struct {

ctx context.Context

sut *AggchainProverFlow
sut *AggchainProverBuilderFlow
}

func NewAggchainProverFlowTestData(t *testing.T, cfgBase BaseFlowConfig) *AggchainProverFlowTestData {
Expand All @@ -135,7 +135,7 @@ func NewAggchainProverFlowTestData(t *testing.T, cfgBase BaseFlowConfig) *Aggcha
// Simulate the access to baseFlow variables
res.mockFlowBase.EXPECT().StartL2Block().Return(cfgBase.StartL2Block).Maybe()

res.sut = NewAggchainProverFlow(
res.sut = NewAggchainProverBuilderFlow(
log.WithFields("flowManager", "AggchainProverFlowTestData"),
NewAggchainProverFlowConfigDefault(),
res.mockFlowBase,
Expand Down
Loading
Loading