Skip to content

Commit 922e7db

Browse files
committed
feat: enable multiple quorums on BLSSignatureChecker
1 parent c0863c3 commit 922e7db

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

src/BLSSignatureChecker.sol

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ contract BLSSignatureChecker is IBLSSignatureChecker {
1919
using BN254 for BN254.G1Point;
2020

2121
// CONSTANTS & IMMUTABLES
22-
bytes internal constant ALIGNED_QUORUM_NUMBER = hex"00";
2322

2423
// gas cost of multiplying 2 pairings
2524
uint256 internal constant PAIRING_EQUALITY_CHECK_GAS = 120_000;
@@ -80,21 +79,28 @@ contract BLSSignatureChecker is IBLSSignatureChecker {
8079
* @dev NOTE: Be careful to ensure `msgHash` is collision-resistant! This method does not hash
8180
* `msgHash` in any way, so if an attacker is able to pass in an arbitrary value, they may be able
8281
* to tamper with signature verification.
82+
* @param quorumNumbers is the bytes array of quorum numbers that are being signed for
8383
* @param referenceBlockNumber is the block number at which the stake information is being verified
8484
* @param params is the struct containing information on nonsigners, stakes, quorum apks, and the aggregate signature
8585
* @return quorumStakeTotals is the struct containing the total and signed stake for each quorum
8686
* @return signatoryRecordHash is the hash of the signatory record, which is used for fraud proofs
8787
*/
8888
function checkSignatures(
8989
bytes32 msgHash,
90+
bytes calldata quorumNumbers,
9091
uint32 referenceBlockNumber,
9192
NonSignerStakesAndSignature memory params
9293
) public view returns (QuorumStakeTotals memory, bytes32) {
9394
require(
94-
(ALIGNED_QUORUM_NUMBER.length == params.quorumApks.length) &&
95-
(ALIGNED_QUORUM_NUMBER.length == params.quorumApkIndices.length) &&
96-
(ALIGNED_QUORUM_NUMBER.length == params.totalStakeIndices.length) &&
97-
(ALIGNED_QUORUM_NUMBER.length == params.nonSignerStakeIndices.length),
95+
quorumNumbers.length != 0,
96+
"BLSSignatureChecker.checkSignatures: empty quorum input"
97+
);
98+
99+
require(
100+
(quorumNumbers.length == params.quorumApks.length) &&
101+
(quorumNumbers.length == params.quorumApkIndices.length) &&
102+
(quorumNumbers.length == params.totalStakeIndices.length) &&
103+
(quorumNumbers.length == params.nonSignerStakeIndices.length),
98104
"BLSSignatureChecker.checkSignatures: input quorum length mismatch"
99105
);
100106

@@ -121,8 +127,8 @@ contract BLSSignatureChecker is IBLSSignatureChecker {
121127
// at the referenceBlockNumber, and derive the stake held by signers by subtracting out
122128
// stakes held by nonsigners.
123129
QuorumStakeTotals memory stakeTotals;
124-
stakeTotals.totalStakeForQuorum = new uint96[](ALIGNED_QUORUM_NUMBER.length);
125-
stakeTotals.signedStakeForQuorum = new uint96[](ALIGNED_QUORUM_NUMBER.length);
130+
stakeTotals.totalStakeForQuorum = new uint96[](quorumNumbers.length);
131+
stakeTotals.signedStakeForQuorum = new uint96[](quorumNumbers.length);
126132

127133
NonSignerInfo memory nonSigners;
128134
nonSigners.quorumBitmaps = new uint256[](
@@ -134,7 +140,7 @@ contract BLSSignatureChecker is IBLSSignatureChecker {
134140
// Get a bitmap of the quorums signing the message, and validate that
135141
// quorumNumbers contains only unique, valid quorum numbers
136142
uint256 signingQuorumBitmap = BitmapUtils.orderedBytesArrayToBitmap(
137-
ALIGNED_QUORUM_NUMBER,
143+
quorumNumbers,
138144
registryCoordinator.quorumCount()
139145
);
140146

@@ -191,13 +197,13 @@ contract BLSSignatureChecker is IBLSSignatureChecker {
191197
? delegation.minWithdrawalDelayBlocks()
192198
: 0;
193199

194-
for (uint256 i = 0; i < ALIGNED_QUORUM_NUMBER.length; i++) {
200+
for (uint256 i = 0; i < quorumNumbers.length; i++) {
195201
// If we're disallowing stale stake updates, check that each quorum's last update block
196202
// is within withdrawalDelayBlocks
197203
if (_staleStakesForbidden) {
198204
require(
199205
registryCoordinator.quorumUpdateBlockNumber(
200-
uint8(ALIGNED_QUORUM_NUMBER[i])
206+
uint8(quorumNumbers[i])
201207
) +
202208
withdrawalDelayBlocks >
203209
referenceBlockNumber,
@@ -210,7 +216,7 @@ contract BLSSignatureChecker is IBLSSignatureChecker {
210216
require(
211217
bytes24(params.quorumApks[i].hashG1Point()) ==
212218
blsApkRegistry.getApkHashAtBlockNumberAndIndex({
213-
quorumNumber: uint8(ALIGNED_QUORUM_NUMBER[i]),
219+
quorumNumber: uint8(quorumNumbers[i]),
214220
blockNumber: referenceBlockNumber,
215221
index: params.quorumApkIndices[i]
216222
}),
@@ -221,7 +227,7 @@ contract BLSSignatureChecker is IBLSSignatureChecker {
221227
// Get the total and starting signed stake for the quorum at referenceBlockNumber
222228
stakeTotals.totalStakeForQuorum[i] = stakeRegistry
223229
.getTotalStakeAtBlockNumberFromIndex({
224-
quorumNumber: uint8(ALIGNED_QUORUM_NUMBER[i]),
230+
quorumNumber: uint8(quorumNumbers[i]),
225231
blockNumber: referenceBlockNumber,
226232
index: params.totalStakeIndices[i]
227233
});
@@ -238,12 +244,12 @@ contract BLSSignatureChecker is IBLSSignatureChecker {
238244
if (
239245
BitmapUtils.isSet(
240246
nonSigners.quorumBitmaps[j],
241-
uint8(ALIGNED_QUORUM_NUMBER[i])
247+
uint8(quorumNumbers[i])
242248
)
243249
) {
244250
stakeTotals.signedStakeForQuorum[i] -= stakeRegistry
245251
.getStakeAtBlockNumberAndIndex({
246-
quorumNumber: uint8(ALIGNED_QUORUM_NUMBER[i]),
252+
quorumNumber: uint8(quorumNumbers[i]),
247253
blockNumber: referenceBlockNumber,
248254
operatorId: nonSigners.pubkeyHashes[j],
249255
index: params.nonSignerStakeIndices[i][

src/interfaces/IBLSSignatureChecker.sol

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ interface IBLSSignatureChecker {
6868
* for the total stake (or the operator) or latest before the referenceBlockNumber.
6969
*/
7070
function checkSignatures(
71-
bytes32 msgHash,
71+
bytes32 msgHash,
72+
bytes calldata quorumNumbers,
7273
uint32 referenceBlockNumber,
7374
NonSignerStakesAndSignature memory nonSignerStakesAndSignature
7475
)

0 commit comments

Comments
 (0)