def run_with( _cls, inputs: SequenceOfBLSSignature, _config: Optional[Eth2Config] ) -> BLSSignature: # BLS override bls.use(MilagroBackend) return bls.aggregate(*inputs)
def test_validate_multiple(backend): bls.use(backend) msg = b"\x32" * 32 privkey_0 = 42 privkey_1 = 4242 pubkey_0 = bls.sk_to_pk(privkey_0) pubkey_1 = bls.sk_to_pk(privkey_1) aggregate_sig = bls.aggregate(bls.sign(privkey_0, msg), bls.sign(privkey_1, msg)) bls.validate(msg, aggregate_sig, pubkey_0, pubkey_1)
def test_validate_multiple_one_invalid(backend): bls.use(backend) msg = b"\x32" * 32 privkey_0 = 42 privkey_1 = 4242 privkey_other = 424242 pubkey_0 = bls.sk_to_pk(privkey_0) pubkey_1 = bls.sk_to_pk(privkey_1) aggregate_sig = bls.aggregate( bls.sign(privkey_0, msg), bls.sign(privkey_other, msg) ) with pytest.raises(SignatureError): bls.validate(msg, aggregate_sig, pubkey_0, pubkey_1)
def _correct_indexed_attestation_params(validator_count, attestation, params, privkeys, state, config): valid_params = copy.deepcopy(params) (attesting_indices, signatures) = _get_indices_and_signatures(validator_count, state, config, attestation, privkeys) valid_params["attesting_indices"] = attesting_indices signature = bls.aggregate(*signatures) valid_params["signature"] = signature return valid_params
def aggregate_votes( bitfield: Bitfield, sigs: Sequence[BLSSignature], voting_sigs: Sequence[BLSSignature], attesting_indices: Sequence[CommitteeValidatorIndex], ) -> Tuple[Bitfield, BLSSignature]: """ Aggregate the votes. """ # Update the bitfield and append the signatures sigs = tuple(sigs) + tuple(voting_sigs) bitfield = pipe( bitfield, *(set_voted(index=committee_index) for committee_index in attesting_indices), ) return bitfield, bls.aggregate(*sigs)
def get_aggregate_from_valid_committee_attestations( attestations: Sequence[Attestation] ) -> Attestation: """ Return the aggregate attestation. The given attestations SHOULD have the same `data: AttestationData` and are valid. """ signatures = [attestation.signature for attestation in attestations] aggregate_signature = bls.aggregate(*signatures) all_aggregation_bits = [ attestation.aggregation_bits for attestation in attestations ] aggregation_bits = tuple(map(any, zip(*all_aggregation_bits))) assert len(attestations) > 0 return Attestation.create( data=attestations[0].data, aggregation_bits=Bitfield(aggregation_bits), signature=aggregate_signature, )