Skip to content

Conversation

@goran-ethernal
Copy link
Contributor

🔄 Changes Summary

This PR adds a sanity check on the aggsender-validator for the LastL2BlockInCert field which represents the last L2 block in the proposed certificate.

  • LastL2BlockInCert can not be lower or equal to the last settled block in network.
  • LastL2BlockInCert can not be lower than the deduced ToBlock in the proposed certificate gotten by checking the NewLocalExitRoot and imported bridge exits in the certificate.

⚠️ Breaking Changes

N/A

📋 Config Updates

N/A

✅ Testing

  • 🤖 Automatic: aggkit CI

🐞 Issues

@goran-ethernal goran-ethernal changed the title Feat/last-l2-block-sanity-checks feat: last L2 block in certificate sanity check on aggsender-validator Aug 12, 2025
@goran-ethernal goran-ethernal requested a review from Copilot August 12, 2025 11:28
@goran-ethernal goran-ethernal self-assigned this Aug 12, 2025
@goran-ethernal goran-ethernal requested a review from a team August 12, 2025 11:28
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR implements sanity checks for the LastL2BlockInCert field in the aggsender-validator to prevent invalid certificate proposals. The validation ensures that the proposed certificate's last L2 block is consistent with both the network's state and the certificate's internal data.

  • Adds validation that LastL2BlockInCert must be greater than the last settled block in the network
  • Validates that LastL2BlockInCert must be greater than or equal to the deduced ToBlock from the certificate's NewLocalExitRoot and imported bridge exits
  • Refactors existing code to extract common logic for determining block numbers from Local Exit Roots

Reviewed Changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
aggsender/validator/validate_certificate.go Adds new validation logic and reorganizes existing code flow
aggsender/query/certificate_query.go Implements new method to calculate certificate ToBlock and refactors LER block number extraction
aggsender/types/interfaces.go Adds new interface method for certificate ToBlock calculation
aggsender/mocks/mock_certificate_querier.go Auto-generated mock for the new interface method
aggsender/validator/validate_certificate_test.go Adds comprehensive test coverage for the new validation logic

@goran-ethernal goran-ethernal force-pushed the feat/last-l2-block-sanity-checks branch from 4a1b6c2 to 9fadd2a Compare August 12, 2025 11:42
@goran-ethernal goran-ethernal force-pushed the feat/last-l2-block-sanity-checks branch from 6e300d3 to 8c1363a Compare August 12, 2025 13:38
@goran-ethernal goran-ethernal force-pushed the feat/last-l2-block-sanity-checks branch from 8c1363a to aa01492 Compare August 12, 2025 13:40
@Stefan-Ethernal Stefan-Ethernal removed this from the AggKit - v0.7.0 [phase III] milestone Aug 13, 2025
@sonarqubecloud
Copy link

@goran-ethernal goran-ethernal merged commit 2c0d49d into feat/aggsender-multisig Aug 13, 2025
35 of 37 checks passed
@goran-ethernal goran-ethernal deleted the feat/last-l2-block-sanity-checks branch August 13, 2025 09:29
Stefan-Ethernal added a commit that referenced this pull request Oct 10, 2025
## 🔄 Changes Summary

Enable the AggSender to work with multiple validator nodes in a
committee-based validation system. The implementation includes validator
services, multisig committee management, certificate validation
improvements, and enhanced gRPC communication protocols.

**Multisig Committee Support:** 
- Added `MultisigCommittee` type to manage signer sets and enforce
signature thresholds.
- Signers are represented as `SignerInfo` structs with both address and
URL for improved context and error reporting.
- Committee construction validates non-empty membership and non-zero
threshold, preventing misconfiguration.
- Dynamic signer management: methods for adding signers, duplicate
checks by address and URL.

**Aggsender Validator Refactor:**
- The Aggsender certificate validation flow was refactored to integrate
multisig logic.
- The multisig validation logic is applicable to both `PP` and `FEP`
certificates.
- Certificate validation now checks for contiguous certificates, last L2
block, and settlement status using new queries.
- Import bridge exit proof verification is handled via new logic using
`verifyClaimProofs`, ensuring only valid proofs pass.

**Certificate Metadata removal:**
- It is gone from the agglayer and therefore it is not sent anymore from
the aggsender either.
- Only thing worth noting is that, when calculating `CertificateID`,
instead of metadata field, which was used previously, we now use
`ZeroHash`.

**Smart contracts integration:**
- **AggchainFEP contract:** Removed querying of `TrustedSequencer`
address and rely on the signers committee instead
- **AggchainBase contract:** Retrieve the multisig committee from the
`AggchainBase` contract

**Agglayer integration:**
- Invoke the `GetNetworkState` API from agglayer to get the latest
settled imported bridge exit info.
- Multisig is populated into the certificate and sent to the Agglayer's
`SendCertificate` gRPC endpoint

## ⚠️ Breaking Changes
- 🛠️ **Config**: Make sure that `Mode` on the `Validator` and
`AggSender` are the same.
- 🔌 **API/CLI**: `aggkit` version (`v0.7.0`) that supports `multisig`
will now require updated contracts to run. At least version
`v12.1.0-rc.3` of `agglayer-contracts`, and a new version of `agglayer`
which supports `multisig`, which is the `v0.4.0` of `agglayer`.
- 🗑️ **Deprecated Features**: Aggsender Phase II validator signing logic

## 📋 Config Updates
- Added `AggSender.RequireCommitteeMembershipCheck = false` parameter,
which defines if a check on `aggsender proposer` startup will be
performed to see if the proposer is in the `multisig` committee.
- Added `Validator.RequireCommitteeMembershipCheck =
{{AggSender.RequireCommitteeMembershipCheck}}` parameter, which defines
if a check on `aggsender validator` startup will be performed to see if
the validator is in the `multisig` committee.
- Added `Validator.Mode = "PessimisticProof"` parameter, which acts the
same as the `AggSender.Mode`. It tells the validator that the network is
a `PP` network or an `FEP` network. It has to be the same as on
`aggsender proposer`.
- Added `Validator.FEPConfig.SovereignRollupAddr =
"{{AggSender.SovereignRollupAddr}}" parameter which is the address of
the `AggchainFEP` rollup on L1 for given network for which validator is
running.
- Added `Validator.FEPConfig.RequireNoBlockGap =
{{AggSender.RequireNoFEPBlockGap}}, which acts the same as the given
paremeter on `AggSender` (proposer) config, and tells the validator if
gaps in blocks in certificates are allowed in `FEP` network.

```toml
[AggSender]
RequireCommitteeMembershipCheck = false

[Validator]
# PessimisticProof or AggchainProof
Mode = "PessimisticProof"
RequireCommitteeMembershipCheck = {{AggSender.RequireCommitteeMembershipCheck}}
[Validator.FEPConfig]
	SovereignRollupAddr = "{{AggSender.SovereignRollupAddr}}"
	RequireNoBlockGap = "{{AggSender.RequireNoFEPBlockGap}}"
```

## ✅ Testing
- 🤖 **Automatic**: `aggkit` CI
- 🖱️ **Manual**: [Optional: Steps to verify]

## 🐞 Issues
- Closes #792 
## 🔗 Related PRs
- #814
- #832
- #838
- #839
- #843
- #842
- #846
- #858
- #847
- #865
- #861
- #863
- #875
- #876
- #881
- #877
- #898
- #920
- #913
- #926
- #945
- #951
- #954
- #957
- #955
- #974
- #978
- #985
- #989
- #984
- #998
- #1017
- #1028
- #1034
- #1024
- #1052
- #1067
- #1068
- #1050
- #1071
- #1072
- #1060
- #1087
- #1077
- #1073

---------

Co-authored-by: Goran Rojovic <[email protected]>
Co-authored-by: Goran Rojovic <[email protected]>
Co-authored-by: Joan Esteban <[email protected]>
Co-authored-by: Rachit Sonthalia <[email protected]>
Co-authored-by: Arpit Temani <[email protected]>
Co-authored-by: Copilot <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants