tighten local network simulation correctness checking (#2706)

* tighten local network simulation correctness checking

* rename rejectFirmly to errReject
This commit is contained in:
tersec 2021-07-19 11:58:22 +00:00 committed by GitHub
parent d9f2a91374
commit aebc606cb7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 36 additions and 17 deletions

View File

@ -157,6 +157,23 @@ func check_attestation_subnet(
# Gossip Validation # Gossip Validation
# ---------------------------------------------------------------- # ----------------------------------------------------------------
template errReject(msg: cstring): untyped =
if verifyFinalization in pool.dag.updateFlags:
# This doesn't depend on the wall clock or the exact state of the DAG; it's
# an internal consistency/correctness check only, and effectively never has
# false positives. These don't, for example, arise from timeouts.
doAssert false
err((ValidationResult.Reject, msg))
template errReject(error: (ValidationResult, cstring)): untyped =
doAssert error[0] == ValidationResult.Reject
if verifyFinalization in pool.dag.updateFlags:
# This doesn't depend on the wall clock or the exact state of the DAG; it's
# an internal consistency/correctness check only, and effectively never has
# false positives. These don't, for example, arise from timeouts.
doAssert false
err(error)
# https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/p2p-interface.md#beacon_attestation_subnet_id # https://github.com/ethereum/eth2.0-specs/blob/v1.0.1/specs/phase0/p2p-interface.md#beacon_attestation_subnet_id
proc validateAttestation*( proc validateAttestation*(
pool: ref AttestationPool, pool: ref AttestationPool,
@ -177,7 +194,7 @@ proc validateAttestation*(
block: block:
let v = check_attestation_slot_target(attestation.data) let v = check_attestation_slot_target(attestation.data)
if v.isErr(): if v.isErr():
return err((ValidationResult.Reject, v.error)) return errReject(v.error)
# attestation.data.slot is within the last ATTESTATION_PROPAGATION_SLOT_RANGE # attestation.data.slot is within the last ATTESTATION_PROPAGATION_SLOT_RANGE
# slots (within a MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance) -- i.e. # slots (within a MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance) -- i.e.
@ -195,7 +212,7 @@ proc validateAttestation*(
block: block:
let v = check_aggregation_count(attestation, singular = true) # [REJECT] let v = check_aggregation_count(attestation, singular = true) # [REJECT]
if v.isErr(): if v.isErr():
return err(v.error) return errReject(v.error)
# The block being voted for (attestation.data.beacon_block_root) has been seen # The block being voted for (attestation.data.beacon_block_root) has been seen
# (via both gossip and non-gossip sources) (a client MAY queue attestations for # (via both gossip and non-gossip sources) (a client MAY queue attestations for
@ -223,8 +240,8 @@ proc validateAttestation*(
# [REJECT] The committee index is within the expected range -- i.e. # [REJECT] The committee index is within the expected range -- i.e.
# data.index < get_committee_count_per_slot(state, data.target.epoch). # data.index < get_committee_count_per_slot(state, data.target.epoch).
if not (attestation.data.index < get_committee_count_per_slot(epochRef)): if not (attestation.data.index < get_committee_count_per_slot(epochRef)):
return err((ValidationResult.Reject, cstring( return errReject(cstring(
"validateAttestation: committee index not within expected range"))) "validateAttestation: committee index not within expected range"))
# [REJECT] The attestation is for the correct subnet -- i.e. # [REJECT] The attestation is for the correct subnet -- i.e.
# compute_subnet_for_attestation(committees_per_slot, # compute_subnet_for_attestation(committees_per_slot,
@ -246,8 +263,8 @@ proc validateAttestation*(
# attestation.data.beacon_block_root. # attestation.data.beacon_block_root.
if not (attestation.aggregation_bits.lenu64 == get_beacon_committee_len( if not (attestation.aggregation_bits.lenu64 == get_beacon_committee_len(
epochRef, attestation.data.slot, attestation.data.index.CommitteeIndex)): epochRef, attestation.data.slot, attestation.data.index.CommitteeIndex)):
return err((ValidationResult.Reject, cstring( return errReject(cstring(
"validateAttestation: number of aggregation bits and committee size mismatch"))) "validateAttestation: number of aggregation bits and committee size mismatch"))
let let
fork = getStateField(pool.dag.headState.data, fork) fork = getStateField(pool.dag.headState.data, fork)
@ -278,7 +295,7 @@ proc validateAttestation*(
fork, genesis_validators_root, epochRef, attestation, fork, genesis_validators_root, epochRef, attestation,
{skipBLSValidation}) {skipBLSValidation})
if v.isErr(): if v.isErr():
return err((ValidationResult.Reject, v.error)) return errReject(v.error)
let sig = let sig =
if checkSignature: if checkSignature:
@ -289,7 +306,7 @@ proc validateAttestation*(
attestation attestation
) )
if deferredCrypto.isErr(): if deferredCrypto.isErr():
return err((ValidationResult.Reject, deferredCrypto.error)) return errReject(deferredCrypto.error)
# Await the crypto check # Await the crypto check
let let
@ -298,7 +315,7 @@ proc validateAttestation*(
var x = (await cryptoFut) var x = (await cryptoFut)
case x case x
of BatchResult.Invalid: of BatchResult.Invalid:
return err((ValidationResult.Reject, cstring("validateAttestation: invalid signature"))) return errReject(cstring("validateAttestation: invalid signature"))
of BatchResult.Timeout: of BatchResult.Timeout:
beacon_attestations_dropped_queue_full.inc() beacon_attestations_dropped_queue_full.inc()
return err((ValidationResult.Ignore, cstring("validateAttestation: timeout checking signature"))) return err((ValidationResult.Ignore, cstring("validateAttestation: timeout checking signature")))
@ -342,7 +359,7 @@ proc validateAggregate*(
block: block:
let v = check_attestation_slot_target(aggregate.data) let v = check_attestation_slot_target(aggregate.data)
if v.isErr(): if v.isErr():
return err((ValidationResult.Reject, v.error)) return errReject(v.error)
# [IGNORE] aggregate.data.slot is within the last # [IGNORE] aggregate.data.slot is within the last
# ATTESTATION_PROPAGATION_SLOT_RANGE slots (with a # ATTESTATION_PROPAGATION_SLOT_RANGE slots (with a
@ -410,7 +427,7 @@ proc validateAggregate*(
if not is_aggregator( if not is_aggregator(
epochRef, aggregate.data.slot, aggregate.data.index.CommitteeIndex, epochRef, aggregate.data.slot, aggregate.data.index.CommitteeIndex,
aggregate_and_proof.selection_proof): aggregate_and_proof.selection_proof):
return err((ValidationResult.Reject, cstring("Incorrect aggregator"))) return errReject(cstring("Incorrect aggregator"))
# [REJECT] The aggregator's validator index is within the committee -- i.e. # [REJECT] The aggregator's validator index is within the committee -- i.e.
# aggregate_and_proof.aggregator_index in get_beacon_committee(state, # aggregate_and_proof.aggregator_index in get_beacon_committee(state,
@ -418,8 +435,8 @@ proc validateAggregate*(
if aggregate_and_proof.aggregator_index.ValidatorIndex notin if aggregate_and_proof.aggregator_index.ValidatorIndex notin
get_beacon_committee( get_beacon_committee(
epochRef, aggregate.data.slot, aggregate.data.index.CommitteeIndex): epochRef, aggregate.data.slot, aggregate.data.index.CommitteeIndex):
return err((ValidationResult.Reject, cstring( return errReject(cstring(
"Aggregator's validator index not in committee"))) "Aggregator's validator index not in committee"))
# 1. [REJECT] The aggregate_and_proof.selection_proof is a valid signature of the # 1. [REJECT] The aggregate_and_proof.selection_proof is a valid signature of the
# aggregate.data.slot by the validator with index # aggregate.data.slot by the validator with index
@ -439,7 +456,7 @@ proc validateAggregate*(
signed_aggregate_and_proof signed_aggregate_and_proof
) )
if deferredCrypto.isErr(): if deferredCrypto.isErr():
return err((ValidationResult.Reject, deferredCrypto.error)) return errReject(deferredCrypto.error)
let let
(cryptoFuts, sig) = deferredCrypto.get() (cryptoFuts, sig) = deferredCrypto.get()
@ -449,7 +466,7 @@ proc validateAggregate*(
var x = await cryptoFuts.slotCheck var x = await cryptoFuts.slotCheck
case x case x
of BatchResult.Invalid: of BatchResult.Invalid:
return err((ValidationResult.Reject, cstring("validateAggregate: invalid slot signature"))) return errReject(cstring("validateAggregate: invalid slot signature"))
of BatchResult.Timeout: of BatchResult.Timeout:
beacon_aggregates_dropped_queue_full.inc() beacon_aggregates_dropped_queue_full.inc()
return err((ValidationResult.Reject, cstring("validateAggregate: timeout checking slot signature"))) return err((ValidationResult.Reject, cstring("validateAggregate: timeout checking slot signature")))
@ -461,7 +478,8 @@ proc validateAggregate*(
var x = await cryptoFuts.aggregatorCheck var x = await cryptoFuts.aggregatorCheck
case x case x
of BatchResult.Invalid: of BatchResult.Invalid:
return err((ValidationResult.Reject, cstring("validateAggregate: invalid aggregator signature"))) return errReject(cstring(
"validateAggregate: invalid aggregator signature"))
of BatchResult.Timeout: of BatchResult.Timeout:
beacon_aggregates_dropped_queue_full.inc() beacon_aggregates_dropped_queue_full.inc()
return err((ValidationResult.Reject, cstring("validateAggregate: timeout checking aggregator signature"))) return err((ValidationResult.Reject, cstring("validateAggregate: timeout checking aggregator signature")))
@ -473,7 +491,8 @@ proc validateAggregate*(
var x = await cryptoFuts.aggregateCheck var x = await cryptoFuts.aggregateCheck
case x case x
of BatchResult.Invalid: of BatchResult.Invalid:
return err((ValidationResult.Reject, cstring("validateAggregate: invalid aggregate signature"))) return errReject(cstring(
"validateAggregate: invalid aggregate signature"))
of BatchResult.Timeout: of BatchResult.Timeout:
beacon_aggregates_dropped_queue_full.inc() beacon_aggregates_dropped_queue_full.inc()
return err((ValidationResult.Reject, cstring("validateAggregate: timeout checking aggregate signature"))) return err((ValidationResult.Reject, cstring("validateAggregate: timeout checking aggregate signature")))