diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index ad7ed4c32e5d8c7bb7dc057f47bf74db5787b44b..62fa5d03baedb9e6f669be88aee6ce570cd7e53f 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -2331,6 +2331,15 @@ let record_preattestation ctxt (mode : mode) (content : consensus_content) : in return (ctxt, mk_preattestation_result consensus_key 0 (* Fake power. *)) +let record_dal_content ctxt slot ~dal_power = function + | None -> Result.return ctxt + | Some {attestation} -> + Dal_apply.apply_attestation + ctxt + ~tb_slot:slot + attestation + ~power:dal_power + let record_attestation ctxt (mode : mode) (consensus : consensus_content) (dal : dal_content option) : (context * Kind.attestation contents_result_list) tzresult Lwt.t = @@ -2354,17 +2363,7 @@ let record_attestation ctxt (mode : mode) (consensus : consensus_content) let*? ctxt = Consensus.record_attestation ctxt ~initial_slot:consensus.slot ~power in - let*? ctxt = - Option.fold - ~none:(Result_syntax.return ctxt) - ~some:(fun dal -> - Dal_apply.apply_attestation - ctxt - ~tb_slot:consensus.slot - dal.attestation - ~power:dal_power) - dal - in + let*? ctxt = record_dal_content ctxt consensus.slot ~dal_power dal in return (ctxt, mk_attestation_result consensus_key power) | Partial_construction _ -> (* In mempool mode, attestations are allowed for various levels @@ -2380,7 +2379,7 @@ let record_attestation ctxt (mode : mode) (consensus : consensus_content) in return (ctxt, mk_attestation_result consensus_key 0 (* Fake power. *)) -let record_attestations_aggregate ctxt (mode : mode) (committee : Slot.t list) : +let record_attestations_aggregate ctxt (mode : mode) committee : (context * Kind.attestations_aggregate contents_result_list) tzresult Lwt.t = let open Lwt_result_syntax in @@ -2390,13 +2389,14 @@ let record_attestations_aggregate ctxt (mode : mode) (committee : Slot.t list) : let*? ctxt, committee, consensus_power = let open Result_syntax in List.fold_left_e - (fun (ctxt, consensus_keys, consensus_power) slot -> - let* {delegate; consensus_pkh; _}, power, _ = + (fun (ctxt, consensus_keys, consensus_power) (slot, dal) -> + let* {delegate; consensus_pkh; _}, power, dal_power = find_in_slot_map slot slot_map in let* ctxt = Consensus.record_attestation ctxt ~initial_slot:slot ~power in + let* ctxt = record_dal_content ctxt slot ~dal_power dal in let key = ({delegate; consensus_pkh} : Consensus_key.t) in return (ctxt, key :: consensus_keys, power + consensus_power)) (ctxt, [], 0) @@ -2558,10 +2558,7 @@ let apply_contents_list (type kind) ctxt chain_id (mode : mode) (Constants.aggregate_attestation ctxt) Validate_errors.Consensus.(Aggregate_disabled) in - record_attestations_aggregate - ctxt - mode - (Operation.tmp_to_old_committee committee) + record_attestations_aggregate ctxt mode committee | Single (Seed_nonce_revelation {level; nonce}) -> let level = Level.from_raw ctxt level in let* ctxt = Nonce.reveal ctxt level nonce in diff --git a/src/proto_alpha/lib_protocol/validate.ml b/src/proto_alpha/lib_protocol/validate.ml index 83052dd9feb0faa3c0143bdcbce437764e23cfda..e7dc74494a12d1aa180054e1f8e07c48a1c0efa1 100644 --- a/src/proto_alpha/lib_protocol/validate.ml +++ b/src/proto_alpha/lib_protocol/validate.ml @@ -774,6 +774,16 @@ module Consensus = struct let*? () = check_payload_hash kind expected_payload_hash bph in return_unit + let check_dal_content vi level slot consensus_key = function + | None -> return_unit + | Some {attestation} -> + Dal_apply.validate_attestation + vi.ctxt + level + slot + consensus_key + attestation + let check_attestation vi ~check_signature (operation : Kind.attestation operation) = let open Lwt_result_syntax in @@ -814,15 +824,11 @@ module Consensus = struct in let* () = check_delegate_is_not_forbidden vi.ctxt consensus_key.delegate in let* () = - Option.fold - ~none:return_unit - ~some:(fun dal -> - Dal_apply.validate_attestation - vi.ctxt - consensus_content.level - consensus_content.slot - consensus_key - dal.attestation) + check_dal_content + vi + consensus_content.level + consensus_content.slot + consensus_key dal_content in let*? () = @@ -1142,7 +1148,7 @@ module Consensus = struct (* Retreive public keys and compute total voting power *) let* public_keys, total_voting_power = List.fold_left_es - (fun (public_keys, total_voting_power) slot -> + (fun (public_keys, total_voting_power) (slot, dal) -> (* Lookup the slot owner *) let*? consensus_key, power, _ = get_delegate_details @@ -1153,11 +1159,12 @@ module Consensus = struct let* () = check_delegate_is_not_forbidden info.ctxt consensus_key.delegate in + let* () = check_dal_content info level slot consensus_key dal in match consensus_key.consensus_pk with | Bls pk -> return (pk :: public_keys, power + total_voting_power) | _ -> tzfail Validate_errors.Consensus.Non_bls_key_in_aggregate) ([], 0) - (Operation.tmp_to_old_committee committee) + committee in (* Fail on empty committee *) let*? () =