Skip to content

Conversation

@goran-ethernal
Copy link
Contributor

🔄 Changes Summary

This PR updates the agglayer SubmitCertificate API which now supports sending multisig with the certificate.

multisig is sent in the AggchainData field in the Certificate which supports four types:

  • AggchainDataProof - in the case of FEP network with multisig turned off.
  • AggchainDataSignature - in the case of PP network with multisig turned off.
  • AggchainDataMultisigWithProof - in the case of FEP network with multisig turned on.
  • AggchainDataMultisig - in the case of PP network with multisig turned on.

⚠️ Breaking Changes

NA

📋 Config Updates

NA

✅ Testing

  • 🤖 Automatic: aggkit CI

@goran-ethernal goran-ethernal self-assigned this Sep 1, 2025
@goran-ethernal goran-ethernal force-pushed the feat/send_multisig_with_certificate branch 6 times, most recently from b9f3ee5 to 72f81c2 Compare September 2, 2025 07:40
@goran-ethernal goran-ethernal force-pushed the feat/send_multisig_with_certificate branch from 72f81c2 to 3cb5fef Compare September 2, 2025 09:34
@goran-ethernal goran-ethernal marked this pull request as ready for review September 2, 2025 10:48
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 multisig support for the certificate submission API in the AggLayer. The main purpose is to update the AggLayer SubmitCertificate API to support sending multisig data alongside certificates, enabling support for both FEP and PP networks with multisig capabilities.

  • Added new AggchainData types (AggchainDataMultisig and AggchainDataMultisigWithProof) to support multisig certificates
  • Updated the certificate validation flow to handle multisig collection and include it in the certificate data
  • Modified API signatures to remove separate validator signature parameter since multisig data is now embedded in the certificate

Reviewed Changes

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

Show a summary per file
File Description
go.mod Updates AggLayer protobuf dependencies to support new multisig API
aggsender/validator/ Adds Index() method to validators and updates constructor to accept signer index
aggsender/types/ Adds UpdateAggchainData method to flow interface for multisig handling
aggsender/flows/ Implements UpdateAggchainData for both PP and AggchainProver flows
aggsender/aggsender.go Updates certificate sending flow to collect multisig and embed in certificate
agglayer/types/ Adds new multisig data types and updates NetworkStatus to NetworkState
agglayer/grpc/ Updates client to handle new multisig certificate types and API changes
Comments suppressed due to low confidence (2)

aggsender/aggsender.go:1

  • The format string uses %w for error formatting in Warnf, but %w is only valid for fmt.Errorf to wrap errors. Use %v instead for logging the error.
package aggsender

aggsender/aggsender.go:1

  • The format verb should be %v instead of %w when logging errors. The %w verb is only for error wrapping in fmt.Errorf.
package aggsender

Copy link
Contributor

@Stefan-Ethernal Stefan-Ethernal left a comment

Choose a reason for hiding this comment

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

Generally LGTM, but leaving some comments to consider.

@goran-ethernal goran-ethernal force-pushed the feat/send_multisig_with_certificate branch from 6c4540c to 3543901 Compare September 3, 2025 09:15
@sonarqubecloud
Copy link

sonarqubecloud bot commented Sep 4, 2025

@goran-ethernal goran-ethernal merged commit c0dd242 into feat/aggsender-multisig Sep 4, 2025
21 of 22 checks passed
@goran-ethernal goran-ethernal deleted the feat/send_multisig_with_certificate branch September 4, 2025 09:00
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.

4 participants