increase block proposal speed with many validators (#2423)
* increase block proposal speed with many validators * document CookedSig rationale
This commit is contained in:
parent
af0d302398
commit
85289269d1
4
Makefile
4
Makefile
|
@ -269,8 +269,8 @@ ifeq ($(DISABLE_TEST_FIXTURES_SCRIPT), 0)
|
|||
endif
|
||||
for TEST_BINARY in $(TEST_BINARIES); do \
|
||||
PARAMS=""; \
|
||||
if [[ "$${TEST_BINARY}" == "state_sim" ]]; then PARAMS="--validators=3000 --slots=128"; \
|
||||
elif [[ "$${TEST_BINARY}" == "block_sim" ]]; then PARAMS="--validators=3000 --slots=128"; \
|
||||
if [[ "$${TEST_BINARY}" == "state_sim" ]]; then PARAMS="--validators=6000 --slots=128"; \
|
||||
elif [[ "$${TEST_BINARY}" == "block_sim" ]]; then PARAMS="--validators=6000 --slots=128"; \
|
||||
fi; \
|
||||
echo -e "\nRunning $${TEST_BINARY} $${PARAMS}\n"; \
|
||||
build/$${TEST_BINARY} $${PARAMS} || { echo -e "\n$${TEST_BINARY} $${PARAMS} failed; Aborting."; exit 1; }; \
|
||||
|
|
|
@ -30,7 +30,7 @@ type
|
|||
## added to the aggregate meaning that only non-overlapping aggregates may
|
||||
## be further combined.
|
||||
aggregation_bits*: CommitteeValidatorsBits
|
||||
aggregate_signature*: ValidatorSig
|
||||
aggregate_signature*: CookedSig
|
||||
|
||||
AttestationEntry* = object
|
||||
## Each entry holds the known signatures for a particular, distinct vote
|
||||
|
|
|
@ -11,7 +11,7 @@ import
|
|||
# Standard libraries
|
||||
std/[options, tables, sequtils],
|
||||
# Status libraries
|
||||
chronicles, stew/[byteutils], json_serialization/std/sets as jsonSets,
|
||||
chronicles, stew/byteutils, json_serialization/std/sets as jsonSets,
|
||||
# Internal
|
||||
../spec/[beaconstate, datatypes, crypto, digest],
|
||||
../ssz/merkleization,
|
||||
|
@ -176,9 +176,10 @@ proc addAttestation*(pool: var AttestationPool,
|
|||
|
||||
let
|
||||
attestationsSeen = addr pool.candidates[candidateIdx.get]
|
||||
# Only attestestions with valid signatures get here
|
||||
validation = Validation(
|
||||
aggregation_bits: attestation.aggregation_bits,
|
||||
aggregate_signature: attestation.signature)
|
||||
aggregate_signature: load(attestation.signature).get.CookedSig)
|
||||
|
||||
var found = false
|
||||
for a in attestationsSeen.attestations.mitems():
|
||||
|
@ -281,7 +282,7 @@ iterator attestations*(pool: AttestationPool, slot: Option[Slot],
|
|||
yield Attestation(
|
||||
aggregation_bits: validation.aggregation_bits,
|
||||
data: entry.data,
|
||||
signature: validation.aggregate_signature
|
||||
signature: validation.aggregate_signature.exportRaw
|
||||
)
|
||||
|
||||
func getAttestationDataKey(ad: AttestationData): AttestationDataKey =
|
||||
|
@ -377,7 +378,7 @@ proc getAttestationsForBlock*(pool: var AttestationPool,
|
|||
attestation = Attestation(
|
||||
aggregation_bits: a.validations[0].aggregation_bits,
|
||||
data: a.data,
|
||||
signature: a.validations[0].aggregate_signature
|
||||
signature: a.validations[0].aggregate_signature.exportRaw
|
||||
)
|
||||
|
||||
agg {.noInit.}: AggregateSignature
|
||||
|
@ -448,7 +449,7 @@ proc getAggregatedAttestation*(pool: AttestationPool,
|
|||
attestation = Attestation(
|
||||
aggregation_bits: a.validations[0].aggregation_bits,
|
||||
data: a.data,
|
||||
signature: a.validations[0].aggregate_signature
|
||||
signature: a.validations[0].aggregate_signature.exportRaw
|
||||
)
|
||||
|
||||
agg {.noInit.}: AggregateSignature
|
||||
|
|
|
@ -68,6 +68,11 @@ type
|
|||
|
||||
SomeSig* = TrustedSig | ValidatorSig
|
||||
|
||||
CookedSig* = distinct blscurve.Signature ## \
|
||||
## Allows loading in an atttestation or other message's signature once across
|
||||
## all its computations, rather than repeatedly re-loading it each time it is
|
||||
## referenced. This primarily currently serves the attestation pool.
|
||||
|
||||
export AggregateSignature
|
||||
|
||||
# API
|
||||
|
@ -116,11 +121,19 @@ func init*(agg: var AggregateSignature, sig: ValidatorSig) {.inline.}=
|
|||
## This assumes that the signature is valid
|
||||
agg.init(sig.load().get())
|
||||
|
||||
func aggregate*(agg: var AggregateSignature, sig: ValidatorSig) {.inline.}=
|
||||
func init*(agg: var AggregateSignature, sig: CookedSig) {.inline.}=
|
||||
## Initializes an aggregate signature context
|
||||
agg.init(blscurve.Signature(sig))
|
||||
|
||||
proc aggregate*(agg: var AggregateSignature, sig: ValidatorSig) {.inline.}=
|
||||
## Aggregate two Validator Signatures
|
||||
## Both signatures must be valid
|
||||
agg.aggregate(sig.load.get())
|
||||
|
||||
proc aggregate*(agg: var AggregateSignature, sig: CookedSig) {.inline.}=
|
||||
## Aggregate two Validator Signatures
|
||||
agg.aggregate(blscurve.Signature(sig))
|
||||
|
||||
func finish*(agg: AggregateSignature): ValidatorSig {.inline.}=
|
||||
## Canonicalize an AggregateSignature into a signature
|
||||
var sig: blscurve.Signature
|
||||
|
@ -226,6 +239,9 @@ template toRaw*(x: TrustedSig): auto =
|
|||
func toHex*(x: BlsCurveType): string =
|
||||
toHex(toRaw(x))
|
||||
|
||||
func exportRaw*(x: CookedSig): ValidatorSig =
|
||||
ValidatorSig(blob: blscurve.Signature(x).exportRaw())
|
||||
|
||||
func fromRaw*(T: type ValidatorPrivKey, bytes: openArray[byte]): BlsResult[T] =
|
||||
var val: SecretKey
|
||||
if val.fromBytes(bytes):
|
||||
|
|
|
@ -50,8 +50,8 @@ proc gauss(r: var Rand; mu = 0.0; sigma = 1.0): float =
|
|||
result = mu + sigma * (b / a)
|
||||
|
||||
# TODO confutils is an impenetrable black box. how can a help text be added here?
|
||||
cli do(slots = SLOTS_PER_EPOCH * 6,
|
||||
validators = SLOTS_PER_EPOCH * 200, # One per shard is minimum
|
||||
cli do(slots = SLOTS_PER_EPOCH * 5,
|
||||
validators = SLOTS_PER_EPOCH * 400, # One per shard is minimum
|
||||
attesterRatio {.desc: "ratio of validators that attest in each round"} = 0.82,
|
||||
blockRatio {.desc: "ratio of slots with blocks"} = 1.0,
|
||||
replay = true):
|
||||
|
|
|
@ -33,8 +33,8 @@ proc writeJson*(fn, v: auto) =
|
|||
defer: close(f)
|
||||
Json.saveFile(fn, v, pretty = true)
|
||||
|
||||
cli do(slots = SLOTS_PER_EPOCH * 6,
|
||||
validators = SLOTS_PER_EPOCH * 200, # One per shard is minimum
|
||||
cli do(slots = SLOTS_PER_EPOCH * 5,
|
||||
validators = SLOTS_PER_EPOCH * 400, # One per shard is minimum
|
||||
json_interval = SLOTS_PER_EPOCH,
|
||||
write_last_json = false,
|
||||
prefix: int = 0,
|
||||
|
|
Loading…
Reference in New Issue