|
10 | 10 | sign, |
11 | 11 | verify, |
12 | 12 | verify_multiple, |
| 13 | + verify_multiple_multiple, |
13 | 14 | ) |
14 | 15 | from py_ecc.bls.hash import ( |
15 | 16 | hash_eth2, |
|
44 | 45 | normalize, |
45 | 46 | field_modulus as q, |
46 | 47 | ) |
| 48 | +from random import sample |
47 | 49 |
|
48 | 50 |
|
49 | 51 | @pytest.mark.parametrize( |
@@ -238,3 +240,38 @@ def test_multi_aggregation(msg_1, msg_2, privkeys_1, privkeys_2): |
238 | 240 | signature=aggsig, |
239 | 241 | domain=domain, |
240 | 242 | ) |
| 243 | + |
| 244 | + |
| 245 | +def test_multi_multi(): |
| 246 | + domain = 0 |
| 247 | + validator_indices = tuple(range(10)) |
| 248 | + privkeys = tuple(2**i for i in validator_indices) |
| 249 | + pubkeys = [privtopub(k) for k in privkeys] |
| 250 | + |
| 251 | + class Attestation: |
| 252 | + def __init__(self, msg_1, msg_2): |
| 253 | + msg_1_validators = sample(validator_indices, 3) |
| 254 | + msg_2_validators = sample(validator_indices, 3) |
| 255 | + self.agg_pubkeys = [ |
| 256 | + aggregate_pubkeys([pubkeys[i] for i in msg_1_validators]), |
| 257 | + aggregate_pubkeys([pubkeys[i] for i in msg_2_validators]), |
| 258 | + ] |
| 259 | + self.msgs = [msg_1, msg_2] |
| 260 | + msg_1_sigs = [sign(msg_1, privkeys[i], domain) for i in msg_1_validators] |
| 261 | + msg_2_sigs = [sign(msg_2, privkeys[i], domain) for i in msg_2_validators] |
| 262 | + self.sig = aggregate_signatures([ |
| 263 | + aggregate_signatures(msg_1_sigs), |
| 264 | + aggregate_signatures(msg_2_sigs), |
| 265 | + ]) |
| 266 | + |
| 267 | + msgs = ( |
| 268 | + (b'\x12' * 32, b'\x34' * 32), |
| 269 | + (b'\x56' * 32, b'\x78' * 32), |
| 270 | + (b'\x90' * 32, b'\xab' * 32), |
| 271 | + ) |
| 272 | + atts = [Attestation(msg_1, msg_2) for msg_1, msg_2 in msgs] |
| 273 | + assert verify_multiple_multiple( |
| 274 | + signatures=[att.sig for att in atts], |
| 275 | + pubkeys_and_messages=[[att.agg_pubkeys, att.msgs] for att in atts], |
| 276 | + domain=domain, |
| 277 | + ) |
0 commit comments