@@ -42,6 +42,7 @@ contract BLSApkRegistry is Initializable, OwnableUpgradeable, IBLSApkRegistry, B
42
42
_transferOwnership (_initialOwner);
43
43
finalityRelayerManager = _finalityRelayerManager;
44
44
relayerManager = _relayerManager;
45
+ totalNodes = 0 ;
45
46
_initializeApk ();
46
47
}
47
48
@@ -54,17 +55,32 @@ contract BLSApkRegistry is Initializable, OwnableUpgradeable, IBLSApkRegistry, B
54
55
* @param operator The address of the operator to be registered.
55
56
*/
56
57
function registerOperator (address operator ) public onlyFinalityRelayerManager {
58
+ require (operator != address (0 ), "BLSApkRegistry.registerBLSPublicKey: Operator is zero address " );
59
+
60
+ require (! operatorIsRegister[operator], "BLSApkRegistry.registerBLSPublicKey: Operator have already register " );
61
+
57
62
(BN254.G1Point memory pubkey ,) = getRegisteredPubkey (operator);
58
63
59
64
_processApkUpdate (pubkey);
60
65
66
+ totalNodes += 1 ;
67
+
68
+ operatorIsRegister[operator] = true ;
69
+
61
70
emit OperatorAdded (operator, operatorToPubkeyHash[operator]);
62
71
}
63
72
64
73
function deregisterOperator (address operator ) public onlyFinalityRelayerManager {
74
+ require (operatorIsRegister[operator], "BLSApkRegistry.registerBLSPublicKey: Operator have already deregister " );
75
+
65
76
(BN254.G1Point memory pubkey ,) = getRegisteredPubkey (operator);
66
77
67
78
_processApkUpdate (pubkey.negate ());
79
+
80
+ operatorIsRegister[operator] = false ;
81
+
82
+ totalNodes -= 1 ;
83
+
68
84
emit OperatorRemoved (operator, operatorToPubkeyHash[operator]);
69
85
}
70
86
@@ -73,6 +89,11 @@ contract BLSApkRegistry is Initializable, OwnableUpgradeable, IBLSApkRegistry, B
73
89
PubkeyRegistrationParams calldata params ,
74
90
BN254.G1Point calldata pubkeyRegistrationMessageHash
75
91
) external returns (bytes32 ) {
92
+ require (
93
+ msg .sender == operator,
94
+ "BLSApkRegistry.registerBLSPublicKey: this caller is not operator "
95
+ );
96
+
76
97
require (
77
98
blsRegisterWhitelist[msg .sender ],
78
99
"BLSApkRegistry.registerBLSPublicKey: this address have not permission to register bls key "
@@ -125,34 +146,41 @@ contract BLSApkRegistry is Initializable, OwnableUpgradeable, IBLSApkRegistry, B
125
146
return pubkeyHash;
126
147
}
127
148
128
- function checkSignatures (bytes32 msgHash , uint256 referenceBlockNumber , FinalityNonSignerAndSignature memory params )
129
- public
130
- view
131
- returns (StakeTotals memory , bytes32 )
132
- {
149
+ function checkSignatures (
150
+ bytes32 msgHash ,
151
+ uint256 referenceBlockNumber ,
152
+ FinalityNonSignerAndSignature memory params
153
+ ) public view returns (StakeTotals memory , bytes32 ) {
154
+ require (
155
+ referenceBlockNumber < uint32 (block .number ),
156
+ "BLSSignatureChecker.checkSignatures: invalid reference block "
157
+ );
158
+ uint256 nonSingerNode = params.nonSignerPubkeys.length ;
159
+ uint256 thresholdNodes = (totalNodes * 2 ) / 3 ;
160
+
133
161
require (
134
- referenceBlockNumber < uint32 (block .number ), "BLSSignatureChecker.checkSignatures: invalid reference block "
162
+ totalNodes - nonSingerNode >= thresholdNodes,
163
+ "BLSSignatureChecker.checkSignatures: sign node less than threshold node "
135
164
);
136
- BN254.G1Point memory signerApk = BN254.G1Point (0 , 0 );
165
+
166
+ BN254.G1Point memory signerApk = currentApk;
137
167
bytes32 [] memory nonSignersPubkeyHashes;
168
+
138
169
if (params.nonSignerPubkeys.length > 0 ) {
139
170
nonSignersPubkeyHashes = new bytes32 [](params.nonSignerPubkeys.length );
140
171
for (uint256 j = 0 ; j < params.nonSignerPubkeys.length ; j++ ) {
141
172
nonSignersPubkeyHashes[j] = params.nonSignerPubkeys[j].hashG1Point ();
142
- signerApk = currentApk .plus (params.nonSignerPubkeys[j].negate ());
173
+ signerApk = signerApk .plus (params.nonSignerPubkeys[j].negate ());
143
174
}
144
- } else {
145
- signerApk = currentApk;
146
175
}
147
- ( bool pairingSuccessful , bool signatureIsValid ) =
148
- trySignatureAndApkVerification (msgHash, signerApk, params.apkG2, params.sigma);
176
+
177
+ ( bool pairingSuccessful , bool signatureIsValid ) = trySignatureAndApkVerification (msgHash, signerApk, params.apkG2, params.sigma);
149
178
require (pairingSuccessful, "BLSSignatureChecker.checkSignatures: pairing precompile call failed " );
150
179
require (signatureIsValid, "BLSSignatureChecker.checkSignatures: signature is invalid " );
151
180
152
181
bytes32 signatoryRecordHash = keccak256 (abi.encodePacked (referenceBlockNumber, nonSignersPubkeyHashes));
153
182
154
- StakeTotals memory stakeTotals =
155
- StakeTotals ({totalBtcStaking: params.totalBtcStake, totalMantaStaking: params.totalMantaStake});
183
+ StakeTotals memory stakeTotals = StakeTotals ({totalBtcStaking: params.totalBtcStake, totalMantaStaking: params.totalMantaStake});
156
184
157
185
return (stakeTotals, signatoryRecordHash);
158
186
}
0 commit comments