🔄 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
MultisigCommitteetype to manage signer sets and enforce signature thresholds. - Signers are represented as
SignerInfostructs 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
PPandFEPcertificates. - 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 useZeroHash.
- Only thing worth noting is that, when calculating
Smart contracts integration:
- AggchainFEP contract: Removed querying of
TrustedSequenceraddress and rely on the signers committee instead - AggchainBase contract: Retrieve the multisig committee from the
AggchainBasecontract
Agglayer integration:
- Invoke the
GetNetworkStateAPI from agglayer to get the latest settled imported bridge exit info. - Multisig is populated into the certificate and sent to the Agglayer's
SendCertificategRPC endpoint
⚠️ Breaking Changes
- 🛠️ Config: Make sure that
Modeon theValidatorandAggSenderare the same. - 🔌 API/CLI:
aggkitversion (v0.7.0) that supportsmultisigwill now require updated contracts to run. At least versionv12.1.0-rc.3ofagglayer-contracts, and a new version ofagglayerwhich supportsmultisig, which is thev0.4.0ofagglayer. - 🗑️ Deprecated Features: Aggsender Phase II validator signing logic
📋 Config Updates
- Added
AggSender.RequireCommitteeMembershipCheck = falseparameter, which defines if a check onaggsender proposerstartup will be performed to see if the proposer is in themultisigcommittee. - Added
Validator.RequireCommitteeMembershipCheck = {{AggSender.RequireCommitteeMembershipCheck}}parameter, which defines if a check onaggsender validatorstartup will be performed to see if the validator is in themultisigcommittee. - Added
Validator.Mode = "PessimisticProof"parameter, which acts the same as theAggSender.Mode. It tells the validator that the network is aPPnetwork or anFEPnetwork. It has to be the same as onaggsender proposer. - Added
Validator.FEPConfig.SovereignRollupAddr = "{{AggSender.SovereignRollupAddr}}" parameter which is the address of theAggchainFEP` 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 onAggSender(proposer) config, and tells the validator if gaps in blocks in certificates are allowed inFEP` network.
[AggSender]
RequireCommitteeMembershipCheck = false
[Validator]
# PessimisticProof or AggchainProof
Mode = "PessimisticProof"
RequireCommitteeMembershipCheck = {{AggSender.RequireCommitteeMembershipCheck}}
[Validator.FEPConfig]
SovereignRollupAddr = "{{AggSender.SovereignRollupAddr}}"
RequireNoBlockGap = "{{AggSender.RequireNoFEPBlockGap}}"What's Changed
- feat: introduce
MultisigCommitteeby @Stefan-Ethernal in #832 - feat: mechanism to calculate last settled block by not using
metadataby @goran-ethernal in #838 - feat: decouple initial sync with
agglayerfrom ceritificatemetadataby @goran-ethernal in #839 - chore: remove phase 2 signature validator metadata by @Stefan-Ethernal in #843
- feat: expose last l2 block in certificate to the aggsender validator by @Stefan-Ethernal in #842
- feat: decouple
aggsender-validatorfrommetadatafield by @goran-ethernal in #846 - feat: remove
metadatafromaggsenderby @goran-ethernal in #858 - feat: update hash to sign by the aggsender validators by @Stefan-Ethernal in #847
- feat: bump contracts and populate signers urls by @Stefan-Ethernal in #865
- feat:
aggsender-validatordocs by @goran-ethernal in #861 - feat: last L2 block in certificate sanity check on
aggsender-validatorby @goran-ethernal in #863 - feat: integrate retrieval of aggchain signer infos at once from contract by @Stefan-Ethernal in #875
- feat: support
FEPinaggsender-validatorby @goran-ethernal in #876 - test: shellcheck PR test run by @rachit77 in #850
- feat: enable optimistic tests by @temaniarpit27 in #882
- feat: support multiple
claimsbyglobal indexby @goran-ethernal in #881 - feat: poll committee for signatures by @Stefan-Ethernal in #877
- chore(deps): bump github.com/mattn/go-sqlite3 from 1.14.30 to 1.14.32 by @dependabot[bot] in #887
- fix: flaky nightly tests by @rachit77 in #890
- feat: don't use
debugendpoint onaggsender-validator, instead verify proofs onclaimsby @goran-ethernal in #898 - feat: use bridge db query timeout by @rachit77 in #874
- feat: filter logs recursively by @rachit77 in #902
- feat: add indexes by @temaniarpit27 in #897
- feat: add new test flow by @temaniarpit27 in #904
- fix: geth upgrade issue by @rachit77 in #894
- feat: bump kurtosis version by @goran-ethernal in #922
- feat: confgure block finality based on blockReference and amount of blocks by @joanestebanr in #916
- fix: Ethclienter not timing out while filtering logs by @rachit77 in #888
- chore(deps): bump github.com/go-viper/mapstructure/v2 from 2.3.0 to 2.4.0 by @dependabot[bot] in #899
- chore(deps): bump buf.build/gen/go/agglayer/interop/protocolbuffers/go from 1.36.7-20250519093743-85e8a3d9f59c.1 to 1.36.8-20250519093743-85e8a3d9f59c.1 by @dependabot[bot] in #910
- chore: fix typos in comments and test descriptions by @prestoalvarez in #903
- chore(deps): bump github.com/stretchr/testify from 1.10.0 to 1.11.0 by @dependabot[bot] in #905
- feat: new
aggsendermetrics by @goran-ethernal in #920 - chore(deps): bump google.golang.org/grpc from 1.74.2 to 1.75.0 by @dependabot[bot] in #909
- feat: utilize network status
apifromagglayerby @goran-ethernal in #913 - chore: fix link to evm.go by @gap-editor in #867
- feat: upgrade golang by @temaniarpit27 in #930
- feat: move 3 chain test to nightly by @temaniarpit27 in #933
- feat: add support for individual components by @rachit77 in #923
- fix: include retry count in signed certificate file name by @vcastellm in #929
- feat: send
multisigwith certificate by @goran-ethernal in #926 - feat: remove isNativeToken by @temaniarpit27 in #932
- feat: sanity check if
proposerandvalidatorare committee members by @goran-ethernal in #945 - fix:
L2GERSyncsyncer events indexing by @rachit77 in #927 - feat: modify poll validator committee by @goran-ethernal in #951
- feat: remove
metadatafield by @goran-ethernal in #954 - feat: remove old signing of certificates by @goran-ethernal in #957
- chore(deps): bump github.com/ethereum/go-ethereum from 1.16.2 to 1.16.3 by @dependabot[bot] in #964
- chore(deps): bump go.opentelemetry.io/otel from 1.37.0 to 1.38.0 by @dependabot[bot] in #963
- chore(deps): bump github.com/prometheus/client_golang from 1.23.0 to 1.23.2 by @dependabot[bot] in #959
- feat: filter token-mapping with origin address by @rachit77 in #953
- feat: remove TrustedSequencer retrieval by @Stefan-Ethernal in #955
- chore(deps): bump buf.build/gen/go/agglayer/interop/protocolbuffers/go from 1.36.8-20250828125920-9f07d329a94b.1 to 1.36.8-20250908082243-610ba4f69850.1 by @dependabot[bot] in #961
- chore(deps): bump golang.org/x/sync from 0.16.0 to 0.17.0 by @dependabot[bot] in #965
- chore(deps): bump github.com/swaggo/gin-swagger from 1.6.0 to 1.6.1 by @dependabot[bot] in #962
- feat: update
protobufversion by @goran-ethernal in #974 - fix: localValidator log error, fix conversion aggchainData by @joanestebanr in #978
- fix: remove block number and use the latest one when querying for the committee by @Stefan-Ethernal in #980
New Contributors
- @prestoalvarez made their first contribution in #903
- @gap-editor made their first contribution in #867
Full Changelog: v0.6.0-beta1...v0.7.0-beta2