From 6d8bb0c30abbefd667c0a114be8f35b3c3cf6abb Mon Sep 17 00:00:00 2001 From: anshalshukla Date: Wed, 11 Mar 2026 17:36:31 +0530 Subject: [PATCH] separate attestation and proposal keys --- .../testing/src/consensus_testing/keys.py | 122 +++++++--- .../test_fixtures/fork_choice.py | 41 +++- .../test_fixtures/verify_signatures.py | 40 ++-- .../test_keys/test_scheme/0.json | 6 +- .../test_keys/test_scheme/1.json | 6 +- .../test_keys/test_scheme/10.json | 6 +- .../test_keys/test_scheme/11.json | 6 +- .../test_keys/test_scheme/2.json | 6 +- .../test_keys/test_scheme/3.json | 6 +- .../test_keys/test_scheme/4.json | 6 +- .../test_keys/test_scheme/5.json | 6 +- .../test_keys/test_scheme/6.json | 6 +- .../test_keys/test_scheme/7.json | 6 +- .../test_keys/test_scheme/8.json | 6 +- .../test_keys/test_scheme/9.json | 6 +- .../consensus_testing/test_types/genesis.py | 7 +- .../subspecs/containers/block/block.py | 24 +- .../subspecs/containers/state/state.py | 16 +- .../subspecs/containers/validator.py | 17 +- src/lean_spec/subspecs/forkchoice/__init__.py | 4 +- src/lean_spec/subspecs/forkchoice/store.py | 170 +++++++------- src/lean_spec/subspecs/genesis/config.py | 70 +++--- src/lean_spec/subspecs/validator/registry.py | 69 ++++-- src/lean_spec/subspecs/validator/service.py | 211 +++++++++--------- src/lean_spec/subspecs/xmss/containers.py | 34 ++- .../devnet/fc/test_fork_choice_reorgs.py | 8 +- .../devnet/fc/test_signature_aggregation.py | 33 +-- .../devnet/ssz/test_consensus_containers.py | 58 ++++- .../devnet/ssz/test_xmss_containers.py | 2 +- tests/interop/helpers/diagnostics.py | 2 +- tests/interop/helpers/node_runner.py | 29 ++- tests/interop/test_consensus_lifecycle.py | 7 +- tests/lean_spec/helpers/__init__.py | 4 +- tests/lean_spec/helpers/builders.py | 54 +++-- .../containers/test_state_aggregation.py | 108 ++++----- .../forkchoice/test_attestation_target.py | 18 +- .../forkchoice/test_store_attestations.py | 74 +++--- .../subspecs/forkchoice/test_store_pruning.py | 80 ++++--- .../subspecs/forkchoice/test_validator.py | 18 +- .../lean_spec/subspecs/genesis/test_config.py | 72 ++++-- .../lean_spec/subspecs/genesis/test_state.py | 15 +- tests/lean_spec/subspecs/node/test_node.py | 8 +- tests/lean_spec/subspecs/ssz/test_block.py | 5 +- .../subspecs/validator/test_registry.py | 186 +++++++++++---- .../subspecs/validator/test_service.py | 178 ++++++++------- 45 files changed, 1146 insertions(+), 710 deletions(-) diff --git a/packages/testing/src/consensus_testing/keys.py b/packages/testing/src/consensus_testing/keys.py index 99004277..b3a9bdb7 100755 --- a/packages/testing/src/consensus_testing/keys.py +++ b/packages/testing/src/consensus_testing/keys.py @@ -20,7 +20,9 @@ - Each key pair is stored in a separate JSON file with hex-encoded SSZ. - Directory structure: ``test_keys/{scheme}_scheme/{index}.json`` -- Each file contains: ``{"public": "0a1b...", "secret": "2c3d..."}`` +- Each file has four hex-encoded SSZ fields: + ``attestation_public``, ``attestation_secret``, + ``proposal_public``, ``proposal_secret`` """ from __future__ import annotations @@ -36,6 +38,7 @@ from concurrent.futures import ProcessPoolExecutor from functools import partial from pathlib import Path +from typing import Literal from lean_spec.config import LEAN_ENV from lean_spec.subspecs.containers import AttestationData, ValidatorIndex @@ -48,7 +51,7 @@ from lean_spec.subspecs.koalabear import Fp from lean_spec.subspecs.xmss.aggregation import AggregatedSignatureProof from lean_spec.subspecs.xmss.constants import TARGET_CONFIG -from lean_spec.subspecs.xmss.containers import KeyPair, PublicKey, Signature +from lean_spec.subspecs.xmss.containers import PublicKey, Signature, ValidatorKeyPair from lean_spec.subspecs.xmss.interface import ( PROD_SIGNATURE_SCHEME, TEST_SIGNATURE_SCHEME, @@ -162,14 +165,14 @@ def get_keys_dir(scheme_name: str) -> Path: return Path(__file__).parent / "test_keys" / f"{scheme_name}_scheme" -class LazyKeyDict(Mapping[ValidatorIndex, KeyPair]): +class LazyKeyDict(Mapping[ValidatorIndex, ValidatorKeyPair]): """Load pre-generated keys from disk (cached after first call).""" def __init__(self, scheme_name: str) -> None: """Initialize with scheme name for locating key files.""" self._scheme_name = scheme_name self._keys_dir = get_keys_dir(scheme_name) - self._cache: dict[ValidatorIndex, KeyPair] = {} + self._cache: dict[ValidatorIndex, ValidatorKeyPair] = {} self._available_indices: set[ValidatorIndex] | None = None def _ensure_dir_exists(self) -> None: @@ -194,15 +197,15 @@ def _get_available_indices(self) -> set[ValidatorIndex]: ) return self._available_indices - def _load_key(self, idx: ValidatorIndex) -> KeyPair: + def _load_key(self, idx: ValidatorIndex) -> ValidatorKeyPair: """Load a single key from disk.""" key_file = self._keys_dir / f"{idx}.json" if not key_file.exists(): raise KeyError(f"Key file not found: {key_file}") data = json.loads(key_file.read_text()) - return KeyPair.from_dict(data) + return ValidatorKeyPair.from_dict(data) - def __getitem__(self, idx: ValidatorIndex) -> KeyPair: + def __getitem__(self, idx: ValidatorIndex) -> ValidatorKeyPair: """Get key pair by validator index, loading from disk if needed.""" if idx not in self._cache: self._cache[idx] = self._load_key(idx) @@ -244,7 +247,7 @@ def __init__( """Initialize the manager with optional custom configuration.""" self.max_slot = max_slot self.scheme = scheme - self._state: dict[ValidatorIndex, KeyPair] = {} + self._state: dict[ValidatorIndex, ValidatorKeyPair] = {} try: self.scheme_name = next( @@ -260,7 +263,7 @@ def keys(self) -> LazyKeyDict: _LAZY_KEY_CACHE[self.scheme_name] = LazyKeyDict(self.scheme_name) return _LAZY_KEY_CACHE[self.scheme_name] - def __getitem__(self, idx: ValidatorIndex) -> KeyPair: + def __getitem__(self, idx: ValidatorIndex) -> ValidatorKeyPair: """Get key pair, returning advanced state if available.""" if idx in self._state: return self._state[idx] @@ -282,36 +285,36 @@ def __iter__(self) -> Iterator[ValidatorIndex]: """Iterate over validator indices.""" return iter(self.keys) - def get_public_key(self, idx: ValidatorIndex) -> PublicKey: - """Get a validator's public key.""" - return self[idx].public + def get_attestation_public_key(self, idx: ValidatorIndex) -> PublicKey: + """Get a validator's attestation public key.""" + return self[idx].attestation_public - def sign_attestation_data( + def get_proposal_public_key(self, idx: ValidatorIndex) -> PublicKey: + """Get a validator's proposal public key.""" + return self[idx].proposal_public + + def _sign_with_secret( self, validator_id: ValidatorIndex, attestation_data: AttestationData, + secret_field: Literal["attestation_secret", "proposal_secret"], ) -> Signature: """ - Sign an attestation data with automatic key state advancement. + Shared signing logic for attestation/proposal paths. - XMSS is stateful: signing advances the internal key state. - This method handles advancement transparently. + Handles XMSS state advancement until the requested slot is within the + prepared interval, caches the updated secret, and produces the signature. Args: - validator_id: The validator index to sign the attestation data for. - attestation_data: The attestation data to sign. - - Returns: - XMSS signature. - - Raises: - ValueError: If slot exceeds key lifetime. + validator_id: Validator index whose key should be used. + attestation_data: Data to sign. + secret_field: Which secret on the key pair should advance. """ slot = attestation_data.slot kp = self[validator_id] - sk = kp.secret + sk = getattr(kp, secret_field) - # Advance key state until slot is in prepared interval + # Advance key state until the slot is ready for signing. prepared = self.scheme.get_prepared_interval(sk) while int(slot) not in prepared: activation = self.scheme.get_activation_interval(sk) @@ -320,13 +323,58 @@ def sign_attestation_data( sk = self.scheme.advance_preparation(sk) prepared = self.scheme.get_prepared_interval(sk) - # Cache advanced state - self._state[validator_id] = kp._replace(secret=sk) + # Cache advanced state (only the selected secret changes). + self._state[validator_id] = kp._replace(**{secret_field: sk}) - # Sign hash tree root of the attestation data message = attestation_data.data_root_bytes() return self.scheme.sign(sk, slot, message) + def sign_attestation_data( + self, + validator_id: ValidatorIndex, + attestation_data: AttestationData, + ) -> Signature: + """ + Sign attestation data with the attestation key. + + XMSS is stateful: this delegates to the shared helper which advances the + attestation key state as needed while leaving the proposal key untouched. + + Args: + validator_id: The validator index to sign the attestation data for. + attestation_data: The attestation data to sign. + + Returns: + XMSS signature. + + Raises: + ValueError: If slot exceeds key lifetime. + """ + return self._sign_with_secret(validator_id, attestation_data, "attestation_secret") + + def sign_proposal_data( + self, + validator_id: ValidatorIndex, + attestation_data: AttestationData, + ) -> Signature: + """ + Sign proposer attestation data with the proposal key. + + Delegates to the shared helper which advances only the proposal key, so + the attestation key remains unchanged. + + Args: + validator_id: The validator index to sign the proposal for. + attestation_data: The attestation data to sign. + + Returns: + XMSS signature. + + Raises: + ValueError: If slot exceeds key lifetime. + """ + return self._sign_with_secret(validator_id, attestation_data, "proposal_secret") + def build_attestation_signatures( self, aggregated_attestations: AggregatedAttestations, @@ -350,7 +398,9 @@ def build_attestation_signatures( # Look up pre-computed signatures by attestation data and validator ID. sigs_for_data = lookup.get(agg.data, {}) - public_keys: list[PublicKey] = [self.get_public_key(vid) for vid in validator_ids] + public_keys: list[PublicKey] = [ + self.get_attestation_public_key(vid) for vid in validator_ids + ] signatures: list[Signature] = [ sigs_for_data.get(vid) or self.sign_attestation_data(vid, agg.data) for vid in validator_ids @@ -374,10 +424,16 @@ def build_attestation_signatures( def _generate_single_keypair( scheme: GeneralizedXmssScheme, num_slots: int, index: int ) -> dict[str, str]: - """Generate one key pair (module-level for pickling in ProcessPoolExecutor).""" + """Generate dual key pairs for one validator (module-level for pickling).""" print(f"Starting key #{index} generation...") - pk, sk = scheme.key_gen(Slot(0), Uint64(num_slots)) - return KeyPair(public=pk, secret=sk).to_dict() + att_pk, att_sk = scheme.key_gen(Slot(0), Uint64(num_slots)) + prop_pk, prop_sk = scheme.key_gen(Slot(0), Uint64(num_slots)) + return ValidatorKeyPair( + attestation_public=att_pk, + attestation_secret=att_sk, + proposal_public=prop_pk, + proposal_secret=prop_sk, + ).to_dict() def _generate_keys(lean_env: str, count: int, max_slot: int) -> None: diff --git a/packages/testing/src/consensus_testing/test_fixtures/fork_choice.py b/packages/testing/src/consensus_testing/test_fixtures/fork_choice.py index 4d33e260..38c7ae29 100644 --- a/packages/testing/src/consensus_testing/test_fixtures/fork_choice.py +++ b/packages/testing/src/consensus_testing/test_fixtures/fork_choice.py @@ -200,7 +200,14 @@ def make_fixture(self) -> Self: # Otherwise signature verification will fail. updated_validators = [ validator.model_copy( - update={"pubkey": key_manager[ValidatorIndex(i)].public.encode_bytes()} + update={ + "attestation_pubkey": key_manager[ + ValidatorIndex(i) + ].attestation_public.encode_bytes(), + "proposal_pubkey": key_manager[ + ValidatorIndex(i) + ].proposal_public.encode_bytes(), + } ) for i, validator in enumerate(self.anchor_state.validators) ] @@ -288,6 +295,30 @@ def make_fixture(self) -> Self: scheme=LEAN_ENV_TO_SCHEMES[self.lean_env], ) + # Simulate the proposer's interval 1 gossip attestation. + # + # With dual keys, the proposer gossips a fresh attestation + # using the attestation key. Reuse the attestation data + # from the block envelope — it was built from the proposer's + # chain view (which includes their own block as head). + # + # Best-effort: if the attestation data fails validation + # (e.g. source > target after justification advances), + # skip gracefully — matches ValidatorService behavior. + proposer_att = signed_block.message.proposer_attestation + try: + store = store.on_gossip_attestation( + SignedAttestation( + validator_id=proposer_att.validator_id, + data=proposer_att.data, + signature=proposer_att.signature, + ), + scheme=LEAN_ENV_TO_SCHEMES[self.lean_env], + is_aggregator=True, + ) + except (AssertionError, Exception): + pass + case AttestationStep(): # Process a gossip attestation. # Gossip attestations arrive outside of blocks. @@ -472,9 +503,11 @@ def _build_block_from_spec( "latest_finalized": latest_finalized, } ) - proposer_attestation = Attestation( + proposer_attestation_data = temp_store.produce_attestation_data(spec.slot) + proposer_attestation = SignedAttestation( validator_id=proposer_index, - data=temp_store.produce_attestation_data(spec.slot), + data=proposer_attestation_data, + signature=key_manager.sign_attestation_data(proposer_index, proposer_attestation_data), ) # Sign everything @@ -486,7 +519,7 @@ def _build_block_from_spec( attestation_signatures, ) - proposer_signature = key_manager.sign_attestation_data( + proposer_signature = key_manager.sign_proposal_data( proposer_attestation.validator_id, proposer_attestation.data, ) diff --git a/packages/testing/src/consensus_testing/test_fixtures/verify_signatures.py b/packages/testing/src/consensus_testing/test_fixtures/verify_signatures.py index 4e9c3ff7..d99b6f95 100644 --- a/packages/testing/src/consensus_testing/test_fixtures/verify_signatures.py +++ b/packages/testing/src/consensus_testing/test_fixtures/verify_signatures.py @@ -11,6 +11,7 @@ AggregationBits, Attestation, AttestationData, + SignedAttestation, ) from lean_spec.subspecs.containers.block import ( BlockSignatures, @@ -231,7 +232,7 @@ def _build_block_from_spec( # Valid proof but from wrong validators # Sign with signer_ids but claim validator_ids as participants signer_public_keys = [ - key_manager.get_public_key(vid) for vid in invalid_spec.signer_ids + key_manager.get_attestation_public_key(vid) for vid in invalid_spec.signer_ids ] signer_signatures = [ key_manager.sign_attestation_data(vid, attestation_data) @@ -276,24 +277,31 @@ def _build_block_from_spec( # Create proposer attestation for this block block_root = hash_tree_root(final_block) - proposer_attestation = Attestation( - validator_id=proposer_index, - data=AttestationData( - slot=spec.slot, - head=Checkpoint(root=block_root, slot=spec.slot), - target=Checkpoint(root=block_root, slot=spec.slot), - source=Checkpoint(root=parent_root, slot=parent_state.latest_block_header.slot), - ), + proposer_attestation_data = AttestationData( + slot=spec.slot, + head=Checkpoint(root=block_root, slot=spec.slot), + target=Checkpoint(root=block_root, slot=spec.slot), + source=Checkpoint(root=parent_root, slot=parent_state.latest_block_header.slot), ) - - # Sign proposer attestation - use valid or dummy signature based on spec + # Sign proposer attestation and proposer signature + # use valid or dummy signatures based on spec if spec.valid_signature: - proposer_attestation_signature = key_manager.sign_attestation_data( - proposer_attestation.validator_id, - proposer_attestation.data, + attestation_signature = key_manager.sign_attestation_data( + proposer_index, proposer_attestation_data + ) + proposer_signature = key_manager.sign_proposal_data( + proposer_index, + proposer_attestation_data, ) else: - proposer_attestation_signature = create_dummy_signature() + attestation_signature = create_dummy_signature() + proposer_signature = create_dummy_signature() + + proposer_attestation = SignedAttestation( + validator_id=proposer_index, + data=proposer_attestation_data, + signature=attestation_signature, + ) return SignedBlockWithAttestation( message=BlockWithAttestation( @@ -302,7 +310,7 @@ def _build_block_from_spec( ), signature=BlockSignatures( attestation_signatures=attestation_signatures, - proposer_signature=proposer_attestation_signature, + proposer_signature=proposer_signature, ), ) diff --git a/packages/testing/src/consensus_testing/test_keys/test_scheme/0.json b/packages/testing/src/consensus_testing/test_keys/test_scheme/0.json index c52934f8..78197d5a 100644 --- a/packages/testing/src/consensus_testing/test_keys/test_scheme/0.json +++ b/packages/testing/src/consensus_testing/test_keys/test_scheme/0.json @@ -1,4 +1,6 @@ { - "public": "1d51f4158a7ac0333bac211e7b77036fd8e0fa23fd94ba2e5ce6f0700bc26e0d4e09835bb5472c0ec75cee16e27fe541c948bb2d", - "secret": "7318665b2ab4208b58260080eb3edd85cd8ac9f519de7b014e1e1c5a5c84e1694e09835bb5472c0ec75cee16e27fe541c948bb2d00000000000000007000000000000000580000000000000000000000fc0200004007000008000000000000000400000000000000140000001400000020010000ac010000f80100004402000000000000000000000c0000008c47d563c3b3f157919fd14fa89db9681ca71806f436856ff8d3714dcde1a231ae30a3456a781d456a070f33e59ad035611ddc62ddf0ca79da45510434384446c794c2288b1d10267f60a32a31973b7db1c6366db5f5e03a57e54409c688283a8e14077cd176f925f8288765e18eb243cc3fac46ab59ec5eafa4041c26da98333e25833b9d227124a4e76b3df7ea006555d9a50489ddff4cbd97f0335021252f836cee6533beaf416fbe2c1747a90a1048b5e41e68a3f7126b33ad299399a66425308f38d493704103d15a295ad8386ffe87c575ce63bf79e400172bb7e9ad461037b175fcd80762eee9b65c3033d53c2ebe40418633395da7abec0d7e37da4f00000000000000000c000000a36bc619e77c381b87e34777fcd3386eb6beab0be6fae9739e329802f8adcc6620d44009df01785e63602b7707833d0bfd9f0b3eae1e3677a994c455f0a0da7eec5e4f5952442b496bb8df42a8aec412454f946f8b921704ad96987180d4ca1dd8ff0a12435a35175a36210c903b007abd26bf002b30d6046fd6df0184d6065600000000000000000c000000c14ae16371406a63d6b1b401d60cc84010e51231b34197338467412a1aea0f09342b191e2343a204322a187706843550efa39855b79c157828fc7500bea0f42500000000000000000c000000e0818279b9e70430757f9a653c9eba0a55951f634e2ee302c60ff624f90d145c2e7a163a5af4e502ea008f68c213cd05efecdc773cfdb307575e5429299acf3600000000000000000c0000001d51f4158a7ac0333bac211e7b77036fd8e0fa23fd94ba2e5ce6f0700bc26e0d122e9d33f2ebc55d32d13314d2dd0c001228977de610d7005015201949ba0510080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000b7638d70dac64d51cfa2dd019eb4255d174e122513ce386812ab6e4148bee600e078bc26fcd2790a1d47f81b00292201aa1e011bd3e62655613b227a66459e5d42cad5023822fa4cb6fa805af517db7a1c750a70afde7350a0db0c6804961072945aae28c640907e99404132ff226c57e52b7e122c29af6474b75760a378051a6819bf2d41abef0a66c0f72d69fe8d79901ebc191998e3675d443c3e6236db6e2d18ee52461fd85065ffe018a16dae4bb2fef51ec3731808aef07d5046d9f31c1239bf63fd4d1b7bc343ad5c20480e676650935763c7ec2da028a41d435dab787720234dbfb6cb3bd975fd2ee2bdc424199a6c2deba17e768af5cc154a68cb7b82d89d6892f0294908e2284d4d23934b8ce1f158c907185cfb467721a9f3e02892e24519e2054f6673e86758a7ca482f24dd394847e7597417707d77cb817b547179732a1a4c8200ba3f513e2a2b365df6af5c4bc631713681042347d75cf217f4bdf71486f8267ba786c759d4a2155f5d31cc29af4ac534ab6ec4106708e439c8e1e226ee845d6ad626207e4f151c37ff3cc12ee487d04b0a9959205888675c133df538c2c7f06a0fc7131960ad9340d8798903fec85465e230671a69388767c5810b787059e078710db776641cdc7211e700755257ef7a2a42576e83037b57c9bcf144f05c00096e2f93792986d76dda37ff0b8779792aa0c6ac2f2a26ee5700000000000000000c0000006235a31f3e70815f0813530fedf446316061ad36f34f4957a9f407707c159d3009b1a919f462f50a02be305b77c3bc4c87d4aa308bc1bd10f6c6e431aff7416cff34204de18f4269d141660e78d33d66cc981941261a51365b40550980fba11c587d5332c3873b01fa8d204915097358e77ddb080bc340114d8fce3f9f2f28437b033755ce74a4750ba87f4dc238be682592857189987372088b5b15a064c611862b03525666476b910b2630fa21175c65706165dfe1996fbf98541aa74de1206ed0a71d2ea7f852de649826e576a3378b8745330357ec460f4bd0330521b0365366743c8d590a4550b8de46858680070e5acc0ce415a12a0657922b049c590700000000000000000c0000003983a247685dd04e04a29a15efa06239185c074473d87e44b2b88d721ca5e64cdf5dab06d9a09c0a63058a7c065d9511c8734a76dff0ae3eb118f530cf189e049d924c1a81e209691830c55dbc69ff574a215c0d8ecd9812548b1a58be691217fd3c685b9c64aa0bc4244c37ee37141a647beb708a46a57b064b1e3c6a75c55000000000000000000c000000d9f04c77d8904e015a656f208df9dc75d451d85cbcfd044f13f1145ccae5ea40a4793f5dda844d0d04e3ba5b1c92627c0e6e113d9128f73bea47d5470dac356800000000000000000c0000008c47d563c3b3f157919fd14fa89db9681ca71806f436856ff8d3714dcde1a231080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000d60a911b5953d90cd990e319a482da4a00ece3666ae1207de4f7490e819706213a88204c1ef88857b4336e26b5b07b210a0f660b28714e32927aeb6f43a25045c1dda21c44b89a2da414961ec3a10053550bbd30a8e1ea396aa328742ba34f6fc749a6193f0bd52ed9ad652878a8f0060e8a681c2847a5000eca6b01c3a0941a4ba3ef4643d86314be33de3c2babb007f6f8954a40ec135534fd4b16fc863c014966496af1b18a4c5237286f976552200eb298466291d72b0a09742ea8287d71b47e29439ae0ba7cbe4e9c2ae888b9740a43c208d3aea466d9b1cd3f81cb3050b079396e49a74a0666c80b19e2fddc4b9ccf8a46bae3ed6268f0670773310b09c995bd693d751d3576180c6006e4fe2026ada221b7cafb5ccb6a8a3d3940225dfc4d7318bd6d1b45f8f1184337fa8e197c7b9e01713d6d7ea74bbd2397ff2569211bb7192457f3543d022574d712341e39ad940f7031323d5eb050602a4e9f1248f0796278d0483a919a356f994fe2534537273bcec116430574de7a48e9157e6f86406f85309723aa142e75d0b4490dc64c6023300a854992bd83219e64c44ba3a608608112665693fc3f7a43fae34b168df960728146534824b415b643fc7bd653ad1e77583e07c6b59a5600c28d39a018c67249c5701558830042729f185a4296d83ba47c9408f1c5890b4aa57772c49afe7c1737e004c04b3723d1786e4e08000000000000000c0000004bc88243a4c495135d6c692523536666668b992b28fa18611f077a73df2c5356d998d97782c64a6970dfec0fe7b4c37cde8a6f5c486f9b6d2955d51a6235ed2f69701445fc17851002259356372e0c4f3b5ad073dc4ad337476c1e5a8d718c5e40a6724908caf96fdc4d9819d122dd0f71ebb23fd8e82e1861627468acf1057bce548335db41a430b600f244bcbbfb61da3da017f147f63df07ded3d12d2137073f25f4f49e8bc20ac14817be781634be9abfd1051930006afb4ad020564f73da239936d2e60da46b6de6c2be3c0024c96b5104a3792ff0f004f7035b4bf1273ae0994726ff677090193b1307930276afd491624ca58ac5535533f0eff1b115004000000000000000c000000da63af14c9bebf0410633438cd60c210803c6d554fba660739c4e15ac93e39506a4f7968de651b55dd3a41354ae1b54728c8f2575546d425fae264469fea5f4ea6bc9f41b8ce9b7ab19f6f66e8be1d14fe5a001bf43f3b47e96d0845d0800547381b827048c75a4db7699179673e1b69cfe7197deb5ff55bcdeefc5a1d486e1702000000000000000c000000ecc686308322b157b8f9082d68aae710064860204c21c30676a5dc4b56a135630a88170bcf9e2f6ac876772e75a7f413c900732264e70c3d6fa06411d6110d2601000000000000000c000000ae30a3456a781d456a070f33e59ad035611ddc62ddf0ca79da45510434384446" + "attestation_public": "cd64341d83f28533f239153535b45209592342325ed31a5792b2e61935648748d41c384850baf6386c43bf19bfb63f53eb2c8c0b", + "attestation_secret": "dc34cb2e1838ddd848c6dfa212d3b1ceb7aa7964769e241963834c11c441d510d41c384850baf6386c43bf19bfb63f53eb2c8c0b00000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000f3f0ed2da9b5bf259e55155af62d6c7a3d62db360a32b47c78d76f601dcc464f76549d1be95bad257dfea8682401b70dfb02ed4324bb3f2615fe2d34aabe731000000000000000000c0000004459dc571aee1d106487e76807885f310ca96f59e01b974ad71e2a09be5e42657c42b82c318c54084976ee718192366479c5b43aed1dac54927f017e10dcec3000000000000000000c0000005e89f300aee4057dd072396d451e75432d56223070093031e75eed49df04834eba5f42058fd8df74f790824c2ab7b54b6a905d4587bd356659c5c1104bf2522a00000000000000000c000000f29b3e2924c84a332c059b33b6dc3d1dab063c47cc6bcd6e45acd9679e1e405a8deed17ddd60fb35cd3387701de2bc5a5feb6729c8c579783c1a863413e30f4600000000000000000c000000cd64341d83f28533f239153535b45209592342325ed31a5792b2e61935648748f23dab31177e147114a45508435dfa24c2b2ff40c39ed82a619a7a3ea2a82036080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000d433943375c51d4b12cfed48a8ecbb5abe2e076e1365fa77bed46e73f5f5de467f15f14b8125277326c5242869ccc76fafdee8619fb6eb71677abb3e01411810109fe220525fad0456669971f9161d131e33351e7a528954ebbbb8571bc9847d29174d60f9d0526048120c764851bf3620f480433a820e36a3e4300703aa2b6b5a538f3ac4a2ac368a19b631eaf9be5dcc1b4949fddf11568bedc31684bc5b3e8f66db3e771db1188d4e0862b9da8e1562d63b3ad8eb41126b29c62aa3a95744a6d41c4147f52929bd6f4a1b83f0d60b69914923c0e9de5db0f1344796d1d312734e666b5c658b6ef4db660e6c99fd3cc5d1a55a4b0e9b5addc3e13ddb58874f4dec8855c926c014f6d8fb3fffd2535ca4638e2738b27154251a2032c34ec03dc5d9b058337cd920e29f2b5f54401a193a91623f3bf0c6547d87ba5483568069e2afe259a05d600c2392da299363e46cb43f104c54debc5e2e33d575757e004a627e3d42b4610406152a0f56d06cae447c912f22e63f80521824a430827e5d392fa98a1833eb534a1c06f615bd0b0e2cfe9fa9483a3f4e739c65a515a2693b60cd9a6e7903f218060c046226d200e3477bb70e6d3618ad1ed975177c81db6a1caa5e580e874dbe770e7fa66dedc26a123a958f0a6c5e201f26c839596daefb08fd02a62bc06ee169360918790415271a4cd7086619fed744055ffe76233ec93a00000000000000000c00000029a0c31f8b8eaa4c934738086ba7da13123a393a3e87a6797820da66bbf36f0789fe66633a68d4406fc24a3a50c2a209f3e2673c4a9d8f4d6e79120fcba9eb640c90767ea9fcfc41ec79642c9d7c7c5483657412e69a6760230d4962454e414fe3acc14e0f2d6a7915e57a1699e2041dfef42f5c0ad0ca2fd64d74020c12fa701b4a3b6bb850e818dbda6850c3203d6e51009e07f3784f352768a81e84ca4701d00fe94a1f6a675f78bc7f357f532f5e4fab5c7c233e5a73faa189089f7ade62ea411345d59fc36911a66e58ec43fe7bcb2e2f0c9f7bac3fc28b431660dc19553c965d4fd813a8515cf6882268d4ce5acedc8c4a44fa1a6da5cf481ff085725e00000000000000000c000000e4f0590a9c867237d72d3c23e7548915ca4b9a53fc591d318e746047510e81032bf8ec1fdf31e17ce984093d5a05294404a273175c41ea1f3509d4596c102d2e4678a94e0b2eb646f7faac2062f10e6665df564236065c2a8ba2f14d9ed68d2ae857c917bbc55f30fb8dba6d97e9767a08e9e242dffd44385253802c87d0332900000000000000000c000000ff657821a1e5322176d55f1caf5dfa35f1eca322607ba641ff59120d86ff153b5e464b267f7c473760d21336936f5576ce125f459e1cef75d1b8ff488818865000000000000000000c000000f3f0ed2da9b5bf259e55155af62d6c7a3d62db360a32b47c78d76f601dcc464f080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000c3b7e47113f8fb4056951a28ad63ad3feffebc53d9c0a23970817c4843a8f17db855234ea5c707203520d65e9e7c482ab13af850d8750c73a5916347dfe50651c00b8a276d6aae688518812dbe02950289a49870a416110dd36a512c553d3a020181046b9f75566c1e5a4164f11d117b86527f323147cf0435204d1485da7b30210cf86241669e2b4d5c856ebf621f12858732739d00dc4d2453f1267bf51d2e24e36c098beca858456e5e732c09087409949004f321906624d4d95557fa490df1d4901116d1fe2868d7bb634e8c25512a5650173e75b73e7cf56a5ab894ff743127a47e1d6e2c313e1a6535853d6023125ac45d9a91a205fd17806668a9a12227ab226578f0c64c16d8524e2a0ecf383400a64c41e458136cdf746c6f82cc4b2f2e0f4f8168af25b69f6856585c0e76e835475a8c72500784e0ac22eaec35671e2ee91a88513061d4bb96189b6b340ee7cd1d44e5c26168975d2e6f7390d461459ac3359887e67c070d5e229d5d2b5122ce90504d71a060d7f6b437f60dc5695f3a3735f97ac11fe7c842732f6db46106ebfc6c734ebc619aadc11704d09730180cd07848f9f16691ec7268b402d05af3732a008c92302933c06d52b76af97c5a9f3c1050a9bc5201e26d1d4c8633672d80941aea4ad73a35492346515f822f22e05a0a3c617c21d856891feab7b62d380b8e739d46d13a92e6c07468b5e05c08000000000000000c0000006f0484548c399b1cf2b0080b714f0164fd6f9a59e7213066907e0f0395f86b4165e0115e4f52e05306b1fe08284fd841b7c6f11367bf6d1b6cf44f0bb033e55912c34c7393ec873da289df6bb3163579596b9207d13bdc63c2602001233b260f6ad25d6be5529f06b7d126766b0a6949be5246516dd93330f970be049a305b2e75ed16372b0763399ef2ac34973dd31986549f5aba5358035cb9f04d3d701b2fca41d25724eccc2476c09a0fb4eff81632ddf858bb1bc13a3addd06040f9b42aff3629620bea02773ecb5e6ffa138a057f89423ff4fb0e7864327750c52f8d43f5f7a0561fcb912cf23d863b4c95be6a3d695d5955b05f1fa96ab351bdd7bd0704000000000000000c0000002b66de1a9d91f42df231d1079619c54d6351bd137e919608f2daa20de94ce218288502718c03f837cf7f5f14e6a1904b1e723b26a52d2b51e8af9d37122f72553ad62959c06a650fd634a7366f26750ff0e96f27ffcdba688dc8d439991d6823f1098a7239c79f3f7cdc5c121e9e1235ec2e1e7b0932c63d4fefc81ba4fa3a3002000000000000000c000000da6c9871caca726641fc2d3f76712c4738b8c2382038bf7050ecfd0d0513065d4550e57514957c5dc8d2626b5a822e0d8e7de86a1d924f67b680a72038ecd45b01000000000000000c00000076549d1be95bad257dfea8682401b70dfb02ed4324bb3f2615fe2d34aabe7310", + "proposal_public": "5eba321a84f55461e2c0e94036d24e5107720876752d5c4f6e03183a7e7f1856e372c60dbc6fbc0450c26e58ba402f1da6952a73", + "proposal_secret": "633d36908b6524f852edfd6aaaeb4ad7d64eb57ee97ba3a2ae624951efba43f5e372c60dbc6fbc0450c26e58ba402f1da6952a7300000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000206204602bfa254efbb6bb7dfc36022d1ce7126fb895f470de1f8c50cb1c47678a62c444d4f46645b1e7bd596d286367f371641f9410c01cc78cd42890d1b01200000000000000000c0000008775217baf83ff3ed1b3aa572e9e837b2479e44a62a8532caee3c04d1acd6f28ca0de11d58873e72b6b28f12cf7bb77bf05b9d5cadf3ac71c3fd563b95b9c72500000000000000000c0000005bf05e5c97ce8a258d71683155d70c4a464205151828a16a9e65b94f75dadf506e76682ad83b0a2be07e16406921811b64a9397ae56a72765230054b4c7aba3500000000000000000c0000001f8a3026d773047533027b70579ab35b43d20716d97ca26bf6624f498dd189569bdf3e5855cbe83e89d8942f2ea358511c11b67b58ddef583280c62950b8e83500000000000000000c0000005eba321a84f55461e2c0e94036d24e5107720876752d5c4f6e03183a7e7f1856f4feb9669016ef4f73a6d37955f9624fea33670b5dbe1b2fdb8b9f63ba932633080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c0000007665202caa89be164276a46d18d8fd7b7e56d322a8c9616a5608e613d9f97f180645ad4f2f4f36618024fe29f8211d0b047ca82c1b6e3b132d32077644e6d409b72f4866591bca6e05f74728fee07328118a51638aa0cb4f6fd0921dcf5255778a5c1e4c695b6c105eae036bb8883f364d33820dc9cad454f3c7dd661e07fd778cc1527e5e89a25dc1737c4b4fa5c6139b2f112e2c7bba3ed53ee304dc68942c13d1600b101d1d175ea72333a8f7166fa114820dbeb7415f462d457cc9969562dc57b13148a3877ac5feeb0c0153322d82097a74e1984758524ed83bf26489368ec1660fdd8fb24efe363931a015e83bcb48c954e9c785192c66e83fa6738541c772be062252d1525ba54c208a7db55cd69c9659d14fb1145119bc1e5fd1e74a10e24f60a595f91e5ad98157dd4a000471aa99725ab9ce6b099b8d167590643940387d1b2a12b306f9c7f15cfa45ee5fd2203446a464275777aa50431dc14e442389a03ba61e21597f3643312faa2420562e026b5c1d43728c322e7b497e3538079b0512bc380930c556392491822a0413b65077a12f052734efa025d386f336aa463e3f8df52d3cc049073881ba085db9aa743988ffa706b470df0ba2b37c586af2c1536db72537ce564478bcf5c10c7808e2391d53d708408ce3786d65993c365d1d387693cd2d98d8922fc72fbf317b4b9e67a9dd011c204e9369cbd4943d00000000000000000c0000006dafa31ef8f33a145b37584c21c1d55537843b1eb83992365f89a62cf9fef84db4041d0eef298f365065fa5529c2c01b3ebc827c7b8d9f4b7fdb812d6abe395fd427556e50c0a90e99e7ac38b5a3ac6a85e8f916a6e56d7ab9b2d90c06aea72e42301b253ab885782b708f020e626c486deb427847275540f895445e1afeff4e6270577cea763e0d2fff752c5f571e5d80b6c01fbfd2fa75069cd2708929b76c70b49e0e1e17f41dbaea7856178f6f2bb89465218d1b517e6784123d1ac3e05b5df2c93be3fc7b5e989ef853bd87d141c6923763ed07914f30f02172cfd9e34b789de74d7cf97b6bc51d6c08cec8571dbcabdf58f655bc02d0abda46a4b76a5700000000000000000c000000e2bd716188ee9155a2a61916c566fb7640c10e58c92d2a5dc56d83734c76a039914c8d1b71d84d04191872221a040e64d437ac7c6d9da127fa3d2829e35ede12f49adc00fb702756892483091eddcc79adeffb1a2a29591639690b71a6b0614564ffeb55d0db3e4081a1d515514d3b764234111d5798e50502a05b35495f123300000000000000000c000000ad8bd3207b68a73b95b0ac1d145cb9622fce0b649b02c5604e933a2ad507264be198e17dcd3ff758a9e86e7bb14c9e06db4ead40b3a8204691a4dc32fcab041600000000000000000c000000206204602bfa254efbb6bb7dfc36022d1ce7126fb895f470de1f8c50cb1c4767080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c00000022f3095917bde63093c6940d7f261034459ab81e0dcf9c3468f4724cb3150f57d3a0535d7665c07039f13b0816197e6d30935538b60ab427e60845206ae56d1c20ac3628780c98197a9bff54b6e48120e994271cc81e6d2a7536a567637ef0560efd753b07768a758419d05890ac5e32dd552909630bed601ab81f6507f7b962306e2813b703a013d8d23b6dfb9a821e83d5886e1ea8e3272238040f92da7f63ad7ce8071feff01c6bd73e7e2ad6eb72fd9e623bbb5d365d3e68ef6a4d89731a4535aa10123058683107db746cbc712e6144774f9648ad3cda680d12742e8c6045534338cd04f55bda883428390034449c49333c29641210c911034a517e48366f852c0c98b7ce1002e20c41e192a05ee3b2e33dc25f9a0615c7517d1bf6f700088b36563178f444ca5ece3deaf5b35b4d4e3f0dd3a12f410eca360d8a70dc6d7d75ab669d030c610091a4780756a532bf3b9a4ab5639519c1456f10e7201b6885afd824c5a4db62a0d3614b72cb647d3f67e3275d6d461820681626b34d990bf38c2066e5688e55ca40da5231d6097dd089725f55b6ef0a5e8e683e79e2356991503d661493ee57b1496f19a08c531ba61b574ca1bdd8696f5e8c0642170d4fced0456bf215bc0f9139dd39ef31174b99d00b315b4acb41c1346374b0f9476ff809816723851304f2ccf50ad695221456d12677c69111017c09c5770b55b53c08000000000000000c000000e6d095401507765f7b59993fea972d6aa290355421f70536b0a378586543d12a338ee418fd9c8377feb7c82fe4ff386cf7657f2fb0268b588f065e19ddaba801cbcac9340786fd75566fef52c15def7a0d952473896bf24cd3b7471e261ea37ac95afe479a0f5a5e80d2557496ed06439e7c5412300462762b218a4f83c91c147bd87107be7a374451e1cf430cb77c0d1d8c0b55e306813fa82fdf0f724e5403f3c6025be7c319637d67db6ff2504d642db1b910db51ab1aa37b3076b7aec03180d56e220997c41e464c803df7e4090301dd2b7816c26074d682ae2abb0c8a5f03f97a43a296126117899d0dde215403037c594a36fff42a4ebd874b2cd4733e04000000000000000c0000007917fd01e7430348f618484514392e59d13e3862bc84a05d30ebb93e384e7a302d765f3b3bd79d7855a8102398abc3113ea104757de06f6266f09858059f4a47bd90fd4c0f20210e27fb6031e6ce5e28be022507d5caef19a163e60cc927fd02ca37b94558123e308da63f26cfa3877e91452173ddff511efb2d030fd736b73d02000000000000000c000000259b475704733545355f3053446a386dbaf0b31aa5401a475917155f14c7eb0649ad093b35a33a7edda40c2b7b2d647a65e38e6a193e451e03b99b46be3e016801000000000000000c0000008a62c444d4f46645b1e7bd596d286367f371641f9410c01cc78cd42890d1b012" } \ No newline at end of file diff --git a/packages/testing/src/consensus_testing/test_keys/test_scheme/1.json b/packages/testing/src/consensus_testing/test_keys/test_scheme/1.json index 8d609c6c..8e28eb3b 100644 --- a/packages/testing/src/consensus_testing/test_keys/test_scheme/1.json +++ b/packages/testing/src/consensus_testing/test_keys/test_scheme/1.json @@ -1,4 +1,6 @@ { - "public": "c5f2411bc352f041395d054cc8063f31e86d860d60c7d506673a717628d8e643c840505a25dc7b292243301facf38760f970d548", - "secret": "6a2f40c80a9a50f87ed0932b2c4f87452ae2faf712baa45fd6a326f83bb9e234c840505a25dc7b292243301facf38760f970d54800000000000000007000000000000000580000000000000000000000fc0200004007000008000000000000000400000000000000140000001400000020010000ac010000f80100004402000000000000000000000c0000000eaba6023acc3a0e618b614fa23c552e9c9501259c07aa5b1741f75a6c0e0426ba1e9c6d59eff401345d76515ed82d2b01ce9a7b80ec20364fc0797e1ec1331518d91a734f0ea375dc4676798d90be71a6812369b505bd4dd13c0d101a9bfd72cb9d5c6ea7b8531a32c1fd0655f99a54f3e9295f5a19d46fcb74807d39f3e76e911d1143ada8d845d9fc53245b7f4972fb0ba6608f106b22abccc921e97b740776c9b346ad409d6a06616d56a7a8b83d2c448b5f1d48091787a6a3715389a77c4f66ed74d8ee42267f8f0b1cf3bd30646309552b62c48b785af3466b8d642c4e915ee470dee60c1c2968c47192be92106dffba04da65325eb0dfb37a31a7651500000000000000000c00000079d28d272b72ba5c10829225a178847d49267466f19501062302c57b466c427ca8860630f95abb30cb96bd4bdc396759e4760172123e962063b9884d8381a94ba08fac145d3c5c2b3344586c4bdf71700ffb5b386df3ab7bd786045201e4dc4d45f1af0cdd48d4377c6a592d5212790ce86f295648d3a71d3a2e2d18fdd5f43100000000000000000c00000004f62b1fa52a023a1f08867406f5ab427db9954f8fbbf54d944ed27a80e0af29fe719b6e913cb94046ea3d3a2926002261a4a04c9895490f8ea29f0ce7732f2600000000000000000c000000f50b847e2bdc0b1fd346ff50f52dfd1c7e4b59732017ec291635811448d439110abad036a29aed7c72ccbb6f8d447f56608be628c1928b53ed6f10459554ec1f00000000000000000c000000c5f2411bc352f041395d054cc8063f31e86d860d60c7d506673a717628d8e643dd00c5373f69113529c7a61216a1b05c5ff1ca5ddc8c6d78db93c013a1167976080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c00000096489d1fe394a24144ae771b63469e1a0771ba6696175356a603ab21f97b9f545d09f666eb31d0324925e9787c474f1816361b4b2b16621ece441174a4dec30e68be1e7479643e0031bcab0cb5cf332153baa2519d09fe1a40035c14f531824e25bdcd3be4dccc3ec9a252231e8bbd6461cb6461964cdf1eb5eca561a8586462e6c25a767137cc246f948c03e23f0500145bb73f3df51711abb00e2238d092775ed1c03d59b4d119e0efd81fb0639f77d66ef815cc9f5e46ee34262dd51d754f0dbd434a2b16f564c0ac4b768fb9f1311ce3cc258584f92013a5a87ba0c378611dd5b7738854622c8720154eeff47e7d345c8650b4e9776456ef7875405e2a3a28e18e70b7114050522a9a79eb917965c73c0764e59fdd2d9ab37c7ef122287223e0cb1dda083a54e9bccf2bd44e1d370e2a307afd59276d7b04292e797b197a16d0c3488f76eb6b6a6ab961f55b74320a913d3bf650dd0ae69e6537e3c51300b2f869760969a32895f23b7abdef4e4d8f89725d65ed503488ba89244a4a5042f42a5a552f2e971d71a1736973446e7e596f52676f6e34373cf1a30b0887773bb4f14e53f873723170be6e1e1a7a2e29674b520306a37d2e0fe5c16dfe2c1a5707e6f22f95123d418fc6304db75fb464f9043f21d89030234925c22668321e0366bc315255be772154f470197681a5517ada032f7d7d375865b62278179bb21600000000000000000c000000f379ec76d6c0b812141d95261ac5840fbdca4336f4f138435ff9dd3190bc186ece06131c3e4f9a163a9b1e17de19473f1906e342be75e121bb79841113e3df04645d3e32c5e3211a9e0f7035e7d38308c5b861748fb420205e8d94757948eb6aa4195f22940c636a80690d4c79cc2a49e77af05173e664571d967e61d9db2c6dc6f7930b35eced6156b1d94bd844e865d3a57d61c499516cc243d96365e36109f790002459c1ab09071e510df7782616016b673a11006104f16153642bd2bf17b1bc335a49e67e387f1e123d641be3232e33a16f28f43b0da1470018fcf50b4eec0e8941c8ecef6d77e3a83213c21524d6324f02e0c8bc51ddf92c122219c74800000000000000000c00000058462c63e60ee075f2ba18283e42c3641aca2e76c6b4784c1a3ddd0defa01b6f0e1834321aaa6451d4316479e504115a3e951a24c506bc4f6665435e508b4229eb083079b29e0f114a8b12039afee762b0bae602fee02b557c75ff72f22e183d4e42bd6e6ca0c741cce40322fdeefe075c456550c58a990b49f02136d5cd124000000000000000000c00000081442d56dcc1f277e84bd520a840b07c928baa528f13ae0fee17485720e0412f8f8f876136c859260a7c973113d18b2c7895cb14773706777106ae3254048e1400000000000000000c0000000eaba6023acc3a0e618b614fa23c552e9c9501259c07aa5b1741f75a6c0e0426080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000b80fe25f135ece09530a8e312a10e43a9331c02bec4bd0072ab0583fbc130f022b4da15eb37faa7b9a912c2ac4e4a74b57875a3711290b7549060d47a262793831ec7b3f1486ad24fff7443d4e0eb6147b96ec4d76a4e61dfc10207b27264837a04b6a3866334c4e3d95b00eeb8b4a2b6a6b491da931a47145d5e86660acbb56d227d52ee4983573fe5f344121a9831394d2253c83b9976b53e6961f2adeed33a3767254f8da5d774ca340357a46710d9aebf7487db7635f7804ab7be0eed6190732ba05978e72533bc1f04b1af17d0789f2f708c56c0352a4c9d7717d1a911b4425fc25f99baf7e4186460c39e00a28de0b9168de56ac1cfe35587bfa356b31b2bcda1ba6b6a168576978540e23d06aa5f6cd1bce0e6723c2b7ae71be2605538718f11660daa8740821fc1fea08291c55699f7a74e63b0c2d492a4095fd107571e85e7d0ffa4a0c5e0c147426173d137650a84fb2da660d51bbe50aa2047529a8a3e764c7878e108859600eab26cf7110df5d2e6d218d1c0b4f8e08a4e7c71f9260506ed64f182f19f9fc5ed49ce4151499d57e14eee2644982b159bc7de04662ee92128059e862d8331c2b078ad55e95125d1c45ec6c64c4b05031fc6b5670dbc0ff595c9d1e77670a3e455e13e528f78bcd3c6494f31d8e50617c971b9a6ca519890a41c38d32f4e7570473ed895817792500470e0611dd510d2046624f4908000000000000000c000000d87a6c6a46491825862a2e73d61b930c7da194220ea4041af7b05c3157caae73f5588e611fff1f3dc7e00a31f8392c1793e01237e72af009b026974f76dbb733fc62fa1953ca5f129fe72b11b313912852640b3febeec5794e63f8483911577a3a3b9b0c451d5f3aa34cf435266ca327a2f22d65c5566a462132f433a82ad800835d1437b24d8c3d4fb42a45b83c0507740e2e69e36f6b52c0e63459ed4095331600e875ef0a4f09b9156b1737011656c5d4f8720110f05c708c022ad3063761a3e6151861bd632750c08625035f817ecdc96548877c816125dc75402ac9ff395996504be6e15b289610325163f67258aeee587abbef73083568f16e8669ef1a04000000000000000c0000004e92b85683ffcb2992674701df77280394bc3e0990e31a5c7c6bdd1a1bf640490bf2947e3c0dfb451a568e2a5948401483d805757661cb447561dc5c4a3c650a1d500c68cbe87963936e042952278750e3cad20fb05f635cc17ffb0db025b26b54d94b2511da3870d4d52c74389ff3465d862a066d991441cd32d011cd83907202000000000000000c0000003f28dc48f233932a8a3fcb61f2e6095236cb0d1a264cdb1933d65479f8fe5d0934a76f70767404756ba63f0d9c19e63c2a088e3cea0ee901e5a0f942a9f2077b01000000000000000c000000ba1e9c6d59eff401345d76515ed82d2b01ce9a7b80ec20364fc0797e1ec13315" + "attestation_public": "0c8f12450a0f4375d8f387643a66bd4084a76a522062790d8e961b38dfe3497444af494376e3c76f3007681a4016221434cdf51d", + "attestation_secret": "1fc475cbac3acfca76988f8c4b8fc11a6d6fb77266e23fb6d2615c132c5ef8e944af494376e3c76f3007681a4016221434cdf51d00000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c00000091313d49c42e5e374b484834dc6beb271c2b764432c2214f091a136457caa4375743701501bebd4f4f6dfa24830af26ee9b62e31e38fb45a02353c502562f33800000000000000000c0000000d20e56e408e4f587ab11b565edfb604b676a878c706f4790975c35f48641473f102ec69ce808c2f092349734ee9f92634ed447452dbf640040fb9012ca24a3800000000000000000c000000de8d3908a49d235679542a2f483a11338c346828d0c2b82964c87a0e6df174240ec52c7233e1c715efec243f0918a36b357883450a748b147040335b928da32f00000000000000000c0000000559b52ae098453322064d3e27bb450b06eb1941f853dd2144dd041784b3a4364612b43363271a42fb74ec5f3216a83c9fdb252e8309dc5b5a54595f3659cd5b00000000000000000c0000000c8f12450a0f4375d8f387643a66bd4084a76a522062790d8e961b38dfe3497464776b5c11629f0ece67f70fce4190284dd5480c70d1b00fa8ab95030194787d080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000831f214ea2c8c15e4cc8071120eb775846537a768712e7160af64116e8e1ba776ba25800424a257db4ec9f4d20a902338d804529b9a3f843df742b6d292c3f14f288653545fd2d2ad52e524ca5560d01b9aeff3f622c2b26c172eb38f129df05a39b1c1bc6b57659feb2654edd955c2fea005b2591a2bb3a90a20b0c9133d86ecc19e42dac7ae73203e3a53d83a6e946801fb911bc1bad088373405426df70329d413d0c4b5812099ac32d51cde1cf3f7c7df650cb18245ccb454b63fcc8c00776fe1d71820b6d1a2ad3535081c7b75c96e17250f9bb4957aa9d4e6b92cfe75e7f188652763dbd74693a8342f13ba424297e8b3ffa001649bf34d83bccaac2576f9a106568f009036bd25a3fed0db5411fae3c528541845f21722a16c495176c84d6173323a2315bb8a22b130f4f78798f752e4b42c0272e34bb8e3f2a44983de3fb3831c790864cf674237e77c2a31d60f3bd0375f0366410a45008ca20ad0185104d6d04436f6e5682de350e316c56274cce2e4398bc1465ce6f7cc4b21b564c76480ae37aec1630a83c48c8a4ea295c7ddf1646ce10411a692e7cfa36d378184bdf6752a6671b211ef816d1b47c0acc42b577959d983e3f8256377c2f67774f64ac56822af012dd75e07a98d75b0a3dc54056f5f871579a860b1214a69b5eddbd26370a7ba83b4897267825d3776a285c7655ac632730732048341ac41f4d00000000000000000c0000003714700db6209332626d78293f7ca073b4780f318019a2658442e34f341e960665184b43fb26cf0b86ff4d1328d98331c77d4e7e81e16505996ac02500d023395015a576af717400c47a83006d2ca63679e01d553e80f538c3104574efdd02587430011df49bfa17ea7d9f449a3bb10723ef0e61813d174ae19f4b30eb03de7aef403b71e20ae96d3c1fa77512f9fc6ffccb6a13e868b71c2ae5fe23d8664644ba4e301c0873dc0ec248174d567ed43968ff086a28e0066f9eb52b5e9da1a53ba80a3d68bc02a9294839d60345b9e0398468af4fda078b4999a7aa676b4ea102fcb3cd03254de40cf4bd042fb7eb20118300aa293313a11ca4fdef1bba37483d00000000000000000c0000003afe3f29bf053f41e973a356a0ca033ab826fd609fd80e0da2b5c13401e9754a1b4f4366e855da2f7ceed20ceab97d3aa582ba4e8f46d75588eadb160d973a3a20003c076291456b93e94058cc120216c2325e41d7c05339b47b7e1dd9ca1b38d6357355805594733e71060cd12257479de57352fed4ca7922038f3669a21d4a00000000000000000c000000d23e18610e862a4fd5cb7c7c3ed5a83f526f086a2a26411b43547f5337a8c41a20f34c20730592734650d95b2a80cb58bba0740c9be6ab5afdb34c34b6e7530100000000000000000c00000091313d49c42e5e374b484834dc6beb271c2b764432c2214f091a136457caa437080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000cf5d6754e7521929a4818f7b0925e178e91c890a4c85da171c3896504d5eb263f285ed6dd992b5276b4803068c32c04f59e87d2797f7015ce3f7c04fdcdc48730d6c8265986d686715ae1b7c9c0faa38c26476282a78835a517c823ac727fb666e23bf181a917c069f331a34aa463d75d12a9a23f947791525562b43f0719e312148fc4560c8603032ca546f8b6b7c7492a13d5717a6a05e11e6ea2101ace36d0efe83495b6a5a4331c92279b1ddbe5bc3aff6140394af3ca5ff334d6bca7e39c89198431a6380645c556325088f846ee871691ff79b3c62519c2f3438815f02e7648728eb50256b3c445b40b4cf4c4e8a5773751a431b6b9f16ad78835b4a32a987350379b3766420498b0462c12b15a765c50e58edd6611f64f82a97363b127adc982f2309af026a1b032ded294462da7e731435e76752e416fd46c163826069e8b655aa64590a9d00ed5ffb6dfe43d5095f5c65463d72cdb4595ab89aa146bbcd4854b5e08c11e06b671aea68cf492bd2162dbc553e77400d500239c29605f23f4b401c80c94acfaf486aba986c540aae5e4eb3a6db69ad00ec3515fa4b3d4252881f36ce363c18d21475754f886e2adba455d16f350dd11e6e4b9db108223660351c4910eb2ffce29742b43d0150fe0f434c2bd8865b2ca6706eec88f74c56adae26983fd535ced6fb74ce0eae4f4a9ffb374d9d70540caeb97baffb613e08000000000000000c000000a6ef052b092230140f5f9b05d42eb22ce2723c55419eb000a31e9b5c98506d70e8ac2a3c9f852b2ba315c6627f784849879e9e37022ae1380707f46b8f016a14470cdf01a989aa538cc75113ae31366763bb5b07a8a4826fc02a310c90ae5a29f978901093921f274ca70612ee44e26fa5dd9048050ea438eb075630bba1cc22d7dcce5d1801444a3717f8000a098c4cdd6c743fb014745dd2f9ba272237040d454bf410c77c1d479dc51e3480897636f9e1cc24a023b7160bf2080092c35a068e70ae018a448004124bcf1f87d659743aaf24499b1d955cca93df363dd1700c8327d63ab195e961b764f8692c08d114c33e705b0f00c328d0695048bb6eff2604000000000000000c000000427c9e682f0410516ea71d2493db093ddd73ab185cb1d6487a43443463da8b16ec04fa79926fc226f1e41e0065887f3f0003686a6df4583f2e684d079f73aa7e1ac3d308178df54dbe8b551315794100bad4402b7455bc619100fa113dfea5307e154f612073e029889d245247eed1657168133ec834f40a44a7e74295c64d6f02000000000000000c0000007e5d6341af264468b509f2199345343ceedcf8706ecbe047c1d88c6d8609cb1e1c3c050a6aa9a62ab9112e3e90042321e3bd2c6cc634455ca29dd0601251ab5001000000000000000c0000005743701501bebd4f4f6dfa24830af26ee9b62e31e38fb45a02353c502562f338", + "proposal_public": "8b31ba434a9e116dcd99a11535d8fb480fe67517c20eb1117157ca1b1b6b0c5c9d9a632e3268986f35856c337fc18d7b6d4f926a", + "proposal_secret": "2b390ffd597a3f353dd9398b8f79caac87d88d0cfecab9d8f4ba315cff52579c9d9a632e3268986f35856c337fc18d7b6d4f926a00000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000c794a85b6d83911c21ae1a432a6dba471f41967a2e61bb45c1b83b44bf133708dab5fd2b7c87bd79f5da7d5f6ce8396299375b6d695ada4bba33ac19e2511c0500000000000000000c0000002381d51d323d853134f9e41be84e292a085e6038026b5a42a67c5431badd9460d9c2cf6b0ecaa33a07b0f406a82f6048b858ec33282ed90bbd6a122778cecf7900000000000000000c000000adb204253234e11b0cc780364f4e2b1863cc6441dd977506c9af471c7b1f9272af53ed1ab51cf9722357a863b574691fb2633d155e53815db72ee8198f0e1c4400000000000000000c00000042041b1b79aea377b334057cec34a965a60c4a1591ec1879cdcd5f2fda2f326aa65eb24b13d14a7aac436d69dfd89874e246757ea919601492fea17600163e7d00000000000000000c0000008b31ba434a9e116dcd99a11535d8fb480fe67517c20eb1117157ca1b1b6b0c5c8bc769345f7da0606b2cbc2efc929e326f438b114ed10532575b901b7265ce7d080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c00000049b2b64f27982463438e7e7d86168a20ac5e5e4af7ae2870be90076941fe6d60e74efe0bd0fc7876e7e96a780b6ecb08dc963d27f9e3c7558ef0fb31b02ccd40560ae23ad606a03640d91d5cb0cc825b754b9217083ce53e6fc6fd28a428913ef5d99b7934300c693da52d63b0a1d81ad4d05f2069b09b32a8b2b12367d01c0d10bdf34776a5b851e9e2ac6289e5e54122497265e2d62e107e04524ac9978544f29c6e4806d1bd5c4629de5d83b5c54025e78751e3ded85d4ab9ab2bb13795250910803a9b4dc24e218c915607745a50acd1836b567cbf787d07ed2ae66dc13c1351364df8e4cd0758c67a7394c6d410be83e10473237c33a1f929716bb2910e8457e72a7ca2b65cb52ac8214b9e9f11d271c61154d3415bef1cac14c161af334468243205ab711e46af750439d85e4f0d9db639b748d84717d0dd07768bd7115853655470cc8632850aea0cae5aa40fa815c479d7cbaf79ea50963e9b215d297f8cf109641ec6411cb40d35d3d3f066e8439e5d09b3f14099906d7432dcd862635e0e33b7308149ab75e03588a6f31b415cfd74f1d9c93a88bc2e39cf0a681c1e5c3b76f132235decedf271c354342ab83aef2a74a8d722df62625ddafd416a787a43752b56807da4321f385845091011d86e48378723299d187a1659a76026fb62886556446f4033471e048a0b990d5e27d329dadd904b29d7c66dbaaa610f00000000000000000c000000e725c5785214730d1ce86e484559c60f3d54864fa887836abc5ad22b2192077c825ae942f1b85b39be2865267dbdb0171e4e5c3d6497ef217ea7de00ee316c5741393f46ff02992f1aed22735cecfc101a31091e9a4cbb2d2d645c0460c4707a110dcb661ff03d384ade2d5ab50b8223b050b53e06aa563f00176d70b85152076bbb660cbb1e0128ed0c480daf37a050cc4893167b6a835a5d57ad5ddf980b015352f6544585de6f4de9d756ba81a954a787e37a98924b295d7fa95b2a7ab35cf85b4875abaf740ea8071d6a38b7165aa8347b12a8c808040ef7c0583ebaf40582c66928c41df14261cf0a10cbc77e71ad6c651c712fcd2baf02901c7059153700000000000000000c000000b484e9138e8f586b2a80d078d188112d7906fb1c1b9da95b60bb7414c5273a5233d6a92889892c38bfee6525572fab015eb72f0757921030a0ec2507b482383d98f9134d3b8fde163e6ca550964e463f64f36978cfc9536dfdac4d4280363e5b1842e977a219ed51b4f172365d1b6a269130e43009320f20c1c9f13aa4ecee0300000000000000000c000000e455c767849a697c863dac01f285f40f5063a96653b762633a88a75ddc00fa03848985677d644e52d97cbe34d78ad22a84009958121da45a4d9eb37e71bef80200000000000000000c000000c794a85b6d83911c21ae1a432a6dba471f41967a2e61bb45c1b83b44bf133708080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c00000015620251c79cbb49df8d7d14cef524797fdc2c18ae3e1947f11c0e14e488535d00936331b8d781217357782e09c3245c1819a23046e0d71ffdad1144a0d26a5693a27a381c17086918a6eb7b195ac570bd24170d6bc24e6db997e65609c2ea0032cbda7e3442e52c34b3f1781645a92caac89d7254d46960c67d7818b7ad44057a00c8612ef7ed1855ebf4594ef8f307737728408502d819aa289b7e16e54745d0a1dd7ade0d5c402097d018b99b2f06fa22c60b8b6e7249c296652d67d2307cbf1f6151ee17ea26b7baa478ad2caa45d9ea9849d0ce777c59f0bc652a573a55f12fcd0be5045107dabb802ce7b1520e9989a07917deb55cb5d102476a2fdd248c2b4c1d86cd04112531577efa569c1a1f2ea02735ee0803a8a2bf15a9fe610b6a822f562bed13220d39e576dc00457d4c87771be7eef335642eeb529b0c0e4ca814051eb4f1846e3b808332a5d98806c8d0691dc324c021c100c316b899d52f3fb3000f467f270127eef55c67ae4f1c8cd5b9004189723fb9607857f5e3aa515d71e46f55a19275adc1d63a8878225ab0893f5c14aa2166727eb3055668ab71a2a49a0bb3b59f6e57739f4ee7f1183ab1ddb46635134e24e9a37d4f6262c22b4d6b230582cd0275b610e74f8e1fd715bcdced13cd7f3e2dc45a6a704185457d810cc05668007e0cf2f84c52378fa4233e00b726edb111598e22214850cd870e08000000000000000c000000e8384426c8dcfd2afeac69306449687125239b0bda9ff25d740d476e02fef53b8b14851c07304f088e035866e0cb2f6463103b31f4e3e173b4ca9b685cbc2e42e6ecc72f03570056503a2d21c2d1bb783cb6936ee8543d28c76f487ef2b42851f79efb7042c85d4f71edd43f106cee455309ce6cdf4bf02666fd924a996afa28be159a795bdabe41244b250aa880fc6d7b8bfb388c6be61ee7912c29b5a2763071a3e1678a27642a4f0f3110b837ce2b460fcb4907d6923d75c9d7194452041d0ce0dc6074e40b0269f32940f29e6e1c2d315310542bb46f5f79366acb001f0b9c0c54080eeacb63242efe6b006c10143871835df629104dfd4d3d4e7a9f924704000000000000000c000000eac0ee37d5eb637e250d2b5e2d6e5018463d282065fdbc470b9a80795d80f42e25dcef3d519e38408711da519f417e2e25631143e7f4c84927f5bd6461311a1514dcce5530759f00d74f1956f281df379627b97bd64bd6195137e66d0f9bf43bf88a4957285b2a4ed8ad715a7032b9348719e63b51e4bc17634c7f0813536a7202000000000000000c000000e31e543003a1436b13201465adf99f5620ad8e28e1a92951e140ca4e3e33e16b9330ea545cc463059b15bf685af8bf49684a306aed1f6323ddbaa355443df65d01000000000000000c000000dab5fd2b7c87bd79f5da7d5f6ce8396299375b6d695ada4bba33ac19e2511c05" } \ No newline at end of file diff --git a/packages/testing/src/consensus_testing/test_keys/test_scheme/10.json b/packages/testing/src/consensus_testing/test_keys/test_scheme/10.json index 20b564b8..3d3279fa 100644 --- a/packages/testing/src/consensus_testing/test_keys/test_scheme/10.json +++ b/packages/testing/src/consensus_testing/test_keys/test_scheme/10.json @@ -1,4 +1,6 @@ { - "public": "d1344e445f6cdd3430ac6962433c137c506eba3448aa7a775ae4be46590045701d3c6a074232771682ffda010e123c5b038c3377", - "secret": "fd3f68f270a16baaf91974356484783d5240b3a7328bff94241f7a60329cb1ad1d3c6a074232771682ffda010e123c5b038c337700000000000000007000000000000000580000000000000000000000fc0200004007000008000000000000000400000000000000140000001400000020010000ac010000f80100004402000000000000000000000c00000054e69b37d7a42c243684d57e1dea462e41fdc358a058a556a09500372d9b8076410781369269a963fca9104ea4affe09d7f9020feba64e488a600245b4218a2ac408773752da6075df958412158ca424e5da713c6834fe1992c9495ac990ee1a3b0bcc319684883fe943c946c41430176ac55f6931968d579fd6ff5016455c2a1c73666de562f02b3f190a3e0de038461085cb7bee4d5824a483c31faac53f35d17def24137b76254293aa00b9239e0c5a459f612f6f292640af3b1438b9e5048bfd7661c59a60017fa07437616e0a60fa5fdc681f05b103612bc332acbb5704a0a0d16734b8fe6ebb74ae287f0d8c0f9984b96a48b57515cb2ba9227c82627500000000000000000c0000002f78352f9e5405115a48c30b0bdf59597c948f0a1e93716d6876ee41c1273847299dfb55dfa7e6678852967d73ee8e4c72794f5b4d3fe514a9d07f41dc55c043621e322903aed93647a9aa1984e9045579ae347d89eea13d9c6a57439b912c15c968a54ecc35531fc3a9cd78644ce1587484e71077197c66087a2f286466b57100000000000000000c000000e350874fe5b9b56913e287128669ea552b396a22fbe8d055f3c02012b6c5db06351c0e72589a042da9fad8076721111629627d3fc13f1a2fb772727b6488890d00000000000000000c0000006c165c3889d89e6317c6fa5376ebc964f24c711dceea5c13dd6f5665c8c6885b2bcb4e5383e2130bafa8484f86489000107baa265a6b4f165d348a726b83c82500000000000000000c000000d1344e445f6cdd3430ac6962433c137c506eba3448aa7a775ae4be4659004570da321767b97a462561ce1479c83e3b4630beea2a02911256fce61a41325d3377080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000e183553239b02f5459ff4f3a3f152142beee7507a6e5e76f844c922e257998009f290324e4e4db7939268970756005160247db1d3b5cc327ce136a5973ed8e47d559553a3c259f680068fc2ecdfc1d49694a6c5debfe223693945d4c98582326ab425978d969aa55b868d02eab410758c356f4493f2e762d8eed141b02f4911fd1af4c3f99521c5a22914059b9d48f30b6d9fd0d10a3631348d09254f28123517c7f57634d9bf86e79986347cdae9f617f52207c20f12530a9462d26bbaad403d483e14d166b1d6f8a765b0c1f8c3621c7b7964a12131e741604a37703bd655955d49275a68b916aed409c0e55da5f7bb8d26b73088ef27499e64e3374b45f6b6f0fbf31a0694e316fd10d15affe2b1ca78c273da27862186a668b34310fee46fe98cf5c785c663aff673001ea01e00e24f9d001d5c4347cdf42896a5afed05c14274c21831e244af332d534cc6dd5157f184a57b0df21668ce275380efe8d5d84550e47f2683743ff541a046f32f13283665502617c790302553c63ff82cd69524586391ce89b7ec35eca53ad1039557aecb8690887d13001b84f631a9120286b9c692cd0c734080877137434a4432130761341c3b9f019f5adf45a004bf42c693d046f5f99a1375a289d1c05fa3957f1e32a66d6096717e537971645874c5a6498ec634803dc4cea8a8970b32dc8349c59e76ecc46182e81051d0d0d389c7400000000000000000c000000238085562f59f676ccc48876115a924c590eda4e9287fc6477992c1056269e2487194c02ca4dcb2515af6e498008253863cb4c3a277d820ceb899e765d90a345c3c08e77dab31b126f223114d94799242355d3132cd5563afc24274c1f221d5d1b43ae039ec975607d827a3e973ade4c05fcb640039494635ad0b46bb31a2649ffb0da3abed52f18de4a4c1c5e8d862e8fbd08631740ec712b67192e30db1e5b8adf646b7c557443fb0c2f24b614bf05030ac76415f65c7d74f09a33f85cf753e0a968462f2840160600977c1719a3265ae635234f523933fe246b7930ce343d4f698e523d6a2c25202f9b4bc293326c252d2328e9a71c765617854f9064726d00000000000000000c000000b1e0bb091257d9132eab1725a3ac2e2c41799b1f5d567c4fc113ba1801461c2834349149d7f44c00569ba51cdd6a8762c7ea1356ba264431bc5b6a602b4687176a6b25364fc14206abd3121d300b622438cadc544ed9e775f4b09d49b57d41398aed844d2cb9bf2867511667b15cfa6c2dd24d7135e2d937367f036b6842e84400000000000000000c000000d6521879aa65da0aee9ff91164552c21edfb4113090d027e2a64f9006772ff2b397b0b46e600503d423275256a3faf238e4a1f019c0dcf3829d66743449f170100000000000000000c00000054e69b37d7a42c243684d57e1dea462e41fdc358a058a556a09500372d9b8076080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000fc873630ae8fda135cbd1508e4b4c949040a614cda452d585d08e01e520bed58e86293012ffa5e372e2ccd452a8c7c09aae3ce6c096fc60b3712c80bfe161a1e1d695a1a61dd167186f8a72b043a3a1da0262d6811a0081926b9a8154779685b64e773383daa1c49006392518d2a0359611efe69744b2b447c5422453a735227c8e49376788ef50a6386563bd64c526a759fd44a08b0cd27f137bd01811ebc6717815910e426687c746b540b4691a01f96625c230019452789ebb9470af135279a0ef1383a81463e19cbe066be27842ce4267570c9037a73a0d6631fbdd29407884242431225ca7eb1203a3da7df771fd8d02804ef8cbf2e300b6d00c8a34977d32dd142ee9a0c6c98b69e1f4142ec58ae8f5c60ae840e4067ec522c77993e57ef32fb5b3f7126665133f230c62fc07994e64851f4dcd84d777d4a596e540e294e53bb3be76a703d2ade803194dc3b4837de7516ea7eb17cdfbb6524cd1de45473a0d95b4c720746bae6161e90a84b056ed08a4255f40f43af6be31a4748d3190712dc6a4946815890a09e527dee00513f80341b0f53ff2e76a4ca2e3dc68a5faa2bd7689dce30448557950197f3a90e36cdda270694ec4c9c715a727af72d031368923605aa424a59f48957e138216564f72709b4e71e025b12d46c17f2f23feb39420584f61e2d25962047003a3e0d2ea69012c469fe32f104f23b6135946308000000000000000c00000021c2fe2e4e5b546988147a256b5f23644512f230b84bf27ab1c61a382e551463ca8f3d7899a7ea391a1a5209d789143f7566967a250fbf66c4910f141e39b4366ca7ec6f9eada535155b5a23037bd420a1f6c840f8b6700fb9a3441fbd1b731064c30f478f41780e9ebb817163ec9f2c11fffc2874d45e6e64915a737aa3c24514d1a615b151af357bbc165a65102931b77f9a50b21e090cb90aea45dd62d3117feb117d6093ca7382bfa873ff3fca7b173e1d2f2ab87b693dbe2c6175ea8d2d4f6d1b5dab7cc5151057a17e374cc14648a33f483f3e9d392befba200f002d65efdbed5945a08d1c6cd88d7282557f77c9123614a81eae05f7d7182733dc847804000000000000000c000000e109463fcc147a4fc5b6b70000a8023a94efb32f5545d11ecb12bd411440443e02a9685d499ac75bc1811f6dfbfa40379b6117399c0f365cc18960194fd79f74ebb8116627448f683dfdb61763aec56b03d6fa43cfa6392cf0317e6c99d5427c0906c60721fad6432a1d4a5648f4bb52a8ecbb7539df790917633b043b5f065302000000000000000c000000cbe7af1adeb22c1c1a1261526bc3aa72a12d3d1f36b0a63975f5d22a2363cc6ea2e81104cd53f9410a49d25876b1982aeab3f044be9d2c76a707cc7413400f4d01000000000000000c000000410781369269a963fca9104ea4affe09d7f9020feba64e488a600245b4218a2a" + "attestation_public": "1ae58b0b0a58156ab01c693762f5684981b9fc2086c23640cf626e0ed4d58d6a6963661a3b1f533023d6e40d6f67911c47b7f202", + "attestation_secret": "cdba6abad5f5f2b886981279b5b6df728c98f097cba13b791903778c7837ba986963661a3b1f533023d6e40d6f67911c47b7f20200000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000728b34329944f474ac2ac811c305393a9ee865061190560a1bd0b319e91e021134aa3d05da09452f86b7655b5e8d6930aa8a5b1ae06667147245511ac0babb0000000000000000000c000000d9c07270a0cda40ec754a600903aba204c596c438d7964030333501fe30fe24d6b1fd4659c52a31331610448cb745a1269aaf71f4be26f57767b0933ea17f93300000000000000000c000000d38b746c3456204f58048b536570dd728ff8b876b29f9a6697a2fc75b32d96283e4c1c6a929b741fce2f7055861dff3e40b867186e582d2356154310f3dd2e0c00000000000000000c00000023ba07194db0db08e2a5155f0be8f61d94f5fb4c2e48850207a43c322a11d55290fd4e412091d364ac374428ae17851346166c5d7ebb2275f6857321fad8fc0500000000000000000c0000001ae58b0b0a58156ab01c693762f5684981b9fc2086c23640cf626e0ed4d58d6a459c6b0426501111eb9ec034b51df968a0773a542507543117b8db0945eec919080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c00000018f61552f9da6c52b901981f8f6bd1590fa96c516b58006e0bd70d52941e060bef6718659c5b705b6d475c6b21b6cb536113375f085c8e773d87041e3c83e26dee303a5e6ab52f6798853c3e66f6e733aedfea66a9ec244bb64f723b96a70a2af1f5fb5991b12a28f6a0732000854227846c4d5f45c1721353bb93223b26d75d3d4896512c387c6ef2f3604eee617c682c294e68cfa91c5266247b1ce6c0fa6d11f1d5504b810c44de990973ceba591db3f4a20f2d93a651f36b2301d52211735a3bf84c9fadda2733f59b429d6313287c781023b6051908a998873bee80df1f0963cb4e1e7d5b40972c527267575d79e007c242079ee26c0f74eb6e8f4963341c5c7344dc8a98407ec9441156596f0aec1ccd1a78f4625830100014a451e240e9778a2a1baaf13d3c4dcc5a241f5039d9b14f1e1bdde3431f26f20c1952274d107a605a062f076c91546c6e144d1d12426df34a248c9550dc8f30128fc5ab70a875e740718c766d4e19246a05ea020d86984e60ca3f940e152bf666e8d6a943aea6907b597e841760bed928e6fd843bce39320f8c5c5f0c21839878be9a3c752ddd447e0bb6df08a420095a4a54d144f0438426dea8bb203e150970a840b84a409479057323a520331a4537bfde661d479d4442c47456139453956e4eec064c4138fe2fc76e2745d0945431a111c93f31d12374061a473db3945f44a221024d00000000000000000c000000febbd916ebc245056dad735eed501644adc1d1528a8c6d17cea6d939cd37946652a677048365fa71dbc180072d543170334bd54a3281401771ab8c6e14097226c823cb0a31a3c57ec040fa55037e4d03b38fa10cb5afbd32041a686d1256a330fe84eb77bc50672cee1429364a6e7f4bd29409328d9345476901b4747496a60efd8a9f09118f71712a74ba7ad6ad6040ccc0724c85a2f679c4d42278e6fdea18514b5557392f631f99757a7c4cc66b62cbe8c4524f9c88345f4c5573c3816461445a591face6415e32707104f6156a7e953ac5230ffd5103e6c5df67b287a901f9c9c50a22e9c705258d723e2e054a61972d934727bff012b72dc116ab4da91400000000000000000c00000016c11d094ff29a1fa59bd40fa3b5ff154f867d0c8be1c72b201e2d29cf0d6e0e849374116d58db366e56bd557be9d512493ef231debfd0714f204733eef7926766b2117c7982037861047d5d4a361467eaec9b132b05a22bcc677a21952b6c7824225c43ba81c6794021627836732c3e24d0db1c14ebf64c7195a038873d6d2c00000000000000000c000000198bf7400fc07241d723746a26613f0d552c9179d07aaa111ead864f5fa2e9457cf0cb04c8300335ea82f06f2c2b5a0608e2a878e4bf765e77deaf3344a61c7300000000000000000c000000728b34329944f474ac2ac811c305393a9ee865061190560a1bd0b319e91e0211080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c00000067b51a0116344e5f5dc9a3207e35657aed18e7519026a50970514e080099c34443ea592c9359a240f6da5271408c8d4e26c7c148b2559049c520eb187e780469a230604976824515f73e167047ce673339cf9963692be843203ade5413933341217f0321bfa1be5ae87075200172d62db6ebd574ae3a483a94765c232ea82735e86d8c328a1b2d174dd22f0289645942bf28334bd98672200e44bb6ec70d4573dfa80d20246bb24e61205e4cdfff17194f348c58948fcf6805486a29d80f6339f1bc90235e64851e207b835d75c3d34d8f2bfe0d4d3db64dadc5eb317fb0c369fc131633d617473ea8234155d28d55304ad8cb25a2099326d53bc8474fa84868838bac6f14da0048216ee672eb8d6f69f00791696f7f4100abd9640dc9aa8048901c6e09460f0e3ef17453622f269e2fc959c43ca5d035317309750837d8224d2e92207c75136756dedefe100a8e3c3c7b4f84424e43770c19455a7021a41652863c5932f55f1351d816656b1ae34301ce35646f97d62e53a9788c61c281432f504145336ae7505c99e80b2406818d6b36c4891c7a2c2b0b462b4f0fb5b3c1682acd7470bca5c223991eee305530125a3c4b7d2824e5fb6c59d1e9280a6bf81861375f216e398a4d85efbf1435c8287a9d6b5e4c4fd8453f4edf13466f0c024862f2d119ab12ea2eb031f66d6a7ed636ae2ad218c28e3671cfe54207d73fb41408000000000000000c00000024a4dc5bd581c91d78d34f01239fc54bbff4f04c247eae08abfc6c5940eff121a28d9c654c28601e1ec8eb38f95a2c0be44e353e5605b473baa7371fe40b09264730cf71163cfc329e8d6872c6b9731d04cb072dd25ef630651ab139914e990861fb936dcfc4dc499586fe2687ded02876339f4ba1c6434c752d966ab57fd05ae0e4634e53af647705581147e467d5716c953669ec740603a422290a98e5d95b47300e2118e5df70c9ef335d50786b315b1f8054e585a908aeee4d314c37b624d934e8490e00c00de797c65c585b3741c4a72e402d2bcc3bb113096aa1f12270f30fb20472f22641dfa3c76b79e3ca0543dc7f367f4ba50c2ede8e4bdd63d57704000000000000000c000000c115810eb97a9062ec27ee3cee5e4643b26ff11b5112bd20a690a334190bee36741a2400f9803608b0223d16c29c0a681fcb062669eb347a1e59216317c7ea563ff4c33f26ecc645e1b14339d7a59009399d015ea78a9477ca385f0f98569d3c5c1e0002e6dd44248c28646fa48ad01359c467304c768d67d32ef043ae2bb87c02000000000000000c0000009d56201a09e5b00682388a7a58bcb85eba95271be133622c7da4587986a4681ff4626631e8875551c892682ed2b3cf119157341661be9e56a80d3156b5b79a6401000000000000000c00000034aa3d05da09452f86b7655b5e8d6930aa8a5b1ae06667147245511ac0babb00", + "proposal_public": "20c22b58a0312427d9b38f1901f53e5fb793c6037be2ba3db0e02823b8db0c79eb49ef516b6659781020b47e1641d412f065b946", + "proposal_secret": "4ee5e6c7e65382397ae1e9025037aa5dbc10d56b0d351aa348a5981be706e188eb49ef516b6659781020b47e1641d412f065b94600000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c0000002f17405b7c694034b73858799ccf596bb37c2127494f6f520d89561354fbf30b4dd3cb544950df63a10133466d026d06fc82af2b98d5ac3479dd4109d1f74b7e00000000000000000c000000d19906130140100ced4b0e5066067250a51c5f618a342b0b5a00c21e8a793448b8b05211643ec332850fa34ab619b303571a967210b42a25fef5ee5faff3893300000000000000000c000000736724267f20af3f9587055a026c8b0d3ffa297a2484d9702dc1690e8ccb57041091615a0a3ea25c49f6e663f14b9006641ade1166632443b2b3ed0a83002a1200000000000000000c00000089104a493a4ec15a888d24093e9fc4615691510e047ea01e53676d6466c64e1f1783144257388d1ba1a1927a615861550697466653f75e5811ebed7d97845c0500000000000000000c00000020c22b58a0312427d9b38f1901f53e5fb793c6037be2ba3db0e02823b8db0c79240db40f65b18a44a70dc761f1f13f635a3bdd2eb7acc033d260751e1b316d48080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c0000008d13f845b74d5b4776db69077623ad5f3132714184239d6e07ad527bc50d9711c694c834d1f48b3ec67cf67ab70aef12d4b58a521feacc051770b63b3050466714bbf93cef25b2777b72170e3248b329f254517c9575765091deaa27dcc313347c55ef7dd27c11513d557c2e8ebd0d398bdd226f5e60ea6b3dc1d75b0fccfc5de6d04d40dc726361d9898b5b668c3239f5fb0668c75099453ec8915051031763669b430b03bf483f1390080295e8cc5572bbda0b8b11da5cc77f6368f3421653c465c23b9326636db632095bc1a7fe07939fed02365595076eb45b1ab3e2ce0226a35b1222a9d17ab1b30271f5855f5b1350f46641e82f79c4fb1c25dc3bca2ef4147d5155c2f62126f5d00e6864314e2e8d976c1a178c4e6eaf6c58be0d4b3f77e1ca3d0a99f011b233db2d0a129d2c5e45074136f9a5669c0df169e214e97cda97ef3dba5d472e4ec93e4d47ab8d759182f84eb61fdb6186d51a7849f002715546ab7e78b4e62dff990d3c9df52339e53c2d485b46c333ecd58329fbe2bb1ce33b2f607987061eeb93b35466b1a90b4e1fe93cdd63d379843ef24778b21c517b2e97552259ec443da45212a102370a1a922854499ccb08d611145534774f40ebdaa43a4dbb7504487e6c0af15a1618a3e487215e26821a978e3425c426f82f6a36137011726613e5a40959edd15d3712123b089982bc3c76b413701235ce6e00000000000000000c000000ebe67f4ead315c46d0022e43e339dd3c950fa764b157cb3c1cac1f1513b4aa1135e7705486342d587921fc6aacc6170c889d997204825b1080ca4915909ee157a711a528fc0fba7e240fa0277170a54ab0fa48212fbed07258f8fe12a8203d60c6f2a91801ab852a5c1cbc009a55894ffd0ada161143d5738d64a968e709575a7cda683f4811eb055d3c7440c77a2d22abd9f4151e462921f4d5b9129d3a0e50bfe5e161215626782eb9b6650683ec2d03d61521e371d514b992ef5fd33afd09d14c0e770c3b170c5703da654e1a54047e263310748727595e53cf76c8fc033af1881d004c215120e8d83216b59d857553488a2e712d09091bf3dc64ad93151200000000000000000c000000669535066f59961d1dea5b1dc11e046bd621793379f4ec43cd001072b4b9a43cc01cbf73e99aca6811d7a10d0bba2e26d50eb3502b8bcf57248f8d5ef51d9d403f0afb2cc915730bcdc0023f4ea1ae44c40352443ded290ef7879078eea25f7ef95999669936d643029b3b66c15f827155c6f9595f1f212f33f5b7599016234200000000000000000c000000b515d645787051268a4f0c1298aab53658589014fab8dd2cda1c382a4384c013ee64a62799056f482ca18f586d02ea4f449ed0631356964a9f9e50769f1c160c00000000000000000c0000002f17405b7c694034b73858799ccf596bb37c2127494f6f520d89561354fbf30b080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000ee840a1a9073a85b5246b603d256186233d9f42e5f784d7861adfd02d36b9d5c1bda917a912d843f40bb14546dba6f3d6a9f254898d9986ec4600f12027c57347bf82f504b0e3f34d92f8e4db450d91ea3fcfa1ffc785337fc62773060395747d4249d50d605715287042e5a3e6d757221123e167c2d4674df787e69503c2e5e9c83dd5fe9ba074ef7f336216f64094fde95a3766d216c70eec0d2500f38fa193312de2e7ee99d3b8f7ab36647b58301d252ab1aaf9b52073e65e8355c38f25c63d4bd59307fa64ee94d2a5f7d814325e8d213089b4a01526a3c535c879248674a963d26ae44ac01a6eb74781c27412fae826c72a5539f4bdb78ca4ce347e16af991a56eb00ee04a977b1254d682ff0f8bfec12ef8c20c4c96c5bd2fc4837e5518734855c6a842528d5e543c8751cb3d9ede6460e532866d573d8064cad9e9322b90c43b9804b768b3aae60842176a2e33200d6e5df19266033edb240e2d7d5f14a2bb43cca25c38a7581f491e9d92760d895540e380840576c98c0283b146065280f2004122e52eed9da7630ee3c942b6b12e2701dbfc2742538e4540b31345fad8e4660a55b02d3d41ef0d688a4c3241e23c2f40d1011a83dd7c77ddb06111a0111f49b330187d27b43a3b489fff2911d96232cb44ac6ce9143f506683586a509b97425a289411d9db573c9e872b3fa8e5ac707a9dea65509a245473b9464808000000000000000c000000dbf1c848d44f1f6982784f69dadb3d5036f1730467f592453c45447a01163849b971741b760dbd363724ad2c1db79d2aa1240164a50ce3790c08af74a5bd7a0c1f7b0677a648cf340c22e25cf609d57424c4a85e709068130aadf2633469735c2b66a33bb8a06d7a244de2327be0d651e3c25507d72fa864c12db33d7084513b31ff27554cfe0740e7e2314c363da03162abda38c36f6c421aa527199e7a0e516aa4543ed1172917227411422f88da2b01484e563303665fbb11c413285c2d6e2b7bd36ecdf066396573c94ff6a73c454de5bd09bc477d5f867691538684bf4d3430b43db0f6332877f30710e8756e73079dcc54862c901cc8d10e189df3122404000000000000000c000000581a51049708e025664ad633e8878011930092608a2a0b21210f6903fd283946e0c32148e4243f2fdfc72e3de84c1e0c91ded270a15b906bc8559f32b601de39ea159f4b6b6935406ccd19159bed8a6f47894413baaed05454220c6c930912677f78e86da4ef09604bb67411a85bbe03deeda26e18ad5e5e8b1077558798923502000000000000000c000000225ca768a51641263022ae1f721d5d223fe3762717f9521c90cc0f3ce54bf15b5f32fd23be311766e4a04109f3357642337dd90459fbea584aefda4300134d6701000000000000000c0000004dd3cb544950df63a10133466d026d06fc82af2b98d5ac3479dd4109d1f74b7e" } \ No newline at end of file diff --git a/packages/testing/src/consensus_testing/test_keys/test_scheme/11.json b/packages/testing/src/consensus_testing/test_keys/test_scheme/11.json index a829419e..1e369cd9 100644 --- a/packages/testing/src/consensus_testing/test_keys/test_scheme/11.json +++ b/packages/testing/src/consensus_testing/test_keys/test_scheme/11.json @@ -1,4 +1,6 @@ { - "public": "6a315b309f16363810d2292b0acd5025e6193634a747ee6131145429e4babf61170c724bdc49d60b5402f12eb700d94246a4c039", - "secret": "262aed69cd62872e440534527146a7350e0d7ab3ccd73a93c8cd60e220db5d43170c724bdc49d60b5402f12eb700d94246a4c03900000000000000007000000000000000580000000000000000000000fc0200004007000008000000000000000400000000000000140000001400000020010000ac010000f80100004402000000000000000000000c0000004d8733772f24a457687b861abe57373b4716a3275072cd2ea2c2fd79d936b64a8d124734d1153f4814a37c20979f0c38d8fa657c8c3d805e4908d7374ed8a837de011e4978b9743ef2e5041fb1b43b3a1fbf9e3afc6805611f0b91192879a122e3aa9562e5960a448959c7583d60096b1cbc8c1f20174e50c89a100c93b77c07d12d0f575b958f3ef09346671d65db2dd68eb51775e8ab1fb7fe9e05b6386f685d806846ba669e61356fb944dba73319f9d3826e958b7a549f42867631d1bd1b0f543320d507203da06dd229359547080810d450910f165ebbda25775c58114e70c6fc7d896d83291cb6fe431feb484c6d31322240cbf228a9201b7eb2080c5b00000000000000000c0000005989b009e817375be022b61d25671f223b92c749cd0cfe3813d7617c6d93216a1717b641cee584362b958e73feadce445df64d612c0cf826d447a50ef297df3c4268d075d02a686611b0a158973a450590ddf653a71af6496e8675506472af54fe5266367016973af1d14d7414373943dc5aed6d3d13a95851866962409bd12200000000000000000c000000afe62e5c9ae38e52305b1961099a1761e7486e1e6a2fd41f89a58e320c433d784725b644eaaf1d3e1776c102da6c543f12d92b3e5d170629282eeb11e2dae12500000000000000000c0000005e05d6448b1c6579b20f67710c41bc7ed71b5f13376005409258b96ee5098c0be44e7a6713609869ca7e192a9a536414fe425e6e34984a3d4651b0027d39ed7100000000000000000c0000006a315b309f16363810d2292b0acd5025e6193634a747ee6131145429e4babf6169a4bc565203e96f940bc228113e8026a9b6ab66523d103935bc20083a0eb15c080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c00000099b4c722ab96f37e900dd0255f2d105764c8262f78899565cee27c24090fc86f299e8362f599b6351c73fc07a016cc4ea1c4a67401fb292e34893562acc22e634e1fe147171ddf281266de65b4bfe11da2f7437b8a48f5348580aa672a0f0c2311968103fa5cb6588d5adb4f1a76b740c08eb64430aa2f359382e11633a8c637271f546c68da9026020682258cbfac1fb04b530b488cbe215a360f72a9e2ca35c3402007f809f0648716e96b1ff25954a8a95129dda02e599b75e2000a32217d2c4bc70db7346561631fc01f50c3f4792957d0214aa7bd17251d31045916cf73da071309dc84c76c72505751549dd603ed3513303aaffb5d625f7b4a05793b3e6ecd5e18ee2d2450f16ba33677d7067ce3ef0b48e49576385926253ea7c1b50dd92d981bc4dd1b2fc64f5d0ea27ca858233c3c67aaace500ae23ff170c8c6c6c14c29c0eacc7e62c59fd04605639b512443bc7252f4f15200bd9b84017da6358f2ef7b5d49543c6c1637bc3f6bfd001e13f8d657653b6807579c1267a33df260af10640996939262054f5c2c5161d332853b38089cacc139dbaafa085e091a222250df33287356548305117929f9073603778e7ea296cf6e1f46f4019405423b24132c1ee518821788c53d50830196252528584c2797722985259106299f6b38ec2e111a0cb3422500c8a00bab24f542772a707ee8cfd8066efdb924af6e174d00000000000000000c000000af1864247effac0fd559e2050a21c84f15531e59dcf13a07b4b950109506865625d05a771645492128ab1e17a15f636f7344ce4f52cfcc60cf16da75a2c64234efb7e371271f427e29c36340c58a2357359aab36e5780f7a6f1ef618000674349520bd0a5ae7da7978eeb27ea0afc10b4407f04f3bb0797265f5781d7190614ff45ec00ed76a045f1b8e69162bec1f04c2b6b838855667200ef3bb5dd4d69c20faf63b210832f908847a2e6e418fcd78ab3f360ae216d01bcf715d30b6971310a656f175b3322720999ffa024606c4316c87ca4b5904a64bf8436a1228ddb045b37aa2075d6ab336a1f1a1413d1ca07609a2df6db5bf84116221fc7993edbe5600000000000000000c00000024003b299d4bc4579ceac702751d661faae43152f434db6557b159266e0d763e59c1cb4d038704597e8707090b251b2a268f8b132916a413114d0025557fde28921e1d335094e906f6e7ed2dfa255e731c8257373f9ec42edf5e3a2b3647f80817be583a3aaa4d0186173c0d3bba3306f61817308d519004b1915a43772eac4400000000000000000c00000026388d62260a15003c0a205cc9e81a76b4fbb005e32292774bb6a01ebedb221a1f14866a1d4d1272f9a06b0cade6cc07534c1e1f02e6c0287eb5075b996e1c4300000000000000000c0000004d8733772f24a457687b861abe57373b4716a3275072cd2ea2c2fd79d936b64a080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000f0b8b232f02891530ba9ab3adcec5c6ba8fe7f4705fd8a1b0fc8c8146760fb31d123515b2c548c52db863b58c9cdf918a53f6d03c1960e32ac0e512e9aa7e31e539f1028b125f45207cbe76b6c4e15275e508e30e2af863f7c63b7208fc29562d4bbe4277c73655591e9271508ec327c1431ab152491006227ab20778e19b95deead00216bcb2e52362d640ea8d7d7299a3b1267eabb427e21cca23bfcd4c913514a1939997a0a295f13310e42ba8248b9a08c6d3f19873295bf072592359b5136e14b654a8b8d1a5869976c72741b7a4af4b4202425ae41643ad44fb5d5ed284dc358121969e842ef95c2626d54e04ee5e0d224f28cbc63674da34fd851373b8693bb56840d3533dea72a2ba2885c54350e671418f05479bb5ce1723a73d90cf022b627ea429279b002e50a73c66d5fe80e3559b1e0446551f62417bb489615fcffc71bb6293a4a89b30d77098f4e5aedd80a3c9559524e46751225edf28f5dd0889843b027c045d54cc64b30b5326913d3f22a852c7b27cc968f60b68c8e5de35f3b497d4e5542c5be98422a0e113916203e124f28ce44d23da46c9f148244634ec47d8998d95cb97b95441b64617064cb2530a95ac57e22bb964433ff324724c9c56ca928a2342327a16ce360e13979bf26667ba27e5115d1a3131cd627649553110126b1817da6156578b8809345c9e3c8005aacaa09fa6db861353e315a08000000000000000c000000af897637a9da030d8b3208512d055a1b0258e3702b2ff36da2c3de6916a74547dfdb9f3b5444353adf9fea231ad98602c25b6620c348a25f6d4eef41697d3a45a65d2f39c5f1d62d112c0146cfb6046e58508b1bd19cb966709c3e26d786d03a5d58c248c3bf4629646d0f034be3d905306ae02c48888f68be44f9683b0cce6d5abd4d6c38d32a37c8f9bc6e9a9bf33ce6a4445b4e7d566226b89646f2213d536313c147b856387015440e1266e3b16db3ebc3162e91d779a5750d341f962e5b50f8f17873404a59e109034f3f0db342ebf7482441f2ad6aeb1fde3cded447243dcf07705c28687c1c43a121fd28581e42fa107e4d5c7b021e992d1a2dfb1b1f04000000000000000c0000001bd23527badfc553df33347bf5e7ff484f52983eb404304fc791247031b0574e65a3ed3c5705df34e4bc6f103bb2e87a43d8446183b17c350ddfbd26fe73b3677311145bcbade035bb3dc26b43e7792c6091e350a1570e49c05b1279188d7629371d38545d099f5eecda4c4c51756504425d2910cb820926d7c79b0e47a2d73c02000000000000000c00000086055b007ed0f37999f69b52a8fa8d3d9ed5d12ae96703723aead3072b93810f995c6163b7875919abcfff3f1adab453e902e75f43e87213df16e54994848b5401000000000000000c0000008d124734d1153f4814a37c20979f0c38d8fa657c8c3d805e4908d7374ed8a837" + "attestation_public": "6896ce362c90600b0ccabd6c03065822c8518237c4eb156140a5752158175c0c2d3b575bc6c989607c80c43f90ccb76c34a00f23", + "attestation_secret": "4a1103e4c738b9212f93a99c71e142e9a3ac6e1a53a0d07a0d5e11acb2e246cf2d3b575bc6c989607c80c43f90ccb76c34a00f2300000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000f7e0005b0facf22ddda8073017a8591431b8c857b74809735007f11413a3f37331b1175e3edc7e2e09aa197a453a344e808ede1dcdfa9b26992cfe4bd82af21e00000000000000000c000000cc03382a322dcb0206b99642714aea13acdf7c1eb73e780e0b061e76a4c7ce1cb1811103df8d9c015311d25f00677b4a42e73f44afeb71208ae7943e8d00b00200000000000000000c0000006ea2760fcdd576100417e573a153b877c0092e210442047953260016545d6b53009cbd5947150247c07f8d1e153e3f1d02f9d72399c805530e19e50f0f90eb2900000000000000000c0000008f4d66016fb9763d573625169d3c0e0db9b4551e6615661fd35337780333e85971a70957ae148631a42a616714e9df040dd979225b24f646df68ec4c101b7a0600000000000000000c0000006896ce362c90600b0ccabd6c03065822c8518237c4eb156140a5752158175c0c1ae847298a67c61f1e461f7bfce59f3a8c4a592b4d26700098aa93785cea0329080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c0000007ef63806df39180f814cdb50ddce3f2fd540200a871a736025b6d932e2f41a55084f5426a7d95f433fc22806ff1b9070e6c34c140409ee0af5e49c5c8c3dfa6604b98b78154c1c2c028b464320053866cf7be7015cc87960926d5c101fbb6b4bb9cd5c1bb50ecd45655a504e87fa3b4fac64525ce5bcd8340aa4ed25fcf5a84ff16ea639302d857d46d3ef3538d69d364510820dce70bd1e906767007f4e445ecb5a330badd4ec5d541c7316e0a11c482d1ce52dbadef8059a53d83c7d80ee516d301e6ab904ba410d836f513aa48f4cdf743c4fdd660257a82c8765f406ee373b941641bbdd8303fff934234f2d98320c237c078bd4ec79f9dbf163c855301dbec7bb79bacda0072f48ce54e465857099ebd92120ebd45267e2642bbf7be34fe225f53953493b36943e33530919016c5e5caf72c94c127062ccd1219de22767f246a01f3c1846249508982efa9edb3ef488094bf24ceb0585d6e94f2073f268819013039ee82b69e189a935604f560ceb4db239baf35a792e5fbe6593c6b119a56d5e47788fb8733d51d67634e9bf4a2e9b692157a5825e2b16a7292bd16600c36c2f54951e0013654b313bc3feab22eeb6ed2c1a04c93ce51e74344fc6912f9ed7a543b6c7031adc3e5160990dac3d636db6400ddae316148b290b355b7a0930ed2a5a273df85cfc95e45a9d8cd52465f7c85e7afb2b7cea14bc51486f974500000000000000000c000000e208687a8d7a4c47445ddc162476e414c960ff745c6f7f01adcc9a5d98f4f6784b5ac65c498d20588320af04ff9f5b14c9cc985e78112d497651bc5bf3a1146f44da5707867a270459a4bd1a8699a636762a040916d190670afc0e230c3ada2bffd3c113070e030fa91e3547c7aabc7129d4f86348d1db7c34df177b0713a574198cd271cf5aeb420a300766ef0855324a2ca5565dad3d2973a79d65da606344c9e4997cecbc7a457492fd7caae5261869c20946b7aac96ce4c5ca4d670eff0247e75a4f5d074a320e398a4e6382d75b5c107030f5022849d9ef427b1e3b2e27c446f7240c8b9e31138bbb738e1b9b0dd4a914798233d638eafe0c6a4283037600000000000000000c000000eb1b6e3bcd09b2548a86e27ebb2d3e3bae2efe06ea13a56045bae15ac23eda770229d9183400172ca32a0724c1a8102f3d917c6266369c08dab19e14ddf29621d7e25474b1b51e057f96f97e442cad692af0e466af1d0a14e6266b65e3046f3155db9c575c48db5865cfa40c25be312816ab142e3c543a75898de5204e3a2a0f00000000000000000c0000007d11ae67a9eecc65d6b56e722b82d92b49a2dc16abad1b2a6321ec7cea091449df419f3cc732765cedba8d7378b0c404b6007a2812c54065f2ee9a5f1487772f00000000000000000c000000f7e0005b0facf22ddda8073017a8591431b8c857b74809735007f11413a3f373080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000acb83f69c753a15e6864617c437a4743106ee26492e2dc62892d032a418c9a7940beb8245263596047cf38255babc83d80537452bd1bac70931caa2f6138de6cd201d66e07291f247361ce3a1afce84bdb861a0cdd41d3759fc5ec46fff02144196a1a6dfc82eb65819f983963158a45e0641b246d59aa4ac4fbce088dde92130991dd49fc499607d8aa800dba8ec004998dc750d7022608508a495d989635335e856801b829846ead99d51fbd3e75691edce83b547a8e6b9cc6a875bb1ad97147a7ed65977aab3d9aca40666b254f3e9f9f4a31d8b922504e876e27d8f61f07f19ff41c6e98a8636e0ea1692515f40bc805d87c204b4d2868277f67489e373fdd99d42e5a7973674ee58d3b54e89622ef15367ece95e6571db17219f3b0035a3f04bc35db09387937a3d0708788a066b206f93af6d0564934fb286aa8052b3e4ae7e511b1b7cc39e56feb36fc8775237d133f06e80c8572b5ae42007bb39655f66f446856a09202f22f0f4f3f5aca7e90815959419fde520e107178a181e25f9d79a64cc11e465d714dd7489fabea06f5095e19568512060b6bd15ecf1b8629c895ad2b12d5ce0573040b1f9ab60246ee598705d3ca9e461589e94f67fb83405a010c2edb286d1c2c947b004b434b11ff13a439db65365c93c49b7af5489a12eb90604875f30f45c2237d5c1f83e139f15d3409c434f00e958c26496a7c3d3008000000000000000c0000006142b348e7e5de0e28ceb621a042eb669fc60c38327d7262c795905c6284d077333bf40189a00245f288d06cdfdeb646d51c95739c3eed020f4bcd1d0a400151ecaef0740498ce58b865995dcae74b0165a8fe3a14a17e57d3bcc11ceb33251e2b314637549a144e9e4dab77b4f1907cd50cb74696e00d4f07c2f246a3267f6ea1a28458113b136f38ff1036e18efb698e02667a3f11a3238bb3c840d19d803f56cb15013a58c13c77c14b7285afb90fc63c912e64594c062f590f02b09189256e71e30f08b86133e7901f4eba971a5882fa625f5460f03406b2db55d986f827289ece2d5bf81c74cc90012d58587e60dd9fb92df2cef5095ff60e3263b3b57404000000000000000c000000b5da5e106977242d32960b51de17d83873d2614dcabcbb053b653350ecfedd711ea122028f59674df2ae382d8011ee12dac7b44be9500729e3ad9c2fb803ff119a01b0103235e21aa83b9f47a1593966c4689e6a9d943159a2e20816c237625b6ee9de0625556911abe2754bb25b9043cbdd47221c082c72f3eda016b87f9c5c02000000000000000c00000023714133bbb8aa0ab3e9f35b05a51328120c8645482c217167d8be00ad9eb631354bd14df0414815a886501c43c43b24ff39e46fc007547b4e38f3078313300a01000000000000000c00000031b1175e3edc7e2e09aa197a453a344e808ede1dcdfa9b26992cfe4bd82af21e", + "proposal_public": "5e628465d9a677545dc20a69358075097101ba12ee404812481eaf414360647288a33a5495833f74b8cf2022ae422544c3915140", + "proposal_secret": "3514b997d3d65c012fd1a3235c19a361355dc5b55bfdd2e4e867878bfba8b59e88a33a5495833f74b8cf2022ae422544c391514000000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000ba33ff309639e55d9c356f5ab48a0f5e0c4c544049332f2ebca4de0d658541661229557eb8324e0ce21ca97a64f2174ad9d1e54435385b4f40174749fcf0046000000000000000000c0000001df6c865415c5055de00472ec0c7ac2909b0f8062add55212e520630a483021cac4821232150a26fc08f1a232d677768fdf49b123992124d58cf7c3e8ce4a33b00000000000000000c00000010cfa97ab58e3937882d3b3184675149f83a845cd67b520bc58883692538653092960146b90c865b505950389b2995450a42ee765b05860066ba9a528af4c85500000000000000000c000000c7b6920116e1595a03f3a81280516b07b9fdd13622dd7129651f5e4e32e5ee183a52a415cb08a040d1a6d52bbf134f4561fc5121d50d47387115ce46cc12592a00000000000000000c0000005e628465d9a677545dc20a69358075097101ba12ee404812481eaf4143606472c71ae86149d5a468d6981f14361b5e64e970f47dbd06e267744c2b3455ad7e28080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000f38b8533bb912e11e3c7fb4f8d57ce079b26913e8f0dfb6e22baad69c1266936f082b5252077915b641bdc73f3d9113386599c61db53c4214b86fa57a210955d44ce8d7c0f82a15c99c4d6405f0d860c18311c65d322172824d8631e97e12a47c13791597d0ca74adf10f95740057207b9130e6c31629435b6516b18ce08c642fdb812678eff9304f0b2ee15e3817208a5d728413e462a687cc7c04551398a403011c065646fb25ba5ec697195efb650d89b955a55b4de4d813fe02591129f1dcb53523f56018c32eceb506af184354e0ec7eb186845f726a5026f0dbbc0af7145bc780e1653b43381a1eb77156fd74d6b74c872db68d55fd40f6856ce7e300736510c30c9dfe94d2e57452aa1c4f02371067d7aee72e97025d59e727a45524af8b745626a62d17cffb3362446f35b649f10ba3c5f074600918d923a4541eb26e25d937d10ab030c8919d21fdc96c039a536935e26fd2960d165ed1e0b9bb03098b9ca4881365061c35cee3142da863da7d72d5f0e23956f16d0af619d39ac73cbfebe4699142c4cf7486137f51e883a4376583fcc313e0b472bf6267a8ddf40b8893c7e4181921e3a47a62cf41d6d0f04cdea4201d3587bd1820438c5be8b2475141274e731191c55f8ed7bf73fa46e2256c360379fb56d67efb722b178f84e3913fc5d5199b2400b606e501a9c7209af4a3f352172636bd4fd5d72cabf5c2d00000000000000000c000000c2dc93165a212d2fce73743a6faeae2601cf292e471d61129b74315314acd508fc57a563e15281498d524b208bae4604ed6ac92c07034a1409437b2926a3452ba4545e34b302b173a1017e13c43740376fea0069d6c1cf1c7ada4c3a7ad3fc473756c371f5987e54898373029bf7c172c0e45700db39b7423315c663c88d23741be2e56300c07601b5d8924746362c74c6263b339a09841c7fd37135823bce7c8a96ce17a74197100050890dd19edd52947fb119737d4a7bce9d714d00bdb150853a1b1a3fe5e205f5e3395dda9508450806fd56aae89912ea82555bc26a785b5d585d3cd8f4ec75ff7f262fd732502deea6e371811f6d2b71e4bb5b4622762900000000000000000c000000fb16a0412ce466355cdeb920ba066927946ad031bf0dc31a5d56f226de545e0272dcda3de01a6217d194415c4026ce38cc93130f8834487ef30455671540f20868d7f60bc286807bb034305a557db36e8bd30e369100ef22ccdfe241874a2626f7f0862c73e0f261d78fcf5399cdda02bad62d41727ff640ab89c3684c496b6500000000000000000c000000832e73629428d3461361a27b97dccd6c1bf02c6042832667503eee6071e5577cb7b1b14efefbb35bca6c485af7a5d55e0fbdd57ed132b136a9b15f75b68c9c2400000000000000000c000000ba33ff309639e55d9c356f5ab48a0f5e0c4c544049332f2ebca4de0d65854166080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c00000066bfa771397a6452744e4b5eca9771620dd62f7e6188022386b396718ee8191e1bbc474fd5018464f3142510dc2061478c0b910bd20fb3701ae0e72b9e03931e2ed08b29f48dd2239569a90cf5c4c345ee682636d6320f0e3d26182f8b541521a10fcc7ad6144a6f10e33a612adee17839c80c6a339a936c06318d7bb19143256da6c966f597a0035e162440f582397a9d5d6d1cea8d0c7b912efd13868b757da1728157f40d7255b550991d8718241fcbbbd0199599be1a09f3d406600c190f31f00517f112c00a5a35dc3b6d663505fcc762555b178641809d465d6690650fb0fa6c266431704f7e024c39e84b6a055a646279a890110c49a90a594c90ab6ce83b3362c648a5247e9f1700f8569913b6b4702a9aef2c71998a353fdeff101eca5ce22ccbccc21639169f48d20cbe0fddece6191546f46fdf57a5583bb17872a5c7c26c127a633dd12b603a5258194b2b4f0906a63a0a6539429b315805471f827aba043d28252956e2730bafc1bf60e6f4dd53b9bc03699d11a34594952714fac8904df66d8432c483d1571a6f5d677e063d38195b160f0f9849210622ae3bffbc5936d25b9807bf0ac91cf3359f50c8c87262eca6432075f5f73baa6f161028146c2dea768970928eae277c45235a6c3f3413759ca85d31f5b84780c9924a55f2380a8668946fd0fc2a15d3898c034289c70f91644315ee5b025be09f737208000000000000000c00000017bcd0033883d56c87f4ca45f8ca1e6c2a6a3a37fd96d9053f0be816a0bc7736252d990abe23524cc5618d61b59b362c4d8db5538de50a5e08b65971b9b64f1d43556577778a8d41e7c4df3431b9c23bb6f36b0b7eaf5478d2c4196f08fdbf3ea44d745485cea97ccc317205eb7bf52174a10a07f3e59b6247b338553f448f7d6cca53521e7f390005e08d44cf20d25fa40d842239ba4f14e73a2643ce317457e24e721fd0de675df9e5f95a98743535a3f8b628ed4a461fe50fac3c78600b0bfaac6460ea81d32f66de32497924536daca14a4ae0302b18997e386b14ff7f5f6d12da1b3035db4e941bc436076f5d1ddc65813066ff9c291466447694ccab6b04000000000000000c00000059581055eb86495592003b7b24d3b41429ce0750d2db2f7ef3304f235a0b8c30d66ea95e7f0643795166c05bb95add5b43403b156d5b7f3e48129240495cf5349cdfd10b1655ed78df1f0145a0eed47905f4aa49d453925abd86e321f83ec752330e7b2981bf2c28a3ae907a541eee273d79740919a36e17188a4f2af4ccab7e02000000000000000c000000fbcda21f3b661f71b793f0231b689b4a038d481174d00f4e7817db3262b75d69ff654e35315273453647d5000b5348670c9d7d2cbf91dc77d0e8ac0594ba1d6701000000000000000c0000001229557eb8324e0ce21ca97a64f2174ad9d1e54435385b4f40174749fcf00460" } \ No newline at end of file diff --git a/packages/testing/src/consensus_testing/test_keys/test_scheme/2.json b/packages/testing/src/consensus_testing/test_keys/test_scheme/2.json index d3cd5a40..7e0e66b1 100644 --- a/packages/testing/src/consensus_testing/test_keys/test_scheme/2.json +++ b/packages/testing/src/consensus_testing/test_keys/test_scheme/2.json @@ -1,4 +1,6 @@ { - "public": "dbf06f483dfc472143586e104b12c234811e5f00d6f9f843fb6b4b0bcf4a220b735e4e057d1ed57266808f40d40edf3cf37bde52", - "secret": "98d5887740a790cbcc6ae6cfdc34feb128c0beb881de83b58c8a265a8b2ae6a2735e4e057d1ed57266808f40d40edf3cf37bde5200000000000000007000000000000000580000000000000000000000fc0200004007000008000000000000000400000000000000140000001400000020010000ac010000f80100004402000000000000000000000c000000c84d26425041445a1a1e462829412e22deaa5b36e3b2c56349838976f52def2c97786763d715e658fa9d7a6e7d0d0f303211cd09985ee50810f40167fe3a3a7587e3cb4cd0798812ed12e90cd6714815f31ad405e189636317a7ce12103a133ea64d0c37af1e1f4e0a7c903b7bb286540d3b924460b8ca1bdc7a243502a9e97b6daa3529605dc231a54fb03dd63de023b78886105acb1d3b3ed80f4ec8ce1d534cd81b319759ab565a8d6e6debee832dbf5cda015bddfe4ada8a8a2796e70c3fd82ac04bd8f9ff743241a002afbad81c2fbcab6d2882cf745e87af70ffcc02451ddfaa398f9eaa79e121890326bfe634367d4e329f23962a96cf1d5cb328202b00000000000000000c00000034a2b160cc5f5f5a4eb98213dffe006f4a4e9c73f8f8ac2081a9727b4406e20073acb06bc5be3076a8cf9a42e6f7da1915fbfc6224c00a59fb212f29fe3b1a4bcef33f510c8ca544f1a73741482f3e0544b5986e89c79c431515fa6606badf2c7a981a751402b13b4677661fbd36fc670d97c84ccf9dd636d253c355c252de6700000000000000000c000000acf47b2d0d57192a6fe25e04d5a0ea4c2b766b04e7255d72a58eb022d010ae149c146a63dd0c220096ea2a3c140c681ac28c29004fc6470c9118673f7d87b15e00000000000000000c000000a5b08d09214347596fda431d047fe2137cd6d52acc96d943868a7b7179503f3a06207c3bebe3c3434141f83f6a400d3536446e055e5f1569fbeae42b19f5ce0500000000000000000c000000dbf06f483dfc472143586e104b12c234811e5f00d6f9f843fb6b4b0bcf4a220b1e5cd25dfc481b7d3c34e24f1f23347b1034793f072ee268cf379e7ccccb9e0f080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000d51f93070ee3f665f582ec0cec87033a15445f3b42f2fb00c564ff7bb875ba75792e517e4933645abe2bdf3fa30c64385a3c7e7895673f2efa08e14a1c959535236a1c3f6012880581e5f0721bd7f74d3908343a8b794054e2d4ee17aea3c618e25a5f495c81b41a08df943e1b178d62ecddfd69e0c35e3dc35c774834a66b612409526c132f365379718339f9423d00cbd4e367080eaf70fb500c03ffe8dd081d02983e76683207baf1fe2f0ab91c72f44610741014dc64e5410c07af61b17d0bb8666c0e0f904c4c42e827850fcd5e0780aa623c08466eeb77ab4a0fc4ac37c9bcbe7528f53b6354738b3b4ee04f54694adb6b0c109268f6fba86673e52c0e46224a4dc4c2ea3d16cc014e23441229ef9e3b502cf6a015814da55d54cf3779604589284adb0c682f110e5d34403040f6cfd757cf12dd0981d464525a04ba5eebc49e35ceafc70ecefffe0f3f6a9553fedfe804acff41481a3a68688fe00e2294e767001965733c4e7f9237cf04062945c2fb0bf53f103bf4afe14a34fdb16fb93cc901594ff44d72eaa92645598a351854e2522a36b015db9bbf5e96f47d264b782d5ea55f4d279d02ee11fd7bb81ae4e948773d5ab539ef82ca52cf19dc1feaabb250e19225186ec9905ff8e64b1b2ce6d65404cffd5ae4dd94526389d734084adb769d4b935794cd947c62ce851559c4be280f70c85dfad9db58b773b55100000000000000000c0000009de13779a4a5dc413a1c9d5c1932f4532a5c885cd30f9a6798ad8110a8d14318650eeb0833c0dc725c90d465e7d86d4d79b7ca0c86028c27fc243112c37ead1001e71779db66190eabdee5687f078242496c88255ff29938a0436f02022c5537261b147d6d044118b3e71c0438623c0bc78c9c7aa1672a20edae4270962c077552fbda6599d031630eb9413eca2d2e54f104291983788e3c4964982ec987cd4c96ede97ea4cf592a89a8f401250ea726d29c0f1c35848f43121c6d54372216573c129905d7dd784605d806392a016527f6f51b54fa212004badafd0784e095794ba6c6759e1ffc54dc99b244461107608682c21104be752a11c6411880f1160300000000000000000c00000037606f39a294475960111b37dde415651e61053676f7501b71817b407093a765ba6a977752d8433948913273cc22966b65e58535a7fd0325168ae0702a69cc019b77384c7a84dc67014723485e436a1a114dca5b7b2f9d3561ef816208961e0cdaf3f73f64a2194933118e193b62d3363151497501574666143a6a7e4af7492300000000000000000c000000a206ba6512ed021566059616ac96f5623bbfdc48d8aae467aa7c8d46cd3a3945a023fa7a1895463cfb487d2742479b59b914bb436fdd4c1cb8783f50721fc74700000000000000000c000000c84d26425041445a1a1e462829412e22deaa5b36e3b2c56349838976f52def2c080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000391e7437d9ba5322b9c42574181e903134dada0d499ba9684b40990d724b0c559d6a9418a955053c96a43c39fc05d512ff18d715a8b40319325e8443c555c65b6e600f3464b5b64511aac4142e210b488db5a96d396dff71f7bcac313e51c751437d910dfab0412c28ccfc63c7374b58ca396d303e8667712a8a18385d860d55070fe90bac22c85aa6937e5f8f18985d69d81426b84ae84259c8a46b80b580423f40a90f9682205040dba031b5cd473df8d3ca213f79e1668edbb96279537a42b4a01b511bffb74e0061061674bc2712478c2c158aa5fb0a6d892c7aab265b737e88750d60e69b5d3c3c966ad95a584a81fb9675dfd0592e75ddd91df7970b30e167617d3e47542a97a4912dbc2e6f2b5fa2a070a0aadf152d10121885a9195440c1ee0e8b723d57146cd2634773d176a4964205aecd5f123f228e47a5e9f979d919ca0d1b233e209846704a69f8d4676fbd873aa46ff63f6858812f55953a6242778074e674b90552bb35073041b411b3155d6189e6c870e0701f49d0b62217e3df3021d2515f31d7ee557cbaafb36ba3b4553e499dd063909a644d908baf5dcc37e26477b75f728a04de1ab49e016168eddd538afca139effbed50458f28134b0a0732b3f615103b663a13d91de019a3b9630e6772e454c5893706d33e5f6879994c44f5101867b1e17e04bd0379070cec2a3537ba4704cae9726fbd1f8c0708000000000000000c0000008670a50df5d29a44f4ce6c7d4705341c40894e13a7c4d459c161d86778b5a102b529b23bd6ec081683b643169d98c710330e902321fb7002955a7f10c5dc2d2abbf8a73e54c2db250041c95b4e777f74140fce523558d83c8efc75698693940b692f986f4c96d667612d542f86f3a0223bcca24ddb7d8a4cd7b2eb42039a4c478289706c3fa0336afea1a31cf3e9c34c7a1a9249aa6df043d8d3a14c56e30213c45ea50582d6d34d1c5c987aeb3e3b3bb7a33668408b7a2b43af6f1014099c2e446bf70fe602423add4d2a5bffd8070106f7266ab2a16025ad75c97615face509e74fd726b94393d840eac685017805071ba47076450001906a9ce44893ba11904000000000000000c000000444c740a1c6f340414e4f254030f722d0d1f56079111eb2e93baf44481e29c4a0db77c6358708624533cab651c514e0dfdbc92771435a808f37be14de439281ead18fe3be7946568fdfe57695adb1f625b17ca5f1974e7129805681f6ef5801cf7c98d21a65cb954a0079e0391202d30bd8dba75b9adb45578d27d5be5bd880c02000000000000000c0000000d6c2b6e81d2a85a19ee5312a26e83756b19de2930dfb976d4933b778920e43d26748c4fda13e400285bd61b45e8ea68ac54892fe501cb5b8d9b7913c73c2e1e01000000000000000c00000097786763d715e658fa9d7a6e7d0d0f303211cd09985ee50810f40167fe3a3a75" + "attestation_public": "454d107dc0156e61baee057497d5667adb027d68f6fffb2bc61c6a38e45eed3531c9bd77e64f610044b26b1ec4047929bcfed946", + "attestation_secret": "488d6606753c22fe418f0c599c86acf3e44017875b0d079b4ef0be81f106f87c31c9bd77e64f610044b26b1ec4047929bcfed94600000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c0000003a99b56104bd494eaedd175a8501cd518f2b621e64ec5a404a008f7db5cd6a04740060545dc3c0013c192b1cec5ebd3555c9501a2d192e62b28d7158018ef67500000000000000000c000000ed066b57ba04a41bc9ba042647ce2425bf3c2b0e45f0677894332b2844519a58c51e627970d79f3c65524229cada870439de3140a3e86839e238ba22241cde0c00000000000000000c00000075251b56dccbf248e7d5a61a7ee9902f989b9f13a0a18c52cc30833b777380304108a706fd58634010a3db012844bc1fb81f62114635df64c2a2be6cca27f56300000000000000000c000000f2618223df3ef733384bca1f4edbc369df42e75ab8a7d02d39262b2de103b955fe657571e34a805364d4c26ceb19ba525bc17036dd18327c0166d83ffb78bf2900000000000000000c000000454d107dc0156e61baee057497d5667adb027d68f6fffb2bc61c6a38e45eed35fb384203f1e47930b4faa15f4a508b1c6b39980494491f31a540e51c4c2c0657080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c0000002140d90c9d08b87b806d4a41d922d03293129520d27fc74fc392012eb6f02a6a147a186666f9fe78c70cbe69f13a420fd51fde4a46565f657b24f079482d700d5c26d1282fc14e59f01f7b4e7685132e52f496319c1ee177ab474b57d8c8c55578ea3d06c06ee30961a2775f7dfa194a635e2c5599ed150c7e3cb926924d031f61515927a8aed47af16a5875697bef29b911ad5a4d1c8125665acb7d1e6c48465d72480a5fdcc83a74bfd955490d405cc33376645a2ff86cbe0d665715aea1452d8e65701a6e2a067a78eb74c84c0750a866bf6e9c93d921decca045ffa7054c71029b1dce7b89040837ba1db8b43b685b24af70c09a8a56b7eaa830a3a825595b648118e2f52b7610011455d40dd50c9af0b94c5d4c791e7efd6e2f75e5117172e0943fb51b2c606ea70830f494375dbba3c904923b803177d86a56c4ac71783995c00dc28bc96096b97107b95b125f8ed41477e7470e1e9cc8a14d85b7646c01db873ec62bda1af17a3c4b6695264af266661c84531c6f3835e70de99b1d7cfea6690f62a7ad36418c2a647a463e0dd13a0c2f6b7c08181de8ac170d131c21595f303ab504c36b0e073a0dc1ee1c6c4e8b8d0d82cc10693e9abe7d44ae3372c8b650155e830a444a3bb74d9ba2a7684fec3a1aea18c76cc45ebf6f775fc1263017fb0d7e8a523d933aa81068a7df5f6635f75165574b03f084b569fce1e61f00000000000000000c000000e997bf4aab237731a8113d29c78c5710e1db4157bcd2f52ce1a8537b3cf536049eb8bb1b52992869103a5c3f81492a752457bd40c1b7bb1f7771fa5a6628342776b042528d6e1157bde3e6100eee9d48ecb7cb3af951f810c24e26176df49358ee0a430eaa2b03608c37cc5ced67ab612c0b31237f4a03574e7ceb2d8bc8bc1cacb7df7b750810166acaba353c226b057be9e442ac43455f13fea944b4135d2f013ee164489fbd56447748304956f307d0e49668264fa27516086944ba97401153c18e501d9ea064ed8b763030911d4dbde72a6f36b03967c34051357ade3f4de6dfc03fd3f2c94e246b7e72e169d00f3499f06b64bbda72252ff86c0805f21a00000000000000000c0000004385677a5e556143d42b604e9f760d0944a2b01a2c056f521a996c315b151e2a4afcdb0d5eff3f081eb16525d323345fae8519721b783e4b360d56358f1bbc4af1c8c92df91b1b2b90a3306c371bee2190e7132f13f7a37bfb5dbe6b747d0d236cc6a3768598434e43b1f56958bd8554cd797c2f0a67387e620de4050015d83500000000000000000c00000018852544318ee44d1ee7af4408203c73c67a176ad41d586f2878714ea18edf0822e9a904a7dc79438b6750227740796541650562cd3e1510426f1a444e28323000000000000000000c0000003a99b56104bd494eaedd175a8501cd518f2b621e64ec5a404a008f7db5cd6a04080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000466a192d29106e2535a2d938afaa7c470da4167d0a8b6f43c76c553fcb01243c4618f11994f1fe0626bda52dd43b2f19401e0b1b235f946fdce9a87a5570b3071b83bd052fb5ff744464062203a2245bd8b5c354f603b27631049d13bd7c3f24f200791620066b586505a049743f7068ca096e1fb0c4ff2c9e1cec3f573bd9589f988979ee2a3047ce73940386b8af1aa3018d3243202f160be9ba06aa94af05989dd85d87de284d53769163ae7d3313cae056233b4deb727f2f542aab16e93aecb6a22f9c40b5615a34b3439c1f437bb62983786b073850bfebd147553d3f5cd72c14627173ff0bb7de1c615dd22f1eb427ef6b933b536e02b0c83a49ed705351cbc8465bb8fc164109372aee527422fbc5de00f941a8753fca075333a664153688cb2d6595392cc2582f116a9f93289882987c42998a7407f0783dd90e191b23d1d46fc4100711f3ab212ff9b2420375609b590718e426e692da7414372d4092678d5afca50f3b75c91728bb74345e6e73ab0464868f1fa9609d1c1963ca66168c1b2c2947711e6e2d6678d2078d0046e8e63cfeda4d0008c7181622610926013d0a75575e08040e83e9548ccadc2c7693fd2895c49157f682e00fd343b2384bce61072c18c70a3be78b079026d82423ccff73d623525ed3381719dc74fb53bd5bdc738979c24ccec2fc23a92d541ff13dbf2bdf54612001ae3f5f7f87e93408000000000000000c000000f2716352cf38104ecfc578381d5ecd5a87a5bb07bc42b17b15416a1985d052428e73323ce6ec03491cc97518bb26bd107641461c0526c3151ee92928193dc217c350b168005f7e683b547c0017f2ca4c64544148b57382748789b9446f0eef7c24e9b228ff1d46400acfbd5dede3cd49f60db92572671571005b4519ba47ec592ea54c65c9a7013ca24d8d107294504271146934f13e0335d815817d7acd3a6370d3001ee7271325fa01d836ee2c8b03a9f753793f54cf09a509235dc8f9f25f0bdef520d1fd48727f9d755d6cdff4735b215a256320b954ea49413f6bdd0522581b7e778410781999c44229c0e7732ad3007270ba22d96c803eae3e7d106b2d04000000000000000c000000031ac722a4a9271ae1c7257c6632fc17f4ffdd5bc7144b0b522bb76c6ddc5717eb3f372902bfec3b02dd5868ed15404186f04c770581885f0d5f756be31a5c21753789086c6e58117e66314abe565d4815f21d32b2f8333882f56849c9583b108786511c93cecb17d49a5a42a5183a3ec8a7b7236219fd36d4d9ec623a5ce85802000000000000000c000000819e4f5689975b312ffe7d51a653a364216ff640bcd7fa20a2ac792b2a5799792a24871be3a7072473fd763a1ab46f0b81e2ce2cb9a1931f1639c45085342a6e01000000000000000c000000740060545dc3c0013c192b1cec5ebd3555c9501a2d192e62b28d7158018ef675", + "proposal_public": "ac91d91a23744669bb2a5356605a161a5ae28c1e872fcf1d1e8cc63cb278447d8b889c77ea21884bbd8ecf2ad4824c66ae098a12", + "proposal_secret": "ddf3183a1f36d13458d6e8708363f9d93d857de77eb4b9dd5617ee634cf075628b889c77ea21884bbd8ecf2ad4824c66ae098a1200000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000a741e13b18883a3b675d7307cab82936cfcfab22187c8e269d20f2040b45192f85338a088b5dfa618459693669ade71999bf0d08caa84d779be1ea57684a6d0500000000000000000c0000004934ef733abd0242be3cda36a590983b5cbcef37770e7e274a1e6c50ded3581a77c506104f41fa3bdcf5a27262baf52ac67d4d2cbe113323fa27ac6d0c57c01d00000000000000000c000000d978570ec4ee117d2644ed0b4caa3e4bdff3d51dabcc15129f1dbe2a43bbed0377e7ba0c5d480d7884dae10f19b59d5bd0bfa12494a87f2ce0013a35d4b1cb5f00000000000000000c000000090e0458f9d18212ffa2a1784fa24b76d3692f0075b4fb30d5ee812e70e05b716a74013f7f11cd019a277d0a8faf95265ef9df367caf4744897398043efd3c3a00000000000000000c000000ac91d91a23744669bb2a5356605a161a5ae28c1e872fcf1d1e8cc63cb278447d9342c649622df173681518510547556b54ea4422a7f184432f1f4c2c26b10e5b080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c00000003ee9a6041ea8b1ae53c16326e9d317332410817d90a5112890d30174207a70a44c7d6400a149e5a0945402c78b5f0278405f950d783636810a70d19fe37a873f30bb31b6525d344fd65884d2b441b06db18ca3ea245ea21812ee5754f054629e9512d4ee66a101264cc823c3241fe48f995b923685b0c18d398591fd8619f6dc354243cf61bab5df6759c6989e8de4bc57cf144b8acbc016832db2559a5ce002fc778615611610d6f7c0828a032224023103570d743746688ab2978c700db7ced7ed44719c0b23d92079c23850df77441ec7a563349d672ae86aa59724ff035f97dfa5f6da94859606f46697e279a3735efe971c2cdf2795e23816cbf27ea2878a6c32184b629629709eb4826770d35e504884434bc2874be656c590d75fc7b80c29e5602be5e7499319f22dd89071245a875611335ae21053c6f3864f8e1494091db00f5075a4aca669b73590e116da05621513e24046ab02b844f2d62ff575b589f717831b856f804d47353b774726a4e9044636aa929e7f12c5dc12392024e0deb00ce985f491d07a16c922a5e18a1b1da06b1aaca753811c51fe372871fe0c37d70537f3200f85e6c04f0d32e773df558102827e53d1c940d581e3fa378727223390dab9e4bc6aff0179ebb13757a0e8a7c17108063f6d4bd2ee9a0ee745e4fc82c8dc36337cf32e26af7e9545b4fd9c81d73d8d800ce62b728455f6f7200000000000000000c00000031bc755d2e621b20fe5e7f2b6fd1f466be3b7f6b2ae146497c8e432a0f0420319f0b0805442dcb4e454512272e5693355b0b261d1a25695a08fc284efd5c1016a284ba3f6fdf21560237a642358cf36c71da2f5325bda050eb49ec345467684db913a47b49aa4c458f89bd4127b59418a3d4b64700897b142f0567369cbc731ba7bd1b15401ee13c995f351e2ea4394dd1086629296fee660bd0d95cd6160e358e68a8109f473418f80cf00127a8800c9f9f6074a0a01b348268e9624134e9196c86ac687ce7a13ac89f5743e9a5f01ede4333722184610db1b75f5e82fc5610db66ed3732f69d6fcfc9c835976a39478fcea9579809676c26584d6d39352d0c00000000000000000c000000c5a1d57c697b6e55edea330235b2c94a81b8d329964cac1f86ede821aaffc84c06a2fe348254f17b62611b4a18edde5c8b1ae56b9b2fb5012a7388648dfe850eb42b4736004e33201508fd19e9e55551ab1e670aea4e193245d79f243d0aa20ce67898756b533f0489f2ec334b38e37617f04d6a9fcb4a5a150539262766960100000000000000000c000000d18e41336755db50381635441e07e4493a81f6718e6bff5b7980d528c0c28806e8754416d4dfed7a4f46304c36b02e4a93328129a59cdc00d2485d333a9ea73d00000000000000000c000000a741e13b18883a3b675d7307cab82936cfcfab22187c8e269d20f2040b45192f080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c00000061fde7552a4310436ff5cb3693fbb97655c4bd0d42afec3e2ac3df52ba9c3034434a5656de0f6045573afd221ff9db1b8920426820669d6af8ba8c7b8ce9c65889cf37035a3ce96880d8da45754deb1011aba70fa207290256525c1305b55f08feb9ad06d06eb70d99900c52402a25531e77a242ee514d0d678d3722e285a926a471723561258c6a9d3307150f5838410feea9714c1e304fe36df94ceca9bf4a3bb4d04ef5e788274189d60c97a1c111885b7c378bf8323861751f2000c7ae3908f14012ac54907cea88ec59eeddb43d71b15845a6c05c24289e4a4d9bc594640b88f00e11d7884faabc2f2770984413509a10155b13d12f0622b601d1ca502bb4b3c8233621ea267d75084849a5531f2d9cbb4b37d7b8020f5a894d6d95e73716d4e06614bf3856f087bb271f22bb34e90acb1bce2fc7488d410f2341cab50fc0bd3a35dfa49a7933698110bde194329041af32e0a2727649499d66f285205a536fd44a2068792e003721173ba7343d80a2945cc6b9662dd9195111fcc2c24145ac446f57ac695ab3f07820c361076986ebb8276f85602a5eef6d54123dbd4342db9e65d0f61f151e5347224ad40164eac9f872bfb53c3907b6b620a6faa07cf2958534de6c0f6266d50d4ce29abc33dec613701973667e93d73b0c6a3e306d84d5c01e076f74504dc8e26dfc474b75b3b7da7919908d5905b0872a58056e3308000000000000000c000000f477314e64e08d779b448d047c2691532b81a542bd2a681a44706b43d01cd5374cea091362f22e7d38474c1d0ff3d84333884c3a93bd100be8f1975735181652a9af1d78a88703032c1548049f2c6552fc63bc3b7d2ded2a02642d003522fb1ef5d55c2818b8f51d140fb206eb4d535171614e1d491bf04f920b9c20d1d7f6596e9ce2543829ff5601c8aa442f25a426f1ac6a5d0850ce37c4e797286f11845b4cb41043d6e2fe37ea76190882dcdf19da976d47ec98e37a43271a260698813f0ce38d440e6d1f61e8bb5825f24a8e0f9c81d72a0137e777b9156741078db9569c62ad56dba48835558c0e34f1784b754c2e995b2c2ac00df244253f3fdd883b04000000000000000c0000002036d731602d9815e1d0993f93c1ae5aece88037e4752d4a85579943c0b80b1db95acf6182adea657772f7613880f3275e2129791c732f32c165ce30a935db41dfe79942fa13f979c0ee0332326e884f62a1bd39cc123c38b5c0395412a7ff70c748c029452f2f417477c9572b39fe680481e23ab02b907257d8141f15a5bd7a02000000000000000c0000008af2e43ed11fa547035b704a9b9d141dbf7e893ff69571451a650e6d235aa502407d09620026e7212ba20a5e6761893153ffcc0f61548d56ba9efe576186196001000000000000000c00000085338a088b5dfa618459693669ade71999bf0d08caa84d779be1ea57684a6d05" } \ No newline at end of file diff --git a/packages/testing/src/consensus_testing/test_keys/test_scheme/3.json b/packages/testing/src/consensus_testing/test_keys/test_scheme/3.json index 933652cd..ace50932 100644 --- a/packages/testing/src/consensus_testing/test_keys/test_scheme/3.json +++ b/packages/testing/src/consensus_testing/test_keys/test_scheme/3.json @@ -1,4 +1,6 @@ { - "public": "9060a47a1210a77036802d7369b72150ab76550e61b69e53206859462203122fd0e184462f84a076d95797250f7ab7494e237a04", - "secret": "f3a2d5eed4e0560d952fdf0df875812ce67bf6265cbb22c530b5f4b5258f541dd0e184462f84a076d95797250f7ab7494e237a0400000000000000007000000000000000580000000000000000000000fc0200004007000008000000000000000400000000000000140000001400000020010000ac010000f80100004402000000000000000000000c000000de3418318e783b479d6eac6d4dcff46aac7bde5664d5655bf43b2941cd374627e822f7671894fe4828843e112905374fb4f79e36dd4d1e45094f7d059b8225540ae46a3677ac722c07e52f4b87b929382540d97b5a4bb979fa61660f916bb0522772bc433e45293ab5d96c11bfecb64307d9a34a967121557aa1ba40962fb14961c05354ee74d7356c353b10a8ec6e067cf5f825ff7cdd6ff3cc1b2f8e0261197e0ab85ef11fd30d1ac4523dc5666d532ac17d6c9ed1894014fa5e1c3390646d2ea01122ab83b3431a5b7646db94271d79053d1fb459693007ee624d6a1def61fc695c2a12c15918f9146e19f57e7423c2fe1c50f3f7e9304882e919f40b980b00000000000000000c000000f775370d9c6ef164193543272405d939d266ac68ed071d12237b86112aced4610e13cd6c30d2bc43a0fe4c237861b14a07de163603f1df272047165238481c027951a92cb8c45e6abab3053049fcf66fcd9148639f9978233ac299653665da4958902c3225a5d55514a12b08b14ddf1ecb440c3a8f67ef7484a5525590ccf12300000000000000000c000000063c3b4b3bbc996e2f3cf24cc8a0456c13116c3897c96426b933a37a0487161a241f9b4eb6bc866a94e2ac5a28d939041fffa932a54aad70f24bed0158edf72c00000000000000000c00000041b3545dd57fa3250f08b10f8ecdc42fd66d605c1d996a2922f66c60c927f351a282112bd1e849532eff3c263a73bb6d5930f33433be6778f423c64df0e46e1200000000000000000c0000009060a47a1210a77036802d7369b72150ab76550e61b69e53206859462203122f97fa497a0aab5646e8e6df55df3cf1557c4ac5072999636a3763b744a1c40e1e080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c00000061a21d391b4d080a3bf69534462ca81be726925c09e95b24b1997c356fb12059f406f97170d87d5aaf7aee3e29fec907a7170052caec3d6dc070ac1007410758a8916209a514dd5b2b6722702edec9103fd02e25f6299c7b8eeb4e49460c35551c93af39075d7d022c4974257bd82d78177e6a486477f3004460340363bab4509bfa0209a8a9015e4f0aa5325b90f9150d21b523eee0ae2e02c1c44a85b2737c56cce8386380fb1403de9d44780d1c67bc495555369edf2e5a9d5e74d7e79d0b8569f34ff978024de3bc310ad4a6b214d1692a4ca965f359c753e76bd98125376ba79a1d7110d0001ce28629d7b8813ad498110b734f061580c3681d7d818f342a2b503155246b59f411d56ba1091a723052b526ff18622e1485ee5a270ba024fb828b1be67d2c6863e9521444cdde7a894e7e4a7e44de34d06ca17d14d396136c8c3f38cd67f01675bd7911139ddb64cd25641738ac442d87a3521514f69a1d2b1bc7785f89732e191dba1ebcff7b6363069c10dc6bef5d7c7374302acc9014e1bd3872785abf1c8b10c174322b540bd1e4ee77cd47d02dc50e6b58005d5b58e412260e43539b091531be3c7864d949cd925275461a391320de962c94e10417e2434c5a43ed186ed9105d3190f45901a7c390754d759b4618af6c6a10b6a45e150fe66e1906ad12cb9dd22dd0e7b30024154f55efec2a5600a93d3089c1114b00000000000000000c0000000fe4df5b7ed2e31e4a71fd2e053f014b2359e2654b94122629290b6535696617986e927cc30adb3b4053ef02b11ad675fc69686582b55f79045001062bcbc5226568317d50275e1865d35a690acd6e3b5e36e74ba832d64251dd93044b9a3e25a905ab1efe3aac74c19aff563f0d826243da2515872aee324e389c44a80c851250754f65f5e5c30403e7687bcbc58963cf4760755562365de0e12b52eedc41634feddf3a7a8dc0516ebf9d760078af12d4f0bc775354b83fd1a7ed685d98905938a193598a518648ea0b5e50b4e9f602f6e5e021f5f99d6661dbaa6541ee857a5496ae78a4069839fd08f5582b3e032c9244a17323b0af4be9cbcb7d5a986a2700000000000000000c0000009f0b3942e330b21415bee95186aecb5b3dbe3c2a8b50e108b0785a63d5ac597620d8636715f51500d5415c311f2c9854ac970005458ff657a3c7415f5adeb74ff527425e966ecc387664ef22354a5a4f587e1b326803cf48440fbd4ea9cd2747d9aa8c5dcc9c44342a55f654c2af6a4e577d1d6e72ccba433e28a277655ef56600000000000000000c000000a64a8b1472beb40027671b4669f8a078b36620717dd16e396a29cb60a69f3807e3c388572f832a60faa39f3dd9f40550a8fac8673d11793f7e78921770a3ac3000000000000000000c000000de3418318e783b479d6eac6d4dcff46aac7bde5664d5655bf43b2941cd374627080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000b0aaa705e70e411a0f57bc2202f7bc211498c22030a52e55a24a32151f656154cc6d0703f60e7c4396ea1124a6e519023cf79345d5e6c63934d6d630f3665675acf8de37b0777447135df30cd48d46669781a6735ca23019338d762b064010779d53ff408137023e776be363d51ac27c0fda9d2156fa8314f63c4a53ba3dd018fb3b460495a9be34bb2d0411076a7b39a558af1b3da8297448f05b28e9009e4293b24605d54bc66f00e5d359e377a45438c9b8020a71df2d3abb5754ed386b0cb77aac1bdc399570bdf2d92164db4752d2be2161bf26554c55545e6d4e73935b32ddf73bfe41836ee62d245bfb64755bb8ae4947fd6ade2c4110127573355965db32573dc053e728d2d4187a881fd201fbf84f597336392f87b0b71e0e9ae305a488db054ad6116fd8987e3412a848622034c8039d28605e63172d6bbc99c319cca4a94eff18085e3a9f0844afd31a71e623b5270481521fe2d94e43247f5e66c87ffd1f6c6be121f4518220fddf7342190ed1248d390c12cc8fdc7eeacbb823d56dd927d735b1720384ff0cc55d0f181626b30648695253fce35d1d321f7103fa7b7c2c3c990b3ec8f7417af02a5733f5af62654629f039f5a48073e12ad40ed0866346f07f125998e0c322a3c1211d41886350cd2b9477e165fb0247917a07130da14a7bf826612ead6223b603bc3a1850e4451a7d66636110a511a793582608000000000000000c000000713acc3168f7fd5013254c134aff833f639ea602b722d21fa3ddc263f4b14239c0c61f1ff63406133bb74446582dfb60270d8742c9ab645e3c7efa5e16ee394d167cd3383cf9a82c20df3a0d052da72f8cfbfd2eca3a841f131ba75d64ba7a2e55c92c0b37093f41de10942d752ede2b2aca6e173201c5259224bf6a3d705663d05f1e44793144195f76ec5b18f8d06a1b114c7df6b3c76fd8f8ec198caddc1cb4744105dc9bf16e8858086cd428215990cdf83202cfbf34569ced1602590633e0341e08f5b97803f929fa668ec9c9472558586eefa8263d8af6185de0799658e90637392892ef37e3f28632281e4d4b8a760b211a564d21e3bb4f35e551931c04000000000000000c0000009d74ac6e1df48b226cb5a646adb11b23574af0767a38244a6207eb3c3d4ee303c5773f59f65c0879d9d1304bab0b1d1d4935d71736c4181337e50262cab9eb52fb002f17bb505b2266d7126f45732502ecf0547c15c93e090e70a2223d144b1b536bbd2ae87b8a1b0ebc713ae8f835087265df65b790665a2e8e301d4e5f9a4402000000000000000c000000137f2c69228b961eca5c8f41514a626e32e1001885100a2f04b6e846024bde079231e976fb325e099f95215cc35cf1412916672c045c8735d26578323ffc4f1e01000000000000000c000000e822f7671894fe4828843e112905374fb4f79e36dd4d1e45094f7d059b822554" + "attestation_public": "f19bf07520b1e97b131a55666bfe3e74cca720785f414d6b3e5d6f1616f35f7ab0e82123e74c2c766f970a233d0d19725a7d4d36", + "attestation_secret": "d16b06b8eb936f5576dc217fc1dfe61313758268d53b94a4e8864884189e9808b0e82123e74c2c766f970a233d0d19725a7d4d3600000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c0000006cd576048b43df0476508f1d3819ef127e0a5b391b658b22317f3c37eb5afc133ae00d4c555b8a1a0021802f0740761709128c1b0a9ef6548ec2670a537d3e5e00000000000000000c000000d0df256d523979458a4c995337313f6cd6b6bc367115ec08f8e8ef529579693533c5d0385675987afd50b02749c36b717502fe5cef7aba6e05870d01f4a07d1e00000000000000000c000000f32ec7575326906663d1056e0cb5e955a63f63037921ad2bc3cba44d0059eb03c5113a596c0464132dc2a163409197022cbdfc1c8fe9680b15d5ca665a646c4900000000000000000c000000da0916252e8a0a0389233e2cbb6fbd2fe980df7a7d0f26781dba8573b53d4a4dddb19b2d42f1d259ae1b475d6f628e662bbe02242b60581488d28d4b2c32db7d00000000000000000c000000f19bf07520b1e97b131a55666bfe3e74cca720785f414d6b3e5d6f1616f35f7a576b27408dcc281e7ae12d76bf7b0e2d4c3e4c075c8da93efd3a4b29745ce958080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000e12c0f05c9ffa06851759365385d7c34fc44693dd131be3e10c696183712904145c93b49ba2d9017be0e733ecbdae65f21a00e298ced821cb9a9642cb2b65138f1fa3428f799ba3771d18933ec3bd047fc82150d8dd7ad7cf76e733b358e162fabd97850f230a321a184371337e9da57d041c922c9c2c55d1fa104496f127a48124caa10bbc6745f7eb326706a343d09418a466a1ca69b245854d83e5137842b4fda4b1aa06f604a35874e1de7e9e07d0da17750d72b5b70744b4658f4f459529f792910d6f1322e5e3927550b4f175a0cb37246f77fe25479169b47bb7e3142a4624c21ee75b67932cdb9584e5cc775f014827a8c46a158d31d5d63c793204b5c0a007b46bd3d5c5cf380140f92aa34e3d2d1132dfde1135475114b4ea402139ad7fc5c9d748339df4b2c42e27be70ff0bd4a02ca91a92a6ac0001758f1d51a82b6606a89f56a28289d861cab5de4051907866229d98073b92a300e40213d60c715760284dc7d481ee0f90971180b443472fd6eec6dcd06693b2c745acfc96afd919433b8e1777a6941e657a1a6153855037c30fdfadb4da55bf319d0dfab735bb5c53080b73463e5a06379f8e9ad0e10bf71155d28d12870408b7d61d97d481c4c4834cec42c1c5781d815de3a5015f644ba091e76e003e935ca57219ef1712c71760f7c421b02cccb924834e017146d1efb7a52c7613b70d6612a51129c2c00000000000000000c0000001f675f2abf91e62886b00b58ac37ab771eea9b54304f017527c9fa77867c3666aa789d69e587bc54965051685893ab2210119349c40ea72380e6a55aaaae806a89ff667a655f4d4e4524c0390320af140f425b7805831645dfdf0e71d65e2972d9f5477554f90b11535b0b09bea45936a398bb7a9478045088f75517f970b20a0670ad7b7c1864384797c32a5699f71f61c5d107b9a0574cfe5cf934f063915b5bae056469c63523b1d9e57a87cc336542f7b26893e40d6bb093757241257f18e1f0e0595966ce3d620f8579ff93dc4adb5a1a563cdf0d7df9aa4b5ddd623f4b5133af3c6b08e141c3d96f54f5adba1170816f7873341e754649b2361acfc57d00000000000000000c0000001f29c3550ede2b08da2d1251f9f5ab3e9e057c190962bf4748964d015d106f2b499f3315a7fa9672854eb36cfe24d771f892b159a397493b4c6edf3ae210f2643bc20b1a1bd1632341e0be1ab7aa4039251ea6538dad1524d82d530202ab2c3cfa8c5b2efa520621ad782b291948791b1072ca10ff583b0d3d2e450ecef8160d00000000000000000c000000721e2071607c0e1aa3f11516f24c532e47f7ba43e407cd178e3b1277ad9aac234793eb4fc6383f1feff65c7d8ec8694bbe3ae53dfccced3c91cb17650851e26200000000000000000c0000006cd576048b43df0476508f1d3819ef127e0a5b391b658b22317f3c37eb5afc13080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000524e04295747882da3b2c7426db1374b7a69924e5d5831168fb9640bdd1f743def5f936da475262b07f0387e2036ef5eea85852bf3732f0db918d362bfcf0056c6c4442d142e6b3344fc780b8f63841ec6a5346e8628d00f5bfde5520d418579cc3cc300765e6316f12f3367ac86b91e1b9a876dd26e2a7d4bc1fa63c17ece29669ab1040ae9fc677aa18951f170561712515c22ecb61473aa26044e626dbd7986d13b602497c46cd60f0e1c52e0aa5caa9b4f27ff9ba12dd44ebf4b88bac85e29ce454f1104015b1b10a4173959291443a9a979acef106eb314c07b19b7cd400bc11749823fc85fe262c84c20770b6c3b62543736558d0cb805507344f41771dc8b571d8ed63e548c61ff6996edf57549fd905fe9e72456ec26107d698852438db7480bbffc7e4389299a2f23e5293e3cf41e0a56785d4a32e1dd772ee5130bcd7bd4474fbbfc01c38b1142124e351e46ce4733f302f257e16a65078ee5e407eedc730cf9f8f964862c182c44ea52203566436e8a5c666e32e64c4935a8900eedaa6d12ca38093b4f2db44fef81ee4c1e62052e04271834932b96792b80cf31a6117506e4be1f4a7fd3e4318e9f993907cec345c287a936d668c745e3d0de1cdb21185ad227d92f22c3956f3a973830162456450c780d63713ed2235105776b7ab7ef06ee1d450796a3666dbd7a502a1a865c68188b766ab89f1c1cce78313108000000000000000c00000094c381291b253951ef06471a2ba702438f8c2d14b0a1a95c4f0ead4c5ea6ac72f274f82be71e5d2101e4466940b70c744751451bca4a556057fe8d33f8b3a64663320538fa0daf26c4fb8e2a0d0aee72c1c9be299748e87d6ccf383cf286a3104708ec3094e7a20d05885a32a0996a77a06c3c380bd7e20bfe48ff4bb4981d5ed3ca3f7ef9093151b259282899104e2d74095c431c65d9491af70c5638f8ca55e9d9ca2f14ae6203404e6e6e72cb6807f23f271fe9cf5b34cc698c5afd4fc602f9521f5e3dfec0429b5b02323bcb5b614a444c60a825fa685f682640bbb0562ea7785e60cffe5a603ec6dd1143720040112c3e4de908d32ffef8a968c6e11e0304000000000000000c0000006d88170a7ad7790e7250291ed092de2046febb0c93cc9d640365a4792f2213058c2079493a6d30389344fc4aec50b132f5a3ae0fd88b3d757a236860e76541314f61f21b8504005026eed678ada504075426784a5d54aa1bb084e86cbb100d69c63ed617197d726861ad4f75ea38b669ca65fa0a0d46fa6496634f4ec268b30a02000000000000000c0000001a66c9471d495e76c56d906bd357467e19b9d110db60e666478d1f11230ccb2f352bfb321a7264786d9b5e2509e1362512bb872769c0bd601a49e01970dcc73901000000000000000c0000003ae00d4c555b8a1a0021802f0740761709128c1b0a9ef6548ec2670a537d3e5e", + "proposal_public": "2327c12fc91cac0dc3593a5edb9c4a3c35ee9b5abc12883d28354b6965811c15ea1b926e86b8e16470d3586985293a5944d19b77", + "proposal_secret": "7b68b607f25fb4c7f1ff6f57b286806b815b467fa3e97d148007db1f2eb97930ea1b926e86b8e16470d3586985293a5944d19b7700000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000a85d802f6fe3da3af09ae552bfabda351a6c4b634f5d725953bc1a512852a95553f48c46e0d262427859eb5d73c5be6190c1cb320394da040ecc6b1e7cbd032b00000000000000000c000000c2b65b13df906c2eb18b125592859a7cd0dd5a3e2fdd7f4664047e4171bd95710b0da83690a67d636d40dc4997c1d33fb526b1013115096b2ac0a97e06eec31e00000000000000000c0000009f47312e21ff9a5d085ff23f71361138283ff6125768154f7f517f5dadd9754ec5cced5cc5911535ce374855c3b3ae700418813689e01c13ba7f1547e56bbc4f00000000000000000c0000005cde7d78defedb02a9e8e1374241363f312c3507325cfa29b2d67c0cac53d20ead9de931d7b8ed2e4b443d5f296d08131fcf280fdffed270850c94739b52e32d00000000000000000c0000002327c12fc91cac0dc3593a5edb9c4a3c35ee9b5abc12883d28354b6965811c15f92a51374c2c493cb2c9b76d6011f629ac2d9a7062f5e92d1e377c45b9a53277080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000f7faf15802a20962efa3165f34f8fc18e7661929095dde232727a50ef76ae26a84c0b40ff2d23246f3abad18601fd316b41f9037cc8beb1f30170565aaed9f4386747121f812e55af3cea2254d48474e5797ff1eaecb1f43d6b449135eb81741452e640bdb15705678f263214a759d6ab870f333fe30b1292c9f153d376f6e26ed4d720d43681d708e770933b1e9af4290877034a91c70380b0cfd474e93f2583bb7ff50253b7a791635596963fc335bd6567d6b648bf7774f54db457e6afb0ba0a2b85db960c22783b34e1f761aeb27db0e3c6a56bfbd3e427c4533039ae90555a617677602e90c402dfa226dd09619d4f11e3411ffcc5b9ba5d7011921af66547e902a6ca921401da24c4dbe90494a458eb503bbf9226b7b89e25e1977ed4dc7e1a118048b70621c0194489a1ac25f6069483fb30b88748210fa5e7a649a6db6f5406e05d18e3786101011db89675631a019581f87cb3e72d702561a7bb55bcf009f1b5389ac28f172643f1da4a2756afb895eea60045375bba06147672c2f3220ff103d24577bc1ea2355b79ae213ec9e4a5f669bfa4bde0c5512b40fe4675ca8140b439aa22e7e9201261bead649242f0b5c4a751b66309d991e2f48d82eea67dc2baef30e390802ca0febc86b3777f49d55e24bb37d424484641182b3039905df4d142eeb201a83095628ca7279da23cd15c107595f98f6f71430ebb96100000000000000000c000000732a2123f29e6d785eb41f33e8258f318612ae45418faa327cfd4d6d54e2e563115fc740b0f4d354e01d2c29a57b1f2683ba361edc6061527234022a19d45215b2962a246bc53d6e6ff26f78ffa0c32506cb951939b06b3b3a4d482d62dac676237b8b3fa2ee9d67fc82042c24aad55758ae69433662853114731d7a5355b75af894d158f581662e38ada82a052f4834355eba43227fa76d75d8ab373156cd62bb86a055a203d479393dfd66ed36b36b5e003932862b364dc7cc3867b5ff601aa4142e522e4171668305b51966eed83dd92e8c241455b80172e3a97610644910d43e3f0c8f4504121de8444c515e762c303094728cdd226634fc0500696eb71500000000000000000c0000000acf614488783e6339ed51150dc1f67c1349746339a465798f76f536b55c8142d99ec947664d4d6d7bc05221f02ba80c3aca1d5e8032fb753b1ff540b40be26f9103c62c7b3375301aba7a5beefe6940285aec17fda7c379ace28d3fe8e04f44e7732935c92e305eabfbaa6b87350f4f8b25cd5287a3197bc1a92d393e97600500000000000000000c0000000f4ab147fd37b875496c2a5d830e6d5f957f1a57ce8c4116f063821917d8dc663f8a021726b7b85f7a22e4276f73716c98baef7584759e3cc8571111b114a81e00000000000000000c000000a85d802f6fe3da3af09ae552bfabda351a6c4b634f5d725953bc1a512852a955080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c00000085d6d5550548aa2156034c1ffc67d8259a46997e001ea53a1c886e640f7e7125f214d14eca5e3420645b530b43d9c7609b8b5737474e180dd1e26d784f0a57517236186ac385f528b959f23bfef3ed3c94ddd66d1ca6210599f64b7234c42d1d0350056320c1830bd3a30056dfe6c944a2c7ef5d04086c7cba3e083a66ef1f0f3713af1006d84f5f86fc9817a6c197494d69cf52218bc21e9e58d22a0ed4015d3ce3c05104329b1d3de4f937b0b53b6dfca0a15b8a28db6877cb635efa7a22015e633643c6c3bd7763f6ec4c008daa5b30d50300e0acc047d58d6d3fff39c10b4570670343741827f2e2b3749683c868a32da332dcd5cd77fa81387bafd81b0a1cad634f6061172a995df52deae47038c1c3fa1e7082032609629a0b5e5c985f60c99b45335c6d0124965e471e08f8537617e824823eeb083f5889192c9c8e55b679a314899f1569d9fca1102053766316518221ead95e4dd5ce913f9a97ba50661b07505330d3159efa516ce6f2ec37b98b6f39af514314b688db354824f2650efaf26223d63c0fbe05cf78746d1434d5678718716955715ad81049ebd3f37350a8d15bf08ea90b2283c017cd4e860005c26a0bf71c8c2db57dd11e2e0c2e560282fa5697f9d53bc6abd319c1f1334c956700548f7e215ea9e2734439a25c1f1f55026be7830e429c5a664c902a0205338a1a3d1de89258daea85022525db2308000000000000000c000000e331f34feadedb495389a4630ae33a4b105f850474323c27887dc9035f8fd52e7e7f8b3d16635d2a8b77562526e1d149db89fe29d8b4bc5cf76d642fe194ed4932ed5f195d2b4061b61b1200727c373e2fe24f222e26166107f21b5d069733061294d46ee31c550fbc621d2b237ff2213f4adc3989ce820e37794231784a7e5d4fe31a20f284582fbafde343379cba1ad3730b18649c1c50e964ac3dc3507b2485a2c241f24bd73c1f40a615415f7747f399db35c1ba680d9907d60d022e564363f99b4dc4839e39e357934f1429fb02a9471f7a31e2fd3677461749f56f6922f5dce805d9950838a24b7c52dc5c1541ed317f4a7926094e8ed81a0be0f9746004000000000000000c00000083744f6016bcb458954b2e5c29d3c343479b351a46ca140d9f0afb0757a80c399a2d17674f1a9c6dcef152664d41f5758b0620313b34a62a03204c3c68a6c7467611ed056019685b7c492c4a3743044e6e2f546fa75e3171431b7f4f77d2ad30f76d8d52340b150260e49e6b1a704f5c91e7f70b2d03a542f5ed5b02ce18ca4302000000000000000c00000023aad02b6fe3201fcdfc871326267b3715722f0b7695a705b536d20dccd0bb4cf6add126ea01d35a945585723d16340fdc7a9e145e004010affc676967cb910e01000000000000000c00000053f48c46e0d262427859eb5d73c5be6190c1cb320394da040ecc6b1e7cbd032b" } \ No newline at end of file diff --git a/packages/testing/src/consensus_testing/test_keys/test_scheme/4.json b/packages/testing/src/consensus_testing/test_keys/test_scheme/4.json index 6f9e3ffb..3f93f7c8 100644 --- a/packages/testing/src/consensus_testing/test_keys/test_scheme/4.json +++ b/packages/testing/src/consensus_testing/test_keys/test_scheme/4.json @@ -1,4 +1,6 @@ { - "public": "3560f91957a3fd65d06c130687730651fd6bf177a24a525835c3991dfc8852079a1cd7046cbed711af9c0c444017283538096876", - "secret": "05fd6a00222faeff613112a93fc814c79ed2e23dffb33d18102b8b0ee76954a39a1cd7046cbed711af9c0c44401728353809687600000000000000007000000000000000580000000000000000000000fc0200004007000008000000000000000400000000000000140000001400000020010000ac010000f80100004402000000000000000000000c00000032b1a53acc959046698ad82f5e6844696e08ed292c52c07d5386b645103d1824167ff652ced6204fd21f833ab2532917a7eb1a497e388a303837fb19606a6c45593d7c7d72eba77e01845776af9a9e77345f8e58a855a0298f643d27a2be026d7789c4668f648b364db3056adc47df52ca1adc6ba644541785865a0675d53a64a263f80dce3c8801dd91592a47c28e5443e3864e1e006f63084bb0517f2bab2df0218d7de5e4e35c041289210be0790659f2b52c2d507e07a05c234df9963d1f2d45ad114562235d6a3c5e19fe021262302e2957cbbb822180938617d0d00058022a1f007a21dd5e53145a3bca98fe73122de6273bb3f23961968a6d7f424f1400000000000000000c000000f7e09e708a7e280bb780d25b3b7df14aadaa69494bcdf97e0250f326f3079f0a42db017afa84fc0575e2be4d800309781b2c580a3c61036c4d6c8f7350d5e465ab13be0884436559e5115b1740587d53f1f0ec06cb7db861f7af42016eef5b291949a43b51a0e533d7eff257ae5808266059d0297971ab274708a77e92e4b21e00000000000000000c000000ef226d2027ef9b5044f7bd78c4930c5904f5881f0b03354f4913353bfe8f601031bc587be6d0c823c424a52771e0150699748251fae18d585d45ec49cef4ed6900000000000000000c00000025973f076e1bee2ab734123bf0105b04675d2f0ae1614a2a81959f474f31fa118ecec92aba0d9e04a4d820154931cc07b103c12f0b42bb48fa41dc207d568c0800000000000000000c0000003560f91957a3fd65d06c130687730651fd6bf177a24a525835c3991dfc8852073c439f659a2c8a5d1b0d996ec79cd95a5e79546bb3279a671a87901289ba0c4e080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c0000001a040c4b97db1943c43b356293de1d70dbdea166715552475f41002bd414a27dac390d4afbacbc327451c5449fc9ce461a803325a1e4cb27a7096563a9d3f8007faef77e1a343d637e11e82e1c8a8c686dc725036553a169ab409a45b194fa1e38e8c5602b561f5062962a22e7491e0196d5962237b70b30c571ef5e330ec90e7747205624ed6a07700a880f3db4644c775e34455f9c00433cdc470f3bd502177be05341e90cc50a9a960c4f01899d6ed7545f0a054e3c3652c54d0fe2485737804c7e7b56a4b62d94855e4ff1bdac376338d279a2d1ff7d9b4b4640d3c976606d2b73350f3d2d699787c12cea3b4837aa60111011d4b02b18782c4fbde29e5b37e734334becc978ebec387025c0293f3eebcd14b3514b2ae0200d363b43351f4f61803ab017e41ed27769482932f11c7f28cf222fac9b40eb020734385169310c06fc7630e97a1feb463c2aa6f47f14dfb2f054a38f9b134579ed5061e78331fa44bc40333ff612c758833c54d05410a808a60b301c9b5c6cb29a6964d60e4c8695be23555c1151a8d67847444f95645eb6cf00c92dfb28c6688f38a34cef2f3322b356db939b7413d21c1c0e58ee53587f447a8409a5217b12bd4ea78969318a1bfb3bbe359360aa75b0519c870f6043bb421975cc015239269147393d441977a3d64de5bd8d3e8ae51971ac1ce25d7824bc39653ec14d8a5f4c4ac2c2d16e00000000000000000c0000007d783958933180438924e33d2620503551b6d20f9ba53a5b97a06148f4f5a175ded7b6372c776c5a34413d797606ae0ef01ab204da0cc10f5ef98371976cf2643a48595fb507d84c8f21db412819b263a86794110943c505ded465148da8127565c0814d2a9af02bc3c329029fbf091eaf5e1d5614220d618c2eb144fcad8a2a2154a542dc2d7221b49ac90ae7775e2bac48ac315f94ed702a0e9669d61dd331946d5c53148f582debaf396e5f8c9e6743a35f6ebd82a534b817ad368d82c95815142e7b5fee1c3675e21929cb4ebb353eccb51bac667f4313251b3d20bdf675ed4d3d698c782a7c28d02d03b84cb419698c27693c1e296db8b1734ec57eee2200000000000000000c000000afce482eee33664cc5cd2562179f233ffb98a92b6387cb398c78f17a00bec45c8f5781757b14645ce46cbe4984cb2e72583025361389505d3982db5c9327981938b18f3124c23273db4a943feb0aa75339bd3a3ccdf21b0a68d6fb70eda3d81b45b0de0a9244336ebeb2755da12ebd13ada8482f11588a0705d2b454057f893800000000000000000c00000058a6e450c869266b610e470577bbe50e398e8e6cfd6f94228f042f58d912a33e4acbb5304a894924b917890fa976b93f8732b147818ccd286fb4ca28b34c172b00000000000000000c00000032b1a53acc959046698ad82f5e6844696e08ed292c52c07d5386b645103d1824080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c0000009986c977b750a64ddfc5bc6d27db9477d4e50d66a930ff51b377cc7c14a3c35ad7fb9878b67d122c28213608f5bc4f0603d0df7ad3635730818b7420128f6d5ea89f814a4842ab50f0e80d3566db04370aecf152a2829d0f295dfc043cdfd66d94857a17d0fc422861704860617d0d5972ce8501dfd9ff724a394951ed98ad09e5aa69713519251ffa6df9361cd74164fad6793d18156a244e4ef266ad8e4427f8367b7db1162f02060cf15dcd064b45326f535c1f10bb7d0710324258033e13eab18d29f77d034a0349735e91219074a49f496e957d166f516c6e5d53084a395921da623214b254fb9f5033cbe18f3b9be45b1b66f2ef25f706b15374aff34ecb6c3d446a67d606780f967468038a2aee3a2a75d6900512281bfe566a6f256e233de04e2abbaf6894d92225a690a4665883d6222c620464c4c0c57ac8e1f300a5f22b6229e85677e68778501554cb3ba0dc8329dd788a2613994901f82d414c6dae8a552a4b215c4c66a04e4a7f2b3a7126142eb64ca607f069427b73fbcd2f83ddcf207a559b3109d4831877a92610edec450d26f8741049f42e04f4bc394f0debbc7cf1c8296bfb9fea5c8ff19037caae730cf3eb08326e625f6f36765a4e7b61ba4b5171c03b1a7e316337cb41108056595e7dfd6c77da80430002286902d0f62b0164e3337653624812d3cb1d17b139ca096ef56432352cf4688168e41308000000000000000c000000fd12e427d0065136245f0f40b9a1fc7be380e04087f7eb21781c7c6e15ca9f42bec1c842e32f8361e1356b72210df2373b4cca18c3d4ed15a1ba9a5efa48fc05719fcb7e98579d232e8c8d468129462b453c332f311b3d666a2b9303532a8d385c49e53a15980034ec967a48dfbddb71292e5821c774c51786f8b02cc6270e1cf4463f7c929a3e354c33276c1d23e0022c5d0413060e4a25f8588d1baf4dfc52512dd25947fad8615d5d3a57a9886015f166a0017f71766bd80fd45cb4083115a351f6562c619411ec98d42fb04de80b3762540948908c2e0038d130b5571a482f7412207346533e81395f74c391e371efe732744f0386632e34396288386c5b04000000000000000c00000033212c450547791976a198173b6fcb23a8a6035c6db62c2a5bac783a07c0f70c9e02962b86790f5bd1947462a9c2787e5535130ee0d5dc1cedd0bf1c1e5903059163a6470fb30d07d11b712e18f51d029116f707d7544a76e5ea672813a3896a3e704c1affe8056a7a23c65cca25c80c9ffaf84d17784501ea2c1b5aa1a0bc1702000000000000000c000000b070916fd7764135ee438c0d88af472610183d17d89db306c3c84e6c7890304609d6a45d5a97c16152e24244fa45f761204dab5704166d05548f086cd405b10101000000000000000c000000167ff652ced6204fd21f833ab2532917a7eb1a497e388a303837fb19606a6c45" + "attestation_public": "4f4474010e829808734d51051d4a4656568e10247e1fc004b13c836f4f4d954f81cf9d193c40d3513ad9436e10a9354ca07adc24", + "attestation_secret": "4681489d975db9b812b13973a614d07a2e7572bd64a241351c29e6b994f77bb281cf9d193c40d3513ad9436e10a9354ca07adc2400000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c00000080c0b323e0d435268ab62e33b4ab19551cf5c42cbcc8e11dcd103058cca0316ac0ebeb06bd6274329729d9766f1e3b11787b2428e956353fad7b9368899ae73a00000000000000000c00000090e8554f3792733700bfa62369e0806811558852fe3b511468898f1cd835ed74c6389177d170d8369e1ed07a9c21a65ebaebf30866057c7861a4cd542cf7261f00000000000000000c000000a45dd364aa06b86454ca8b5d2dd26f1cbd154c5d3e29d47d08d88861041f5a7ac0eb4159501e0e29c2a52c0b3d6e6f24f9f89a25bef7d2491a414b7d3fbde54f00000000000000000c000000ba675c349343ae3aa934a84deabdec4267bac37aeaaa2310f54e47539883622981eb997a053c49153bc51d79f0a02818d378da4d98f939281d27ac6c53faa06c00000000000000000c0000004f4474010e829808734d51051d4a4656568e10247e1fc004b13c836f4f4d954fc28962201dfa8c45db9ab969587a2f40d2faf356d9275e3c80f6a820c27fe50d080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000f789041488759117586ca27cbebe0d756c70ee1388899a07428eb17b252fd902109d49019b8b5b040390c05f2ac3fa38611f44062b0f6864ddaef03045e2cd5d7f3a6b710628d018745b572181cdbe4eca7efa4380deaa605c81156057ff2c64899ed3482cf0eb0474568e034fcb17780011b07cc386063bf5808c2437cdec454940087c1f8061796224276d98b0eb0437394023319f4c0f6e39483c55b3490ec6c38a60982d8246cfbab9017610ac325c0f296ce8a0772df043e23199eea73c3b5d52530fdc8148ae5204781c99f02d8db0116e17c3125a97270a5cdfee5624eb0e022df327e12915c25e23cebed7085cbd390d99e394427e76e26e449a990ef28ea5214ca2374cfcbf2c2192fe3b72b480af644f5dda627db0e15e622dee511f2a825d8b4982597a16d42cc4ef2e593350a7375b0be618ff167a386d60a77d3a81e535aaf76151880cd8580f20d63dff650152863aaa26a0a13b724a89a51e214c9e6f1693e1045aa5923eb0f48e39f2f5ad4ec715895375d751429714482c86809b117554416d0d22597eaceade53d5f75549488c42263976291f8b85174210077e3cb48933140534de54676dce3eb5a60440a2a9dc49f671753838a54d255cfb465d75da1874486132040989330eeeba7d6cdb9d0b143ccd653b397c024645f016270e04522873bbf4270817067b699b2f057c38fb4be6d3190703caf22700000000000000000c00000075ffb04672c3534b6c70585559b48849ac9ab93fb1936a65c4e3ee7970996e201e82780d6b575e64821f317b94c8d279c47af136d2795552244c607193419e5d44938b684c06844096035c6e79acbb15d76f1a48dbf4827e113d4476970d19548317752d3c43423dc3577b4c378a693fcdb9553ad2535f7140403e21d07e9a4cce5000146aafa61bbf809e5cd6f89e07f91f8662e9da5520862dfd2a87b6a8707c27dd37ad589e78856f04326a3d95006ed7d468eec05263f713b930e8c3e11b58eb5a291eb35c68f2f86511c2954a64b69fbf5baf8c297a27b5282dc47a683dc95ba854a3997350b6dece62c0b0f52a912d7a57db405a6191db160b6983312700000000000000000c000000be2888786a8cf5696124792b3fab2e0e553587024a1e7039f77e805a955df47ae2b5945852e8a26f051a1129f6476b661951680534ff1d7297aca93448440844cbd7c374c1fcd12073a2a5404c7fc94b7d7fd836464140586f52b15eb9ab8f430112281a58cf817d60b4f225c3003d1d5492f94075ad8a74a3edba790c8bd01900000000000000000c000000e45f3436e3c9ce586fef9d6f3b274b04956e09377ccda1000252a744f174f32dbb30bd3ecb87124e2b16b0113cbbe0521bc17f5eaeb07b34a1205a1b3543134500000000000000000c00000080c0b323e0d435268ab62e33b4ab19551cf5c42cbcc8e11dcd103058cca0316a080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000fd529a16359b82674b868a549263381ea1893634567834516cf1e0683a94a01e5e826f7da0819b624842c3366d55a62767e9ea248cbe647d98b3ca5e550a1b1110e42d4c4814bc3116f421643277294b307ccd37b441cb62ee536436d4d0ff55fa3bea72cf4b90689c84112816881d0c6551f21792f5383c90839d08c69f9e4a7edc1508be581c764a4bea3b1b728a369cea2612c0fe681138c7f322ce923a3336c2371ead468826045c9d639ecf48429cfd710ecc629a5f786ce04e44c77404db3e7755d659bf630e83463f711e476cc3313a5de8d2963ec30e695966d6dd4e8af348576216ae14933926016fe06567fc73d06b2d93fb1c772c3f25128ea865097ff543d5814e176273bc05d45e4029e6f87f58ae754e669dac7e022ce5c64372a0281ca808264ff5974b08afea3765be2707359615203b7bd7a3691c7db2453311965517bcaa7b95a08a7abe16b64d2c2a5f3d6011244034b6dc607cb95b1ec749c336b0c09e73815ca3279944c9546c89ac4708ec38522ab8dc381167740f875c213313a0732785a9a91d7e99c22406ac4866596e7f381e65a201ca5d405757d113505ff9a0450ce990645e02961f5abee1728dbc8c18e246f7179a212f52999178195991ae0ecce12e30779dd71a2a169c0c7757000a59e8b3734d1f522a18db4f08dfd33619eb1a831e071e5c315a601d3c62a05d14c2b52d5137e8607a08000000000000000c000000b171aa624c02e549e77044747ab2105edca6dd159c83bb5b53de7d3742dc7c3d3e4da551e8836c1d79d90512c1c48044706f5943dec41253d815d432106a322c65ffc6412f760f24cf9eff630f2d971546e5c13508dc31197a083d28d833e440c82ee4102d09b93fa2458e5df429980ecebeea5c15eef242ec957067e867c10a991dd0263c14e618f285d04f4a8a1a0e57bbd543e0bbe911af1d81319e916b053b74eb6e164cbd4e20ebb33e1e7fd938c14e0b43fc8b44745f2337525d79a84e70184f1977bfc47a9910661725cdfd368d7b8f4482416362f9149e7e3b1ae732a8a2912fcd1cf33c0cd19b793421525a6b6bbb49760c2d01b8c08d228fe0175404000000000000000c000000ff339717d56c1749ff778d502d6b7e59c238e2201a0b7233c0ec913778cb371c8952320806cf287c405e2516664096262979cf218c346f5caf3c69616575625883fef02488d1a63e52ec8e614a89eb5796f2815928c5f2278634253c406b5b1fe8fa326f910eed32b5618b00304d47240c2b852a480f7c6b96f1811fdb3b582b02000000000000000c000000a74d35743d67440dca9fbb3de7eca1568d09b3740e7f230886b21e3d97a329291f32563f662eb7581b30b13bb35b6869a166500a8df5394b4a05c57019a2a87101000000000000000c000000c0ebeb06bd6274329729d9766f1e3b11787b2428e956353fad7b9368899ae73a", + "proposal_public": "92cf4f08c7cc302da1ef19446f4942503267246bb3ad8e4ca162f466d86d604f71cfe419f6726223282bb171a6670178e87ebb73", + "proposal_secret": "c6944d84c7dce0d3b0081a2e8fbc649cc6dc00b17a7dcfef039dbe764d9defe471cfe419f6726223282bb171a6670178e87ebb7300000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000ed0bf6106c344772492ad80117e7eb0495610e0201831807b8cc9324bdeaa4457cd94e5a56bc611e3b6cd533c4f17a08e88d1113f31e7156a0cc317b394ff53500000000000000000c000000d73d8f2edee2cb1302b59e4707860a15186f5d7571560506316f6179d4cdd00efa1c2071265270635e9a6d001c5c8c517afaa91fec559b417d34073b83115f7200000000000000000c0000007f8b8349907e973c9900187a74e9c31b06cc4a275c86c8309796892562617140d500e06a6b2775740e887b4de961155ad2a47d1cff3e3e2d5942bb0cf11d6d2b00000000000000000c000000485e1951e4a80b19d650ed0fbaed75144471ed1fb6c1727004501c2bc75f236099216b590db02c6149da6a6a86f02c4e248dfd0b7385fa5b37e07159df5b5a5100000000000000000c00000092cf4f08c7cc302da1ef19446f4942503267246bb3ad8e4ca162f466d86d604f15234b47b63b5e0056f4744ec7633705286a3a3d96359a4f0f2f465ddf8bc05e080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000de890d104c035b36c15ea023078525571b1cfa69bcf0c53ceb538f53b84d1416ddd6e5317bc88363fbdee14239e67638a9a44f2594757a02b2d62b1fce026a68a62bae036ebdc81066ca201eb6c43c18503da11eb3d19b5a9bfb87589dad704855560b5943f4b014e1a0bb6bd6e21f19b732b20cb02dae2b00694d557b85086b71935441dde89b69011ab62951a78570f83e7466b556ba6a59e7fa73d455620a581bdb722d2179541704460ef0eaf400b5a48f438da4443c5e22982238d7960dd2aaf60d1ece9403227d320eb9117371bd3e0f439743886c0eaac0285c12c247ccdbe42235c4b41e49ea883c389bed56ecbea2545641c47d39714c70b615e7705f29eb2ac71da12ab4e2402793cdf77c9e372a7a981c9636cf9958396c9a7d4c96a67f6a3059df1bb859400514f13f4486efb7782758386b482af23d1cf9856bb11e2f17197e8d61a29bf5548e7c25308e63763e56ce7458309d941d21603d0f1840e559617d55186787c44b177b4118e153a320f0d8d63a1c34285f06ceae5089d2d610cd62484264628838a84cfd086ac0e25374a5ba6a4181615f6477743a27377457efeca4715c346a04e23edf2ab7f334649ae5e433a0c6bd4ab6d4b34e6b147f3a6d17520c1149546ad91753117eef666c348a2211f677913eb818c84edd4226311fd4976979827d18de3a106fdc1fad47d0b54842a7ecfc1a460d937800000000000000000c00000033c0d52d6efeca00f6a161280159f8458fa6de2a414c073d8f4638686b369e782d078c2b2b9d606eba99722b3465e06cb8afd4476f0fee57040dd06d4dfec20ff6e8d95f86035c6c301111539a6a87708b16827226e12e103c2b6550e1050d307f6ae3231529f4384a79665d3b8b1217f7ea4c4b994aae0d3513b254736c0b5d2de0e6330a5c72674066ee32b0ac29051f3ab948e4138356aed4f053fd2d240e114e2e4311f0cb051816e109f2a3fd0f0d4ab67c5d313244f6557607a8fbd50016973a4de382b8562040b00cf35bf131781b240d8673ae3d32128241d278204e47b48174369b2936f59c5f7a63a2ae147964932c78b85e30ef278878ab4ed33200000000000000000c00000088e8d861c54d103a3f643d4e9cb84f20516276244ecc133ba22aa168fbc45054afa1145e0661ce1acc940f30c9bf487e26e7ec4ad1d85802ce89da47c3e69f4b7684fa285900357c4763a970fc9db1038d628f617304c065c39d0d0328d10179e11b473c332f0e04538cf50eeebf6c40fb2fa403b5d9f54a782d2421369aa36c00000000000000000c00000089307731831e475107a7aa0705369e63bc8de22ff9bab66c290e24001a17cc15eda19462f709c10f9502fc6c445027603d9715368886855eb17ca402bd0e403b00000000000000000c000000ed0bf6106c344772492ad80117e7eb0495610e0201831807b8cc9324bdeaa445080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c00000064da4d5929b9567ac685114cf494b17b5d52cd1d0bcae4756e7d9f6aab3d0555de5fc21a63c5be47b9ea7c4ad863fe0f3ecaee15073226631776e667ace7290fe53de445abc89b0413953b1354854974281ff073ec2c1039aa6e9472fdeeb3431a78154c473b8c3a44e7bb424ae49534717612789691553abc96d8633eec07133ea78f0bac5698781cb8c77c9ddf65159025245fe261b632fbfd5f7a8cdb6e3ed852301149d10b1ba3dd325be5d77b49dadce95929aabb722bbea418a06f484617621a346ea02c06b338a567f2f48c297a74404892dcc3783268ac357b22ab50966b373242b452461c09aa6469215b35b6506014c51430310e59f31fcb3bd006a1ebb763692571026587ba1d425de4461c791749dad7f12a43840f1455eb3d0e1f77a92336e43745e9094801da92a45f800a9932b4a31715bcdc8e2b2fab291edefd575431cf6863c435fe2fcf855d24a2a4aa3eeffaba76592cb77eec2e3c2aa79920428ba10934c38dc710c47bf3795ef46c5bac4bf2799d8b5f106e9cd077703b391cf1acc37b0e00777c2621cf199dab154b84983e63340cc124b1958c637ce14f7c2454aa3289fbb14b5496f943e6120e29921f6d151fb5a01d8be4684becc5302c4e487440550ede63aa263f4d6138334cb8507d32ba1f2d331aa15612f0cfaf6de5d5a77893e58248eec302110d795e54ca19d52157d9eb6a56adca7408000000000000000c000000abbd2947e20f1d2f41963b76e01fe27947c6d012565105753725f755b2da4c3cb1b2cf4fc011435453e1c47a80e5a54f023482337bbde24ac708c3505c50847424a64e2ce8ea826553d8e60a4c382816b76a8b4edf5dea667856c3754755981070383349222b36643be0eb4d4f95ca6920da2e77f75e2921d3ee173094b9d45a6fc1dd6cdef75c63b931c65db583da4a18ae795cec3de02110327b22ea962079caeb065c0e3efd6f770b6441104c9157e521e530bc21d425592a0f65e0027e413a49ea73fe85cb181552b37ce8305b249091117369a3966e0441ff31d0c1f944b6b41978e5e1af619b45170441ca3b6d1432ec1e728dca371b3ce106d6fbb44b04000000000000000c0000000a541f030130a044a81369068bafeb71187fc200632a01116e225472b8fd8a1bda895c494fe1577d8ad47d0a0120205531ca586e4498266dc10c1d033aaeed133e2b2410b2925352c7a5b466541a320673b1812547a51552e270866f43d36e1df827190a916f5a06f6d0f91ae12e6541e92b461684617825f30e2b1d7a3fbf3602000000000000000c000000346c1b1b479f39619aa318694503fb5fe9af667cd85a950ffbc74e13d3635724c429ba09a6c0763fbaa136124a0c4731d1c2cb3f0f3efa09a3ec5f48324a3e2b01000000000000000c0000007cd94e5a56bc611e3b6cd533c4f17a08e88d1113f31e7156a0cc317b394ff535" } \ No newline at end of file diff --git a/packages/testing/src/consensus_testing/test_keys/test_scheme/5.json b/packages/testing/src/consensus_testing/test_keys/test_scheme/5.json index 1a4ce3b1..097ad2b3 100644 --- a/packages/testing/src/consensus_testing/test_keys/test_scheme/5.json +++ b/packages/testing/src/consensus_testing/test_keys/test_scheme/5.json @@ -1,4 +1,6 @@ { - "public": "b49974250d03bd3e7134f837d6c4b8508e7d281bfe49c379802e0e3aa44e9e3ef28eff401cdfdf144aec9215fed9a921cb211018", - "secret": "6d4ee65661a83c8ffb014206eab5a602ffb2dc1d22e4b1732983358bc3c0a134f28eff401cdfdf144aec9215fed9a921cb21101800000000000000007000000000000000580000000000000000000000fc0200004007000008000000000000000400000000000000140000001400000020010000ac010000f80100004402000000000000000000000c00000047b7187e92d4ea79728f8552cf664f73cac0da7c99772013f65f61050180d822b78758483479541b45c19a690b2b3942f9f3e614c5c27a5d9b751b5faaa4384697d9564d1411f81e4def502243f71a7774ab953404ada97ac568eb27369cd46e6c35aa498133db201ad1ca7b6f630c1c257e6248874aed0fc5f3b817873772658e720479e4e00c085984123faaa52165773858368e6ab418f3d5af262f55127131ea79446bee4d6f0b1e2f12f3ac7135748d4f0a6360ab59b31e01223cb2807b178edb7e3c25bf56a07b575ec4c4e763e92f9f5be04d25548f79a0446812b65f937d11627a4eb0538b736532346cba6fd66f022c615bcb5674e3d4604295772300000000000000000c000000cbcc2e616c14fc72b01bcf490bdaf96902f05e61700732419c375d2c8cc3aa06347d162d09869139c4cc00328a853762076c8b5f7d80b40b5f6b3527092522516dad9176d15af1736d92ed74c2e25039d5451e525dd1be56f750a54aad12092acd2f1f4a77a36b7bdb80e8769f878e005e8b0517acc7bc462f69c570379dc32e00000000000000000c000000f192d82f3d02356291534676029c1465ee8397022f2d5b66ee79077c9e05c73f095aa01b8b205a209d1e0f4f9163c80f7531db7c121b1d18d869a8009ed1782e00000000000000000c0000005b6630475c97a822382ea25cd6e8423486817510a392f27e8675605d007dc04f11b7034675c9731f6c90cc2b780d074d78766b7481558e65aa629b0797f21d7700000000000000000c000000b49974250d03bd3e7134f837d6c4b8508e7d281bfe49c379802e0e3aa44e9e3edc913b2724029f7145473125f581f063170aaa4c958b854bdaf8eb06c5c44270080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000851662327c6fc940a42770524f71d326bdebe56096dd481c3fbdc76f2e8edb77f03c1764c86608560d36f64893153b1b8459d90613ddec76fa77da7c926c7651a064ef222d2a753b9ae9bd7833184c0e5a54b4061756fb197780e636e83ad05a4e6b326221757b68b3157d2e0c90150373632c35cba5447464db525a5d3f4c3cb11d492819ef4a383e22b56b581d646db2d1e1694af99b450306bc1b94f14241aa354d6d34a6a64d46e9161be95df3098948da3a33fc7d1a6069194055b1be22a9519a1d55fea846ab3a5c38f960d4123fb74064b417794b4f91e1006696a55063c36507a035c15ff702ca361248e577b3c7e35e07c6eb37bee73c2c9281f73174aa831087983f28967f97247b19da65e04c167ee1de1d52cb0db868a0c71143772d377443b93704027b6e5081208470fb844d32ea7ee636737a93341ef8fe6ccb9ae139636e3958c07c1d1d240eb853c6350e26e476ce2bae18f506491f1b0e7715ef373cdc4b4820d89044f184f82686f11d4cbb2a823c16c4e1033b9f6474a6762613fcac9771d7c93b051f935319cd3205771dcdf318167c0d41b2f4d92fcda0b474b2f8eb654ae52a7218ca9039bcd03f10161877152bbdf8682d84386364776e76f405583df0d77d037793392134b79864050a2b237429b5794e860e51a7843806367bb775378c403052dd22525d7f6075fd22b909acf20d68004c665400000000000000000c0000007d741b2b995bf436aa764b1c3029ef3f4d8d552cf9d2cb23e7bf615471c37844606899709c6a6b173c08bb4cf374e23e74a2a41989d9243154c96634b5b9da2a97432c6a00b4b43d4a5b9402abfb046203fbc3319dce99173d83081b9303cd0aeabb4a0adf1f420a0b38610c36d601108b6baa7c992db1110f6cb2491a9ab54b1cdea53f258f7419547fe535fb78e4652d25aa2c44c20110622cff046af0042cce065b582fa1317a2fb73f528c881008668ce10b4b23f42eecb7ad0d319b7f168c747e4531208e7c7b1d432765ca810092089927a6eabd38cd93733d80938a1e69776c25e1d83547697a62756f9cea54c0b9bd45904d411b0bcd08404b0eb14400000000000000000c000000628b077ec8451247e63bfb05206935754796495a8c81f20c61273820aa2d4e1661a6764e690d825e0c89556a4e3d8d2d3ef41f244c06fc03b4335175d0fdb221df219e5edfd6122e6defac3db58cd85a7eb200210cc79a52b0a67c55978ccc2c1834632c9b39d41adb1312619a076b6a27d6172868ff780ade29ad15e7b3076500000000000000000c00000053ab181c04288b1ce0134f2e57cf2b0a225cd51ce8e2091fe9a8a80aeea383149e6222776138ec0d81fc4238ceb2552f5f270d6f25ce1e2ef2606e030742e52000000000000000000c00000047b7187e92d4ea79728f8552cf664f73cac0da7c99772013f65f61050180d822080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000ecb0f913c99cb12f2c957f4768a34a724566ea7d031862383c53d14505a41c4f848ae344104608491e330c1291cf387d7633726cab1f482d54391627f21a867a752c9a218bad3706b43fc10dce520b45eef7e37db3efbf3d65d03c5ba9798e652f283c34cd6d7e5b0cf0de0a28241b14d2fc8f6f61688d083e56fa4ab705e302b69fbb24f092193eb660a16ea21e890bc98e932cd672db28aa3c7e2d91146627e5ce420182d69504937d86068d18e8786ffe1043607f144b2d317a5ab5856575d00d870b2f5ebc73a7bbe70b8aebf9401dd94108fe6a255301f9964fce531229b99bea570a8d5762db17d929a535d55aae72f12372ce477db0b71c3a75cd6c4841419656eecd60145d12f5217a041c0985ea972fc033f10fe9ee164aba16e50a5f5ed80154aa6a2a7f3afd2f083a583cd3eb8d106233ff1dd3fc7a054307b867b9940e12ee8ca03a4e247e3fe9de626ef5b91140ffe6004a7e321f3cd551ca6140d8051215263367cea0d27d4265167dadd02a0c79202b5ac7ceda354d805a6af6ad4e0f8d3a5b633410914462a9622fe9296f040e0dac39c40fda766c6f3a5de2768773284cdc34b02b5a4de286ef6e77077b79a52ea7689c2db66f70a38d2a5ede320f6ac72d61fb6e235ba05f83667d2f12566fd1b419cd523448d01fdd4ee335a960a497fe64a05dbe76c767cb36971e7077807f1c38b12ca6365c73673408000000000000000c0000009dd85e084e576b50fa3a7b462c85401cb89405112f45637b25ae8d6cd3b6d05525cc5b4f615e1c6bed2069341f3d606778f87a44d796ff10a47bd92d90decd6b523f293c3a256a43f5c6726ac818fc67315c634bd4e2745ab59d5a5a75f47b7a46e0a24905d15720c85d7978df3dff4e6e6ef162b6f3ef32b7aec2676c0731241b7c114f758e7677f794604ea9b95a34758d7e06833fb83e49f1940a0f1412447f31346ea7f1c14dfbfda92fec63cd5029d2ce2ec6a5467ee45d682af16a2576cc7203246b24014142e2454e971d38212ebe0b33f6f728688741e406eef6d57c11cefa03c3579e15d27c7f4c5af5b63ba590c768d5c3f70a3296f761dd3dcd2d04000000000000000c0000006f41f51f2998d87575de6451cf1fe74ad2c3f97dde6cd4575d0f4f3fdd86c25157e4985b2e8969532791f657e27a56066fb93e72d72b506e9c01d50a41a0ec59533e2755fdaad620334125160b2f6d0d9cabcd614740b93f71428a23ca1a0a0ca0172c37a8300109e5ca1571ef154562e8a8776886de850aaa6a764180db773d02000000000000000c00000030bc73120613bd67dbdc28473be6f61a7963324e32b0fe52062d591184c1161acebec33275eedd694cdf8a44476fe53f61cd4a1fd246d60c2380dc3f5063c01b01000000000000000c000000b78758483479541b45c19a690b2b3942f9f3e614c5c27a5d9b751b5faaa43846" + "attestation_public": "8211d250c8c5e55178edd51b6657a50a21b1257898aeaf2b2c48524cc796d259056b0769dd8c434944b1934ddcaec2462f3d5839", + "attestation_secret": "d732b51af33e514f4f09c90735c48ce9bdbfd6b6b25b2d9bd0d69341c5809129056b0769dd8c434944b1934ddcaec2462f3d583900000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000167baf0e35b69768ed8723319e5d93470e8f4b722e289d6529bbb04a0676ad3d5cf85668ea3a447bc746275f6089843f6f08400261d5722216aca13bf1bee82800000000000000000c000000233da41df8ccd123e26b6924bc20784780ce85712a748057bb7c7a740ad03e4db8487151e8529a48673123076b80956b2f6a0b1018ac9e6277321c3e524d8b1800000000000000000c000000c5f7c7264a41281b8c1deb047697012457681b404a34f67bb3c5bd1a2d2bf63c20c42743dd55e077acbc3a1612ac886fc033225c2e6ac01ec9e872386ef0300400000000000000000c000000796a540fc4c3626a2d6a217c5b0e71590560263125beb92651a14c7be5649051674a541e653100096154987113c2c1424872f300a9c35f0c25f93023b564242a00000000000000000c0000008211d250c8c5e55178edd51b6657a50a21b1257898aeaf2b2c48524cc796d2592a43b074aac41365e713920407aae957fcafb103cc9f730e6cee2e3bce0f9c70080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000663ac75e2dfe65527519fa7a3bd13e49c2b5665d92fdd309cd45c13a8397e460b5e15a4becb01e30f6dd3b1ff0c98c0ae7d6c01075169f46e22b754359c9a63f36aaff300ffc394162d6dc27c946c5248d6f5a3dca0eb132d9029e7150bfb7187366aa07cc85d6333e0e8f1f2abeb926c6be6c5ad058351682b15418659f2b2e5d462f7e013d145e1ae19b029540d16073eff00bf030fa2577615844ec0d6e1ad135c358443cee39c3ad9738030a72432f2c3f43a490652fe3a2144baabd3229c657a3383c9a16485853bc4b5d1db521fc146a0a0bdf093afde7542672acfd4b0323a5265a031001591b1f7356713a4ca9a16363c9e97e61f2b9ec1f98abd26768fe626a26994741ca68585ceda9fc7ab4204f17c83dc17e472d8e578a66de30fe543c02d11e6a1c1dbdbb3963519b7c2299df4845ba9866bb8a4d0e8027cf03f5f4ec5d1d4cc74da294ac556d345f5bb53d631e7d250665c5fe9c0014571529a7284a6a94d5623c36012e5df7f8d976ac52dd69ba52697174a8f03d9d40c10447d39f6a6aa0c262cf2a937323ec2a57f6f69d081197f90787d50905c4fd1579b5160e5bc6a1c429ceed6877d50a0c6ae7c5624318b1ae034ddd5447676ed97eb6e2974a259bcf6f96b88731d37b4826863bc2030288e549039a3e725b893c502d236220faf79a1866abe00d36d3fe61d71ae744ecddc260126dd22a39091a7c00000000000000000c00000013408a7b4c9ebb56f24565347830642e8fbf044ffd4f1e662defc2407daf2230f9e3024e16b04b776d17123ca6a89b06bd3168564b3f2d4972c7644d093e667ecb1d50604ab3dd5c5039f1703c8a8c7782a4ba3517d96a39efb82a2cedb3626b7af59c2b1821b53be7b0e378e442ad3ec08df210b42b3104a1d63114cf231e3a4dc2a75bb2c1807c8140d70cdbcc2638eabde942c72909763667274e22415e4a2542a03a10f86016c4b606773be2291951bbcd2afddd9c374ae4550458883149d9fb2f3b7cae3007f9823a7c1e2c7234f555817268037147a9a6b56c86faf43f2adac61d6acecb2ee7ea88328a834b2b38b4fb28510f674063a3dc12a6a1ae0a00000000000000000c0000007194b13422c9d61b8a0f001d90030a162d0d0812c80dfb3f4e0b34061eb197442cc2a20495e1fd79a8ee4d38c503e61a7734a924938b160deae277598700cc7e53332570b480da568d827c4129c19d129759b83e1549474717da8b375586ff1502b7912a309fd3433652aa4b7567566144b65f64be185c607a037b52f460320500000000000000000c000000476b177ddddd04087b2d1e024c3969563ebf9728d3cea76941c19e2f814da658a6773c2fa9aa0762ca678e072d8b583031fc0457c1e6421b6b1e91511104611700000000000000000c000000167baf0e35b69768ed8723319e5d93470e8f4b722e289d6529bbb04a0676ad3d080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c0000006e71f736862e4c49ab98196b08c46b25251f3f57e2f23902cb086a07b2afea17c081943669b5075665f0bc217aa3eb62a2564c2f839a0129db730a1ec96a7a38e45b3f437745bb0abb172e2b76d4e156bd497f56c13c2a7b48a4d3765414dd22ec9f5b33e4e37b093fefa83990578f7acfdcfc569e9c2e11d66eb05904bcd462851c6e705c42601a031c912648df3b50f61c035b552026412b521041b5a6ff3b0478e17833037503def4bc4e74140230b5df2e264d61b70a397fda02e5d8f10f531bde7961ecb115f909ae549642410294e83e113050734c3d417174e0177857d0dcbd75e4910c18f2fac505553c767e9dbbcd4bfb46c352b06c3a6791eb5a274c215f4b5a653c6b20d23e5fb27ef04fc699fc41580b9817a6cec611ef88027394abbd27051c52166280de1aa2b6e41d2cfaee761b136e0e9b3ab375528f6f2e3f376f151b8dd662df1434608b4f015b421de36d852a210437a66f3f883f6e3630ac3c1ecc91aa482dfd6236d67a0b2444287f73367b33745e70730ea05fb20701a508087b0309627ff909555959d331555f5515fd3a746877556727b2caf2537954a24088f7e732d3a0b07162904b2534a4a572f042eb023d4c4223169cca5eafefa65fd70cb132ec54696a974b5f30a92b5e2ada3eb0480a12f06b12c9d14a6f47c364552d80132a103c521bfb2c40bfde3620852316769cb52a75ccbc812908000000000000000c000000ddd67770984db11627ee787dfe97831965cb686699b9a9092d7cc362d2ec85276f4c75225c288e4e1d7d0b386584ad583b7fe92caecaf934938b1b3a244b9f4aef14801ff8a9df70d004e44e23608d4d74a9020ba9a48c15b0ca016d1a6ad13c88b6a07a833a807aff9952524b796561d92a7c5d84eff411a326741762f66b19edf07d4f0f95395fcfb322200a33b94d6448bc04ae627867e969b31c267b233a2852436b8b5f5b3caee55e5f3607f94791b66b1521042d746ce9341dc337a1207e7b6540a2327a3dac2335545b82a6572d286c33457bbc38925b68015d67640c6779c7066f65f2569fa12534b11a3312144110149a824e5063fd1a2fe5f15f4d04000000000000000c0000009c3e0424eda1ef3e17529c7d7b8b67140eb1554db53aa420a805de1d47735d7555cc9a692c80175e8f2173711365e61280cf8934a14e0205efe722400f2c783f60a69a3a7deb165ead78aa533f592c0a524dfe56e9a99b1f323bbb15de589b77523c0f47e301f6592538037451ec6f0ffe41352fbea56e39434f5329b30ddd1702000000000000000c000000c84aa351497c534aeb3e0313b09a504d07313704cbff723d866d9b2a60d9936c072a3a5d5100765c7009d51405a264208785417a093acb0a365d6d4af9f9e60301000000000000000c0000005cf85668ea3a447bc746275f6089843f6f08400261d5722216aca13bf1bee828", + "proposal_public": "b1a04c55e41c6c7347f37979b2cac65941619336e9ca7d210bb2916e8049867e3e66997e9ed5db6d875a10718ddb980d812bb164", + "proposal_secret": "4a19a321932712d463f6fcbd9ea74fa2e17f2e478870b45f7f636966dc0809113e66997e9ed5db6d875a10718ddb980d812bb16400000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c00000039d5d378755bdf24ecf0c41f047a017586e7da0d51c31d0f0d0d322878708f5cc17b57279bd10007155a5c7cf8442b5e8f3519025ea14b65950d1c128d68802000000000000000000c000000915e177420afc866293ed14d2bfe284250c4816668690573b83e1a02d109662553f5943d8d56af7d4709d5515cccad0b52fad0694465831e0bca0f3c935ac86a00000000000000000c0000008499c71c52202719d6d890128e8bc63dabf7cf0dd92cfa10c54187398017466020bea9270b74e42d737a7139cbca9a70d455d302e4627778b3bbc24e3f33205700000000000000000c000000f181f85f0706992d921e163397d9ef076552ed78405443633c86ec014945b570dde8b264a85b99380bed4b45ae11be61f2e1c9126dacc5254bea13210952387300000000000000000c000000b1a04c55e41c6c7347f37979b2cac65941619336e9ca7d210bb2916e8049867e17c9ea49888c6f2ea6a16650b8624d46e564e64d5f217a3d0ddad062446a4708080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000ce815b313f53c85d7bb52c6ba7031e3427d2ab6e6767793f8866a60bd62f4a58b8963d7c8869fd1fcc90473a68165123da0df566d0d8c244f9b24507f363cb67ad1c202d97ee53420d03da41a354db738212b3521cd0e87e194287691e88c755944ec64bc850d56d09cfdd45c54ce76ac00e99035a9c29078ef1c101363bd7776f38997cccbfc7513e8deb7deda8de5d7747bd2c12ed8a7a7224481f6827ef3b6be4cb47955e480eccfc3071c11c1e25a9a41c2f1ed56f283e07093898f5585712c30421009f4e49bee61d6eebbd13408b58cf1ca400e64260ce31412717d9128a484c3611ebc62b319719071794c41f90ee7642b36a345f76caad39c1c6a7194bf3c569bf53ef489ddf5f5211ae140199bd3258b7bf50788001cc12c1345e6c9b09606c846e3f5932caf8268eb9e00e58c8a43d0830c946e7b81324ca937716686fc956f86fae100124bf46ddc97010e5ad00366e34a25c3a53ac1cca16af55b35e0c73e23dd312fc461f7c738b8d4fa1d85801e0837e58afc7db7b7a519a1956ac4f356b305f070254ff5b9d7e3963a2dcfe46094df14ef7aa1c43ea5507219185db464eb4e65673fbb975c5640d014c50cc3c03b6f22a1793370a41525e725067c5448b86315745b5ec5372e0193d2b54b92c6762b41f3802ff51822d4e717eb35565ffe1163069a71e200e71375c89ec99386814535b502a0257fb44611000000000000000000c000000cd3918430a329b1308d6e70b337b7d152843322d85c3d0231b4ca662aea65968e223031027f8b5760b1c2808ee98fc440184bf269893405a16830f77fd26fa5517eb26184bbdc93d7987d32f92727755d52bdc51622f9c2862180959a365a13943729e46f0679e7d29c2640f6393dc6ce67fc844da6d840d25bc3a185e525202d7ffd051d8ae74483ebbde789576a80e7650347a40e456214c49150657c6263c993b4411706a4d2e17580a2eb5dede160012ad66f526e63b864a5017952af1768fcf9b5d87d52c77bc4ebd3d4b4d896e92067917fce7d51f26262d33ca3bf31fe3a1a405219fee57eedc453ba80b0e6e3a9040202eb1dc53aa916944056b415900000000000000000c000000434b9976cd96573ddfdbcd54b03eff38cf614d4d9f63d056e18f1a346ca8560c887f580a6e922161f6347b3d2a858329463ea9012da5d2457f4c39649648935a59ea0863a6035d303d352c3addb01f0933e4a35e4e14501ebdbc690abb21a94616f49b3696cfa80b2772213fafa0515ad64eae5854380a1bea0ee049768af97d00000000000000000c00000030193152188adc216fe2de00671dfc72090015367b423966f9902438fb13d20d85c9ef021a87952c5a2f8a131758e313b04f7e753cada16f04ed8b626fb0ba7a00000000000000000c00000039d5d378755bdf24ecf0c41f047a017586e7da0d51c31d0f0d0d322878708f5c080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000daeb982c9cb273645227655c48910d2976122b1a0c140f002565c93f8b58686482d09e143794ce1beef1fa23eb268e74a9ee2a74618e464b4eeee4269d2d0713282a9d0858b73d3ed10b3a6c980e212c5b4ac72e8854625d669f802dcfab687810b0af4166b79f597689cf1858770977f7431c2c78f0b95b7459c510d4a67f2f032b540e1d146c59aca346684f2cb9347eb95b694b47e001ba04942f1e47894a95fa3d680d70e36ba2be9e26577af17ea7309912382e127d7fc628618def3f4fb7b55442e7e5c838c7af6545c6a1462d0e1a5f3bfda16920857b270be57ffe6b859cbb11c624792970034f43a86dff3d007f93493af5c16e47dc8012bff8502ba744647b16ef8d3bc353982a570a5a3aaae175090be1193e3f782401a320cb2397cf0c592f0e4b3ca0380a106298d521d08796322e63ef025ea09a575832bf7a04bfef03fb9ff934e0aa911d02fa59747f28b72346cce6564f9aeb1dc6c9f57ce7def321fe566e51b2a19234467753734e444d391c0c932d0966e10083005d0e1cf51a4a18620e5cf6fdef5b63ea5b32bc3e812ff50df50a0595507ad4cd095d0e2bc032e23705021587cf36a45bb925bba56d7e2a99e51e890fc6616347eb5cdd3a87495a38b8757595143051eab309a177f64d733deb678641233fd97afd3fe40e167cf80f41044f514f2f96c8601e4b3fa3563296aa4f8dec673aa34e751f08000000000000000c0000002b6d5f3b8919760510ec7f7953dcf33188d73d4450668b7b78cde566ef50a07da180a527e948774600b33a546a051d7612cf9c67149fb54e699a550912fb860a29ef5a3d90ad3f02d5987c08cddcd95922ea490f76e85508df36b57310af0d786b320d3334c0fb0f6c9b90693ca8523fc7be2622f3ec3b15918fc46b0a7c2506a1c1660201a5c1743ec54769bc4f922e351f2b5c5340c73b870fa66c1c1e9611a85d4111b66b3f1d6d0b95299d2255368d15516be115612352afa15de176540494c2ec603be0b714d423812d8235097dd0a64d60c74b7f625893c65e0932ba4ac9cce802905df5051bb77816799b620dcee3117db6e64a743d989c628b66a82e04000000000000000c00000078814b61585f587c3535925b9a839d3d2bf4b92d1b31e71fe7cd027d253ccd57e4e3150106c814360309c47a3e35f872b53c810e07ecce0c01f9f05866170f061120176e043f3a4d37d7be787a744c15b261714130d051105944667247c45d77a4902466d3a96b685cd947679dc40a617ddc8125961f4b4b5f4c265b7883900e02000000000000000c0000005e45283b0672ea4d07bfdc2e0458df0ff45e2e345331f6372c3fe631ce42540c6840232a94dd9b6f1943bf4a27335c5c1eccdb126bbaa542fb77771e7fca697a01000000000000000c000000c17b57279bd10007155a5c7cf8442b5e8f3519025ea14b65950d1c128d688020" } \ No newline at end of file diff --git a/packages/testing/src/consensus_testing/test_keys/test_scheme/6.json b/packages/testing/src/consensus_testing/test_keys/test_scheme/6.json index 527dbda3..b497ddbc 100644 --- a/packages/testing/src/consensus_testing/test_keys/test_scheme/6.json +++ b/packages/testing/src/consensus_testing/test_keys/test_scheme/6.json @@ -1,4 +1,6 @@ { - "public": "6b317420f5706a72af9eea12e2930d47c5f52b03989df1611c08f86acfd06650f9785f34779368016d42b30e9d3b47235365a83b", - "secret": "6ed1bc8eff0edee334be9c770599d645ba6209345f9fb34029f6635f7bf63b07f9785f34779368016d42b30e9d3b47235365a83b00000000000000007000000000000000580000000000000000000000fc0200004007000008000000000000000400000000000000140000001400000020010000ac010000f80100004402000000000000000000000c000000254396718a1f28785e2d9c2a6b41633605ad0a319acec2786a743c20a21d67762a6e082013ba9b07b52af430fe6a792509bd1d1f0d3c5670a718662213650b4909d1a9409323091e39b9261f581f4e49b62ad200264c2d140e3dd90d7d86ce092dc9e024a30bf82aa0f4a73e29ae735b0d44972e5bdd7f0f81feb316ae1f22137949571439d8dd22553d990a6f030b3d3d779914e638e72b75d68f5b8d509561698db11b54e22026b214603c85b6c04a5d20b4590d1c6d051993872678e75f76da09ad0b013dd55bf2440c1ad693e16ccdb15b409997254521566179dfa88208bde2f524e8efdf2927cba02df94c265e781fa252ca739200500d162f1226d67500000000000000000c00000005c9b137c73341012087d76284c4bc318774d461dda9744e23c60002128ab5553c64f87b86d8714f1da07b71ead5dc53e020b971600abc43b585b95f1dccfb48382f433e5dec0330817e4133e08d2c79adb253218e4e484bd0249164d5561622334c4b59f5f9001c8acf205bb42957435b47ea1fc458176d416ed3390487944600000000000000000c000000fc284936753fa3746b6d880873214105da148a3f55ee51784a1f741fde62855d76bf3b363592591a25fe0455af28b6666f91711cb211d8537076f83bb8d4750f00000000000000000c0000000fb5a236fecc935e3534900ffe9eea387bb68a153c97a260e1b05e1de2e255267669945a5d701d746a89314481854614d5d1596360d2a06654c54b1825ce523700000000000000000c0000006b317420f5706a72af9eea12e2930d47c5f52b03989df1611c08f86acfd06650759192563a721b1a9d490c52c5bbb13789fab64738bf512c59ac404cabbcda7d080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000dda64f06ca862451871fc933488c9644adf5f74021b29f39b49a84588d46612306cd551cbc17231d62f2420d4dea51610bf2410f02c08775c5f71c5f4db5c105a1f3b04758d38c240ba94a53302ee17797a4494308e4342c8a35916fb6263d74bb4e045b428c987722161b6aaa7c3445726d297e46f42174ee0bc36e40d1de01f605c77858935615a12b7700606e67531e2c5c623f3717191f89e866ede37c5063ff776fc0da4d289f299b74734c954e7f04516f02136e214446d5248a39a75bf3d6c5108d5511776e5741101883ab32eb51b91b9617ed71dc95000cf31393167e30a93082891d44adfa4537d6c441243a43ab57dcc80b53aba73204fbad2663b063a572d05c79758055ce6f99f9c817021dff5b88fcce5cba87e73b4cf3981a1ab7845fe0cf8431c714b47ab14aa62c67da824e6584a87a59cacc435416007b493c2123cded0974a8137d2f3880773687396b2582458a4404a0f34d9fee4716cc10402fc860e727ab21863968200479771a2071c0e24c4c74f9e822959d003f25157f18abcc264e80b3476176533319f152da4d81eaa759bebdb53b5dbd620c53187308e15ed221f758426ee5ff1f4e6a4e403f57ef52760dc9f369f76336390e86ff6bd5b4bd748fce19668bfbd07929a74c6987817e6458a31f026584dd43ab812029d110b027b9f7d120f42e953762da921f7b393f3b0728a762c7b4e44800000000000000000c0000007f046c6b339b4d35df9a56642244011955751616265c32392d646e710ee46f24e6c75e3c93b2fa135c004d3824d4ec248c840b352eb1f6333ebfca13dd8f0c624207a0676543240622c7791ab757705f2a303a703a07066ed7521b13e9a56a013a61d43b27273f3a8173db1540370d47c981fb0d036524426f95ee3f856e0978711bd95877fe7b73f2114950ba4ea33784fa9352ca50f2769d22bb6c9d862167582f507bed0a9a3913f90f2b98852866b258bc23e8d03079ef4407265e9e2b3d1ca1632802551e4faf069a4e1dcfef57269cc8653aa0e463a0ee281d7e39c877382fb34b83e33a3058897b26e2432f045624c43513f616119178c93df50c107800000000000000000c000000fc46de3c042b256814e7914de8cf9a3c3a6eeb0877ca6249c338bf55762b5e2dbf769a7a964dd52d0412a61852b2f23d1ec0152de9d17665eb0aa508dc698116a1bf28097152a77c0e449a592577207a13836617998ec44ddab9803b7b46f34b1798770d3e3a22110c1a415d910d2f400736a9650129a97d4c252b257d04c43700000000000000000c000000e37d5b0fe44ca079133b90411732fe108716ad3ac0eb6318e42742037b14804497bf6a2aa60be30b5150670d27d9a97d2d9a8842b43c411d92a85366e8ae4f5e00000000000000000c000000254396718a1f28785e2d9c2a6b41633605ad0a319acec2786a743c20a21d6776080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c0000000baaa9782f1516525d003b3f1373085dd2ed3c553aa55f2fb47a7d3ccd963a7b2016383696873c1fc9de2d13c32105198ff8a4024e7afe0ba1aaa109b6a2814e14700b24f51d5d06cab18d42df1ce7781d4c4759af0ddf5556e590702904465648a5e40de6f6fe1b4219c706e1dd3014a52ed4539c78317d48c0bf048a99ad36dbb12e23a70e581f97b9ae06facdd94b20dfd639024c58039f88867105fd56511669384a84f70b0b386d643b75645e2b22c45d1b9fc5764bd7766b0e54a98224f5f82a51af3025148d47f635a01df05083b1c331d0a033462445b605fec226181a6c44542c95141afc0b467af5d2f13e90805347e4a1dc214208d836f660a843b205db621b78d7724dfa9011dc47754c0b2455370f15893e5ab94b78697c5b7b3f3bf8020cfa90388db9330b0c942e1eafeb81027549587d4eddc437ee98041836e4542f7cb01166c6781f6d0ef9274e422f754c54622677e889592ca39a58749c364c6ad9ba46693ba0961a2295a442fe93ae3550e99340c107fc518ecd0240a2a4dc221c4d7440ae751349ff2259568225701b3d87f41f839f8b3b4e5851321727471d2ba3d34c7494601ac9a5493c0a78ce376767ae31523901029740c00a74bcab26dbff343b7b58d624630b4847721ee546bab20f662c4e3a7625c9232683ed792f077ba0264231f43ca416231c2087d349b9f1744e199032213e6dd05308000000000000000c0000006aca2d077650350c26b4ed043fa8712fab11540ece4d1d691ceb717ef397dd174ae49938f2602d5e855b1b47e9bd2405492ed30da2444b50910bff2e5ceb2e4aabb5a93b7135fa5f8b3bf03ad2dcc93034d9d33ba31efc1a7a0a3e7585cb7c71f07dca143bf3ec5ae044830d724eb04b81648d48db7a2f63df617a2ba834340e9ca0e40db3737d0545287e64203f751e3f44841facae521d9fb74f086f9f803242aa557b91307208f6e0f82a740a51398975df1cd2b7af3aedbadd461b43700c861cf77bf2d7c013a55a8912f710594bf292a963d52b2018ed523226fb04656df59f8f7cecd7c635ad718602add2aa63a219e52242072a025d3ed63c8ca8656604000000000000000c0000006591a520c23e105d269b43091e674646db51c13818ccfb4bc055fe11f84e59775e4fa757bba05e103284a342071a596216b19d637aa6187a688f096cfc964e10f86f5f5e1533fa42f7fa2726929a693e58852b5c1d0d2c2607053741dd8a10417d03496a1c503f4e41d5374071825c0838076f0114c8832517942112e926582402000000000000000c000000c85f047050628d30a7b1e21eb439935cbf77cd38ad195f32083def1f88ca4e6a25396531ae77430331277f66fb680415a2bb15448708aa5a3bbd345c2ae20b5101000000000000000c0000002a6e082013ba9b07b52af430fe6a792509bd1d1f0d3c5670a718662213650b49" + "attestation_public": "9629d25415dd57261bd9a041e9afe7089aa7f548b9023b580d466f7239ae5b53a24d5e0a307db6420fc2cc67d1435c0547dabe30", + "attestation_secret": "d68054521c9bbbc0c63ebcf3d85de1651e7021a6628e9efea5a770bf98acad04a24d5e0a307db6420fc2cc67d1435c0547dabe3000000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000f80f8b31e787cf70af02434b512c3a57d950b639f882c8772e950e4faef4ed69b3751e07b87e5f5e624faa736ce1e62a3a262d6721c08a5bca22451adf78282400000000000000000c00000019decf220252e26aad0f770423324b6a80a215477555aa3548b2ac7dfff46d4dc0697c2712de6a1718ce535f7eb13f5b2bf2bc1ff4298e35038cbb2456b6124b00000000000000000c0000000504a2011237390d2a5f9e274a7cec1532155926afe0667bdbb7b9670923225fafda3e5371263710703da71863cf55516f6801723fef352a6f09bb384e23ea0900000000000000000c000000a3f9840d26940a708b90a049f9e9e01450b97718bbf0a8001fd75335d2807600d418946a72910e5e8ace79087b01bb35647e9e3f17525010db3991330fbaa82100000000000000000c0000009629d25415dd57261bd9a041e9afe7089aa7f548b9023b580d466f7239ae5b531b95c8334d6541496fe5fe68d33f2312ab36407a117ccd634a6d4e20536c3a66080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000ae62b47562cefc11a682b4099ea61e0d3eacc25be7570678faa829089c696f11791d8f10647339047104500b17e62140a78d616390afa83740652f683747350fe001920db44e5143c37cec662ea807266c55a20234bff35e4fa5bd3f6443e9654ed2450df2980c2d55495c00421abf74263603604c29dd161696ae0d955978775f3c6a6e1d2b2e2d7ec56c26ad4a2b3a8e02c3210667a53f1db2ad688ce4b26b640d870cb1f3d36113e4ca52721d656a1d159b109efe1445702fc60c5c51d5561eb6c8362e58695ec5c53924d17aec01541c425b2871431f814bd62009dc021bfaf1ea2caf1e7a6e817dd913d678ba3941df760bcd43bf52c1fb3704142b35137371ee3e0202593d0c831258bc89382fe162455f23be4b5faafca8587665dc04713ad77d151f397e2ccb9b262f793b5f160c7f00e0737e5135fd1935e59df3382891923cf5c7732a151748683ccee26f6058ab3e1c3261287c4eb633449968630a70bf412bdc2a16e4aaf662cf91d61c1b4ca3701b89382da27c1554ff38b371943a946465449a0494bd2437cbe77b0dd16e1b638108ca25055b12604882b43a6ee4413d0872f9634e2c46659cb7e50c29186108dc8100470ff520763039d73726347a0b65a6dd5507140949286df52236bde94862c8b4642147f4744e6353778d0a4818f392372d71f0925d8839b94532733d29f612fa39839d947ab8b4221500000000000000000c00000007d62f672c15b822510728778d41780ca31e0c4bfa0cac0490c06e24a10586758a6244338236017c7843e268f463f031403f467a025437737e01f11c1839cd4eb51aad5542c2fa05fff237421430746adc20a22f6191915820057b7b69892d6250555d75fb62f341566ab168fd10204d31437e2decd27436ea5fb0147188355feab1a431a2d497328b7dba30a9bf9c7894fba220986c453f147415012ad544799acb9733bdec4859eec82b27b1b46f6404462b15f97cd8417368645010f16b3c8e4fb24909a82052cc7d1956bd0a44436d1ad156f548e6051cc5003a3cd9f333106ba6067e62d74950230d05242b8c3230ecf6403eb1190cbdafc6679ca7021d00000000000000000c00000069b7b02b7d5dbd0272233147a82a871fe17f0642bd31a259d0f5cb56af49fd63f75abb172a2ebe00534cfe4f2deb04550816df262c650b56408df24279441a4df3b3115b46c1c8139dc52c7180b27615a79a7e6540a3ed3ff7b56e2fffe1c8166052d418c2bc42662e5eff19b6539613e766916aa0130716fd0e834ecbb6f41000000000000000000c000000482ee6614778190befac3725860bd33a0dfd154f64417774c7953c08a413ca7c124b3f0a82c49e6bf8dc2c1f71d2e743bfeb0d68ab81fb323069590a612c480c00000000000000000c000000f80f8b31e787cf70af02434b512c3a57d950b639f882c8772e950e4faef4ed69080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000e124f36c59acdf15d8d1b65be745415c0c523448bcbe2240db9e2215f08492617c186049b1603d1a6103ac1d3616083894557d730d34a05d0bee297c6a9bf40db754e0783075a74e75caba4df2fade11f3522973548bb16cf0c37a74e85c381cee2672691ff0186db43fdf3bab80916ef044f62561ccfd1fa065fa75e1b5a815e377813cad8a002b5bdc9536be15b1135e7ea1387aa68c4f60fa35152c2f9f46ddbf044cb8682a1543d5ad1fe192090297cbc45b0e952d0785c316081a6990139cad62793650bf6eb23c310c0b235369947cc16129f3c04297414c01fbcb5e2e303ae04f8b7145044e61bc3e27d4bc741271a63eec120e3849dd082c7d153967eeb2b6437c94c007c28dab53aa83c870f3b2c5356222a73b890b8a5d68032d2f11104f77f16fa34ea02c1640d81b7f5fb9ab5c5b8d35c07636fef80d65afdc63d86af61c7760761976e582284514032f0c0f51026d6f125758bbfc0b3f17025e8594bc3a46607a5944e68e741abdaf72a8724b2e1293d8153565022f2c2d44356c6bc0686cdf7c7be8508d088a639f6397492105f2560e23d055a23d668432134db489282ac9a37c696ee048b5acf5772ab21944b392a76b184c4c0f307e4d3e270b545f9a71f87ca4f3025a5b732e5d2588d01b317d2f71835ab528dab5740ba59a05758232924072b28c07de718667c8a67e6f50e0f64c8688bf55d473a22e08000000000000000c000000ab33982632f73e0e9b5cd045495ec47a88c0837052b13750d57f742799649817cee0b25617899761a749a02452ec3738e2e0a44e9229d60b6146dd2c0205bb2933e4934d58935357ffcc8f6265840d446a784e4b08eb47576d39e023d6d085617a11515d3a1a4a0fd5c8686a2fe07c17a195bb3ee33506292759226ea07eff4df9ac3a6b243fb537a494473d19a07616a46aa70da7034c25aa3cef074a87cf2ea3e7ae1cfab1d7339b9b17461eccf5390ad6a721443f410b98b41674d76f0b2686b5fb4c59bc1a0f01540245991d4d5cbc759753ff27e06af7dcca4e6ada590238598570d4d8c9256a09125358a1f52071bbca0eb0ce4157964e997086ab827804000000000000000c000000d0d83d253c274e7e48c96f180595a31afa4e4233ba1f9f730bfc4c593542061d50a09902406d3d1e3f0f1409f100f556956e0b369025f615783d163a0b6f8f5ab897e83e61c0a42d6ed348009e5968094212924e97d512548fb03b3d20a5ea185815984e194e62746d2cfd4add159732d1204f5d2f397576a92b5f6d7aa9171002000000000000000c0000005ba4d516906fe063069f1b71c3622a27d738a1613ea52177bb99b0124116c84db35be17ddaf1bd10413aab1fd538645920a4363e1d749f001d5ea97e6939887a01000000000000000c000000b3751e07b87e5f5e624faa736ce1e62a3a262d6721c08a5bca22451adf782824", + "proposal_public": "14f0a56560a11e20276ea3375789f44e8c2b8100d7d7466a879a9b2f5ef419273cd770265faa826e82c32260b72f5c44e09e8c70", + "proposal_secret": "61d86520f291e7d64abe6786124fef860f1b3842b8303cc0bd8af9d84c703a443cd770265faa826e82c32260b72f5c44e09e8c7000000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000c7edae2591178150c472f36b4c8ed9311b0b69085d52ca3c8fa1061520de8d09bf1e94604eecf04673116e361923e3112240192c6e5bd773bbef0761bdd2172600000000000000000c000000f43d9055a6cbe8481440b406d717793cd541b72603209e2b401d8a1682312d7b36a0a70e2233b74236b8ad16c92cc13d6302ad6d11d6ce63b0fc4370592aef0000000000000000000c0000002f155e0941d93b7464382631bdc10016846f253cd306972672dc290ea603d041302c353778eb803525c94437ccc9ae1297b3d156849d98706d1007477198b31400000000000000000c00000013316d5803d3ad6e3e2000406db9e872f2ea1c2b9ee5456cc09f1a6831ae1c3a5e7c0c26593e0e383e75da6ccbebd622fa32cf1379e1a62c18de206a37eecf6300000000000000000c00000014f0a56560a11e20276ea3375789f44e8c2b8100d7d7466a879a9b2f5ef4192779a54e31eed123643d408c3ca9542839445545419a263b1d86437b1f477b7874080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000419b0177dd2279178ce41529adea6916b700da4bcac82b705488c13328f8ce69bace0b43349a9c682a96275ac11a6f009c55626c09b15e49957a5634bc99be1a58a977661408d4547cf877702a993361b8ba61051b93db1e2a96c35a230b243157969e06da1e3b3f3fe1d90d99369b26649aa50de1742a7ed0149e5a92e9d953b04cb66ad0ac4c24e1412a10b1c6737cbdc2eb51d391b568ee96f014abe9d50b34b3f2686d91c113daf0917ae24bdc3557e16541564fb02903c8402dda7aee385dce8a5c60adc923f154333564d31a7276637e15c93420087f5b5e753220cf197054fd087865a06be5486070a5b3c9583a389922973dc75c43c82705bf092b75cb07101ceb96df21368e5f629002062537f1845c071ec230f9aa044273508c0714005b604f836065a163d52bcb914d4c612bf35a52863b5940bb5223071b8d5114c41b113aab9b445bb42331b4888011c4b1a82d8c57d6499ba851630e632965a6bb4701a45351761db36842e523607e4044cd3e2d691b5f09e8d5736c19b323ab468a068f9393399072a01a832a3f0daeee3a1d9b827c2e7b9588523eb246235d7b245f5ab3bb4d5daaa40cd4495707f5332916ecb795078011a47427ed736bd6965066cedd476d4c1b5f7ac07b094a49530c11a2da8e28cd31d60d7f17bb399c784060d6c49f1f1532b90ef51ba061f92c8b2ca9aa615566f677412923b92300000000000000000c0000007d3bcb2c0db11811a3b1194da0bc3c7e56c6797376a0b25020e9e71ed1e9a8287209b13258a15a6ce70077660a976855124e6f3525d96a13bfcf2a60049bbb109cea0e42e739ac5e6252140d01db813a0b348c1a8d4e8749d7f558489b1b4d72ec69cc430f08d84cde254f20ee67fe7d91bf093e288d251fb1fb92004157984a7dc9ca277fd40c6f1308a061de94ce680473b276f8a16e43b14ca7260afba97c22a6e1544b8f88124baaa55940e86a155c171b786453461f3c22be466b35575264ce3e3184de236ec66038739cdf882ebbff436a8581b837bb70dc005475494f60194f2840a4c014f4e3403b2201411a03468c06cb538c32aad8552168f91d2d00000000000000000c00000034137a011962bd4d0d23f244aaabdf5237411033df32c947a4e8c32d322dc20194e4dd4cb479270c938e710f1c05e06d83edb43428f4ae52b09c4e496860501893f7442018c8875d863948698fb3185ab318c62cd76d8c1030b9a538ab954b4186faa5673854a902b7fb493fb3cf434f6b59da24dfa11156bd35660fb678380300000000000000000c0000003a3388785ba6d33810d8c6606dfa685c9b4d243d4030f16192732c71ff7a1e486eb794617ff81b7dd1891b4c91dee6407522d34743c7d344191bc6771f46095600000000000000000c000000c7edae2591178150c472f36b4c8ed9311b0b69085d52ca3c8fa1061520de8d09080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c00000003a92e1cb513645dacb2e37314172a02b6b71b725ccb9a2c730efa611c608d15cf93b15267b1dc5a0842a053e7efa03dd0d4061639d7ab008bb19824e25b5043ca2a5e669987dd324d64825b7501522e996ada4386451e604a983b13e551077a51ee114e3bb77a3bd5e96e6b49ace173aa6c6b0232684e7112645f786bc8cd6c59de547a9e97000b2b539b66f55f3e406f65eb3b3bb52734ce817f70f54b002c8e3af93ad517713e0bc66a738532775ce9196d7023ea196d0fe84e138e8571178a58450456c66847fbacfc70978b795e11adbc4dbaeb70046215e35ff021fd367453784df5cd560bc2200c4c6a3e184acfb7140dcdd1be057a484410dec39c57f4c80653d2c57f29694f514c56862f674dcfe77934ddc764b3a4ce1c7d391623940594438d1240377346011e1cccce21fd80423ef7185762ac6c0d57d16900405b85a72b8951981ace6ca538176b740ee91e5c78f6dc24026c4ca00bb7c05903b05fcb120f61a3339ca21b4319abe41e9c5d2a54e7cd8b4d29f45c4f57f6d20cd61fa25717910456de9fbc2f147227183033467d5b25e327c539311eef898d1ba0f3197e0f703a2b69028b04a9dd1c648f42d97765b3ea62539aae4bab2e3e0bdcb5731660988d656aac710e339e2770b2cca34e702ea95f3379686df617ef396e4e1e4d4141644ef39b7c409610ed2ace6d7d4b117e15166f3a6e0c77cfb57708000000000000000c0000007556f957c238406da88e050932b22373875c595c8f92bb23dad21225341c0508527d66113d945247ae304a1940ca712a0445c737eff88524961501368a7ef9372108df783af9b62db00bb3385898ff439ec4140a5a5e911ad36c905588bc37030511715f27ca10391d5f914a05691f3da2c6583a103e283c1b6295380994646fd8783340858e2d7e14273c49fcf52f51ef0d345fd6936e2273e78904951d0a14e2617f341e406e0530e11b3ecd4608258bc17b3972179d782a1a0b748019f445745f35273164ad79c0e884373222cd39ba6cff0d39341b791eef4716717f614c86cdd92087f9e726f64cd25d142f754158fd1e7534cee10df6220c222171452204000000000000000c0000008aab3c03f8fb9f238a818d08c07a7d43480ccb3d53eee32a94315b5725312137fe2ad169eaf0710efded784926779a718da3c038a19aac2d8473913943621a5c2222a17e47ff1b702b0a8c46f9ab5c395c81026de975182f9606d309a888064f9bc44b6b716dc91544066e3dc17fb2329fbf026e77ff1b08ff1f292ee8c73b1f02000000000000000c00000059289e50888049770beed3016333f875f7840333b6e2025723401014cb03196b0e9a600ea735f449c5211c6fe264bb3bed0bc95d71c26b3695269d623c0dac4101000000000000000c000000bf1e94604eecf04673116e361923e3112240192c6e5bd773bbef0761bdd21726" } \ No newline at end of file diff --git a/packages/testing/src/consensus_testing/test_keys/test_scheme/7.json b/packages/testing/src/consensus_testing/test_keys/test_scheme/7.json index 50c5292e..0fbed6a7 100644 --- a/packages/testing/src/consensus_testing/test_keys/test_scheme/7.json +++ b/packages/testing/src/consensus_testing/test_keys/test_scheme/7.json @@ -1,4 +1,6 @@ { - "public": "eb46e02041a6da07a5bd3c2c40ba6b596c9a6902571ef520472f964ad4812532db0a1240d7f7976c8910f333d4758f104519b107", - "secret": "5da2bdbc8e89dc1d0b4f3aeee3f7e11510fd3f32ead2075107b4fe82c53e7a38db0a1240d7f7976c8910f333d4758f104519b10700000000000000007000000000000000580000000000000000000000fc0200004007000008000000000000000400000000000000140000001400000020010000ac010000f80100004402000000000000000000000c000000aa50e47eb464526d60f72073c94c9961cb3d3360f9f31356e1316420b6863d20605af2439103c647d681c03ed715c87c601f61477638ef3d4cce5307c11bc2003362aa1ee3b313785e164b28ead1bd05775c57388af0de08be91f047ce8deb461fc94d42345a40267491154907101624673cb4698041135fb993412b1c146a1f4ac2f163d4e25d4626ace4709966e658b8f84524d5da33012b8949074779d34b924aee06cb945c0db5a5f16bf5b1cc52ebdcc65b2edbf55a91f0ee3d3496cc0e2cfd52550a7f7e6f9a48fc4da14d661189edfc252962e1284295a14544488a3c79600123ab8bd61b7494f855f5bc723aa61e66100e32e659f886ff29d5203d3000000000000000000c0000000926da648c71d22100a60621e9a53d0810b5012223e5ee0442f03f03ea27ea41fcc6ef08b0755715ce77bf6d5a299a0e40aa1d706ebbaf3086ee992590eabd214d47ae4fe8ed946611149820dfa1ed6d60cc3f59f9c0d3148808710cb3b54061e48f93594bca4f53f263b57411fa857a56fca4369a3fc66d7adc3c680a7f5b3d00000000000000000c0000006aee33778b31962a77ca55739545705bc47f8851c67f2c26e2140a2e5bfc3760a2bd954f540d53336f75912f97852572dc049411290ab62e3cc4906c3888402200000000000000000c0000001f1aab6023bfe35994586f24b228f22ee065105acc631c72021cdd6eeb3b6c71af85861f3657a476da19cb1d41f11f31a2d6f3783957c70c2f62646417b1911300000000000000000c000000eb46e02041a6da07a5bd3c2c40ba6b596c9a6902571ef520472f964ad48125321e117644730097443610014bff669340dd223c0b7415e03d3ad6b9072ccb5b24080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c00000090ecad7565c88664da7088025df51359fa42c42238a5dd109c9bb3768b0f3207a2f76e0aea0190624f5ccf41d3d5ad319f07421af38e2d2800902c3bf913c67a30c5912f31e8696d13eb0f546886915ac1052565e9df4c46aa556109e28e647afd4c001b65a01973fc2b8e64921d11100d78146457c40c07aebbee5dccd88a293faf855451a51f274057fe0e4fb7a203508fe2266e36b00c036dff3dbae0ea1ba48f4e620d6e615fd3270804d3260e0686544b2a1d474a1da4ae2a1ff93f953943ee3b11f219be7479dc9a52502f80016fc76070f4116832a7c2f21b69c3dd380893885fc8c2ca004720273c0c015c2bab77b028e57da4791a6f8d7846870633bdbac051edefac1a2785f1718ad5e85bf8a9da69053ae209813a342ee688e968325b994d7b7ad1263c4ec764a215260909250a451809516318ce8d593d27ea4d970c4a0d9d8434734d606b0305d4173c58b96b6bbb641426f4a12234acbe9c351bf01e0429afe4331a6a582cb9bb7f2661abbf7e00d56519ce81bb329e5cba7364ab2567ecfc4d4f77478043804ef33645eb3208510e4226e28f8e13d6a1566c669d565ac591ad3a2eb2b10e21cb7517926dd647153c253c39e32a2841f4937c5528703eeb23010f87ef321c584226049a3e043a04854b5e4976b2350d4ed3265d803a4e417af97b8ec35a09e808b05a432f113c3bfb9a02b7ce9c77569d090900000000000000000c0000007c335d17aaaf02702348562542529c12d8dcda5e848eb17d248c5f6b65b26046e9d0c26003cd2677bc8e0845c1135e2047c8f016d3c75f117b40c40f3fbdab718f24af25655a8b74d56ae8583e29e904152fea168218ff4c4c208a583c475d48a7df1643b7e70360388f9248d66593787e90553f9a870b6aa130c74da081d50425982d543b978013a604f1465affd931a313ea3113440c7a7499c1644b5bae5ff2c5c3579899447497569d31d275aa56b8a872516bd4c37cbe8af11109272d4e64ab122bdcadc67ac39f2d4bfe0c2d1becf9146d009d11132d9ab1441d802641d490542dd0b53b26fb3ade0758f380297d199e3f7a631b3de135810ea7bd625300000000000000000c0000009b0ac5250279245132d46a083935257390039b50bbb30b210a3b5a23af00513c19cbbf3583956c0920010638dc084b2b33435c0beb85d21b505c2f57ae77540711c1ca56486f8861e331d46dabaeda75af1bfd41c456192ded3eab0c257a310f295086369909bd5226201c1a40059712a557c61e8544f773951bb8170bc2a85800000000000000000c00000006758c0617008c31f4b61c21fa100053a518ce016388173bf5945c272bd04c209b58ba20e924c277d8d1ee180b09216ef460a314d38f2949dd9e6808d379f83100000000000000000c000000aa50e47eb464526d60f72073c94c9961cb3d3360f9f31356e1316420b6863d20080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000fac9ec52977ced004aa28a4242c4d973d45c681e13c32005bdcb0f090c3c3d3de027aa583ad954260d035265e37f4767390dcb03e6e52d7031a8113b4421fd7cea2385460f27553d1056225e30d1bd2cb015194c54e4e62f4f87205df5fdd518534f2f1052e0ac141de9a53055034240d4d9c910fa907b0e6fa86d0894017d01bd9c861ba0e22506cc96853131cd0a1d56b779729ef8a77a40253556b1aaef4649624b68a5a5187ed514e11206a8fd7b1a9b8d640aa5ff005e290020f662ba2b72398d5a20a81c076bf86a3f3e2e7f77be1a186d6fc5d03eaf1a221c9ac7097bd14f3d20e121e3422bf716586a4cd212ec171e1b21a9190095a27b50f3038a0962827e4d38bd3c2f6c827601f9ae5a04e5047060e38284406782e82b2946e32a163af765c9bb3a3e9a8af701bc0662793fcdf2291eeecb4bc5ac770aa726af3df65bc70d693780463946de77cbf3660fd959f563a1e4da584be6b6572686f95fcaeb47606d1b263f2a2f656fca741738c24614504f12ac60a6a28d02a72bfb1bb4ea69684fc38f568d981a139828485616f505221f77036a9a7844676d95c33b1450f771c850631dc85485287bcd462962207529d9348037c023fa161414cd21116ed933d95be651669fd17b7f52d867e3bf4d4681caac07f2fe321c16be7856355c5b7c9736762ff93fc130d62dd13b4234806067e26e5ad8b1a574469cc05d08000000000000000c000000eac92b43a6b50c48634d0a3a9d309a46279a5e18c7bfa77a9f8ac64516e81c5462c2864b501a3352a53e5930a7f03d45c6e02c0607878055c5f96610f4ab0741dcd21740ac96e558a08ec13ade4ba92dbc81a9526ca8f11ce9477e4045ee24383af1261bdaa0823914bff1452192625424f1d812e8a9375106390b44b0b3d97807956d3d0b05c160966059729876a819dbfebc4a43ebd076b0d950273b1d3b74f0fbbd547cfe96442278d84c8ec3b94a1fe09155652299745595f71a06e55560633a4a50cd41db43dde28825e8eeb97158da7e672d84ff77af5b66125844362ad0ae0b60075a157c2905bd76ce74170df53ebc54d56d1a00cbf0a93b3f3a4c6904000000000000000c00000065d976636ded7814f39fc82c572fb1280af42127e44442433d64915d73af630e62f90a54a34d433003847a0574d73121f84d6c787cf91867908cc26c88363c34c7d1ee59bb64f0428d52b74108e0403fae77cb2f06fbcd086c00ce14e5e86b5454adcc6e610fb85605cc6a1f21ad222d78b73e07ac65007005ee4c46376b2e5c02000000000000000c000000d2e7af0c623bd9345d3f8239290a4a4f30469a59e6bf6a719d1dfd4236e0132187f6042c56412344b9de12238440951fcf90b34a75e9946e0c257b66e25ec35701000000000000000c000000605af2439103c647d681c03ed715c87c601f61477638ef3d4cce5307c11bc200" + "attestation_public": "7675f751a6c1821f92daa3513134d055f75b155011f44058b1376919bd623318a5ae8541557404301f3c8d14c15109654f2eab44", + "attestation_secret": "571d11ca22653c8dc50001f47d46990b948021ac520188e8aae65053c085552ba5ae8541557404301f3c8d14c15109654f2eab4400000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000e8a7222c6e9e9124b081695d42f67f031f930f6e7a026710753ae43e386efa6cf0082c63e4cec17002080b6738d9bb67a911b37bc859ea15206f9e7c3d56496a00000000000000000c0000001ea9b42904ab07392439d33c8469260ea930bb67a74e507b56bf702da2ca557b84a3065968d2d44b222bcd46651e24659438e90664164b2438614d3fdcca946b00000000000000000c0000006c149d385712ec3ed0aaeb37b80a612d9e96ce2dc1553e0c0611610422d4d75f4296e177cc9d6075e2a1310df786900e2a763a75eb5e7e25d276935e2aa4677800000000000000000c00000090a54f77060827492115f114ea71730276bc037366404a0a43143477b826030f25bd4e6b871b117d2daef6128318a229a2be53275ee383076b30d20283a39b1a00000000000000000c0000007675f751a6c1821f92daa3513134d055f75b155011f44058b1376919bd623318b6485a640665ce1c48e6a147944a8d10c36c2a35bc3b9d5508a38b186fb7b564080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c0000001f4aad20f035c230f53cd877a89b3637601c3d23ea23593a435af42707f21526cd54f62d3b9b6c2da54b89382337f4630ee56a5d7eb88a7e81e00976c1c6ec760dc03703702f2665c87d8b70ed38f1396422b225101cbb74f47d18105cff2043dfc08273d02dca2a3e1b9323f5cff47052cd7c6e1fc9802465588557ed7afe06f4b4a55fba77db3879a89d6562eace0260dfd73e6c1cc37a3b52721f490de34dee4527503767151861c19a14d3640728753fb6412f3144582e056429755cca6f4f25572ac00e4045cb41477de9a02e194ab6ec5f039b0c17a5805b4b0bb4b713a5b0181f9ec8362eb951e4309374211655597450302cbe225ff9362d392b474996787f52c4d42571737f7a776cf18331f87bce54570e381eed5579212459ae356058ef54c2cf0a50b3324a3d6575694f61d96618628b432805e5f4101e80bd17c06d0f0f6a7f7b68a0700e78cb4e323cb7ba9d7d7732964300656511d2a82e4718db833695746e7519866e3caa83002bfecfcc72b928256b936395027a0a1a3faa3f7a25600b0d66dd48c331722c565c2a175222ddb8c87538b560426595ae68005acb3bcc6b9b033dda3f421e4bfc432b26817cb0150c55d1c4950dde19fc60ea59222c80c89310f4815a2889e28306ba6b02380a0bfa27c3398209637f7612263bcd5debf8731449855c52469c103dafeb83171616db29266a790800306b6b00000000000000000c000000cac8690394c20f07d8bf4f74fe48eb04c77813495c1ce631d3b3dd3e87de5769d990116a461f0676d932e93116867f133f575075e123e7061562fc6804a0ca5a73b50222f65c5c392a2fd27595da2d401429c265adb01b67bf5dee5066e083586944df4a3ea92f20d86cbb48f3e4890cd1ccdd72cdcc42120a950d76b8148e729ff32018ef6cc57a980fea33a864f475297be43a958e5e6bab59a95ffd1a5663a5b22b511a97013a352ffb03e574981f4dec032cbef6b05a59b6493ac812f329aedfc9734b635a49f5ae165339f872042b13ca022239211925931711c0b507068875b3333614c02319411804af59781afc53f6501cf5af36d632df6dc9b8f70d00000000000000000c0000003b80c955f285a77e5beaa8394768934fc0a0b10cd6face4db132077e80ff9214586de02ef8406a498493956f2db964617231fb02d470a102bac14d1a62909c4d6eada558a994901a76e5944a18328861774f6403e9f9be624e2f3e7350ae641ee4232606aae99538a326385b79d016056c2ac11fc1ea7968fa707912ec372d0200000000000000000c00000024d8093be88f27559f5cc624b5537251931b981f50958137005bb919d23a25669d03fb005503b229f497b11cf8f395712b90fd4b7e920c0cda54f52dc1138c6f00000000000000000c000000e8a7222c6e9e9124b081695d42f67f031f930f6e7a026710753ae43e386efa6c080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c00000088916006a4bb1541a982ad0610270b45ab39a3053172f85493cbf5174725ee4efacac12cb7930d240fefd827fd5f9c32df6ae91ad7bda0473941896067c65a42cf8378082c59e559a487275adae7000f18e135728cf0737cb922035516770243bfc4ba44b17a4a4c0337ba6097cba5431858415a7961504f1633234929ce98435c62b27176294e552d315a172b6a96577ae8084bb7323067b586ed4264d4f203dc33be69c75fcb4de69c260fe9dd101041a88f737dfe0122c91a83371355551bd5059231ce3d656367df2a2001f9184aa483ea2dd8a80d63d4089e3184c729444ebb2b0175cb293da3ac5d2879ccb870e4cebc6a19f0944848fb73766e59e5579e41d14fb361744fd4dfd0401f30bb6d109d6a56102ce7057f95a43092d760501b1d516bbbacf1314c4e251b49c06a62f8e0e81a00cf882197a6d63ffb621b19c1f278463f26b530ab0f3671dce22038049eb75b37f0790be71f173327a7be5e6479123d13335a0642ccde66e3a22538609f172a7be16c1c25cd63397d605320229caa1b014b104311db654e6c100a20e006691884fb7e648ec5191d73fcc903f6a2a6313474b304f73c7e76ff2c5a7ccd20d644773bb11a1fffbf691d4644774e266b396ba34c11e9ec1610327b2c4726cccd4ca3a4d3360722c16c590bf7108f2f503441466a251998d25f639f3042d856795ac709f3169000c31a6482981308000000000000000c00000005ac337c6fdbd631b1bc574e0828d11729e95f3201f2c92cca5a1a3d264834324ed4474a1a640d4df4639d5bc622e05edd6ab56b5940f1530711256485951b26f61add62f167154fd0210c12a282212d1b2d976f228bb0490f9acc1a7da8c80dc75a6a23fab1a306b482640e628e3e0304edf238c19cb01e050f594d22d2ac1d64109f1c75739e078ca07459c07f0d4c646a7a247473c82376884559bab9a81dc354b7208961e1629c8af50ea3f4ea58e06eef5829fa8f246e5aa660e6da6267a1e77e1a9cba99511e0c6715fc61733bea2103400256ad2d11516523f3d2a03a1ec7646a60ce5a6d980a253c51e1f73a9ab6404ea7af9935a09720192915f86304000000000000000c000000bf9b692826a55f63ed48da691bbb256a80dacf580fe9be1ba357af24edec0244b9d99c0f4f6b9d181427524bb4cefe71d057357dcb677d54cf9ec17b2c110c48e478cd61e3cda02e99ae1a67cc366b3e13ec0234eca591171542e01ba1acb172f3062d1956a206519584b305706c662337943735124c661d5e93f94bd2d2832202000000000000000c000000d63dc0546d31a451aba78321de32dc08713d0c0861e4ae23272ba32d09023e507f36824e99e1f45224474b5e2b0526024ede8135c2fa087635eca55ad2a2350f01000000000000000c000000f0082c63e4cec17002080b6738d9bb67a911b37bc859ea15206f9e7c3d56496a", + "proposal_public": "3a0c56152f245f3c68162e5f21e42752a85c7545b8f6f133216d467a96ad276c2046f80d6e13a14704e50c1e7947c82651407b0d", + "proposal_secret": "ca576dfb2923da37f8d5e2b752b9f54623ae16a19dfd30e652eb6d8d7c22c9982046f80d6e13a14704e50c1e7947c82651407b0d00000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000a4025e4762f1050017acd46bac9a204a86c4d33bc7c2365ba5ef166c43eac668515d162f0e9f55129e5cd40008f16f631e35c36227fa3300610071214089181200000000000000000c00000004a0dd3e23fb2638554f325f8fd9ba68ac2f862c95de445802bcd1708b61da4eaca09f1cce83f737bdb4a33ebfd92e73ece65260f81bcf42411e756b119d525a00000000000000000c0000001e68053faafc627a1ee0d75c2911d731a12e902bd63685210ebe272637e74467b523273636b55d196fbba259cd5fde3f4e7b4d00880c580495dbdf1fccaa587800000000000000000c000000a7a47658adc21743dc45594b8ede315ef2f5934dacbe0c30950183584f672368d6abf20f48a6da05822665595ae8773953e55f3c0323e62dd52da512d8c4095f00000000000000000c0000003a0c56152f245f3c68162e5f21e42752a85c7545b8f6f133216d467a96ad276cb29a37257896c5348f3a72728e0d3f392a45d23b6863487113bdac721ab2ba5e080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c0000008de4510f51994e73df85260732e0d7275859954795bcaf0779c103393e959737218def2b452c521a96bb854a9527e6123e40951de3ff564b39417c0a6eb06f78158ae91e5628007c82bc3f7c6488c9606b05da0565fbb30d5debb86a605a2502531b2e63a97bf05d8ca8cf05cd54065901476a7b7070bd5564300066a653e165e34e4860e75d9d565ad06242abb0bb55d111e069fd52d11c8139cf1cd3c96c30c98df46537b681228bab153f90c38c1273f351376fde61709219a146f38e0f03640fbf1d2405331406bc920f9d7f4a4b85f77d45411bbe0d2eb05144760cac42a3a4d54fbe825b4801811c66ae5e8e3910357d23ad031969e7cb3640b3aabb6590044627da442e4be3c12d445c7313530354cc7468ea217d39d5fe3bba4c0710c888a276c133716ae8a03468f9d0a82496148606e27926451eaa816d1c322e5207bc736c45c4261f06f470693042565307ea8555c24c620ea125ad61d873aa1aeceeab20ed240c664a4008262cf7ef4afb4de70f8671b94a723ed3377fc9751dc9d2d305c21bb03a578c77627f932260bd993c607c4634608ad1b0754439be771d30f84cec39b4502451d07d81c2f01a809f024f9aa69b12cbe3505b07e89c25f43db03414d0e62995566851cd80983a9ed4a531984c152a9401444acecb231525e8d04122722f584f938769e27eb67cfd318b233b8f2644e432a0332a70172800000000000000000c000000d83ca20c6cd4161f49ec5a743597d359fbc3646eb2eca8011e1d8c6d8c0de81726b8ff2b43fb7444a7fc1114ac70ec616c73d2145321ef5b16f6d06e2929697adcd5bf40d5fedb2b65796b2b1c2f4517f31ccb76cbede8168c551b0918d2053140e85d1d4c3631331f39961525aa7d7a319937096368a65f5fc2591179909f641bbe226216ccf515c1495523769eed4f303e6c17cfa83075cd3328327ffc325f142e0e76d660ed3dfa231969ae4f4230c4b2c8152f14c3508f6fb56a98a25044890c0a4a65fc1d4fd7007309caf6d047168e8126ca1ee648697ce063ad2fa008e2a5da67df868b33a1c8187795ae7b15cc489976186d5e236c9115739c097a7800000000000000000c0000003beaf159c973550e592def4d9bd47d710b24db7d5310426bd468663b6b090c3ecb1b9a2b557e370cde1f726b51f7b42ac5d8555fa47d0264342a3e51a6d7137bc7bcb74ff29bdf7c4f997470937f7c1be14995390727b845ece0da7a308b68793de5c82e16c780795152a55e9b412d5080d6ce1200e5020c777d7a6b9682906c00000000000000000c000000120d82355574143f696684408881e83f8b6e600673d7a276405d345829d235583c49653a13db011110578c0b80e90212fd320b5549ecf1492e0d7631f7d7673000000000000000000c000000a4025e4762f1050017acd46bac9a204a86c4d33bc7c2365ba5ef166c43eac668080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c0000005364e202d181f30f5037253ad3b986070b997609c2e37b45317508591d8a3c504398c90e6bd8fa71f846d20230425948ce89966bf5910873e582043fddb20709a78a7b5bf9181677c7b8be12ffb8a96e98ccc01d451a1874b554d826827f9b0b65b24d16368763693d49e8320930df7c2571582a0ed5ee1ef9b0f31d069ff45defa880124b3d556aa23bd01816bbcb1103a67d4b03ed612229aaa27661cb9a4a8f64f43f4d1f2b199d3748713684b325e29ce561a1ceb459bf87386295000e5001fe4a3b8fee5e126a60cd3745932a487fce6a1bfbfbd411e8abb038f5d99b3ec0f6181ac1a4c275b5c00203548b0b47f291794cdf4ea06647b21956b6128148e2c16174a5bb4c08c26d6421fbc8a63c362a1f32d5e63a76589b8f7af790eb54a1bda33fa3068866305b231fd8ca944139a5ef0d3c99237c073d861edb2f7b681fddd110ed112629f24d4e1cfd512c37e8e4f35e3cb77d12a2a3923c7b38cd78d447c502b9aa76233255a41201bb3727e6cf900a306083005283c725bdd76d67c7daf340e19f6f63d534b042e8a4196d7e0a842c760696536f220b022678de2da602785a051e6911e052bb44d8287b22db307e43c9dacd7ad195ed70b4df1439991a7c0fec780c4273d06612e1d1f75b7eb9e164a6c01341810c1e751a468109f8627c5e8dbffd0b8c9d2c2bd1e161601ba9a54f9fa6105b0ffafa291550353e08000000000000000c0000004d0535333b39171902eb421f7ec02d2d905f2d16b950fb48addcc61f08b8a3199974796c4a4d085e077f985e6baa6d6d10b4b020a78f3c2068caf04b2c36ce5fb8ea6557c6f4f428f9a4bd25c92e56257ba2f23717463f686827d3020577a56a94b0413b82751c189b5c202d0ba1ac50552df0114fd77b05f54ecf4aa7363d0f19492f2af0c1115ce9f49a07caa1221c703bb74d92f42d2b5554303f29541404850b055449f22c72550b23748036ef17d352832b05d01e44cbe91312d29d292f1b67fa7276c8a531c6e015402fb83723bf56445b1729090c1232c97a427f1c4091a7933a1223104ab1e9144b9d7f16140053e264d5546f7a886f9d5bef237c3404000000000000000c000000eefd9771db1c3c0dde638d3978f98a413c1aa5028c3e7c1b01421d65428ee0136b26d10cb35b430a6b32fb4e5ed80608208f7e6777caac49d66b200b39fc4352337d1552bce6a24e4e26a860b8c5d0486fdb8b0b406eda1883ba4b4e08fe0b161d4ab52088fb7e67747abf20b2c8e776a02171558b597e0e6a0494069207eb2b02000000000000000c0000009222236654337a2c1b2bf7449f57c1700736dd60b51f7a7befb73a15db891306dc30d6042a79d0117029187e4f422c2c635686208d05b138d835d1536e3e347401000000000000000c000000515d162f0e9f55129e5cd40008f16f631e35c36227fa33006100712140891812" } \ No newline at end of file diff --git a/packages/testing/src/consensus_testing/test_keys/test_scheme/8.json b/packages/testing/src/consensus_testing/test_keys/test_scheme/8.json index 1e5f4efb..8caa7aba 100644 --- a/packages/testing/src/consensus_testing/test_keys/test_scheme/8.json +++ b/packages/testing/src/consensus_testing/test_keys/test_scheme/8.json @@ -1,4 +1,6 @@ { - "public": "e1a31546552ca130f01d6301503f0b57ecb2822d3a9dd90b6dff5d6cd1f97125b8657322a22c9a27093f85308bb14a2290bde67e", - "secret": "cdae536c1926ffd0d190b80edbfc6b2cdd6657f85ee7704a85a52224c7fe88cbb8657322a22c9a27093f85308bb14a2290bde67e00000000000000007000000000000000580000000000000000000000fc0200004007000008000000000000000400000000000000140000001400000020010000ac010000f80100004402000000000000000000000c000000915f34586b35bc0385f65b5f8c77480074fe896217d43a2a2d9e2f465451616cca8def1cb2d0af3539b1ae2e08c5d44951efa61399547439e85553242c8d4d702fc46e7db011574a957ba32d53cd50384277c703a65db723a8018d65ceb3ad580e4152057cb67c375648b673894d40060bc0bd1575221179f744e80ae55dae75a2cc5209874afd5db9434259ef022c592d1fc52343808e0f4090bc58b522a40f6e502f4f5891452f449e801b66aba1153241606f3f91a818b53ab82c552b2c29ae1f840e24282169ad983024b504852248361901b4cf7c0cd6a5894d58a3c9179017f113d1ff725eac7da8705982dc0d5180830ff03b7d5523935202324ea76d00000000000000000c00000013f1de0821942e22f133ef0e9e731a3e722cd02e6037be20a75ec62b8892f5330f678e426606155b917c0e0000271235c47d346cfe9ef42d8765c53c15c89a53ce46fd71fccb5e290819cd78476a88523e39526762b9d57b477d4c37f04b2953ae510a74df334813b886c4180566255a2a857f42e1de9e4a5a500b0ee7033e6100000000000000000c000000ffb8d405cf0ffc695e460577f0990e1aa671c879fa5b5231896c98704ffecc1b4cd92f46f8792c13edd4ce03ab935853f1eddd6922365f23223a7c67a080ab6500000000000000000c000000ec08ff32969627421c02be1f8527a274a89bd76440be4801a858b56256b73d369daf3772787247444d59a01d17b60b5de6d6845f3de6a2723452666babfef17800000000000000000c000000e1a31546552ca130f01d6301503f0b57ecb2822d3a9dd90b6dff5d6cd1f971252f4f5915aea0bc4cd903ed272b7b982e2490ce30fff6885f09030e218c132762080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000e1616b52dfbe606274199457183fe621bc80c76bbeeaaf1af3f2f92ee241036ca6379e62c4b1e466367b5a1e020f434550bf770c6fcaa860b6f88e7e9724022b75163e75f1aecc0f20b22763b0220f754e93ae43ef74bc45b0d3807ab3f5315224be480389da9f695b37284fb7c6f9205b6bda55e570282178b7e0569eefb92e428ca938d7d9bc7615bafc3cfcc16112d36d2e74626753048f8eed56b6901e0f12fbd51f5dd7aa1f3d5ca255d61c02512c6a5c2a5e0f1463ab264a35032213413f2fb237789c934a4080d755a9698c4c41bcb26921aeca5d6e0fb31f9e87036192ddd43c8aa91c5a90760559c978ab354d1e1c36edc4ef2bc529324ba817fa6c01669422dc62951c6cf7c064f4956b3c1ef4b717bb98a90d8f67b61a9d152876e7474b117e1ff75a63e5a47d781b806f112c4571063b5e1b4a494d02309dd13d6a01232b7af14e79b37758569e7f584c42816a3beae89c156cce2f6eecda2b0757a33a5c5f391d0d1d23010b3142263d1987874d8349b1070d4a482e98fab049f04d526580417c72104f20226ddfe16b49d95d2066b27b758c754b5afd88193c154b0768c0e49b00a1fa146be5b62a21a2d2e24d9a1bb37b06b65636d0390d63947a1c2c031f532c265c6d29bfaa29664354d774dd83907d5d01405912ecc847e348f57a650b5104a3651d762400805d8f0fd25ac92b9c6b64345349835b195300000000000000000c0000006385d7013b9a4113db4c576aeda7674e3d0dd137bd6ac70e36c02b3fa684cc64f1aef957a4c6001ac5ab8f04c983e24b1824822346e61341e049ad1cc804873130fa1e4e6142f158618fc4573f07a5713e62245bd057612bc0637e32a629cd6a4226e17d07d442734e3d1249832ad4258f82477b8ad1b919db523e0b869ece1e9ee0c807e473f560447f372794b9c27cf3c96972b9a4557d2ebbc714312109323b40973eb52c47729ad7c640f90ff653b76cc248aaaf8568712f76671f3ff838db340a2d83c61d151d7d96197fba8f4715800166a8fe5a094c505b2353dfdd0f5d289c6ce88f6d080fcabe53cfe4191ed198d70a26e3b67156a620680216aa3300000000000000000c000000668ebd3f09eb0a67e8fade2d24da44438b5392146b1e1340d8b2a533a464192904eae146af0a45128b438f0d59692812a3ea870543f44b1a4e0d872b8e97414b36464e0160357d28c3efc149cbcd680cb7e0410f97b258697c222607de93fb50a53acc37b9b1817545296557e7705807b25b12275a2a015ad51b0075d060606b00000000000000000c0000000126641b5119dc7606c850665bfae9108166c33e240dbb2fb4467f03cfdc3d01470ee77bcee2d84868faed4f739dc064f6dbc317e972cc75aabc935b9fd2d00800000000000000000c000000915f34586b35bc0385f65b5f8c77480074fe896217d43a2a2d9e2f465451616c080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000d63a15259c64ca6589b1144474c9ba3bb525773e0b96bb66b25b064bcfdbc8513a5b973448848127a25baf6433b2db66bb9d370a24a811371bf108121ad9114ba0e9137744249e3ca1c8bc793e6fa82509c68b750c84cd43eed9843f10128171e18d227924f34110c58f5b21339a1a7a42827762b56a28711bf5d66d0885f0051d202e4563cf834f6f87f02222a8a035a84e3b68ae91cd15bade882c0e59197ccd5691347fe97449196a9149a0e8546cb5c2572e3b913a334c3c307a759afd31dd32436229bf157e5669877d27710359ae43aa7431152313f0a3770072ed000da627eb0c80af52238f3c58695c09293c0020055c53cedb1d31c2c13928d1ea5325c4b107d9861e0121fcf80d8828f170852f66684bc2c0692c63df760477b509b64175120c823c49318f9855b6f8175fc4306b522d6a074098be224c7817b8410723453c9afb40773a43876c88e6972e53b0c5197ac0725b0d87f51250f1510fa25b0039714c5941a0f7f755ed67e77d8924d77db5fdd24dc83b1a71d330fa7c736cfb5b402e6155ffe2fa04380ec00cabcdd749be7bbf3bba228a704478e23f260c772f5fcd7525f3dbba303a60862172fc714c53a33a47173e77647ff58166ee4af607c66e3721c106e935b665f94260ee8a2b00523a43ffb15167d612b4796d803b41f02006069eadcf14d90b902ed0a2ec1e42548f673349145760e1b16508000000000000000c00000091967d6d160cc17da901947533a9b21af159a106eef30074c8532d5044590f6b3626d775c6d86e068e1d92211c5291764efe922dc9e2cf1871c5ca4533ea0a45cd89514220011957f6b3554fd0648c606de905432fe96371a50eb371b1d1ef49f70b9674bccece0194a7343721136b4df60d1c47b93c0b5521791158368b270c3c066f0d9b2771644840ca3d54c3961cba324a57770dce473cd7961efd25a54c7ee8f844c88cf1346ab82c637b43887010de8c244135014844858d3f8b32d40f7412463f88b91f2c50deac1b1a26923fad3bc83a6424344c6145645729df5067605a00676d868e3abcba3f63f634502111dd4221e3c2367e784cb81cf45c886004000000000000000c000000baf18b1934f4a0658c4ffe15542ada4d62bb474e53f6bf55ea782d68b20a14372171a532359b70198a25d82447e4cd54a2103578347f250cd5a7873b3d353a028432884a64e10477a20ec13d601aaa1a04f899289d55560870494e28248a5e30f9137e5c94753739ff38a338a7515e47b6ce11152143d8014a392355e968b75f02000000000000000c0000002f0acb2dd8b0a95ca22b814c1cb7b422f58fac0c55c5051c2cd50e0cfa45d1603b64626d0eab964cf295d944ece60c7175e304107fe4623e7fec640fad80f50901000000000000000c000000ca8def1cb2d0af3539b1ae2e08c5d44951efa61399547439e85553242c8d4d70" + "attestation_public": "2613016582d86a2e74c1f040efde24203e247f0769d15362b7ae885537b5532cc7383d4b64ab89203854bd21ba4f893f33e1ec7c", + "attestation_secret": "063667f2fb3ab8f625cd2147cb1796609b25188574927b34d12f916723bb28b0c7383d4b64ab89203854bd21ba4f893f33e1ec7c00000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c000000c75d0e74a95f434d6057c42288e8f71db23a0f3ebe9e251c67588168be8c903854492b1f7306fd425958a51080a5bf4cbb90135af0ad287d71e3320b5a339c5600000000000000000c000000ff2bf416a8d2ea01ac434030bc2f0d467157a94235ed516db0e7f25c3136ac3a547019236269ce3a86b55875d407da2183845e6a8713f30f0c719f298aab4e4200000000000000000c000000b8501d163bc94d7311f85328aa10701821b68c26dad2536d3c4b585d64d291641cfdd7232abacd2f2704343d0623501f49b35a077b83cd3db765632a7b37814c00000000000000000c000000fd59950382edf45fffdd29742ba4871031a45979491321103da5d01eab5f3f7cafc741675c69b033a94c063c757767459200695bf37c504125764037a895276900000000000000000c0000002613016582d86a2e74c1f040efde24203e247f0769d15362b7ae885537b5532c8965676b311cbd330e16bb436063fc26bbd5a073b7cbde5f7bc44d29d9275511080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c0000004dfabe7cec0ffd3ae813c930190d6b71a9ca23486fad2244314827630902ba236f228c622ac0857cfebe663af0ff60309032cb0c2bc7bd28d463644ec3bab13ac65ad70eae2d7b60ec442a0cc7124e0bd95d7e2c9835ba5e925552557509411dade40d64cce21c32452c773c81545b4fc2bc712472fe272e0a47e653ec6dfb74eef5c633165fae6445c47679d08905475a7c9e397fce281be179fd6664d6eb786c0d86240f063d55baf07c302267331f7992631c7b94b05bdf5d7a555fcfbc348bd5c3385436516f67dd872685f5672cf121f306e4b37d7e50a4ee3431e2842992d8684ed6fc3b33e6d901001b1ce06b01df842aa6cc8557be367b22f61d7d11c68363536f2d2014b15a37469c396276a02c18325d6aed0c2dbc8a05a39c611f23d645777ab7484648bb623e60f71c4f1da6f66aace14c4fe8a1706bd522bf37daa58767bd782e5093eec00244d3ca7665144a4e7602c85f4463eb1841a792102d9f016c3f535f755a56c972666d187e4ac11128e3171767d6b0d358846e99647952b21ab22665441e97f974eff7fd2955784b0ca34d0c50dbbfed327070cd7ad0d63b38e54ff65a2a45867a5a3d7356db45ff5acc5f6535c93c1a0418a25967ef6bd34e79e5b730de75495266176f10ecb85c10b6c85e71fb5ebe0a196acc0b2aa26233249b3b6134ba0b33c4537718c84252293bd8ea081324015489f30f3d00000000000000000c0000002d4654045eeeec5f09e9f8376d07886537a9bd4d11cc392b478368389b8ea9048ee1b635e9e67171a5cd83571fffcc340e7e5c0ef1bafb04709d5013c1a66760a9ce22140cfbc745da96543a4ba8e009b8f926656c351926842c115a4f59c5092795af03032415244c09476dbe8075480086bb22931856414802ec02bc37ff42de5000354a911a0dd08bdd6ca9e89343e9a6106e0492f22f9560bf4672898212aa04c177e6fef468720cc30a451069100fb0ff7e6ae711233bdaf4594881910209ba2e78dbbd45643d055b180cce5b015a87b566567b5067c9194134f5a23448192f955fc17942451f58fb3a4158ed0e2fffcf1f8d5b7d43ac33ff5eccda196500000000000000000c000000c1de0558e35f91765ba81a32599b3f5bfd7cec693180525677d0505484d0f644931843788e1dbf7c339e3f452536326e1a9d5a45aef79d2f4baa207822c1ee1d8443167cfc858a36e8a6832ee770eb6ea0a5e75e9be967360db74d7d64d7a5339f65934bfc7b70573e517c5115f9c4194b820e676a91525bdcc38b5c1b5c046d00000000000000000c0000008980457a344ff4676e1ba53dc26687672d175c03a5130769d2b44f09a49e3b5a94253d561be1da64af63ac6344a38078c8aa32215db2aa15d15b846714074f6b00000000000000000c000000c75d0e74a95f434d6057c42288e8f71db23a0f3ebe9e251c67588168be8c9038080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c0000001cde321a44da525160ad495221f14b7d14445d3a46253c189411e5371c23236d53e7be1652f6d40d2dd7ca4915dcc03f86be3f13d7acb6538247821bfffff7107c3612652f1f103f72afc973f787371fdb464319fd394d0407385f2618f5357343de684202b1cc15507e0e18f9704e17b6a694375cde7629f4be582acf12720192c4f83bd0a2800253c3c6324627cc70bf7d5031ac962d57b2b9c567a60e511b5a99151d07586d385160a80a0636fa20ca7e7a318e6fb0548526787308e50c2a5b821b6000443e4cf332280a9a17a908983a501710328239ebf1de5a5b15994965de08268234842b4c1a33613ac84c75fd96fb5f90620a1c74c5816c80ba6c03ffa96465cd18ba4c90ce2362c06860790ad4847537178a35a4a6224f95c40e65bf34af1bf03c7e09d8b572386aaef309bd3a871f8c71c500a4ce9f3c69d87841b15dd0668e6b93459b0a5c7977343847dde8a5225d3f10728df91f721950743c3603d546e42ac757e8425955f773335bc437cf3ca9f688579322c832076d5750b1b32c1293d4ad65ea83ab71a3b2bc32a8ffd1020a62c64569b3771e871d575c69e10f62f9369a66a1605f18a1a07702f10cd86bbcbb80363edc663f3eb8086136c7cf1926dd5a219664a21caf9cde31561ee16fdecaca47e91cb362aedb0220ec118016ba48c80429b94203229bd86d769f6f48c43ee174b198b2205ebedf2608000000000000000c000000afbc522b3f05fc62fe2264397f7de074a6a6800e310119748712917c90d3e45ac3ab7a753e26de4e3fdd1215a029c83b7d1d0834fc96110ec1c50d3995dcee01b4d83f22944841554e2a27153c12ac43b72e8b4aad210c6765e10469bfc10f36e254db2ca63ebf7a306b932579c6be5514f2995a2bb073118b8e7b03d36449136958951a35a22b33e8d8f113a28da413ae69bc01d9b39324584cd51a9bd892329c6d637c9c96a1267a568302ac1cf15c89c80d656f2a887219dde7157453ad77f64891420399b552006831448f0b27794561620dd4e1694125b19045027f792eb3a9453ddc62577a45453a1993beb65a2f3ddd50b5df1f75202b6c2d8a2f2d3704000000000000000c000000bfe135183a41cc07ffbdcf4e4704e11978652d27af1db4479f4e292ca4b97062f140eb590340d508405b9e74ae04e65c0d3be255c7f0755c3265fa03c672d16fe994fe387c4fac2b0a0eb33ae93aed33b7c3885472a28c07eff17466a8447448d8d3ad33e257645f5f1905400bfcbc3fc9be8e2784cee44e8765d00732d7bc4202000000000000000c00000017f8753c69a3c166d5f6032d420e650243251e26ebe66443d2a9b81196eac944e428f85354f11356467c237711d52a615329cd0942cc306c72b53a31378c4f2401000000000000000c00000054492b1f7306fd425958a51080a5bf4cbb90135af0ad287d71e3320b5a339c56", + "proposal_public": "0a60101631e36e0d8ab0d663c37f6b4494c1646ad26fd3193ffb233471e5d80ccb2aaa1bd089fc022a26f83689cfa057f0d0aa5f", + "proposal_secret": "08d01f29a09772f5565173a3d928be0290f6fcb7a8789dc69bdcf8a2d580ada2cb2aaa1bd089fc022a26f83689cfa057f0d0aa5f00000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c00000068ae6a23a677593ef24f0960139ab440187800422019357cd054f315c2bb6123e4d6a453a89f94603499d463dd07a64785406048d1581f71167a3c2da9db083d00000000000000000c0000009028922b300e0038a44931261589ac310d090d78fc6f68067069802053e5751f39a0c03d09795645ba43ee5e1b5d2e7e714e8877c5e546395f84b02d59ffda7e00000000000000000c00000024c8612500246209f7d1b966950abd15ed69513c5534487e67335b0b7f1f8b48693162024c7f600059a55b5c8a310b5e23a09e73a7fb5e5d94108e52c557176e00000000000000000c000000a02ce737485fdd247c5c626ecbf5892e6d2dd322a7cf1f74ce6f342ad29e896aa51a2b4d57c7550619b300704d80a0150073ec17494e44009ff0014c10fa152400000000000000000c0000000a60101631e36e0d8ab0d663c37f6b4494c1646ad26fd3193ffb233471e5d80c386bed6d724436162c37992f34f8277a1680c959e3b62544dc01842113fe1830080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000366ac81b0f48b1165f9d976a1737ec0cb64ee2437a6b6d503fe878223f2c1a5540c4bd5ea092f96cf4fa55791eda9b44a3870c5586eb722c93a74d4c33caf11f8cc8777834241e33406f2420fce0005dbf3d60027773fe7cc67ed4483d8f206169d75c231845bb01db71132a32c1ad5e6d206171b392d02e632f9b48684d9a622afba31366e6aa224670544fd0e335088737ec6da46c6f640b213466d5345d23e4853d0f4cd0be71807ab6368a36eb1825862126af83463de20dfc1060e4317befc41c554167c81151fde6005abbf5770d8fdf3a1b56320c9cea82015a7ab314d0bdb6549c4ab510f2c7cd1fac921c7e25161f34e8d567641aea4e7dfca11d26e21e84639d671946c81837391b01c04cb095f23dfae031211642f52016a5f223ef5d87613ed581098569e5066c72b80ce8168e21988d3e0b27e04a2d3eff47091429d21ad688742963f3f169276c546354f72c2f77b28e0ea92cc875262438003bbfe656fcfce526b24a810ba5db155566c6880e7cd07c47c8a57338b2b9182913bbee216faf5e55b045cb636878d351564d3c1fd3828076f18c0370d118c742a73d8a1272fcc27c8354c43cab2c6112efdba563ff503a5483489139bb9936334d014535734b9d53c3bfa069a923f457b8919f661d37f9317796083edaa06c005ef8bf174c7c3360425f8867e4939d3aaca6b60a1afdd911fc17be53630d7e4a00000000000000000c000000b124754c9b1aee1e7d7c8b785881d85136503a2d6062bd3e3be7606fda117925b04a4b417b309118a2ec7e0ea821681ac15e0923e267037411f5ee6304f59768a1cd824dfef0ad3eacc9975714b6aa29ddf22b29db86753d4cb4820d7f05385006a9844455689351f7fcdd5b428edb0fb3bdd97ce8c777482cc893762aa9836b3b34ea2728bb4d1b2b70521c9c5d24617fca475d3651a868b2bdb03dbe0e454d266f931b2513eb2579a055737ba2c31adecc73166580ff071dd70275dff9a7670429b46ea057fe3fa7f48c208f7e3b442fbb6338856b095475f45a5d6da7195a67a2d849cbd17d3f0dea6e057034a608dad6df6636ec7d36f4a36b0ab754426d00000000000000000c000000d1402533fa8ba33a7044955f1c062c3c381e30633533cc766c238a206cc8af027485ce7b29e7b033d45b0377147f334edbfd604aa49c853497d1ff31906eb17d086b1d3e1f362c2072658972ebccb7355de1bf4a0275f1317e991d3e06e0ca6b4aa6944a7ba3046463ac7157b0e81170fa0e162e54de75135beb2514c2de8a6e00000000000000000c000000e4dc3963fc577c4089e55b4ea38fc42d32a49079bc90b85b1cfc67574b4cb43174e1a220a9918855ecc15841ea15552f808f683e48d6a363ad186c47f8717b2f00000000000000000c00000068ae6a23a677593ef24f0960139ab440187800422019357cd054f315c2bb6123080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c0000003fc21532aff7ce0b4152e506ebc0b97159afed62e24dec39aa2eae323fcf1d7e93a9423c3cb96e30de845f7d6695066fa6c8c810c78e101c949a7e0316713e2afb21cc1e9e68ac3ac519330a0664131cee1e092f05e945288a837363537950791df64e0b41ced1032c77df11d9154a08b604fb435b18872b0d621957e3c38307c087af3a32ee0e674408aa6b584ba41ab13c2b34217a1f512a1b283b5620bd3d9af6a25a7228b13e65ccb6755ec61152ec7adc6fe073e056e6939b790cc8c20188dfcc6895bd9a5bc1c4621fe9be60755cda7e75a14ecc3a145c982ac6d4887537c76822a0298966ac2ecc799d6ca160e779596a6c7f720561c05c1e04bcac1bc0907d07893c6d227aee0274b5018202e388687ef4ad1041baa32f3f50e94f3480815b5f19e28954ddfb83333f85d7122cfca342e541c974926ac31f777c307cf7deba6fd3e5df2b6ed0d52e351c1838b5939039fc347e4f70a0e06555826d3e5e1f297516ea334dc4db2e0377db9e4da647b152741c38765d126a712fa7f8382606cf30ff163d78b8a22e21ec4ff05b8c948545b14b1863bd86c426bebd8f4166ae181276b27e6f399390400a38cc3265d6e5206dfde81f9f32940b5f97377a6e77ca0253dba63830e8d031ed8a83633ff64205b93a0d30bdc1d90cd08dc160389d9a68a13ef97579cfa739907bb42488de6a7d8805cc273a8a4c7447705d4708000000000000000c000000abe4ee3316d1ae208b18920b9663ac20869f4b5865c7a2752a764802d1f5044c9f7d71657d10612a79e141422fe2661c8ac1f636d65c17194cfd44378d48704a0345333b940ba4309598397ed38079779a2c4b6e6c02436be778a83e88d9d064ccfd6f2d69e635240133eb72d2add9171aa894497c3cdb7714c50a3f3578ac492adc963b633047142af4b87b55caa57aa8efd23633c97a72a01da14bdf1be04586c33203914f5a213bea533e5a19e34e10fc3e4116337f2e2ab53d7a0377d822e8da3232bb78f14474f656050f092e6700aa2b08554ef7366be887043dee727976533a7d9b035c5020ae7954b95f7e6e0b1a807152c05232a029ba67eafe984104000000000000000c00000035040c69a66f937d5efbad3065404b5f313121784340d66ebac7116010fe7b10435e77626aeb430ae7010508b4718b00f5abbe5a2cecfc640149556dc570573da32dfa133162f70aafe17a0b45b261186a5ec360d2039c0b456b2a047bb9b552d8bace302866ff78083b5d4491377863f879670053ece14d7c74001f841af30602000000000000000c0000005f47797219547f7450193e7424f99851e817ef1c2617c152890b714c1b1d4e02c8ab434b6bbde7683a73a851722b3c0693fdfd61dbe2a818efa69012947d121101000000000000000c000000e4d6a453a89f94603499d463dd07a64785406048d1581f71167a3c2da9db083d" } \ No newline at end of file diff --git a/packages/testing/src/consensus_testing/test_keys/test_scheme/9.json b/packages/testing/src/consensus_testing/test_keys/test_scheme/9.json index 0fa992fe..301828c7 100644 --- a/packages/testing/src/consensus_testing/test_keys/test_scheme/9.json +++ b/packages/testing/src/consensus_testing/test_keys/test_scheme/9.json @@ -1,4 +1,6 @@ { - "public": "e3bc520aac9cdd7cdd99d16f0eed2f4276e099536c6d096a2ddc514ad9716d3d4c366d31dff8593d2ec3c46026e75c27f20eee50", - "secret": "735c0d5e60be0bc5eaa30c8c9ac6db9d80e1ee30117d85e8dca2ba7f5f2643114c366d31dff8593d2ec3c46026e75c27f20eee5000000000000000007000000000000000580000000000000000000000fc0200004007000008000000000000000400000000000000140000001400000020010000ac010000f80100004402000000000000000000000c000000b1ea54329edfe64af4270b6f5cc3202c00b9293868c05d5e021d20438e899e7953aa7663839a4213c7df0b62a23d38064ae9a5347627264efbaf311dfff7070eeed3c63e16fded6738b7c17516979b526a7e1479ba13ad352ae5225cd675057de7d1e94ba5c1e9192d3319413962d0698f45fc156c2eb27c5b90ee6e88644e081989b7730df6d23839906a6e7e811f6ac1ebc81f963167610b596b467a43910084d89a3f8c002d06538b693675b5af3e6c3c357083c9086d25b4ea3193115128c3df240833f7c3292c24f31472449a1a4d3e933a092c7b2869a751685aa155505d4d230bc327ba24ea6ea70bde6fb514360cc91d3bac5755ccb9fb61a3ac6d4a00000000000000000c0000003ca54a5b21716063bab01934b758bb694b68804a8f31ae58b353445e3fae976d9cc25f4608d2f238d063786d26571a1006db9152c369c254a212675bb497720cbafaed032ad4ec0dedf7cd378ebb17430a1cc501dfc9a41ef018c84b7b374b56d04a0f0fa8af584b736a2f2e66922c346800dc61227f614082f0f83ea558454600000000000000000c000000626a484b5182ee163b3b99303824da012f73d2211a83762621f7381a4152ca38c10af1014818ff615f9f07116018033b23e4b75ebed7b96e3a3c2f754f3a8d0000000000000000000c0000002411db73df25ac070fc6f545c97772265b3792068937cc455ee0f967e4a63840c01b3958fa6fd9482337130e2ce6f006d628e507c9a9065fc1079f540a03191f00000000000000000c000000e3bc520aac9cdd7cdd99d16f0eed2f4276e099536c6d096a2ddc514ad9716d3d2bc8c46df93fed67b9d1e034ecb62600a5fb7d055649147ec2912d531a347316080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000c622694f41ba7f6e1115386e0eb32025c9e5e921ac8502625593861d6b569623c2127e67284f1624cd072c44205f7456dc1d4d0d240d6d74a872f04b20c36c2c5c974c70428eb63383ed5a7c6e9b51035c5c0727a511ce2f8a7b5b680c7f25322182832589360a586b7c1b4de7750e7715dd301b05c19d0d1f3d273b96359c4a48eb3b19e791be776c625a223cf16a7e22406d11af354706c94d122840a24942c04ec80136c6204ce27a2e4670418f7e89ba2507bdc3b97d2a9060781d88e8068c81bf34212ee66fe8858f5b00774119a5a24755e8f3a130e32c8b6d57e0077528cdff484de56e2049398650cd85eb535049fa39af69ab4abba84149ba5ec7053073be28577f872b021a006e24417b520005935584e64f2dc4f9ea4f3683b475910be0531b1dcc67d1516d0e80d46e7d6871444a4de79b6e58a2cd4714ea99459c83bf150783f91ee3a5c621b512b037e8895704447f9b3d7f130c708e99c70d5e1a2e6fb64e1236ef3fd27a21c52d3df100ce22ca7b905368d60f71c7659372c20ee442c24f000193198a1fb2eb54231b4b78308699d054420efb628f00f34adabc2c3c21f3fb7a732f02647a696a63aa86c47aa6a4de726ce20d5f94ad8422fb5aed7e4cae3663f211a0778f3cdb659e315b43e8e1965fac379728e83b4a5e10ad8247f911ec42db33024360e2ee655a8b510e18a825701bba83119c34ea2f00000000000000000c0000003b199c4eb398cc24cfd4d930c43aea7dd8662104f21f9e54013ba864817d160d74cd3b01a265c02be64d935291199a6f96d3124ef864436f0b6b3e60bf664b4d008dd41a81539475e563ea6f34d2406ab030f31921c8897bb1271b3445be8426face042c77c7bc389b95ca5339c331685906090a474d885adfa4c8231904ff32b46efc52c69e2071cc33955055b97f4057f0491044240940a9e3601e0ef5f66d6e3ee84497140c5f27184e4562fd087c340dd049a6901a5a7310de24898e0a55a4f95447bf098f2290ca9d5fb6d87912fc168d50b9814c0852273846e2336460b2f1c05051f0c73d864cf933032d2d29a4bc463da51011000d2e4d65847f0b6900000000000000000c0000002636bd599918810b2dd7c55fe498d7600487521d43f9dd4a959c561259cc664e9c3c246a97ff1423d6681d4cdc271d04a8e2df0216a9b41ad5e1df5a5bfb723b6d759d1f7857b06f50d0aa59307e6f7997b2917ed2ef371300a1886c71c8ca6801046563e7e06128ea57b53356df5559b6d74836af6dea5b33a9c2332d48363e00000000000000000c0000002dd165548fb7a911b901256862274f2a8fa76b41687efa443b3ea311db6fd477d0a33e098327456e8193b12b73715c4be92a5231a2573b1fb04a3009dae8871600000000000000000c000000b1ea54329edfe64af4270b6f5cc3202c00b9293868c05d5e021d20438e899e79080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c00000098f3cf7922468e2c6af0351d29228d0a51379a0f46be815fedb8bb3ca85fb5333088f626047b9f7182db4f78fee0d53914a14e64615fb556ee08a609555c5b7d2359b67c5ed899733f5ce23de1c7630f2c8ef302ef0afd11228f6e658f2d38501de2a10d45fced7504a3a10e99192a0fd9082a15ea3e263b6e4479429844de555dd0d8301559c16577cd395f4d5e2932c115441e2d552e4369b5c113f94f0b0d36a45472d2d2991f82acaf275aaa453e558b5d61e5c154078f9f147c90da31791b8b524888c03721a1b6d63da81f556360ea724fb4b9ac5d670205367ff12404e242cc080e193f4c07a5756ac403750004cec343e4d7ec02a1b7342fb06e505c25040b36edeec235e3d7c745ef90cf7e5c72a149cbb3ab3ea08852201322b168013bde48e1b57b6a3198307be3efd91acfd1bc6362cf4d1aebb60119e348082ddd58601e3a71dd1050c17c4fa73e067a3d9a0017a3289c023d505d552f306653cb034b1a827e46728fa6121ae0c7fc1b70633608db2d6a045b116440639dbe5636b09e3d31c1e22b3d1a1869e762b565c8bf9a59d8dc8f3b5db3dc577d54fb49b3813e1a0fd2a824b16f917a5c25623c9c6680355966f65c99b9955c3ba1380b0a1c0a4d29e78868aa2e366400993814cdf4ad436c06eb4e52e6bc59e87e9840bb60a026d9c4e75154761a257b7293172dcaf003cbe2e0671f663e1b65750a0208000000000000000c0000003f944e3ebdf11b08936c650843ac7e378bfe4e0d2a92886e93c45320245ac14e04dcef7c7f2aa219643a7049f3ea0105d08f672150649519cd4d3b32151c34585bbc756685f5d35f66e5e833af286b403ffcf81ef7ee3519422be40773e3e71f9826fc2c443f3e5b8c5c4a3af2382f30da3acc1177f1f54d813fef23817e7431be5f945318393e4bc576237ca664cd5d7a84766470da866cb45ab40e06b07f532dff847c32cb574c3968da5e0951695298eedf76aefa7f506049ef1f6c253f29781e1b5036ce89533b9d455cbe88207c13ea4a28d4c72e19524e580ccee6225bb021f727cb97127a18edb822486c907878713e0fb2fd554d7f187f05d816953804000000000000000c0000000c63a1010f0fbc79bad3be5f6e3e6228f522894073faec169bc6344269c93337ba83ff66b7028f51fcdebe5c46bc4267b877f21997e9104e7dadd272833e7a72316dba552adcdc073659db287e21c40568d24d31ab99b9432388a24cfb40d97c6b39743fefd03b7a6969e930aff777426968b17b4eff872709e4941892959a5e02000000000000000c0000009528da166407a641f8d54b1226d9c710c0aad0485e4b3d6c8192733da04bdd2157f8451de32d3f3594ec6a0e6c2bc95e5f54df78b5b238631170a6455f86f62f01000000000000000c00000053aa7663839a4213c7df0b62a23d38064ae9a5347627264efbaf311dfff7070e" + "attestation_public": "36846e17116bbb09d7dce812b2a0901f2725b47e7c0fac174e7d8c2287c7a77e61982d1b7620991ce6e16641dc8c333a23ed1317", + "attestation_secret": "d7295f8ab7c6818db63df6845237e0c126baef9980cd71c107f6eb50984106af61982d1b7620991ce6e16641dc8c333a23ed131700000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c0000006e4fa763d694c249d835d67910a580425f4a9a79fde14552be0ea45b8ce7e701190d3b3036b4002b691c436b44d3d05d91e4d72dbce6f50fc017f4438461824800000000000000000c000000fe8fa1208aa9c1031023f727397b950e64df81029371b41a87369442c2889d0686bbe509de22aa123760f33814b0a81341a2d164737b4352229431466636eb0600000000000000000c0000003ca8cf38b25c10256ab38f4f60ca5461fd7df35a2fa58c76ccaff010602e15114565bf0b32890d03c4ba09426a89cd6f9485354aa834463b81fb551b10dafc0b00000000000000000c000000de74192a752dc156af6d0940a625f32e6c3ac836257e704154542077252c457cbcedc823b569142a04c8c62628a9f8310c8afd6bd028c67e3d61836ef6b5385e00000000000000000c00000036846e17116bbb09d7dce812b2a0901f2725b47e7c0fac174e7d8c2287c7a77e69257114fd1187438237db1d83a58479bba03b05e1403c3939abb44ce5f2f462080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000a683bc195d85653a61f65635872916782bda5f462a2840778a5d9e2993a5472619b985214a745b298e91bf63574af65d4d9b5f7e7d0c254c2916274e82f8fa75057413669ba37645066feb2a9234656afb718851888ace0bae08cb01fff3040b93b21a7b61ad90727e3b5533e9494b17ff11e57a2f41b608bb166d2bfc930b7976fed7504b5e535312955d6cc9aaf2337a16392967f1e63bbfcc3b1a2b9bf259746d49621cb7016a1fbc99435c94fa205b94144a63642855dab3e717e5bbe37d435d6d560817b922a4ab75195c58e52dd0a21b5b1a044b382cf9165c5e4b6e362d8905545ee3b0621f968d23e81b496e1c4bbf515b6e804ae0321823323d9b33bf9eac131d9bd93563db0e378946db1a3cb3614460295c08832745547431214c7259ce276b853a5be074a9768182e87ace58872ca3737404d09b511e66a12750133d097e2c0e3d6d7a9c6d0e6fb8763658a1dc1d123d5f7866b52604b32ca207a3b4454b340dc93bfb2064671705380b988ee6784b36b01a7b8bb41745ec1478e3f9ec5e623e203e204c3e55d7e2bc47518c0331dc1a3149d520d051163e0646d140d710dedb4a0a87c5c41c08271b1781eddb6771c64d1bbfc2f4051f606230b1bc9d38e7c6ee5eab9ddd30ae6dc221e273907b0db26f1efd24b86069c5e30d45675a3c8a6836559f49c33f5ddb8753bcc97d246c258a730943414be258096f00000000000000000c00000076407078e5e1ee27de66925e98b1086cb23c766adde9886ae971d17af6ff29034cf41b6190681c70d7956e7a6b5f4f54fd8e3b62ffd259614d99517972c3ce00d33f337edf4d510e53105213799a2c2f7e6c8451e7c8442594c7a6614354c175d67ac73d1cf157359e16ed43353524798467a16bf1e90c21d68edb0a3461d34593608c4ef2fb3b0ddfbc881d85837f45795b540fa041967ab63d941a9742cb49d468f2521458115ba2097374f30dea4a620fca2d9b8dee4d1e0c7a07580d810ea200fa46a31c7267fcd266751cdb52645ea6f469f88115200581443a9b5a8137a13beb2570698d55c5cbda729eb380680591e8294d2a7267b6c72536bd5bf30c00000000000000000c00000041f6e02b933fe0539d492f78d5951453db461431bb26c13f733ffe71bacd705e2bfc0b1f8f35996b96dcd517247eb553897f3a024d95d208a850a64cdc7d0a5cfaafef6076357148e23b2940af08f2619e25f67181f1db37a51df329bd8b521f43ca030c1559164bd77a571e3f7d4446e82b4745fa8f8b406d37460e8fb0fe5900000000000000000c0000008a8adc2062bdc10ebb6a8f243cf580112c017b4606173333c1498d7a2ecdf10233e0b86056454276a1ed8472858fba0d96d6a87942114423ff9b5877df96e84a00000000000000000c0000006e4fa763d694c249d835d67910a580425f4a9a79fde14552be0ea45b8ce7e701080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c0000004717993422bf8f6916ec2e1e3c012f6ef8193d1c757c4d495c6a14771f669314ce63e8555a2f570f78787b514f824108e9332b32d3969042ad13ad109472513d85afe963451f5d4a43082a4040becc4a556ea6627f3ea1422d26780d51822c3ba9144a1e8eaecb1d16eb910d67367159e0a20b630662ab606e58244f279aaf08ee08b770049eff50b9761b62bd7d8c6aa55d375dfb5160544976816e0d5a5045191f3e2c6a186615d69f875157a3f205300c6269f179105f220b5d71ab401e3d76622e6f15d33624897c6d2af1235c74ba49bd4fc7cbc7333645641ebbda87789c960b1fad446651c38d0d2754381c5e71208060dd50b2230fca663250af3c1af68d415bbed7d20435c25b5ecf4b6803c6ad586d494b1b6cfd1b8a2ac27725546a74c953d2d1575f68bfaf257a7403309980b836860a1106ddb12a21b95c9e582825b40d64c5215e564d7d13f5b5db1587dc805e27325d50597ac75ead0fe7433b04514f595a187a8f001d0b94757072f939222914d5a217c7891510c04cda63fd55b958f1be205792b1f82ab25e86600b143461c4c8da3b4c10af21788c74597d4b366355d9af634e0e6a3dd2a83632ce4bbd41a597124adfca5f2df5a27f2c5b649d6caaf27f09b2fac81b6f3e950f32c80208cfafa75b0cb2ac22e305593d49b5a836a1c8a36b1720ca235de53f3025c4465bb975dd0da7fc3c460c65116008000000000000000c000000fc5201623e76d1121a96b508db92151eceba8b1484b832691763b8437531a42fbed63d610a8cca1ba819d64111a8b325e883cf48c21c693d85869f5441b4d57b0311e3081fc2921cdc11037ef1aa2062fe68780102798a073221154bab69e303d151ff221212fe3dfccf1d6967ceb2122db11f3b2feaf00bdaca2a4a1a2a6d3313f85649b0c2aa2123ef2b3974c7c30565fffd2f306b4b57b21e896cbe6a105189ee514591a9ae63d992ca1681eb4d791e0f207a8031e80a886fbd408e029f338caac9510ddced291fcad04588ad97366e0a557cc440624f0574007ac1ee3d410f2b4a639954a54c4871d01884967c471d4a676040e1be0e99e01a60eae90b1e04000000000000000c0000009ad51779047470192e3a6664836ea91efbf14254840f810a54e94831be17295a9ef1cc0dc9e61e0de9969519af4e054006ef32746161ef24d494e461f78d2b6284ec967adef5e119d6749e70e037493fe42b8823325b2c01bafb551e39b6a86d4e4409387bab7757676b506822853e045e68ed1039bee63305ee16730229cb6002000000000000000c0000000d96a344273d89738d901b1c542b60116eed51717c3e2817675ab058c31ebc5e7c4e653a4d92a969242b0b524d7f2c6d7d4bee1f542a974c1f1d1f466fd4fa5701000000000000000c000000190d3b3036b4002b691c436b44d3d05d91e4d72dbce6f50fc017f44384618248", + "proposal_public": "be1d2d75bb42c22e455d6d22302b6762a320d078435dfd19e0ae5f64d658ec0c0daa724c76a77779c792c66bf6550a3ea7c84368", + "proposal_secret": "93408d5e7185059db4cacb9867db391352dbd04b81af243d2819100d8a97a3310daa724c76a77779c792c66bf6550a3ea7c8436800000000000000002000000000000000580000000000000000000000fc0100004006000008000000000000000400000000000000140000001400000060000000ac000000f80000004401000000000000000000000c0000002166c343da875d08b84dcf2bd7f0723f7ec84769077101225c72fe2703dda749a11cc337da72e3032c4050215698975f37db6c565e21193205350a289cfd876f00000000000000000c0000009f5aaf56979ecb0ba57827520383e62b96a0213e80881b6057dbb20803de770d1776130c38f8fb604449722e7f6ac0083df18e65d390e22362b97049f5abaa1500000000000000000c00000087289848cc968124c1159b6c4c01977b1b1de02e793fe51e238e6c2ec901a341f983c65acc494472bc71ba4d539a00238bd8e31666a8177edb5a216e4efccf4200000000000000000c0000005273fe3c5d4bf912bb5a815a44a9386a4389802c9fc6ab35c5a961780f86d640cf64d276183bd341ee196909a0989f43337b39788363a602fe48b10e87677f5a00000000000000000c000000be1d2d75bb42c22e455d6d22302b6762a320d078435dfd19e0ae5f64d658ec0cb9fb29637100a168d03e990b4103295a7d546747c806703f8a77a70a5ec4ed78080000000000000000000000000000001400000014000000200200002c030000b80300000404000000000000000000000c000000e1e3bf2eae9ffb4f5923da5f4e6ae476bd7a7d00e2c67033ed393436eb5f2856adef264663632b5868371f2f4405277e5270aa2f8202837af69fd25da4a89e503c9cd41ae358276b5bf7fd2128a61058420828290911c83a97103940e0ea5f5288d8254a6824ae25d455605047b96d4e9efd3462f0a8a72980627c230df5bb2f124a427d8227b1394aa6ca634761861acf7b4e27303d2245c6ffef16c888bb49c145b3122ba0e15eb87e106e230eb91bb5f93103a8a64e78e09d8b0058c23b6db1d7f961e992b7023786a43bc1649a16d7f3d4482102c070edf5603fac4ab276d0aabb3b31e1c8494f798f52465050493cebd35ce3b4ad7ba12e795ec51e8f2c0cc6063cf4a6375bb6d353587f419c7818f9442240d88a705751161823ce32117fb2a0776eb4a1119e081a2ac1236d4d692ac854eb6a5a43b43bf5259746de787b18ad1ca106985c1dcef2657e8edb3541cf262d684b776f5439e34a9ed49b4c3a444a34a6651d55dfd54a4f057a925248442d715ef5d26aee6854007261ea367777ff163e03f118fb72ca36b370ab589783d17e1d3d247e595c903101d8ff69ad15622764d0917a0d595b1b330e047954fffa307f99f05065bf463f01eeb85566986364377ff673ad768675d99b9068be502f799d2617517ee30558bef2054f7dc4fc5123ee373f79976f731374c921e1bbbc3d65920d597638c80df528bc0400000000000000000c000000a4b6270287d8b35ac3f5a77c99f9c457a1f71f23213306216874b54f869e661ff509204aa8ab331e93b1694203efdb28d75d823034148c5fffa7e95c505e1734e5396c68411e294c4ffa4f7610b18a2efa35fd136b83f0572e614d1df28ec0150e2d9369c581ef6268a9871666f4c8387efd882bffd39a599d5cd60fc8e8211c22fd1f3207ea9435e185bb1f5fea4e6d86fa7d1e3432576a1afe804970a955026be1777d12741838533d92590502900d3de0136549368a178b497128e3173e0911bce870bd0e7a3812423245c228ea7363e247173d885d0d2b7def6f3025e174769966243cde9b69d9b41246a6b54500f13104225a18970b323d70255195ea2e00000000000000000c0000007d90ff550de1db44012543258fdecf786f669771e9355c6a292e1c53d890c15b512f7572ca268e34e727e30567ec837b55773d05a0eff8496acaa614b4fceb0ae98a39307d00766a3a071a76043c531a12209377bb4f312d8abbd300f4a00419dc023c3998a61a2d1123263a9dd74656ab39d06a723c4a20e2256c27b3a70e3500000000000000000c0000006ec0b43ea96bde540a0b9e0f4b860d272dc7ff5fe6aa651ea0825d46b8b5791fcca17b46cc0d006db7fc1e58f413e40dac7d2e2a4955640db358194dfb5c370800000000000000000c0000002166c343da875d08b84dcf2bd7f0723f7ec84769077101225c72fe2703dda749080000000000000000000000000000001400000014000000200200002c030000b80300000404000010000000000000000c000000fa07e1659cb7684e90d4296283f7d04e5afbe921940270392e678072b0c82c234e693a6a25a76521e8dd3e240b569d3e46944e406b83f019414cef75df5c4a264a18862b4374575783088d3c52b23d5401a6cb46f2ba5d69cfb7352579c72169057a1b2e1e6f212858a59d40cceabc0527cb9f7328742532e0ab1207c709af4a01ae331da82b3417e9c23f7ea82f314402fc2a72ca8177650ad875553106d20ec891b57541f4bb1604035f5a774f807ac9506b38128c2e78d96ef30904bcd6295db72a03e44c1f4070282043bf442105dafd282846b4dc4a42263f3bd141ab7155c5646c4822c44786d78a7ade46be642885a754871a386e922022523d20f23fb4cec00ca65e140bd0479970fa8fd72d92c44b17e8491e6ccbc8f34955368e44e66c8f6e6408a2427ddd8f636f7026415288ba2bce69e05f7ba6530f8c01aa00f0467f3fd7f4866a2a37be0513332d62eeb72c37f67a861ce687390e4fe6ad5a40ab637a6609e651ac363a36f1dc5d2daeffc621acdc7a39355dbe4b1b67651eaf28b51326a9847274ad9c23a7eeb10de53fdc5a4e94b055d9e0fa2ca38d9d25551b6873ba7e5671461ff32ca64fab30381dd7637faaf60582c05e6849f73a7734262e6a87c44073a6779026a400f06266039f166bb9fe206309495bf80a8d66ce6d2e693ab4db202cb56b2464bd884038bf6a05dfb480555df5ca2b93a8ea2a08000000000000000c00000033aade7cc2e9c90ad3fb0938b1c7551eec4beb0c0511be5edd64d45b1ac95542cc5f891c940b93238c2bef74669bb476b2ce5d75e81d3a65854f636a0a59f24dec1d8614d35c385b52a0485868085e4ba9ca5a6b77d43f1cd844e83fdb94267a30c2a578371d924b6b820506f7400036c2563320a9a2904f64cda4437626962301757c0f7be47d5b4533ae6a0775c064cfd17725e28fc00d1d24141901c7841279095448a61df07c6b53dd1ea0a7a359c4e6f430cf510634e046724a2da90d3ed135a30fa109112340ae4c763c565f2c60b3f4465024b335027401494e846a53df6d0c7592560a04db21706d99f4d5538f9a47226dcbbf043b616c7037c1db2904000000000000000c000000b1a9d32e11a6e308ec139703c1b8c435782c2a4f002f546da148fd66f4492505c8b72664a5bb403ba495a16e618bba38c8f8d00eb6e8ff3297a2ee6fc198de05181fb3215b73966ad55eb30859cd0e389b09f05be305327b8e1dcd7d605b2a0308cc2d3f62d5f914734d325dc1d1cd58d98f3d56f150d229102c9a61e7f4b13702000000000000000c000000b513ac5d9dcb4e14b840ac0a39c4ff6f008acb143a1fef0d0d3f7f2a1a0caa55d6adfd7cde4a9c62408ba0448b8ce2213df24e2b9748862e637e847e98f16f0401000000000000000c000000a11cc337da72e3032c4050215698975f37db6c565e21193205350a289cfd876f" } \ No newline at end of file diff --git a/packages/testing/src/consensus_testing/test_types/genesis.py b/packages/testing/src/consensus_testing/test_types/genesis.py index 2556c703..2d7f0186 100644 --- a/packages/testing/src/consensus_testing/test_types/genesis.py +++ b/packages/testing/src/consensus_testing/test_types/genesis.py @@ -36,7 +36,12 @@ def generate_pre_state(**kwargs: Any) -> State: validators = Validators( data=[ Validator( - pubkey=Bytes52(key_manager[ValidatorIndex(i)].public.encode_bytes()), + attestation_pubkey=Bytes52( + key_manager[ValidatorIndex(i)].attestation_public.encode_bytes() + ), + proposal_pubkey=Bytes52( + key_manager[ValidatorIndex(i)].proposal_public.encode_bytes() + ), index=ValidatorIndex(i), ) for i in range(num_validators) diff --git a/src/lean_spec/subspecs/containers/block/block.py b/src/lean_spec/subspecs/containers/block/block.py index 3dd9fb8c..50987ebf 100644 --- a/src/lean_spec/subspecs/containers/block/block.py +++ b/src/lean_spec/subspecs/containers/block/block.py @@ -16,7 +16,7 @@ from lean_spec.types.container import Container from ...xmss.containers import Signature -from ..attestation import Attestation +from ..attestation import SignedAttestation from .types import ( AggregatedAttestations, AttestationSignatures, @@ -82,8 +82,8 @@ class BlockWithAttestation(Container): block: Block """The proposed block message.""" - proposer_attestation: Attestation - """The proposer's attestation corresponding to this block.""" + proposer_attestation: SignedAttestation + """The proposer's attestation corresponding to this block (attestation key).""" class BlockSignatures(Container): @@ -160,9 +160,9 @@ def verify_signatures( num_validators = Uint64(len(validators)) assert validator_id.is_valid(num_validators), "Validator index out of range" - # Collect public keys for all participating validators. + # Collect attestation public keys for all participating validators. # Order matters: must match the order in the aggregated signature. - public_keys = [validators[vid].get_pubkey() for vid in validator_ids] + public_keys = [validators[vid].get_attestation_pubkey() for vid in validator_ids] # Verify the aggregated signature against all public keys. try: @@ -193,10 +193,18 @@ def verify_signatures( ) proposer = validators[proposer_attestation.validator_id] - # Verify the proposer's individual XMSS signature. - # This is not aggregated since there's only one signer. + # Verify the proposer's attestation signature (attestation key). + assert proposer_attestation.signature.verify( + proposer.get_attestation_pubkey(), + proposer_attestation.data.slot, + proposer_attestation.data.data_root_bytes(), + scheme, + ), "Proposer attestation signature verification failed" + + # Verify the proposer's individual XMSS signature (proposal key). + # Uses the proposal key, separate from the attestation key. assert proposer_signature.verify( - proposer.get_pubkey(), + proposer.get_proposal_pubkey(), proposer_attestation.data.slot, proposer_attestation.data.data_root_bytes(), scheme, diff --git a/src/lean_spec/subspecs/containers/state/state.py b/src/lean_spec/subspecs/containers/state/state.py index b4dfe379..f20b5b7b 100644 --- a/src/lean_spec/subspecs/containers/state/state.py +++ b/src/lean_spec/subspecs/containers/state/state.py @@ -33,7 +33,7 @@ ) if TYPE_CHECKING: - from lean_spec.subspecs.forkchoice import GossipSignatureEntry + from lean_spec.subspecs.forkchoice import AttestationSignatureEntry class State(Container): @@ -759,10 +759,10 @@ def build_block( return final_block, post_state, aggregated_attestations, aggregated_signatures - def aggregate_gossip_signatures( + def aggregate_attestation_signatures( self, attestations: Collection[Attestation], - gossip_signatures: dict[AttestationData, set[GossipSignatureEntry]] | None = None, + attestation_signatures: dict[AttestationData, set[AttestationSignatureEntry]] | None = None, ) -> list[tuple[AggregatedAttestation, AggregatedSignatureProof]]: """ Collect aggregated signatures from gossip network and aggregate them. @@ -773,8 +773,10 @@ def aggregate_gossip_signatures( Args: attestations: Individual attestations to aggregate and sign. - gossip_signatures: Per-validator XMSS signatures learned from + attestation_signatures: Per-validator XMSS signatures learned from the gossip network, keyed by the attestation data they signed. + Proposer entries flagged in the map are ignored for aggregation + because they use the proposal key rather than the attestation key. Returns: List of (attestation, proof) pairs from gossip collection. @@ -808,11 +810,13 @@ def aggregate_gossip_signatures( # Look up signatures by attestation data directly. # Sort by validator ID for deterministic aggregation order. - if gossip_signatures and (entries := gossip_signatures.get(data)): + if attestation_signatures and (entries := attestation_signatures.get(data)): for entry in sorted(entries, key=lambda e: e.validator_id): if entry.validator_id in validator_ids: gossip_sigs.append(entry.signature) - gossip_keys.append(self.validators[entry.validator_id].get_pubkey()) + gossip_keys.append( + self.validators[entry.validator_id].get_attestation_pubkey() + ) gossip_ids.append(entry.validator_id) # If we collected any gossip signatures, aggregate them into a proof. diff --git a/src/lean_spec/subspecs/containers/validator.py b/src/lean_spec/subspecs/containers/validator.py index ebb4d1c7..3a98f384 100644 --- a/src/lean_spec/subspecs/containers/validator.py +++ b/src/lean_spec/subspecs/containers/validator.py @@ -49,12 +49,19 @@ class ValidatorIndices(SSZList[ValidatorIndex]): class Validator(Container): """Represents a validator's static metadata and operational interface.""" - pubkey: Bytes52 - """XMSS one-time signature public key.""" + attestation_pubkey: Bytes52 + """XMSS public key for signing attestations.""" + + proposal_pubkey: Bytes52 + """XMSS public key for signing proposer attestations in blocks.""" index: ValidatorIndex = ValidatorIndex(0) """Validator index in the registry.""" - def get_pubkey(self) -> PublicKey: - """Get the XMSS public key from this validator.""" - return PublicKey.decode_bytes(bytes(self.pubkey)) + def get_attestation_pubkey(self) -> PublicKey: + """Get the XMSS public key used for attestation verification.""" + return PublicKey.decode_bytes(bytes(self.attestation_pubkey)) + + def get_proposal_pubkey(self) -> PublicKey: + """Get the XMSS public key used for proposer attestation verification.""" + return PublicKey.decode_bytes(bytes(self.proposal_pubkey)) diff --git a/src/lean_spec/subspecs/forkchoice/__init__.py b/src/lean_spec/subspecs/forkchoice/__init__.py index 8a916517..ef6edb3b 100644 --- a/src/lean_spec/subspecs/forkchoice/__init__.py +++ b/src/lean_spec/subspecs/forkchoice/__init__.py @@ -5,9 +5,9 @@ providing the core functionality for determining the canonical chain head. """ -from .store import GossipSignatureEntry, Store +from .store import AttestationSignatureEntry, Store __all__ = [ - "GossipSignatureEntry", + "AttestationSignatureEntry", "Store", ] diff --git a/src/lean_spec/subspecs/forkchoice/store.py b/src/lean_spec/subspecs/forkchoice/store.py index f758410b..53465554 100644 --- a/src/lean_spec/subspecs/forkchoice/store.py +++ b/src/lean_spec/subspecs/forkchoice/store.py @@ -4,7 +4,7 @@ The Store tracks all information required for the LMD GHOST forkchoice algorithm. """ -__all__ = ["GossipSignatureEntry", "Store"] +__all__ = ["AttestationSignatureEntry", "Store"] from collections import defaultdict from typing import NamedTuple @@ -44,11 +44,11 @@ from lean_spec.types.base import StrictBaseModel -class GossipSignatureEntry(NamedTuple): +class AttestationSignatureEntry(NamedTuple): """ - Single validator's XMSS signature for an attestation, as learned from gossip. + Single validator's XMSS signature for an attestation. - Used as an element in the gossip_signatures map: one entry per validator + Used as an element in the attestation_signatures map: one entry per validator that attested to the same AttestationData. """ @@ -135,11 +135,12 @@ class Store(StrictBaseModel): validator_id: ValidatorIndex | None """Index of the validator running this store instance.""" - gossip_signatures: dict[AttestationData, set[GossipSignatureEntry]] = {} + attestation_signatures: dict[AttestationData, set[AttestationSignatureEntry]] = {} """ Per-validator XMSS signatures learned from committee attesters. - Keyed by AttestationData. + Keyed by AttestationData. Includes signatures originating from gossip as well as + proposer attestation signatures extracted from block envelopes. """ latest_new_aggregated_payloads: dict[AttestationData, set[AggregatedSignatureProof]] = {} @@ -235,8 +236,7 @@ def prune_stale_attestation_data(self) -> "Store": Pruning removes all attestation-related data: - - Attestation data entries - - Gossip signatures + - Attestation signatures (gossip/proposer) - Pending aggregated payloads - Processed aggregated payloads @@ -250,9 +250,9 @@ def prune_stale_attestation_data(self) -> "Store": # Each mapping is keyed by attestation data, so we check membership by slot # against the finalized slot. - new_gossip_sigs = { + new_attestation_sigs = { attestation_data: sigs - for attestation_data, sigs in self.gossip_signatures.items() + for attestation_data, sigs in self.attestation_signatures.items() if attestation_data.target.slot > finalized_slot } @@ -270,7 +270,7 @@ def prune_stale_attestation_data(self) -> "Store": return self.model_copy( update={ - "gossip_signatures": new_gossip_sigs, + "attestation_signatures": new_attestation_sigs, "latest_new_aggregated_payloads": new_aggregated_new, "latest_known_aggregated_payloads": new_aggregated_known, } @@ -370,7 +370,7 @@ def on_gossip_attestation( assert validator_id.is_valid(Uint64(len(key_state.validators))), ( f"Validator {validator_id} not found in state {attestation_data.target.root.hex()}" ) - public_key = key_state.validators[validator_id].get_pubkey() + public_key = key_state.validators[validator_id].get_attestation_pubkey() assert signature.verify( public_key, attestation_data.slot, attestation_data.data_root_bytes(), scheme @@ -378,7 +378,7 @@ def on_gossip_attestation( # Store signature and attestation data for later aggregation. # Copy the inner sets so we can add to them without mutating the previous store. - new_committee_sigs = {k: set(v) for k, v in self.gossip_signatures.items()} + new_committee_sigs = {k: set(v) for k, v in self.attestation_signatures.items()} if is_aggregator: assert self.validator_id is not None, "Current validator ID must be set for aggregation" @@ -386,13 +386,13 @@ def on_gossip_attestation( attester_subnet = validator_id.compute_subnet_id(ATTESTATION_COMMITTEE_COUNT) if current_subnet == attester_subnet: new_committee_sigs.setdefault(attestation_data, set()).add( - GossipSignatureEntry(validator_id, signature) + AttestationSignatureEntry(validator_id, signature) ) # Return store with updated signature map and attestation data return self.model_copy( update={ - "gossip_signatures": new_committee_sigs, + "attestation_signatures": new_committee_sigs, } ) @@ -437,7 +437,7 @@ def on_gossip_aggregated_attestation( ) # Prepare public keys for verification - public_keys = [validators[vid].get_pubkey() for vid in validator_ids] + public_keys = [validators[vid].get_attestation_pubkey() for vid in validator_ids] # Verify the leanVM aggregated proof try: @@ -476,8 +476,8 @@ def on_block( 1. Validating the block's parent exists 2. Computing the post-state via the state transition function 3. Processing attestations included in the block body (on-chain) - 4. Updating the forkchoice head - 5. Processing the proposer's attestation (as if gossiped) + 4. Adding the proposer's attestation signature to the individual-signature pipeline + 5. Updating the forkchoice head Algorithm Overview ------------------ @@ -488,17 +488,17 @@ def on_block( - They are historical and have already influenced prior fork choice - Processed immediately as "known" attestations - **Proposer Attestation** (processed as gossip): + **Proposer Attestation** (added to attestation_signatures): - The proposer's attestation for their own block - - Cast during interval 1 (after block proposal in interval 0) - - Should NOT influence this block's fork choice position - - Treated as pending until interval 3 (end of slot) - - Will be included in a future block + - Contains a real attestation-key signature + - Added directly to attestation_signatures so the proposer's vote flows + through the standard aggregation pipeline + - Ensures the vote counts even if the proposer crashes before re-gossiping - This separation ensures: - - The proposer's attestation doesn't create circular weight - - Fork choice head is computed before counting proposer attestation - - The attestation is available for the next block producer + This ensures: + - The proposer's vote is never lost (crash/partition resilience) + - Fork choice head is computed after storing all attestation data + - The attestation flows through normal aggregation like any gossip attestation Args: signed_block_with_attestation: Complete signed block with proposer attestation. @@ -512,7 +512,6 @@ def on_block( """ # Unpack block components block = signed_block_with_attestation.message.block - proposer_attestation = signed_block_with_attestation.message.proposer_attestation block_root = hash_tree_root(block) # Skip duplicate blocks (idempotent operation) @@ -571,44 +570,22 @@ def on_block( for att, proof in zip(aggregated_attestations, attestation_signatures, strict=True): block_proofs.setdefault(att.data, set()).add(proof) - # Update store with new aggregated proofs and attestation data - store = store.model_copy( - update={ - "latest_known_aggregated_payloads": block_proofs, - } + # Update store with new aggregated proofs. + store = store.model_copy(update={"latest_known_aggregated_payloads": block_proofs}) + + # Add the proposer's attestation signature to the individual-signature pipeline. + # This ensures the proposer's vote counts for fork choice even if they never + # re-gossip at interval 1 (crash resilience). + proposer_att = signed_block_with_attestation.message.proposer_attestation + att_sigs = {k: set(v) for k, v in store.attestation_signatures.items()} + att_sigs.setdefault(proposer_att.data, set()).add( + AttestationSignatureEntry(proposer_att.validator_id, proposer_att.signature) ) + store = store.model_copy(update={"attestation_signatures": att_sigs}) # Update forkchoice head based on new block and attestations - # - # IMPORTANT: This must happen BEFORE processing proposer attestation - # to prevent the proposer from gaining circular weight advantage. store = store.update_head() - # Process proposer signature for future aggregation - # - # The proposer casts their attestation in interval 1, after block - # proposal. Store the signature so it can be aggregated later. - - new_gossip_sigs = {k: set(v) for k, v in store.gossip_signatures.items()} - - # Store proposer signature for future lookup if it belongs to the same committee - # as the current validator. - if self.validator_id is not None: - proposer_subnet_id = proposer_attestation.validator_id.compute_subnet_id( - ATTESTATION_COMMITTEE_COUNT - ) - current_validator_subnet_id = self.validator_id.compute_subnet_id( - ATTESTATION_COMMITTEE_COUNT - ) - if proposer_subnet_id == current_validator_subnet_id: - sig = signed_block_with_attestation.signature.proposer_signature - new_gossip_sigs.setdefault(proposer_attestation.data, set()).add( - GossipSignatureEntry(proposer_attestation.validator_id, sig) - ) - - # Update store with proposer signature - store = store.model_copy(update={"gossip_signatures": new_gossip_sigs}) - # Prune stale attestation data when finalization advances if store.latest_finalized.slot > self.latest_finalized.slot: store = store.prune_stale_attestation_data() @@ -640,6 +617,25 @@ def extract_attestations_from_aggregated_payloads( attestations[validator_id] = attestation_data return attestations + def _merge_individual_signature_votes( + self, attestations: dict[ValidatorIndex, AttestationData] + ) -> dict[ValidatorIndex, AttestationData]: + """ + Merge votes from individual attestation signatures into a vote map. + + Individual signatures in attestation_signatures include proposer attestations + extracted from block envelopes and gossip attestations awaiting aggregation. + If a validator already has a vote from the aggregation pipeline (newer or + same slot), the aggregated vote takes precedence. + """ + merged = dict(attestations) + for att_data, entries in self.attestation_signatures.items(): + for entry in entries: + existing = merged.get(entry.validator_id) + if existing is None or existing.slot < att_data.slot: + merged[entry.validator_id] = att_data + return merged + def compute_block_weights(self) -> dict[Bytes32, int]: """ Compute attestation-based weight for each block above the finalized slot. @@ -650,8 +646,10 @@ def compute_block_weights(self) -> dict[Bytes32, int]: Returns: Mapping from block root to accumulated attestation weight. """ - attestations = self.extract_attestations_from_aggregated_payloads( - self.latest_known_aggregated_payloads + attestations = self._merge_individual_signature_votes( + self.extract_attestations_from_aggregated_payloads( + self.latest_known_aggregated_payloads + ) ) start_slot = self.latest_finalized.slot @@ -778,9 +776,12 @@ def update_head(self) -> "Store": New Store with updated head. """ - # Extract attestations from known aggregated payloads - attestations = self.extract_attestations_from_aggregated_payloads( - self.latest_known_aggregated_payloads + # Extract attestations from known aggregated payloads, merged with + # individual attestation signatures (including proposer attestations). + attestations = self._merge_individual_signature_votes( + self.extract_attestations_from_aggregated_payloads( + self.latest_known_aggregated_payloads + ) ) # Run LMD-GHOST fork choice algorithm @@ -924,7 +925,11 @@ def update_safe_target(self) -> "Store": # # Each proof encodes which validators participated. # This step unpacks those bitfields into a flat mapping of validator -> vote. - attestations = self.extract_attestations_from_aggregated_payloads(all_payloads) + # Also merge individual attestation signatures so proposer attestations + # from block envelopes contribute to safe target. + attestations = self._merge_individual_signature_votes( + self.extract_attestations_from_aggregated_payloads(all_payloads) + ) # Run LMD GHOST with the supermajority threshold. # @@ -950,7 +955,7 @@ def aggregate_committee_signatures(self) -> tuple["Store", list[SignedAggregated """ Aggregate committee signatures for attestations in committee_signatures. - This method aggregates signatures from the gossip_signatures map. + This method aggregates signatures from the attestation_signatures map. Returns: Tuple of (new Store with updated payloads, list of new SignedAggregatedAttestation). @@ -960,18 +965,19 @@ def aggregate_committee_signatures(self) -> tuple["Store", list[SignedAggregated for attestation_data, proofs in self.latest_new_aggregated_payloads.items() } - committee_signatures = self.gossip_signatures + committee_signatures = self.attestation_signatures - # Extract attestations from gossip_signatures - attestation_list: list[Attestation] = [ - Attestation(validator_id=entry.validator_id, data=attestation_data) - for attestation_data, signatures in self.gossip_signatures.items() - for entry in signatures - ] + # Extract attestations from attestation_signatures + attestation_list: list[Attestation] = [] + for attestation_data, signatures in self.attestation_signatures.items(): + for entry in signatures: + attestation_list.append( + Attestation(validator_id=entry.validator_id, data=attestation_data) + ) head_state = self.states[self.head] # Perform aggregation - aggregated_results = head_state.aggregate_gossip_signatures( + aggregated_results = head_state.aggregate_attestation_signatures( attestation_list, committee_signatures, ) @@ -982,27 +988,27 @@ def aggregate_committee_signatures(self) -> tuple["Store", list[SignedAggregated ] # Compute new aggregated payloads - new_gossip_sigs = { + new_attestation_sigs = { attestation_data: set(signatures) - for attestation_data, signatures in self.gossip_signatures.items() + for attestation_data, signatures in self.attestation_signatures.items() } for aggregated_attestation, aggregated_signature in aggregated_results: attestation_data = aggregated_attestation.data new_aggregated_payloads.setdefault(attestation_data, set()).add(aggregated_signature) validator_ids = set(aggregated_signature.participants.to_validator_indices()) - existing_entries = new_gossip_sigs.get(attestation_data) + existing_entries = new_attestation_sigs.get(attestation_data) if existing_entries: remaining = {e for e in existing_entries if e.validator_id not in validator_ids} if remaining: - new_gossip_sigs[attestation_data] = remaining + new_attestation_sigs[attestation_data] = remaining else: - del new_gossip_sigs[attestation_data] + del new_attestation_sigs[attestation_data] return self.model_copy( update={ "latest_new_aggregated_payloads": new_aggregated_payloads, - "gossip_signatures": new_gossip_sigs, + "attestation_signatures": new_attestation_sigs, } ), new_aggregates diff --git a/src/lean_spec/subspecs/genesis/config.py b/src/lean_spec/subspecs/genesis/config.py index 8368c8d8..a1a77b1b 100644 --- a/src/lean_spec/subspecs/genesis/config.py +++ b/src/lean_spec/subspecs/genesis/config.py @@ -6,8 +6,10 @@ GENESIS_TIME: 1704085200 GENESIS_VALIDATORS: - - 0xe2a03c16122c7e0f940e2301aa460c54a2e1e8343968bb2782f26636f051e65e... - - 0x0767e65924063f79ae92ee1953685f06718b1756cc665a299bd61b4b82055e37... + - attestation_pubkey: 0xe2a03c16122c7e0f... + proposal_pubkey: 0x0767e65924063f79... + - attestation_pubkey: 0xabcdef0123456789... + proposal_pubkey: 0x9876543210fedcba... """ from __future__ import annotations @@ -24,6 +26,33 @@ from lean_spec.types import Bytes52, StrictBaseModel, Uint64 +def _parse_hex_pubkey(v: Any) -> Bytes52: + """Convert hex string or integer to Bytes52.""" + if isinstance(v, int): + return Bytes52(f"0x{v:0104x}") + return Bytes52(v) + + +class GenesisValidatorEntry(StrictBaseModel): + """A single validator's public keys in the genesis configuration.""" + + attestation_pubkey: Bytes52 + """XMSS public key for signing attestations.""" + + proposal_pubkey: Bytes52 + """XMSS public key for signing proposer attestations in blocks.""" + + @field_validator("attestation_pubkey", "proposal_pubkey", mode="before") + @classmethod + def parse_hex_pubkey(cls, v: Any) -> Bytes52: + """ + Convert hex strings or integers to validated Bytes52 pubkeys. + + YAML parsers may interpret 0x-prefixed values as integers. + """ + return _parse_hex_pubkey(v) + + class GenesisConfig(StrictBaseModel): """ Configuration that establishes the birth of an Ethereum consensus chain. @@ -65,37 +94,18 @@ class GenesisConfig(StrictBaseModel): The actual validator count is derived from the genesis validator list. """ - genesis_validators: list[Bytes52] = Field(alias="GENESIS_VALIDATORS") + genesis_validators: list[GenesisValidatorEntry] = Field(alias="GENESIS_VALIDATORS") """ - Public keys of validators trusted to secure the chain from slot 0. - - Bootstrap the proof-of-stake mechanism. - - These validators can: + Validators trusted to secure the chain from slot 0. - - Propose the first blocks - - Cast attestations for justification/finalization - - Form the supermajority needed for consensus + Each entry contains two XMSS public keys: - Each key is 52 bytes (XMSS format). + - attestation_pubkey: for signing attestations + - proposal_pubkey: for signing proposer attestations in blocks Security note: 2/3+ collusion controls the chain until new validators join. """ - @field_validator("genesis_validators", mode="before") - @classmethod - def parse_hex_pubkeys(cls, v: Any) -> list[Bytes52]: - """ - Convert hex strings or integers to validated Bytes52 pubkeys. - - YAML parsers may interpret 0x-prefixed values as integers. - Handles both string and integer inputs for compatibility. - """ - if not isinstance(v, list): - raise ValueError(f"genesis_validators must be a list, got {type(v).__name__}") - - return [Bytes52(f"0x{pk:0104x}" if isinstance(pk, int) else pk) for pk in v] - @model_validator(mode="after") def validate_num_validators_consistency(self) -> GenesisConfig: """Verify num_validators matches actual count when provided.""" @@ -117,8 +127,12 @@ def to_validators(self) -> Validators: """ return Validators( data=[ - Validator(pubkey=pk, index=ValidatorIndex(i)) - for i, pk in enumerate(self.genesis_validators) + Validator( + attestation_pubkey=entry.attestation_pubkey, + proposal_pubkey=entry.proposal_pubkey, + index=ValidatorIndex(i), + ) + for i, entry in enumerate(self.genesis_validators) ] ) diff --git a/src/lean_spec/subspecs/validator/registry.py b/src/lean_spec/subspecs/validator/registry.py index 7427ca45..0b8e4215 100644 --- a/src/lean_spec/subspecs/validator/registry.py +++ b/src/lean_spec/subspecs/validator/registry.py @@ -47,13 +47,19 @@ class ValidatorManifestEntry(BaseModel): index: int """Validator index in the registry.""" - pubkey_hex: str - """Public key as hex string with 0x prefix.""" + attestation_pubkey_hex: str + """Attestation public key as hex string with 0x prefix.""" - privkey_file: str - """Filename of the private key file (e.g., validator_0_sk.ssz).""" + proposal_pubkey_hex: str + """Proposal public key as hex string with 0x prefix.""" - @field_validator("pubkey_hex", mode="before") + attestation_privkey_file: str + """Filename of the attestation private key file.""" + + proposal_privkey_file: str + """Filename of the proposal private key file.""" + + @field_validator("attestation_pubkey_hex", "proposal_pubkey_hex", mode="before") @classmethod def parse_pubkey_hex(cls, v: str | int) -> str: """ @@ -138,14 +144,19 @@ class ValidatorEntry: """ A single validator's key material. - Holds both the index and the secret key needed for signing. + Holds the index and both secret keys needed for signing. + Attestation and proposal keys are separate to allow independent + OTS signing within the same slot. """ index: ValidatorIndex """Validator index in the registry.""" - secret_key: SecretKey - """Secret key for signing operations.""" + attestation_secret_key: SecretKey + """Secret key for signing attestations.""" + + proposal_secret_key: SecretKey + """Secret key for signing proposer attestations in blocks.""" @dataclass(slots=True) @@ -270,38 +281,58 @@ def from_yaml( ) continue - # Load secret key from SSZ file. - privkey_path = manifest_dir / entry.privkey_file + # Load attestation secret key from SSZ file. + att_key_path = manifest_dir / entry.attestation_privkey_file + try: + attestation_secret_key = SecretKey.decode_bytes(att_key_path.read_bytes()) + except FileNotFoundError as e: + raise ValueError(f"Attestation key file not found: {att_key_path}") from e + except Exception as e: + raise ValueError( + f"Failed to load attestation key for validator {index}: {e}" + ) from e + + # Load proposal secret key from SSZ file. + prop_key_path = manifest_dir / entry.proposal_privkey_file try: - secret_key = SecretKey.decode_bytes(privkey_path.read_bytes()) + proposal_secret_key = SecretKey.decode_bytes(prop_key_path.read_bytes()) except FileNotFoundError as e: - raise ValueError(f"Private key file not found: {privkey_path}") from e + raise ValueError(f"Proposal key file not found: {prop_key_path}") from e except Exception as e: - raise ValueError(f"Failed to load private key for validator {index}: {e}") from e + raise ValueError(f"Failed to load proposal key for validator {index}: {e}") from e registry.add( ValidatorEntry( index=ValidatorIndex(index), - secret_key=secret_key, + attestation_secret_key=attestation_secret_key, + proposal_secret_key=proposal_secret_key, ) ) return registry @classmethod - def from_secret_keys(cls, keys: dict[ValidatorIndex, SecretKey]) -> ValidatorRegistry: + def from_secret_keys( + cls, keys: dict[ValidatorIndex, tuple[SecretKey, SecretKey]] + ) -> ValidatorRegistry: """ - Create registry from a dictionary of secret keys. + Create registry from a dictionary of secret key pairs. Convenience method for testing or programmatic key loading. Args: - keys: Mapping from validator index to signing key. + keys: Mapping from validator index to (attestation_secret_key, proposal_secret_key). Returns: Registry populated with provided keys. """ registry = cls() - for index, secret_key in keys.items(): - registry.add(ValidatorEntry(index=index, secret_key=secret_key)) + for index, (att_sk, prop_sk) in keys.items(): + registry.add( + ValidatorEntry( + index=index, + attestation_secret_key=att_sk, + proposal_secret_key=prop_sk, + ) + ) return registry diff --git a/src/lean_spec/subspecs/validator/service.py b/src/lean_spec/subspecs/validator/service.py index ca76a3e0..953878a5 100644 --- a/src/lean_spec/subspecs/validator/service.py +++ b/src/lean_spec/subspecs/validator/service.py @@ -12,21 +12,21 @@ This service drives validator duties by monitoring the slot clock and triggering production at the appropriate intervals. -Proposer Attestation Design ---------------------------- -Each validator attests exactly once per slot. +Dual-Key Attestation Design +---------------------------- +Each validator has two XMSS key pairs: -However, proposers and non-proposers attest at different times: -- Proposers attest at interval 0, bundled inside their block -- Non-proposers attest at interval 1, broadcast separately +- **Proposal key**: Signs the proposer signature while proposing a block +- **Attestation key**: Signs gossip attestations for aggregation -This design has two benefits: -1. Proposers see their own attestation immediately (no network delay) -2. Non-proposers can attest to a block they actually received +Proposers produce two attestations per slot: -The proposer's attestation is embedded in a block wrapper alongside -the block itself. At interval 1, we skip proposers because they already -attested. This prevents double-attestation. +1. Interval 0: Proposer signature inside the block (proposal key) +2. Interval 1: Gossip attestation like all other validators (attestation key) + +These use independent keys, so OTS constraints do not conflict. +The block envelope attestation is added directly to Store.attestation_signatures, +flowing through the normal aggregation pipeline alongside gossip attestations. """ from __future__ import annotations @@ -38,9 +38,7 @@ from typing import TYPE_CHECKING, cast from lean_spec.subspecs.chain.clock import Interval, SlotClock -from lean_spec.subspecs.chain.config import ATTESTATION_COMMITTEE_COUNT from lean_spec.subspecs.containers import ( - Attestation, AttestationData, Block, SignedAttestation, @@ -53,7 +51,8 @@ BlockWithAttestation, ) from lean_spec.subspecs.containers.slot import Slot -from lean_spec.subspecs.forkchoice import GossipSignatureEntry +from lean_spec.subspecs.forkchoice.store import AttestationSignatureEntry +from lean_spec.subspecs.ssz.hash import hash_tree_root from lean_spec.subspecs.xmss import TARGET_SIGNATURE_SCHEME, GeneralizedXmssScheme from lean_spec.subspecs.xmss.aggregation import AggregatedSignatureProof from lean_spec.types import Uint64 @@ -115,6 +114,14 @@ class ValidatorService: _attested_slots: set[Slot] = field(default_factory=set, repr=False) """Slots for which we've already produced attestations (prevents duplicates).""" + _cached_signed_attestations: dict[tuple[ValidatorIndex, Slot], SignedAttestation] = field( + default_factory=dict, repr=False + ) + """ + Cache of signed proposer attestations keyed by (validator, slot) so the same + attestation signature can be reused during the gossip step. + """ + async def run(self) -> None: """ Main loop - check duties every interval. @@ -300,14 +307,17 @@ async def _maybe_produce_block(self, slot: Slot) -> None: # This adds our attestation and signatures to the block. signed_block = self._sign_block(block, validator_index, signatures) - # Store proposer's attestation signature locally for aggregation. - # - # The proposer's block is already in the store from produce_block_with_signatures. - # When on_gossip_block is called locally, it returns early (duplicate check). - # So the proposer's attestation signature never reaches gossip_signatures - # via on_block. We must store it explicitly here so the aggregator - # (which may be this same node) can include it in aggregation. - self._store_proposer_attestation_signature(signed_block, validator_index) + # Add the proposer's attestation signature to the store so our + # local view matches what other nodes derive when processing the block. + proposer_att = signed_block.message.proposer_attestation + store = self.sync_service.store + att_sigs = {k: set(v) for k, v in store.attestation_signatures.items()} + att_sigs.setdefault(proposer_att.data, set()).add( + AttestationSignatureEntry(proposer_att.validator_id, proposer_att.signature) + ) + self.sync_service.store = store.model_copy( + update={"attestation_signatures": att_sigs} + ) self._blocks_produced += 1 @@ -331,11 +341,11 @@ async def _maybe_produce_block(self, slot: Slot) -> None: async def _produce_attestations(self, slot: Slot) -> None: """ - Produce attestations for all non-proposer validators we control. + Produce gossip attestations for all validators we control. - Every validator attests exactly once per slot. Since proposers already - bundled their attestation inside the block at interval 0, they are - skipped here to prevent double-attestation. + Every validator gossips an attestation signed with the attestation key. + Proposers also attest here — their block envelope carries a separate + proposal-key signature, so there is no conflict with OTS constraints. Args: slot: Current slot number. @@ -363,24 +373,17 @@ async def _produce_attestations(self, slot: Slot) -> None: if head_state is None: return - num_validators = Uint64(len(head_state.validators)) - for validator_index in self.registry.indices(): - # Skip proposer - they already attested within their block. - # - # The proposer signed and bundled their attestation at interval 0. - # Creating another attestation here would violate the - # "one attestation per validator per slot" invariant. - if validator_index.is_proposer_for(slot, num_validators): - continue - - # Produce attestation data using Store's method. - # - # This calculates head, target, and source checkpoints. - attestation_data = store.produce_attestation_data(slot) + cache_key = (validator_index, slot) + signed_attestation = self._cached_signed_attestations.pop(cache_key, None) + if signed_attestation is None: + # Produce attestation data using Store's method. + # + # This calculates head, target, and source checkpoints. + attestation_data = store.produce_attestation_data(slot) - # Sign the attestation using our secret key. - signed_attestation = self._sign_attestation(attestation_data, validator_index) + # Sign the attestation using our secret key. + signed_attestation = self._sign_attestation(attestation_data, validator_index) self._attestations_produced += 1 @@ -388,7 +391,7 @@ async def _produce_attestations(self, slot: Slot) -> None: # # Gossipsub does not deliver messages back to the sender. # Without local processing, the aggregator node never sees its own - # validator's attestation in gossip_signatures, reducing the + # validator's attestation in attestation_signatures, reducing the # aggregation count below the 2/3 safe-target threshold. is_aggregator_role = ( self.sync_service.store.validator_id is not None and self.sync_service.is_aggregator @@ -427,29 +430,40 @@ def _sign_block( """ # Create the proposer's attestation for this slot. # - # The proposer also attests to the chain head they see. - proposer_attestation_data = self.sync_service.store.produce_attestation_data(block.slot) - proposer_attestation = Attestation( - validator_id=validator_index, - data=proposer_attestation_data, + # Force the store view to treat the newly built block as head so the + # attestation votes for the block we are proposing. + block_root = hash_tree_root(block) + store_updates: dict[str, object] = {"head": block_root} + if block_root not in self.sync_service.store.blocks: + # When blocks are signed in tests they may not exist in the store yet. + store_updates["blocks"] = self.sync_service.store.blocks | {block_root: block} + attestation_store = self.sync_service.store.model_copy(update=store_updates) + proposer_attestation_data = attestation_store.produce_attestation_data(block.slot) + proposer_attestation = self._sign_attestation( + attestation_data=proposer_attestation_data, + validator_index=validator_index, ) # Sign the proposer's attestation. # - # Uses XMSS signature scheme from the validator's secret key. + # Uses the proposal key, separate from the attestation key. + # This allows the proposer to also sign a regular attestation at the same slot. entry = self.registry.get(validator_index) if entry is None: raise ValueError(f"No secret key for validator {validator_index}") - # Ensure the XMSS secret key is prepared for this slot. - entry = self._ensure_prepared_for_slot(entry, block.slot) + # Ensure the proposal key is prepared for this slot. + entry = self._ensure_proposal_key_prepared(entry, block.slot) proposer_signature = TARGET_SIGNATURE_SCHEME.sign( - entry.secret_key, + entry.proposal_secret_key, block.slot, proposer_attestation_data.data_root_bytes(), ) + # Cache the signed attestation for reuse during gossip. + self._cached_signed_attestations[(validator_index, block.slot)] = proposer_attestation + # Create the message wrapper. # # Bundles the block with the proposer's attestation. @@ -493,14 +507,14 @@ def _sign_attestation( if entry is None: raise ValueError(f"No secret key for validator {validator_index}") - # Ensure the XMSS secret key is prepared for this slot. - entry = self._ensure_prepared_for_slot(entry, attestation_data.slot) + # Ensure the attestation key is prepared for this slot. + entry = self._ensure_attestation_key_prepared(entry, attestation_data.slot) # Sign the attestation data root. # - # Uses XMSS one-time signature for the current slot. + # Uses the attestation key, separate from the proposal key. signature = TARGET_SIGNATURE_SCHEME.sign( - entry.secret_key, + entry.attestation_secret_key, attestation_data.slot, attestation_data.data_root_bytes(), ) @@ -511,89 +525,76 @@ def _sign_attestation( signature=signature, ) - def _store_proposer_attestation_signature( + def _ensure_attestation_key_prepared( self, - signed_block: SignedBlockWithAttestation, - validator_index: ValidatorIndex, - ) -> None: + entry: ValidatorEntry, + slot: Slot, + ) -> ValidatorEntry: """ - Store the proposer's attestation signature in gossip_signatures. + Ensure the attestation secret key is prepared for signing at the given slot. - When the proposer produces a block, the block is added to the store - immediately. The subsequent local on_gossip_block call returns early - because the block is already in the store (duplicate check). This means - the proposer's attestation signature never reaches gossip_signatures - via the normal on_block path. - - This method explicitly stores the signature so aggregation can include it. + XMSS uses a sliding window of prepared slots. If the requested slot + is outside this window, we advance the preparation by computing + additional bottom trees until the slot is covered. Args: - signed_block: The signed block containing the proposer attestation. - validator_index: The proposer's validator index. - """ - store = self.sync_service.store - if store.validator_id is None: - return + entry: Validator entry containing the secret keys. + slot: The slot at which we need to sign. - # Only store if the proposer is in the same subnet as the aggregator. - proposer_subnet = validator_index.compute_subnet_id(ATTESTATION_COMMITTEE_COUNT) - current_subnet = store.validator_id.compute_subnet_id(ATTESTATION_COMMITTEE_COUNT) - if proposer_subnet != current_subnet: - return + Returns: + The entry, possibly with an updated attestation secret key. + """ + scheme = cast(GeneralizedXmssScheme, TARGET_SIGNATURE_SCHEME) + prepared_interval = scheme.get_prepared_interval(entry.attestation_secret_key) - proposer_attestation = signed_block.message.proposer_attestation - proposer_signature = signed_block.signature.proposer_signature + slot_int = int(slot) + if slot_int in prepared_interval: + return entry - new_gossip_sigs = {k: set(v) for k, v in store.gossip_signatures.items()} - new_gossip_sigs.setdefault(proposer_attestation.data, set()).add( - GossipSignatureEntry(validator_index, proposer_signature) - ) + secret_key = entry.attestation_secret_key + while slot_int not in scheme.get_prepared_interval(secret_key): + secret_key = scheme.advance_preparation(secret_key) - self.sync_service.store = store.model_copy( - update={ - "gossip_signatures": new_gossip_sigs, - } + updated_entry = ValidatorEntry( + index=entry.index, + attestation_secret_key=secret_key, + proposal_secret_key=entry.proposal_secret_key, ) + self.registry.add(updated_entry) + return updated_entry - def _ensure_prepared_for_slot( + def _ensure_proposal_key_prepared( self, entry: ValidatorEntry, slot: Slot, ) -> ValidatorEntry: """ - Ensure the secret key is prepared for signing at the given slot. - - XMSS uses a sliding window of prepared slots. If the requested slot - is outside this window, we advance the preparation by computing - additional bottom trees until the slot is covered. + Ensure the proposal secret key is prepared for signing at the given slot. Args: - entry: Validator entry containing the secret key. + entry: Validator entry containing the secret keys. slot: The slot at which we need to sign. Returns: - The entry, possibly with an updated secret key. + The entry, possibly with an updated proposal secret key. """ scheme = cast(GeneralizedXmssScheme, TARGET_SIGNATURE_SCHEME) - prepared_interval = scheme.get_prepared_interval(entry.secret_key) + prepared_interval = scheme.get_prepared_interval(entry.proposal_secret_key) - # If slot is already in the prepared interval, no action needed. slot_int = int(slot) if slot_int in prepared_interval: return entry - # Advance preparation until the slot is covered. - secret_key = entry.secret_key + secret_key = entry.proposal_secret_key while slot_int not in scheme.get_prepared_interval(secret_key): secret_key = scheme.advance_preparation(secret_key) - # Update the registry with the new secret key. updated_entry = ValidatorEntry( index=entry.index, - secret_key=secret_key, + attestation_secret_key=entry.attestation_secret_key, + proposal_secret_key=secret_key, ) self.registry.add(updated_entry) - return updated_entry def stop(self) -> None: diff --git a/src/lean_spec/subspecs/xmss/containers.py b/src/lean_spec/subspecs/xmss/containers.py index 565f6bfa..594a4ed2 100644 --- a/src/lean_spec/subspecs/xmss/containers.py +++ b/src/lean_spec/subspecs/xmss/containers.py @@ -218,27 +218,43 @@ class SecretKey(Container): class KeyPair(NamedTuple): """ - Immutable XMSS key pair for a validator. + Immutable XMSS key pair produced by key generation. - Attributes: - public: Public key for signature verification. - secret: Secret key containing Merkle tree structures. + Used at the scheme level for a single public/secret pair. """ public: PublicKey secret: SecretKey + +class ValidatorKeyPair(NamedTuple): + """ + Immutable dual XMSS key pair for a validator. + + Attestation and proposal keys are separate to allow independent signing + within the same slot. OTS requires a distinct key for each signing purpose. + """ + + attestation_public: PublicKey + attestation_secret: SecretKey + proposal_public: PublicKey + proposal_secret: SecretKey + @classmethod - def from_dict(cls, data: Mapping[str, str]) -> KeyPair: + def from_dict(cls, data: Mapping[str, str]) -> ValidatorKeyPair: """Deserialize from JSON-compatible dict with hex-encoded SSZ.""" return cls( - public=PublicKey.decode_bytes(bytes.fromhex(data["public"])), - secret=SecretKey.decode_bytes(bytes.fromhex(data["secret"])), + attestation_public=PublicKey.decode_bytes(bytes.fromhex(data["attestation_public"])), + attestation_secret=SecretKey.decode_bytes(bytes.fromhex(data["attestation_secret"])), + proposal_public=PublicKey.decode_bytes(bytes.fromhex(data["proposal_public"])), + proposal_secret=SecretKey.decode_bytes(bytes.fromhex(data["proposal_secret"])), ) def to_dict(self) -> dict[str, str]: """Serialize to JSON-compatible dict with hex-encoded SSZ.""" return { - "public": self.public.encode_bytes().hex(), - "secret": self.secret.encode_bytes().hex(), + "attestation_public": self.attestation_public.encode_bytes().hex(), + "attestation_secret": self.attestation_secret.encode_bytes().hex(), + "proposal_public": self.proposal_public.encode_bytes().hex(), + "proposal_secret": self.proposal_secret.encode_bytes().hex(), } diff --git a/tests/consensus/devnet/fc/test_fork_choice_reorgs.py b/tests/consensus/devnet/fc/test_fork_choice_reorgs.py index 358a4006..70b79473 100644 --- a/tests/consensus/devnet/fc/test_fork_choice_reorgs.py +++ b/tests/consensus/devnet/fc/test_fork_choice_reorgs.py @@ -381,8 +381,8 @@ def test_reorg_with_slot_gaps( BlockStep( block=BlockSpec(slot=Slot(4), parent_label="base", label="fork_b_4"), checks=StoreChecks( - head_slot=Slot(3), - head_root_label="fork_a_3", # Tie-breaker + head_slot=Slot(4), + head_root_label="fork_b_4", # Tie (1 vote each), fork_b wins by hash ), ), # Fork A at slot 7 (missed slots 4-6) @@ -401,8 +401,8 @@ def test_reorg_with_slot_gaps( BlockStep( block=BlockSpec(slot=Slot(8), parent_label="fork_b_4", label="fork_b_8"), checks=StoreChecks( - head_slot=Slot(7), - head_root_label="fork_a_7", # Tie (both 2 blocks deep) + head_slot=Slot(8), + head_root_label="fork_b_8", # Tie (2 votes each), fork_b wins by hash ), ), # Fork B at slot 9 (overtakes with 3rd block) diff --git a/tests/consensus/devnet/fc/test_signature_aggregation.py b/tests/consensus/devnet/fc/test_signature_aggregation.py index bdb374c6..f79b0aa7 100644 --- a/tests/consensus/devnet/fc/test_signature_aggregation.py +++ b/tests/consensus/devnet/fc/test_signature_aggregation.py @@ -271,27 +271,23 @@ def test_auto_collect_proposer_attestations( fork_choice_test: ForkChoiceTestFiller, ) -> None: """ - Automatically collect previous proposers' attestations into block body. + Proposer gossip attestations ARE auto-collected into future block bodies. Scenario -------- With automatic attestation collection enabled: - - Block 1: proposer 1 attests (attestation goes to Store) - - Block 2: auto-collects proposer 1's attestation into block body + - Block 1: proposer (validator 1) gossips attestation using attestation key + - Block 2: auto-collection picks up the proposer's gossip attestation Expected -------- - Without explicit attestation specs, blocks automatically include - attestations from previous proposers whose signatures are available - and whose source matches the current justified checkpoint. - - Note: Auto-collection only includes attestations whose source matches - the post-state's latest_justified checkpoint. Proposer attestations - reference their parent as source, which must match for inclusion. + With dual keys, proposers gossip a separate attestation using their + attestation key (in addition to the proposal-key signature in the block + envelope). This gossip attestation enters the normal aggregation pipeline + and gets auto-collected into the next block body. """ fork_choice_test( steps=[ - # Block 1: Proposer 1 attests (goes to the store gossiped signatures) BlockStep( block=BlockSpec(slot=Slot(1), label="block_1"), checks=StoreChecks( @@ -299,7 +295,6 @@ def test_auto_collect_proposer_attestations( block_attestation_count=0, ), ), - # Block 2: Auto-collect proposer 1's attestation BlockStep( block=BlockSpec( slot=Slot(2), @@ -308,9 +303,6 @@ def test_auto_collect_proposer_attestations( ), checks=StoreChecks( head_slot=Slot(2), - # Proposer 1's attestation should be auto-collected. - # Target is genesis (slot 0) because the spec's attestation target - # algorithm walks back from head toward safe_target. block_attestation_count=1, block_attestations=[ AggregatedAttestationCheck( @@ -334,15 +326,15 @@ def test_auto_collect_combined_with_explicit_attestations( Scenario -------- Block 2 uses both mechanisms: - - Auto-collection gathers proposer 1's attestation from Store + - Auto-collection picks up block 1's proposer gossip attestation (validator 1) - Explicit spec adds validators 0 and 3 Expected -------- - Block body contains attestations from all sources. - Proposer 1's attestation targets genesis (slot 0) via the spec's target - walk-back algorithm, while explicit attestations target block_1 (slot 1). - Different targets produce separate aggregation groups. + Block body contains both the auto-collected proposer gossip attestation + and the explicit attestations. The proposer's gossip attestation (attestation + key) enters the normal aggregation pipeline and merges with any explicit + attestations targeting the same data. """ fork_choice_test( steps=[ @@ -365,7 +357,6 @@ def test_auto_collect_combined_with_explicit_attestations( ), checks=StoreChecks( head_slot=Slot(2), - # Two separate groups: proposer targets genesis, explicit targets block_1 block_attestation_count=2, block_attestations=[ AggregatedAttestationCheck( diff --git a/tests/consensus/devnet/ssz/test_consensus_containers.py b/tests/consensus/devnet/ssz/test_consensus_containers.py index 0dc2a51f..031a2e28 100644 --- a/tests/consensus/devnet/ssz/test_consensus_containers.py +++ b/tests/consensus/devnet/ssz/test_consensus_containers.py @@ -260,7 +260,11 @@ def test_block_with_attestation_minimal(ssz: SSZTestFiller) -> None: state_root=Bytes32.zero(), body=BlockBody(attestations=AggregatedAttestations(data=[])), ) - attestation = Attestation(validator_id=ValidatorIndex(0), data=_zero_attestation_data()) + attestation = SignedAttestation( + validator_id=ValidatorIndex(0), + data=_zero_attestation_data(), + signature=create_dummy_signature(), + ) ssz( type_name="BlockWithAttestation", value=BlockWithAttestation(block=block, proposer_attestation=attestation), @@ -311,7 +315,11 @@ def test_signed_block_with_attestation_minimal(ssz: SSZTestFiller) -> None: state_root=Bytes32.zero(), body=BlockBody(attestations=AggregatedAttestations(data=[])), ) - attestation = Attestation(validator_id=ValidatorIndex(0), data=_zero_attestation_data()) + attestation = SignedAttestation( + validator_id=ValidatorIndex(0), + data=_zero_attestation_data(), + signature=create_dummy_signature(), + ) message = BlockWithAttestation(block=block, proposer_attestation=attestation) signature = BlockSignatures( attestation_signatures=AttestationSignatures(data=[]), @@ -343,7 +351,11 @@ def test_validator_zero(ssz: SSZTestFiller) -> None: """SSZ roundtrip for Validator with zero values.""" ssz( type_name="Validator", - value=Validator(pubkey=Bytes52.zero(), index=ValidatorIndex(0)), + value=Validator( + attestation_pubkey=Bytes52.zero(), + proposal_pubkey=Bytes52.zero(), + index=ValidatorIndex(0), + ), ) @@ -351,7 +363,11 @@ def test_validator_typical(ssz: SSZTestFiller) -> None: """SSZ roundtrip for Validator with typical values.""" ssz( type_name="Validator", - value=Validator(pubkey=Bytes52(b"\xab" * 52), index=ValidatorIndex(42)), + value=Validator( + attestation_pubkey=Bytes52(b"\xab" * 52), + proposal_pubkey=Bytes52(b"\xab" * 52), + index=ValidatorIndex(42), + ), ) @@ -378,7 +394,15 @@ def test_state_minimal(ssz: SSZTestFiller) -> None: latest_finalized=zero_cp, historical_block_hashes=HistoricalBlockHashes(data=[]), justified_slots=JustifiedSlots(data=[]), - validators=Validators(data=[Validator(pubkey=Bytes52.zero(), index=ValidatorIndex(0))]), + validators=Validators( + data=[ + Validator( + attestation_pubkey=Bytes52.zero(), + proposal_pubkey=Bytes52.zero(), + index=ValidatorIndex(0), + ) + ] + ), justifications_roots=JustificationRoots(data=[]), justifications_validators=JustificationValidators(data=[]), ), @@ -407,10 +431,26 @@ def test_state_with_validators(ssz: SSZTestFiller) -> None: justified_slots=JustifiedSlots(data=[Boolean(True), Boolean(False), Boolean(True)]), validators=Validators( data=[ - Validator(pubkey=Bytes52(b"\x01" * 52), index=ValidatorIndex(0)), - Validator(pubkey=Bytes52(b"\x02" * 52), index=ValidatorIndex(1)), - Validator(pubkey=Bytes52(b"\x03" * 52), index=ValidatorIndex(2)), - Validator(pubkey=Bytes52(b"\x04" * 52), index=ValidatorIndex(3)), + Validator( + attestation_pubkey=Bytes52(b"\x01" * 52), + proposal_pubkey=Bytes52(b"\x01" * 52), + index=ValidatorIndex(0), + ), + Validator( + attestation_pubkey=Bytes52(b"\x02" * 52), + proposal_pubkey=Bytes52(b"\x02" * 52), + index=ValidatorIndex(1), + ), + Validator( + attestation_pubkey=Bytes52(b"\x03" * 52), + proposal_pubkey=Bytes52(b"\x03" * 52), + index=ValidatorIndex(2), + ), + Validator( + attestation_pubkey=Bytes52(b"\x04" * 52), + proposal_pubkey=Bytes52(b"\x04" * 52), + index=ValidatorIndex(3), + ), ] ), justifications_roots=JustificationRoots(data=[Bytes32(b"\x20" * 32)]), diff --git a/tests/consensus/devnet/ssz/test_xmss_containers.py b/tests/consensus/devnet/ssz/test_xmss_containers.py index 380d1729..a2c85959 100644 --- a/tests/consensus/devnet/ssz/test_xmss_containers.py +++ b/tests/consensus/devnet/ssz/test_xmss_containers.py @@ -54,7 +54,7 @@ def test_signature_actual(ssz: SSZTestFiller) -> None: """SSZ roundtrip for a cryptographically valid Signature produced by signing.""" key_manager = get_shared_key_manager() scheme = key_manager.scheme - _, sk = key_manager.keys[ValidatorIndex(0)] + sk = key_manager.keys[ValidatorIndex(0)].attestation_secret signature = scheme.sign(sk, Slot(0), Bytes32(b"\x42" * 32)) ssz(type_name="Signature", value=signature) diff --git a/tests/interop/helpers/diagnostics.py b/tests/interop/helpers/diagnostics.py index e18fba82..fe4927f8 100644 --- a/tests/interop/helpers/diagnostics.py +++ b/tests/interop/helpers/diagnostics.py @@ -27,7 +27,7 @@ class PipelineDiagnostics: justified_slot: int """Latest justified slot.""" - gossip_signatures_count: int + attestation_signatures_count: int """Number of pending gossip signatures (pre-aggregation).""" new_aggregated_count: int diff --git a/tests/interop/helpers/node_runner.py b/tests/interop/helpers/node_runner.py index 6d73f060..681cbe91 100644 --- a/tests/interop/helpers/node_runner.py +++ b/tests/interop/helpers/node_runner.py @@ -109,7 +109,7 @@ def diagnostics(self) -> PipelineDiagnostics: safe_target_slot=int(safe_block.slot) if safe_block else 0, finalized_slot=self.finalized_slot, justified_slot=self.justified_slot, - gossip_signatures_count=len(store.gossip_signatures), + attestation_signatures_count=len(store.attestation_signatures), new_aggregated_count=len(store.latest_new_aggregated_payloads), known_aggregated_count=len(store.latest_known_aggregated_payloads), block_count=len(store.blocks), @@ -189,8 +189,10 @@ class NodeCluster: _validators: Validators | None = field(default=None, repr=False) """Shared validator set.""" - _secret_keys: dict[ValidatorIndex, SecretKey] = field(default_factory=dict, repr=False) - """Secret keys by validator index.""" + _secret_keys: dict[ValidatorIndex, tuple[SecretKey, SecretKey]] = field( + default_factory=dict, repr=False + ) + """Attestation and proposal secret keys by validator index.""" _genesis_time: int = field(default=0, repr=False) """Genesis time for all nodes.""" @@ -217,15 +219,20 @@ def _generate_validators(self) -> None: num_active_slots = int(scheme.config.LIFETIME) for i in range(self.num_validators): - keypair = scheme.key_gen(Slot(0), Uint64(num_active_slots)) - self._secret_keys[ValidatorIndex(i)] = keypair.secret + att_keypair = scheme.key_gen(Slot(0), Uint64(num_active_slots)) + prop_keypair = scheme.key_gen(Slot(0), Uint64(num_active_slots)) + self._secret_keys[ValidatorIndex(i)] = (att_keypair.secret, prop_keypair.secret) - pubkey_bytes = keypair.public.encode_bytes()[:52] - pubkey = Bytes52(pubkey_bytes.ljust(52, b"\x00")) + att_pubkey_bytes = att_keypair.public.encode_bytes()[:52] + att_pubkey = Bytes52(att_pubkey_bytes.ljust(52, b"\x00")) + + prop_pubkey_bytes = prop_keypair.public.encode_bytes()[:52] + prop_pubkey = Bytes52(prop_pubkey_bytes.ljust(52, b"\x00")) validators.append( Validator( - pubkey=pubkey, + attestation_pubkey=att_pubkey, + proposal_pubkey=prop_pubkey, index=ValidatorIndex(i), ) ) @@ -268,10 +275,12 @@ async def start_node( registry = ValidatorRegistry() for idx in validator_indices: if idx in self._secret_keys: + att_sk, prop_sk = self._secret_keys[idx] registry.add( ValidatorEntry( index=ValidatorIndex(idx), - secret_key=self._secret_keys[idx], + attestation_secret_key=att_sk, + proposal_secret_key=prop_sk, ) ) if len(registry) > 0: @@ -601,7 +610,7 @@ def log_diagnostics(self, phase: str) -> list[PipelineDiagnostics]: d.justified_slot, d.finalized_slot, d.block_count, - d.gossip_signatures_count, + d.attestation_signatures_count, d.new_aggregated_count, d.known_aggregated_count, ) diff --git a/tests/interop/test_consensus_lifecycle.py b/tests/interop/test_consensus_lifecycle.py index ab0671a1..4ae84cb5 100644 --- a/tests/interop/test_consensus_lifecycle.py +++ b/tests/interop/test_consensus_lifecycle.py @@ -181,7 +181,8 @@ async def test_consensus_lifecycle(node_cluster: NodeCluster) -> None: # Three validators each produce one attestation, so the sum of # all pipeline stages across all nodes must be at least 3. total_activity = sum( - d.gossip_signatures_count + d.new_aggregated_count + d.known_aggregated_count for d in diags + d.attestation_signatures_count + d.new_aggregated_count + d.known_aggregated_count + for d in diags ) assert total_activity >= MIN_ATTESTATION_ACTIVITY, ( f"Expected >= {MIN_ATTESTATION_ACTIVITY} attestation pipeline " @@ -192,11 +193,11 @@ async def test_consensus_lifecycle(node_cluster: NodeCluster) -> None: # A node with zero activity indicates a gossip or subscription failure. for i, d in enumerate(diags): node_activity = ( - d.gossip_signatures_count + d.new_aggregated_count + d.known_aggregated_count + d.attestation_signatures_count + d.new_aggregated_count + d.known_aggregated_count ) assert node_activity >= 1, ( f"Node {i}: zero attestation pipeline activity " - f"(gsigs={d.gossip_signatures_count}, " + f"(gsigs={d.attestation_signatures_count}, " f"nagg={d.new_aggregated_count}, " f"kagg={d.known_aggregated_count})" ) diff --git a/tests/lean_spec/helpers/__init__.py b/tests/lean_spec/helpers/__init__.py index 7bfe0068..08144314 100644 --- a/tests/lean_spec/helpers/__init__.py +++ b/tests/lean_spec/helpers/__init__.py @@ -26,7 +26,7 @@ make_signed_block_from_store, make_store, make_store_with_attestation_data, - make_store_with_gossip_signatures, + make_store_with_attestation_signatures, make_test_block, make_test_status, make_validators, @@ -60,7 +60,7 @@ "make_signed_block_from_store", "make_store", "make_store_with_attestation_data", - "make_store_with_gossip_signatures", + "make_store_with_attestation_signatures", "make_test_block", "make_test_status", "make_validators", diff --git a/tests/lean_spec/helpers/builders.py b/tests/lean_spec/helpers/builders.py index f6e9687c..7afd2c2a 100644 --- a/tests/lean_spec/helpers/builders.py +++ b/tests/lean_spec/helpers/builders.py @@ -14,7 +14,6 @@ from lean_spec.subspecs.chain.clock import Interval, SlotClock from lean_spec.subspecs.chain.config import INTERVALS_PER_SLOT from lean_spec.subspecs.containers import ( - Attestation, AttestationData, Block, BlockBody, @@ -31,7 +30,7 @@ from lean_spec.subspecs.containers.slot import Slot from lean_spec.subspecs.containers.state import Validators from lean_spec.subspecs.containers.validator import ValidatorIndex, ValidatorIndices -from lean_spec.subspecs.forkchoice import GossipSignatureEntry, Store +from lean_spec.subspecs.forkchoice import AttestationSignatureEntry, Store from lean_spec.subspecs.koalabear import Fp from lean_spec.subspecs.networking import PeerId from lean_spec.subspecs.networking.peer import PeerInfo @@ -91,7 +90,12 @@ def make_validators(count: int) -> Validators: Validators are indexed 0 through count-1. """ validators = [ - Validator(pubkey=Bytes52(b"\x00" * 52), index=ValidatorIndex(i)) for i in range(count) + Validator( + attestation_pubkey=Bytes52(b"\x00" * 52), + proposal_pubkey=Bytes52(b"\x00" * 52), + index=ValidatorIndex(i), + ) + for i in range(count) ] return Validators(data=validators) @@ -101,7 +105,12 @@ def make_validators_from_key_manager(key_manager: XmssKeyManager, count: int) -> return Validators( data=[ Validator( - pubkey=Bytes52(key_manager[ValidatorIndex(i)].public.encode_bytes()), + attestation_pubkey=Bytes52( + key_manager[ValidatorIndex(i)].attestation_public.encode_bytes() + ), + proposal_pubkey=Bytes52( + key_manager[ValidatorIndex(i)].proposal_public.encode_bytes() + ), index=ValidatorIndex(i), ) for i in range(count) @@ -211,7 +220,7 @@ def make_signed_block( block_root = hash_tree_root(block) - attestation = Attestation( + attestation = SignedAttestation( validator_id=proposer_index, data=AttestationData( slot=slot, @@ -219,6 +228,7 @@ def make_signed_block( target=Checkpoint(root=block_root, slot=slot), source=Checkpoint(root=parent_root, slot=Slot(0)), ), + signature=make_mock_signature(), ) return SignedBlockWithAttestation( @@ -375,7 +385,7 @@ def make_store_with_attestation_data( return store, attestation_data -def make_store_with_gossip_signatures( +def make_store_with_attestation_signatures( key_manager: XmssKeyManager, num_validators: int, validator_id: ValidatorIndex, @@ -389,15 +399,15 @@ def make_store_with_gossip_signatures( validator_id, attestation_slot, ) - gossip_signatures = { + attestation_signatures = { attestation_data: { - GossipSignatureEntry(vid, key_manager.sign_attestation_data(vid, attestation_data)) + AttestationSignatureEntry(vid, key_manager.sign_attestation_data(vid, attestation_data)) for vid in attesting_validators }, } store = store.model_copy( update={ - "gossip_signatures": gossip_signatures, + "attestation_signatures": attestation_signatures, } ) return store, attestation_data @@ -438,7 +448,7 @@ def make_aggregated_proof( data_root = attestation_data.data_root_bytes() return AggregatedSignatureProof.aggregate( participants=AggregationBits.from_validator_indices(ValidatorIndices(data=participants)), - public_keys=[key_manager.get_public_key(vid) for vid in participants], + public_keys=[key_manager.get_attestation_public_key(vid) for vid in participants], signatures=[ key_manager.sign_attestation_data(vid, attestation_data) for vid in participants ], @@ -461,21 +471,21 @@ def make_signed_block_from_store( block_root = hash_tree_root(block) parent_state = store.states[block.parent_root] - proposer_attestation = Attestation( - validator_id=proposer_index, - data=AttestationData( - slot=slot, - head=Checkpoint(root=block_root, slot=slot), - target=Checkpoint(root=block_root, slot=slot), - source=Checkpoint( - root=block.parent_root, - slot=parent_state.latest_block_header.slot, - ), + proposer_attestation_data = AttestationData( + slot=slot, + head=Checkpoint(root=block_root, slot=slot), + target=Checkpoint(root=block_root, slot=slot), + source=Checkpoint( + root=block.parent_root, + slot=parent_state.latest_block_header.slot, ), ) - proposer_signature = key_manager.sign_attestation_data( - proposer_index, proposer_attestation.data + proposer_attestation = SignedAttestation( + validator_id=proposer_index, + data=proposer_attestation_data, + signature=key_manager.sign_attestation_data(proposer_index, proposer_attestation_data), ) + proposer_signature = key_manager.sign_proposal_data(proposer_index, proposer_attestation.data) attestation_signatures = key_manager.build_attestation_signatures(block.body.attestations) signed_block = SignedBlockWithAttestation( diff --git a/tests/lean_spec/subspecs/containers/test_state_aggregation.py b/tests/lean_spec/subspecs/containers/test_state_aggregation.py index bb6b15fb..f81f9de4 100644 --- a/tests/lean_spec/subspecs/containers/test_state_aggregation.py +++ b/tests/lean_spec/subspecs/containers/test_state_aggregation.py @@ -11,7 +11,7 @@ from lean_spec.subspecs.containers.checkpoint import Checkpoint from lean_spec.subspecs.containers.slot import Slot from lean_spec.subspecs.containers.validator import ValidatorIndex, ValidatorIndices -from lean_spec.subspecs.forkchoice import GossipSignatureEntry +from lean_spec.subspecs.forkchoice import AttestationSignatureEntry from lean_spec.subspecs.ssz.hash import hash_tree_root from tests.lean_spec.helpers import ( make_aggregated_proof, @@ -30,9 +30,9 @@ def test_aggregated_signatures_prefers_full_gossip_payload( Slot(2), make_bytes32(3), make_bytes32(4), source=source ) attestations = [Attestation(validator_id=ValidatorIndex(i), data=att_data) for i in range(2)] - gossip_signatures = { + attestation_signatures = { att_data: { - GossipSignatureEntry( + AttestationSignatureEntry( ValidatorIndex(i), container_key_manager.sign_attestation_data(ValidatorIndex(i), att_data), ) @@ -40,9 +40,9 @@ def test_aggregated_signatures_prefers_full_gossip_payload( } } - results = state.aggregate_gossip_signatures( + results = state.aggregate_attestation_signatures( attestations, - gossip_signatures=gossip_signatures, + attestation_signatures=attestation_signatures, ) aggregated_atts, aggregated_proofs = ( [att for att, _ in results], @@ -56,7 +56,9 @@ def test_aggregated_signatures_prefers_full_gossip_payload( ValidatorIndex(1), } - public_keys = [container_key_manager.get_public_key(ValidatorIndex(i)) for i in range(2)] + public_keys = [ + container_key_manager.get_attestation_public_key(ValidatorIndex(i)) for i in range(2) + ] aggregated_proofs[0].verify( public_keys=public_keys, message=att_data.data_root_bytes(), @@ -74,9 +76,9 @@ def test_aggregate_signatures_splits_when_needed( Slot(3), make_bytes32(5), make_bytes32(6), source=source ) attestations = [Attestation(validator_id=ValidatorIndex(i), data=att_data) for i in range(3)] - gossip_signatures = { + attestation_signatures = { att_data: { - GossipSignatureEntry( + AttestationSignatureEntry( ValidatorIndex(0), container_key_manager.sign_attestation_data(ValidatorIndex(0), att_data), ) @@ -91,9 +93,9 @@ def test_aggregate_signatures_splits_when_needed( att_data: {block_proof}, } - gossip_results = state.aggregate_gossip_signatures( + gossip_results = state.aggregate_attestation_signatures( attestations, - gossip_signatures=gossip_signatures, + attestation_signatures=attestation_signatures, ) payload_atts, payload_proofs = state.select_aggregated_proofs( attestations, @@ -118,7 +120,7 @@ def test_aggregate_signatures_splits_when_needed( participants = proof.participants.to_validator_indices() if participants == [ValidatorIndex(0)]: proof.verify( - public_keys=[container_key_manager.get_public_key(ValidatorIndex(0))], + public_keys=[container_key_manager.get_attestation_public_key(ValidatorIndex(0))], message=att_data.data_root_bytes(), slot=att_data.slot, ) @@ -168,7 +170,7 @@ def test_build_block_collects_valid_available_attestations( ) aggregated_proofs[0].verify( - public_keys=[container_key_manager.get_public_key(ValidatorIndex(0))], + public_keys=[container_key_manager.get_attestation_public_key(ValidatorIndex(0))], message=data_root, slot=att_data.slot, ) @@ -209,15 +211,15 @@ def test_build_block_skips_attestations_without_signatures( assert list(block.body.attestations.data) == [] -def test_aggregate_gossip_signatures_with_empty_attestations( +def test_aggregate_attestation_signatures_with_empty_attestations( container_key_manager: XmssKeyManager, ) -> None: """Empty attestations list should return empty results.""" state = make_keyed_genesis_state(2, container_key_manager) - results = state.aggregate_gossip_signatures( + results = state.aggregate_attestation_signatures( [], - gossip_signatures={}, + attestation_signatures={}, ) assert results == [] @@ -243,32 +245,32 @@ def test_aggregated_signatures_with_multiple_data_groups( Attestation(validator_id=ValidatorIndex(3), data=att_data2), ] - gossip_signatures = { + attestation_signatures = { att_data1: { - GossipSignatureEntry( + AttestationSignatureEntry( ValidatorIndex(0), container_key_manager.sign_attestation_data(ValidatorIndex(0), att_data1), ), - GossipSignatureEntry( + AttestationSignatureEntry( ValidatorIndex(1), container_key_manager.sign_attestation_data(ValidatorIndex(1), att_data1), ), }, att_data2: { - GossipSignatureEntry( + AttestationSignatureEntry( ValidatorIndex(2), container_key_manager.sign_attestation_data(ValidatorIndex(2), att_data2), ), - GossipSignatureEntry( + AttestationSignatureEntry( ValidatorIndex(3), container_key_manager.sign_attestation_data(ValidatorIndex(3), att_data2), ), }, } - results = state.aggregate_gossip_signatures( + results = state.aggregate_attestation_signatures( attestations, - gossip_signatures=gossip_signatures, + attestation_signatures=attestation_signatures, ) aggregated_atts, aggregated_proofs = ( [att for att, _ in results], @@ -280,7 +282,9 @@ def test_aggregated_signatures_with_multiple_data_groups( for agg_att, proof in zip(aggregated_atts, aggregated_proofs, strict=True): participants = proof.participants.to_validator_indices() - public_keys = [container_key_manager.get_public_key(vid) for vid in participants] + public_keys = [ + container_key_manager.get_attestation_public_key(vid) for vid in participants + ] proof.verify( public_keys=public_keys, message=agg_att.data.data_root_bytes(), @@ -299,9 +303,9 @@ def test_aggregated_signatures_falls_back_to_block_payload( ) attestations = [Attestation(validator_id=ValidatorIndex(i), data=att_data) for i in range(2)] - gossip_signatures = { + attestation_signatures = { att_data: { - GossipSignatureEntry( + AttestationSignatureEntry( ValidatorIndex(0), container_key_manager.sign_attestation_data(ValidatorIndex(0), att_data), ) @@ -314,9 +318,9 @@ def test_aggregated_signatures_falls_back_to_block_payload( aggregated_payloads = {att_data: {block_proof}} - gossip_results = state.aggregate_gossip_signatures( + gossip_results = state.aggregate_attestation_signatures( attestations, - gossip_signatures=gossip_signatures, + attestation_signatures=attestation_signatures, ) payload_atts, payload_proofs = state.select_aggregated_proofs( attestations, @@ -335,7 +339,7 @@ def test_aggregated_signatures_falls_back_to_block_payload( participants = proof.participants.to_validator_indices() if participants == [ValidatorIndex(0)]: proof.verify( - public_keys=[container_key_manager.get_public_key(ValidatorIndex(0))], + public_keys=[container_key_manager.get_attestation_public_key(ValidatorIndex(0))], message=att_data.data_root_bytes(), slot=att_data.slot, ) @@ -502,13 +506,13 @@ def test_greedy_stops_when_no_useful_proofs_remain( ) attestations = [Attestation(validator_id=ValidatorIndex(i), data=att_data) for i in range(5)] - gossip_signatures = { + attestation_signatures = { att_data: { - GossipSignatureEntry( + AttestationSignatureEntry( ValidatorIndex(0), container_key_manager.sign_attestation_data(ValidatorIndex(0), att_data), ), - GossipSignatureEntry( + AttestationSignatureEntry( ValidatorIndex(1), container_key_manager.sign_attestation_data(ValidatorIndex(1), att_data), ), @@ -521,9 +525,9 @@ def test_greedy_stops_when_no_useful_proofs_remain( aggregated_payloads = {att_data: {proof_23}} - gossip_results = state.aggregate_gossip_signatures( + gossip_results = state.aggregate_attestation_signatures( attestations, - gossip_signatures=gossip_signatures, + attestation_signatures=attestation_signatures, ) payload_atts, payload_proofs = state.select_aggregated_proofs( attestations, @@ -573,9 +577,9 @@ def test_greedy_handles_overlapping_proof_chains( ) attestations = [Attestation(validator_id=ValidatorIndex(i), data=att_data) for i in range(5)] - gossip_signatures = { + attestation_signatures = { att_data: { - GossipSignatureEntry( + AttestationSignatureEntry( ValidatorIndex(0), container_key_manager.sign_attestation_data(ValidatorIndex(0), att_data), ), @@ -594,9 +598,9 @@ def test_greedy_handles_overlapping_proof_chains( aggregated_payloads = {att_data: {proof_a, proof_b, proof_c}} - gossip_results = state.aggregate_gossip_signatures( + gossip_results = state.aggregate_attestation_signatures( attestations, - gossip_signatures=gossip_signatures, + attestation_signatures=attestation_signatures, ) payload_atts, payload_proofs = state.select_aggregated_proofs( attestations, @@ -696,9 +700,9 @@ def test_validator_in_both_gossip_and_fallback_proof( ) attestations = [Attestation(validator_id=ValidatorIndex(i), data=att_data) for i in range(2)] - gossip_signatures = { + attestation_signatures = { att_data: { - GossipSignatureEntry( + AttestationSignatureEntry( ValidatorIndex(0), container_key_manager.sign_attestation_data(ValidatorIndex(0), att_data), ), @@ -711,9 +715,9 @@ def test_validator_in_both_gossip_and_fallback_proof( aggregated_payloads = {att_data: {fallback_proof}} - gossip_results = state.aggregate_gossip_signatures( + gossip_results = state.aggregate_attestation_signatures( attestations, - gossip_signatures=gossip_signatures, + attestation_signatures=attestation_signatures, ) payload_atts, payload_proofs = state.select_aggregated_proofs( attestations, @@ -734,7 +738,9 @@ def test_validator_in_both_gossip_and_fallback_proof( for proof in aggregated_proofs: participants = proof.participants.to_validator_indices() - public_keys = [container_key_manager.get_public_key(vid) for vid in participants] + public_keys = [ + container_key_manager.get_attestation_public_key(vid) for vid in participants + ] proof.verify( public_keys=public_keys, message=att_data.data_root_bytes(), @@ -746,7 +752,7 @@ def test_gossip_none_and_aggregated_payloads_none( container_key_manager: XmssKeyManager, ) -> None: """ - Test edge case where both gossip_signatures and aggregated_payloads are None. + Test edge case where both attestation_signatures and aggregated_payloads are None. Expected Behavior ----------------- @@ -759,9 +765,9 @@ def test_gossip_none_and_aggregated_payloads_none( ) attestations = [Attestation(validator_id=ValidatorIndex(i), data=att_data) for i in range(2)] - results = state.aggregate_gossip_signatures( + results = state.aggregate_attestation_signatures( attestations, - gossip_signatures=None, + attestation_signatures=None, ) assert results == [] @@ -810,7 +816,9 @@ def test_aggregated_payloads_only_no_gossip( participants = {int(v) for v in aggregated_proofs[0].participants.to_validator_indices()} assert participants == {0, 1, 2} - public_keys = [container_key_manager.get_public_key(ValidatorIndex(i)) for i in range(3)] + public_keys = [ + container_key_manager.get_attestation_public_key(ValidatorIndex(i)) for i in range(3) + ] aggregated_proofs[0].verify(public_keys=public_keys, message=data_root, slot=att_data.slot) @@ -840,9 +848,9 @@ def test_proof_with_extra_validators_beyond_needed( ) attestations = [Attestation(validator_id=ValidatorIndex(i), data=att_data) for i in range(2)] - gossip_signatures = { + attestation_signatures = { att_data: { - GossipSignatureEntry( + AttestationSignatureEntry( ValidatorIndex(0), container_key_manager.sign_attestation_data(ValidatorIndex(0), att_data), ), @@ -855,9 +863,9 @@ def test_proof_with_extra_validators_beyond_needed( aggregated_payloads = {att_data: {proof}} - gossip_results = state.aggregate_gossip_signatures( + gossip_results = state.aggregate_attestation_signatures( attestations, - gossip_signatures=gossip_signatures, + attestation_signatures=attestation_signatures, ) payload_atts, payload_proofs = state.select_aggregated_proofs( attestations, diff --git a/tests/lean_spec/subspecs/forkchoice/test_attestation_target.py b/tests/lean_spec/subspecs/forkchoice/test_attestation_target.py index 4283d038..a010e8a6 100644 --- a/tests/lean_spec/subspecs/forkchoice/test_attestation_target.py +++ b/tests/lean_spec/subspecs/forkchoice/test_attestation_target.py @@ -562,16 +562,18 @@ def test_attestation_target_after_on_block( block_root = hash_tree_root(block) # Get attestation data for the block's slot - proposer_attestation = Attestation( + proposer_attestation_data = AttestationData( + slot=slot_1, + head=Checkpoint(root=block_root, slot=slot_1), + target=Checkpoint(root=block_root, slot=slot_1), + source=store.latest_justified, + ) + proposer_attestation = SignedAttestation( validator_id=proposer_1, - data=AttestationData( - slot=slot_1, - head=Checkpoint(root=block_root, slot=slot_1), - target=Checkpoint(root=block_root, slot=slot_1), - source=store.latest_justified, - ), + data=proposer_attestation_data, + signature=key_manager.sign_attestation_data(proposer_1, proposer_attestation_data), ) - proposer_signature = key_manager.sign_attestation_data( + proposer_signature = key_manager.sign_proposal_data( proposer_attestation.validator_id, proposer_attestation.data, ) diff --git a/tests/lean_spec/subspecs/forkchoice/test_store_attestations.py b/tests/lean_spec/subspecs/forkchoice/test_store_attestations.py index 334d137e..671e6186 100644 --- a/tests/lean_spec/subspecs/forkchoice/test_store_attestations.py +++ b/tests/lean_spec/subspecs/forkchoice/test_store_attestations.py @@ -17,7 +17,7 @@ from lean_spec.subspecs.containers.checkpoint import Checkpoint from lean_spec.subspecs.containers.slot import Slot from lean_spec.subspecs.containers.validator import ValidatorIndex, ValidatorIndices -from lean_spec.subspecs.forkchoice import GossipSignatureEntry +from lean_spec.subspecs.forkchoice import AttestationSignatureEntry from lean_spec.subspecs.xmss.aggregation import AggregatedSignatureProof from lean_spec.types import Bytes32, Uint64 from tests.lean_spec.helpers import ( @@ -26,7 +26,7 @@ make_signed_block_from_store, make_store, make_store_with_attestation_data, - make_store_with_gossip_signatures, + make_store_with_attestation_signatures, ) @@ -81,7 +81,7 @@ def test_on_block_preserves_immutability_of_aggregated_payloads( gossip_sigs_1 = { attestation_data_1: { - GossipSignatureEntry( + AttestationSignatureEntry( validator_id, key_manager.sign_attestation_data(validator_id, attestation_data_1) ) for validator_id in (ValidatorIndex(1), ValidatorIndex(2)) @@ -90,7 +90,7 @@ def test_on_block_preserves_immutability_of_aggregated_payloads( producer_store_1 = base_store.model_copy( update={ - "gossip_signatures": gossip_sigs_1, + "attestation_signatures": gossip_sigs_1, } ) @@ -105,7 +105,7 @@ def test_on_block_preserves_immutability_of_aggregated_payloads( gossip_sigs_2 = { attestation_data_2: { - GossipSignatureEntry( + AttestationSignatureEntry( validator_id, key_manager.sign_attestation_data(validator_id, attestation_data_2) ) for validator_id in (ValidatorIndex(1), ValidatorIndex(2)) @@ -114,7 +114,7 @@ def test_on_block_preserves_immutability_of_aggregated_payloads( producer_store_2 = store_after_block_1.model_copy( update={ - "gossip_signatures": gossip_sigs_2, + "attestation_signatures": gossip_sigs_2, } ) @@ -177,7 +177,7 @@ def test_same_subnet_stores_signature(self, key_manager: XmssKeyManager) -> None ) # Verify signature does NOT exist before calling the method - assert attestation_data not in store.gossip_signatures, ( + assert attestation_data not in store.attestation_signatures, ( "Precondition: signature should not exist before calling method" ) @@ -191,7 +191,7 @@ def test_same_subnet_stores_signature(self, key_manager: XmssKeyManager) -> None ) # Verify signature NOW exists after calling the method - sigs = updated_store.gossip_signatures.get(attestation_data, set()) + sigs = updated_store.attestation_signatures.get(attestation_data, set()) assert any(entry.validator_id == attester_validator for entry in sigs), ( "Signature from same-subnet validator should be stored" ) @@ -227,7 +227,7 @@ def test_cross_subnet_ignores_signature(self, key_manager: XmssKeyManager) -> No ) # Verify signature was NOT stored - sigs = updated_store.gossip_signatures.get(attestation_data, set()) + sigs = updated_store.attestation_signatures.get(attestation_data, set()) assert not any(entry.validator_id == attester_validator for entry in sigs), ( "Signature from different-subnet validator should NOT be stored" ) @@ -261,17 +261,17 @@ def test_non_aggregator_never_stores_signature(self, key_manager: XmssKeyManager ) # Verify signature was NOT stored even though same subnet - sigs = updated_store.gossip_signatures.get(attestation_data, set()) + sigs = updated_store.attestation_signatures.get(attestation_data, set()) assert not any(entry.validator_id == attester_validator for entry in sigs), ( "Non-aggregator should never store gossip signatures" ) def test_cross_subnet_does_not_create_gossip_entry(self, key_manager: XmssKeyManager) -> None: """ - Cross-subnet attestation does not create a gossip_signatures entry. + Cross-subnet attestation does not create a attestation_signatures entry. When the attester is in a different subnet, no entry is created - for that attestation data in gossip_signatures. + for that attestation data in attestation_signatures. """ current_validator = ValidatorIndex(0) attester_validator = ValidatorIndex(1) # Different subnet @@ -295,8 +295,8 @@ def test_cross_subnet_does_not_create_gossip_entry(self, key_manager: XmssKeyMan ) # Verify no gossip entry was created for this attestation data - assert attestation_data not in updated_store.gossip_signatures, ( - "Cross-subnet attestation should not create a gossip_signatures entry" + assert attestation_data not in updated_store.attestation_signatures, ( + "Cross-subnet attestation should not create a attestation_signatures entry" ) @@ -327,7 +327,7 @@ def test_valid_proof_stored_correctly(self, key_manager: XmssKeyManager) -> None participants=AggregationBits.from_validator_indices( ValidatorIndices(data=participants) ), - public_keys=[key_manager.get_public_key(vid) for vid in participants], + public_keys=[key_manager.get_attestation_public_key(vid) for vid in participants], signatures=[ key_manager.sign_attestation_data(vid, attestation_data) for vid in participants ], @@ -368,7 +368,7 @@ def test_attestation_data_used_as_key(self, key_manager: XmssKeyManager) -> None participants=AggregationBits.from_validator_indices( ValidatorIndices(data=participants) ), - public_keys=[key_manager.get_public_key(vid) for vid in participants], + public_keys=[key_manager.get_attestation_public_key(vid) for vid in participants], signatures=[ key_manager.sign_attestation_data(vid, attestation_data) for vid in participants ], @@ -406,7 +406,7 @@ def test_invalid_proof_rejected(self, key_manager: XmssKeyManager) -> None: participants=AggregationBits.from_validator_indices( ValidatorIndices(data=claimed_participants) ), - public_keys=[key_manager.get_public_key(vid) for vid in actual_signers], + public_keys=[key_manager.get_attestation_public_key(vid) for vid in actual_signers], signatures=[ key_manager.sign_attestation_data(vid, attestation_data) for vid in actual_signers ], @@ -441,7 +441,7 @@ def test_multiple_proofs_accumulate(self, key_manager: XmssKeyManager) -> None: participants=AggregationBits.from_validator_indices( ValidatorIndices(data=participants_1) ), - public_keys=[key_manager.get_public_key(vid) for vid in participants_1], + public_keys=[key_manager.get_attestation_public_key(vid) for vid in participants_1], signatures=[ key_manager.sign_attestation_data(vid, attestation_data) for vid in participants_1 ], @@ -455,7 +455,7 @@ def test_multiple_proofs_accumulate(self, key_manager: XmssKeyManager) -> None: participants=AggregationBits.from_validator_indices( ValidatorIndices(data=participants_2) ), - public_keys=[key_manager.get_public_key(vid) for vid in participants_2], + public_keys=[key_manager.get_attestation_public_key(vid) for vid in participants_2], signatures=[ key_manager.sign_attestation_data(vid, attestation_data) for vid in participants_2 ], @@ -485,7 +485,9 @@ class TestAggregateCommitteeSignatures: and stored for later use. """ - def test_aggregates_gossip_signatures_into_proof(self, key_manager: XmssKeyManager) -> None: + def test_aggregates_attestation_signatures_into_proof( + self, key_manager: XmssKeyManager + ) -> None: """ Aggregation creates proofs from collected gossip signatures. @@ -496,7 +498,7 @@ def test_aggregates_gossip_signatures_into_proof(self, key_manager: XmssKeyManag """ attesting_validators = [ValidatorIndex(1), ValidatorIndex(2)] - store, attestation_data = make_store_with_gossip_signatures( + store, attestation_data = make_store_with_attestation_signatures( key_manager, num_validators=4, validator_id=ValidatorIndex(0), @@ -522,7 +524,7 @@ def test_aggregated_proof_is_valid(self, key_manager: XmssKeyManager) -> None: """ attesting_validators = [ValidatorIndex(1), ValidatorIndex(2)] - store, attestation_data = make_store_with_gossip_signatures( + store, attestation_data = make_store_with_attestation_signatures( key_manager, num_validators=4, validator_id=ValidatorIndex(0), @@ -536,7 +538,7 @@ def test_aggregated_proof_is_valid(self, key_manager: XmssKeyManager) -> None: # Extract participants from the proof participants = proof.participants.to_validator_indices() - public_keys = [key_manager.get_public_key(vid) for vid in participants] + public_keys = [key_manager.get_attestation_public_key(vid) for vid in participants] # Verify the proof is valid proof.verify( @@ -545,13 +547,15 @@ def test_aggregated_proof_is_valid(self, key_manager: XmssKeyManager) -> None: slot=attestation_data.slot, ) - def test_empty_gossip_signatures_produces_no_proofs(self, key_manager: XmssKeyManager) -> None: + def test_empty_attestation_signatures_produces_no_proofs( + self, key_manager: XmssKeyManager + ) -> None: """ - No proofs created when gossip_signatures is empty. + No proofs created when attestation_signatures is empty. This is the expected behavior when no attestations have been received. """ - store, _ = make_store_with_gossip_signatures( + store, _ = make_store_with_attestation_signatures( key_manager, num_validators=4, validator_id=ValidatorIndex(0), @@ -588,14 +592,14 @@ def test_multiple_attestation_data_grouped_separately( # Validators 1 attests to data_1, validator 2 attests to data_2 sig_1 = key_manager.sign_attestation_data(ValidatorIndex(1), att_data_1) sig_2 = key_manager.sign_attestation_data(ValidatorIndex(2), att_data_2) - gossip_signatures = { - att_data_1: {GossipSignatureEntry(ValidatorIndex(1), sig_1)}, - att_data_2: {GossipSignatureEntry(ValidatorIndex(2), sig_2)}, + attestation_signatures = { + att_data_1: {AttestationSignatureEntry(ValidatorIndex(1), sig_1)}, + att_data_2: {AttestationSignatureEntry(ValidatorIndex(2), sig_2)}, } store = base_store.model_copy( update={ - "gossip_signatures": gossip_signatures, + "attestation_signatures": attestation_signatures, } ) @@ -625,7 +629,7 @@ def test_interval_2_triggers_aggregation_for_aggregator( """ attesting_validators = [ValidatorIndex(1), ValidatorIndex(2)] - store, attestation_data = make_store_with_gossip_signatures( + store, attestation_data = make_store_with_attestation_signatures( key_manager, num_validators=4, validator_id=ValidatorIndex(0), @@ -655,7 +659,7 @@ def test_interval_2_skips_aggregation_for_non_aggregator( """ attesting_validators = [ValidatorIndex(1), ValidatorIndex(2)] - store, attestation_data = make_store_with_gossip_signatures( + store, attestation_data = make_store_with_attestation_signatures( key_manager, num_validators=4, validator_id=ValidatorIndex(0), @@ -681,7 +685,7 @@ def test_other_intervals_do_not_trigger_aggregation(self, key_manager: XmssKeyMa """ attesting_validators = [ValidatorIndex(1), ValidatorIndex(2)] - store, attestation_data = make_store_with_gossip_signatures( + store, attestation_data = make_store_with_attestation_signatures( key_manager, num_validators=4, validator_id=ValidatorIndex(0), @@ -774,7 +778,7 @@ def test_gossip_to_aggregation_to_storage(self, key_manager: XmssKeyManager) -> ) # Verify signatures were stored - sigs = store.gossip_signatures.get(attestation_data, set()) + sigs = store.attestation_signatures.get(attestation_data, set()) for vid in attesting_validators: assert any(entry.validator_id == vid for entry in sigs), ( f"Signature for {vid} should be stored" @@ -792,7 +796,7 @@ def test_gossip_to_aggregation_to_storage(self, key_manager: XmssKeyManager) -> # Step 4: Verify the proof is valid proof = next(iter(store.latest_new_aggregated_payloads[attestation_data])) participants = proof.participants.to_validator_indices() - public_keys = [key_manager.get_public_key(vid) for vid in participants] + public_keys = [key_manager.get_attestation_public_key(vid) for vid in participants] proof.verify( public_keys=public_keys, diff --git a/tests/lean_spec/subspecs/forkchoice/test_store_pruning.py b/tests/lean_spec/subspecs/forkchoice/test_store_pruning.py index a69128e0..d2ccfeb5 100644 --- a/tests/lean_spec/subspecs/forkchoice/test_store_pruning.py +++ b/tests/lean_spec/subspecs/forkchoice/test_store_pruning.py @@ -3,7 +3,7 @@ from lean_spec.subspecs.containers.attestation import AggregationBits from lean_spec.subspecs.containers.slot import Slot from lean_spec.subspecs.containers.validator import ValidatorIndex, ValidatorIndices -from lean_spec.subspecs.forkchoice import GossipSignatureEntry, Store +from lean_spec.subspecs.forkchoice import AttestationSignatureEntry, Store from lean_spec.subspecs.xmss.aggregation import AggregatedSignatureProof from lean_spec.types import ByteListMiB, Bytes32 from tests.lean_spec.helpers import ( @@ -30,20 +30,22 @@ def test_prunes_entries_with_target_at_finalized(pruning_store: Store) -> None: # Set up store with attestation data and finalized slot at 5 store = store.model_copy( update={ - "gossip_signatures": { - attestation_data: {GossipSignatureEntry(ValidatorIndex(1), make_mock_signature())}, + "attestation_signatures": { + attestation_data: { + AttestationSignatureEntry(ValidatorIndex(1), make_mock_signature()) + }, }, "latest_finalized": make_checkpoint(root_seed=255, slot=5), } ) # Verify data exists before pruning - assert attestation_data in store.gossip_signatures + assert attestation_data in store.attestation_signatures # Prune should remove entries where target.slot <= finalized.slot pruned_store = store.prune_stale_attestation_data() - assert attestation_data not in pruned_store.gossip_signatures + assert attestation_data not in pruned_store.attestation_signatures def test_prunes_entries_with_target_before_finalized(pruning_store: Store) -> None: @@ -62,20 +64,22 @@ def test_prunes_entries_with_target_before_finalized(pruning_store: Store) -> No # Set up store with finalized slot at 5 (greater than target.slot) store = store.model_copy( update={ - "gossip_signatures": { - attestation_data: {GossipSignatureEntry(ValidatorIndex(1), make_mock_signature())}, + "attestation_signatures": { + attestation_data: { + AttestationSignatureEntry(ValidatorIndex(1), make_mock_signature()) + }, }, "latest_finalized": make_checkpoint(root_seed=255, slot=5), } ) # Verify data exists before pruning - assert attestation_data in store.gossip_signatures + assert attestation_data in store.attestation_signatures # Prune should remove entries where target.slot <= finalized.slot pruned_store = store.prune_stale_attestation_data() - assert attestation_data not in pruned_store.gossip_signatures + assert attestation_data not in pruned_store.attestation_signatures def test_keeps_entries_with_target_after_finalized(pruning_store: Store) -> None: @@ -94,20 +98,22 @@ def test_keeps_entries_with_target_after_finalized(pruning_store: Store) -> None # Set up store with finalized slot at 5 (less than target.slot) store = store.model_copy( update={ - "gossip_signatures": { - attestation_data: {GossipSignatureEntry(ValidatorIndex(1), make_mock_signature())}, + "attestation_signatures": { + attestation_data: { + AttestationSignatureEntry(ValidatorIndex(1), make_mock_signature()) + }, }, "latest_finalized": make_checkpoint(root_seed=255, slot=5), } ) # Verify data exists before pruning - assert attestation_data in store.gossip_signatures + assert attestation_data in store.attestation_signatures # Prune should keep entries where target.slot > finalized.slot pruned_store = store.prune_stale_attestation_data() - assert attestation_data in pruned_store.gossip_signatures + assert attestation_data in pruned_store.attestation_signatures def test_prunes_related_structures_together(pruning_store: Store) -> None: @@ -143,9 +149,13 @@ def test_prunes_related_structures_together(pruning_store: Store) -> None: # Set up store with both stale and fresh entries in all structures store = store.model_copy( update={ - "gossip_signatures": { - stale_attestation: {GossipSignatureEntry(ValidatorIndex(1), make_mock_signature())}, - fresh_attestation: {GossipSignatureEntry(ValidatorIndex(2), make_mock_signature())}, + "attestation_signatures": { + stale_attestation: { + AttestationSignatureEntry(ValidatorIndex(1), make_mock_signature()) + }, + fresh_attestation: { + AttestationSignatureEntry(ValidatorIndex(2), make_mock_signature()) + }, }, "latest_new_aggregated_payloads": { stale_attestation: {mock_proof}, @@ -160,37 +170,37 @@ def test_prunes_related_structures_together(pruning_store: Store) -> None: ) # Verify all data exists before pruning - assert stale_attestation in store.gossip_signatures + assert stale_attestation in store.attestation_signatures assert stale_attestation in store.latest_new_aggregated_payloads assert stale_attestation in store.latest_known_aggregated_payloads - assert fresh_attestation in store.gossip_signatures + assert fresh_attestation in store.attestation_signatures assert fresh_attestation in store.latest_new_aggregated_payloads assert fresh_attestation in store.latest_known_aggregated_payloads pruned_store = store.prune_stale_attestation_data() # Stale entries should be removed from all structures - assert stale_attestation not in pruned_store.gossip_signatures + assert stale_attestation not in pruned_store.attestation_signatures assert stale_attestation not in pruned_store.latest_new_aggregated_payloads assert stale_attestation not in pruned_store.latest_known_aggregated_payloads # Fresh entries should be preserved in all structures - assert fresh_attestation in pruned_store.gossip_signatures + assert fresh_attestation in pruned_store.attestation_signatures assert fresh_attestation in pruned_store.latest_new_aggregated_payloads assert fresh_attestation in pruned_store.latest_known_aggregated_payloads -def test_handles_empty_gossip_signatures(pruning_store: Store) -> None: - """Verify pruning works correctly when gossip_signatures is empty.""" +def test_handles_empty_attestation_signatures(pruning_store: Store) -> None: + """Verify pruning works correctly when attestation_signatures is empty.""" store = pruning_store # Ensure store has empty gossip signatures - assert len(store.gossip_signatures) == 0 + assert len(store.attestation_signatures) == 0 # Pruning should not fail pruned_store = store.prune_stale_attestation_data() - assert len(pruned_store.gossip_signatures) == 0 + assert len(pruned_store.attestation_signatures) == 0 def test_prunes_multiple_validators_same_attestation_data(pruning_store: Store) -> None: @@ -209,10 +219,10 @@ def test_prunes_multiple_validators_same_attestation_data(pruning_store: Store) # Multiple validators signed the same attestation data store = store.model_copy( update={ - "gossip_signatures": { + "attestation_signatures": { stale_attestation: { - GossipSignatureEntry(ValidatorIndex(1), make_mock_signature()), - GossipSignatureEntry(ValidatorIndex(2), make_mock_signature()), + AttestationSignatureEntry(ValidatorIndex(1), make_mock_signature()), + AttestationSignatureEntry(ValidatorIndex(2), make_mock_signature()), }, }, "latest_finalized": make_checkpoint(root_seed=255, slot=5), @@ -220,13 +230,13 @@ def test_prunes_multiple_validators_same_attestation_data(pruning_store: Store) ) # Verify data exists before pruning - assert stale_attestation in store.gossip_signatures - assert len(store.gossip_signatures[stale_attestation]) == 2 + assert stale_attestation in store.attestation_signatures + assert len(store.attestation_signatures[stale_attestation]) == 2 pruned_store = store.prune_stale_attestation_data() # All validators' signatures should be removed (whole entry pruned) - assert stale_attestation not in pruned_store.gossip_signatures + assert stale_attestation not in pruned_store.attestation_signatures def test_mixed_stale_and_fresh_entries(pruning_store: Store) -> None: @@ -246,28 +256,28 @@ def test_mixed_stale_and_fresh_entries(pruning_store: Store) -> None: ] gossip_sigs = { - att: {GossipSignatureEntry(ValidatorIndex(i), make_mock_signature())} + att: {AttestationSignatureEntry(ValidatorIndex(i), make_mock_signature())} for i, att in enumerate(attestations, start=1) } # Finalized at slot 5 means slots 1-5 are stale, 6-10 are fresh store = store.model_copy( update={ - "gossip_signatures": gossip_sigs, + "attestation_signatures": gossip_sigs, "latest_finalized": make_checkpoint(root_seed=255, slot=5), } ) # Verify all data exists before pruning for att in attestations: - assert att in store.gossip_signatures + assert att in store.attestation_signatures pruned_store = store.prune_stale_attestation_data() # Entries with target.slot <= 5 should be pruned (slots 1-5) for att in attestations[:5]: - assert att not in pruned_store.gossip_signatures + assert att not in pruned_store.attestation_signatures # Entries with target.slot > 5 should be kept (slots 6-10) for att in attestations[5:]: - assert att in pruned_store.gossip_signatures + assert att in pruned_store.attestation_signatures diff --git a/tests/lean_spec/subspecs/forkchoice/test_validator.py b/tests/lean_spec/subspecs/forkchoice/test_validator.py index bda94cd4..295f26cb 100644 --- a/tests/lean_spec/subspecs/forkchoice/test_validator.py +++ b/tests/lean_spec/subspecs/forkchoice/test_validator.py @@ -15,7 +15,7 @@ ValidatorIndex, ) from lean_spec.subspecs.containers.slot import Slot -from lean_spec.subspecs.forkchoice import GossipSignatureEntry, Store +from lean_spec.subspecs.forkchoice import AttestationSignatureEntry, Store from lean_spec.subspecs.ssz.hash import hash_tree_root from lean_spec.subspecs.xmss.aggregation import AggregatedSignatureProof from lean_spec.types import Bytes32, Uint64 @@ -93,16 +93,16 @@ def test_produce_block_with_attestations( gossip_sigs = {} gossip_sigs.setdefault(signed_5.data, set()).add( - GossipSignatureEntry(ValidatorIndex(5), signed_5.signature) + AttestationSignatureEntry(ValidatorIndex(5), signed_5.signature) ) gossip_sigs.setdefault(signed_6.data, set()).add( - GossipSignatureEntry(ValidatorIndex(6), signed_6.signature) + AttestationSignatureEntry(ValidatorIndex(6), signed_6.signature) ) sample_store = sample_store.model_copy( update={ "latest_known_aggregated_payloads": known_payloads, - "gossip_signatures": gossip_sigs, + "attestation_signatures": gossip_sigs, } ) @@ -126,7 +126,7 @@ def test_produce_block_with_attestations( # Verify each aggregated signature proof for agg_att, proof in zip(block.body.attestations.data, signatures, strict=True): participants = proof.participants.to_validator_indices() - public_keys = [key_manager.get_public_key(vid) for vid in participants] + public_keys = [key_manager.get_attestation_public_key(vid) for vid in participants] proof.verify( public_keys=public_keys, message=agg_att.data.data_root_bytes(), @@ -222,8 +222,10 @@ def test_produce_block_state_consistency( sample_store = sample_store.model_copy( update={ "latest_known_aggregated_payloads": {signed_7.data: {proof_7}}, - "gossip_signatures": { - signed_7.data: {GossipSignatureEntry(ValidatorIndex(7), signed_7.signature)}, + "attestation_signatures": { + signed_7.data: { + AttestationSignatureEntry(ValidatorIndex(7), signed_7.signature) + }, }, } ) @@ -241,7 +243,7 @@ def test_produce_block_state_consistency( # Verify each aggregated signature proof for agg_att, proof in zip(block.body.attestations.data, signatures, strict=True): participants = proof.participants.to_validator_indices() - public_keys = [key_manager.get_public_key(vid) for vid in participants] + public_keys = [key_manager.get_attestation_public_key(vid) for vid in participants] proof.verify( public_keys=public_keys, message=agg_att.data.data_root_bytes(), diff --git a/tests/lean_spec/subspecs/genesis/test_config.py b/tests/lean_spec/subspecs/genesis/test_config.py index 1fbe757e..69d07dc8 100644 --- a/tests/lean_spec/subspecs/genesis/test_config.py +++ b/tests/lean_spec/subspecs/genesis/test_config.py @@ -20,7 +20,11 @@ SAMPLE_YAML = yaml.dump( { "GENESIS_TIME": 1704085200, - "GENESIS_VALIDATORS": [SAMPLE_PUBKEY_1, SAMPLE_PUBKEY_2, SAMPLE_PUBKEY_3], + "GENESIS_VALIDATORS": [ + {"attestation_pubkey": SAMPLE_PUBKEY_1, "proposal_pubkey": SAMPLE_PUBKEY_1}, + {"attestation_pubkey": SAMPLE_PUBKEY_2, "proposal_pubkey": SAMPLE_PUBKEY_2}, + {"attestation_pubkey": SAMPLE_PUBKEY_3, "proposal_pubkey": SAMPLE_PUBKEY_3}, + ], } ) @@ -64,22 +68,27 @@ def test_pubkeys_parsed_correctly(self) -> None: """Pubkeys are converted to Bytes52 instances.""" config = GenesisConfig.from_yaml(SAMPLE_YAML) - for pk in config.genesis_validators: - assert isinstance(pk, Bytes52) - assert len(pk) == 52 + for entry in config.genesis_validators: + assert isinstance(entry.attestation_pubkey, Bytes52) + assert len(entry.attestation_pubkey) == 52 + assert isinstance(entry.proposal_pubkey, Bytes52) + assert len(entry.proposal_pubkey) == 52 def test_pubkey_without_0x_prefix(self) -> None: """Handles pubkeys without 0x prefix (zeam format).""" yaml_content = yaml.dump( { "GENESIS_TIME": 1704085200, - "GENESIS_VALIDATORS": ["00" * 52, "01" * 52], + "GENESIS_VALIDATORS": [ + {"attestation_pubkey": "00" * 52, "proposal_pubkey": "00" * 52}, + {"attestation_pubkey": "01" * 52, "proposal_pubkey": "01" * 52}, + ], } ) config = GenesisConfig.from_yaml(yaml_content) assert len(config.genesis_validators) == 2 - assert config.genesis_validators[0] == Bytes52(b"\x00" * 52) + assert config.genesis_validators[0].attestation_pubkey == Bytes52(b"\x00" * 52) class TestGenesisConfigValidators: @@ -94,7 +103,8 @@ def test_to_validators_creates_indexed_list(self) -> None: for i, validator in enumerate(validators.data): assert validator.index == Uint64(i) - assert validator.pubkey == config.genesis_validators[i] + assert validator.attestation_pubkey == config.genesis_validators[i].attestation_pubkey + assert validator.proposal_pubkey == config.genesis_validators[i].proposal_pubkey def test_empty_validators_list(self) -> None: """Handles empty validator list.""" @@ -132,7 +142,9 @@ def test_invalid_pubkey_raises_validation_error(self) -> None: yaml_content = yaml.dump( { "GENESIS_TIME": 1704085200, - "GENESIS_VALIDATORS": ["not_valid_hex"], + "GENESIS_VALIDATORS": [ + {"attestation_pubkey": "not_valid_hex", "proposal_pubkey": "not_valid_hex"}, + ], } ) with pytest.raises(ValidationError): @@ -143,7 +155,9 @@ def test_wrong_length_pubkey_raises_error(self) -> None: yaml_content = yaml.dump( { "GENESIS_TIME": 1704085200, - "GENESIS_VALIDATORS": ["0x0011223344"], + "GENESIS_VALIDATORS": [ + {"attestation_pubkey": "0x0011223344", "proposal_pubkey": "0x0011223344"}, + ], } ) with pytest.raises(SSZValueError): @@ -153,7 +167,12 @@ def test_missing_genesis_time_raises_error(self) -> None: """Requires GENESIS_TIME field.""" yaml_content = yaml.dump( { - "GENESIS_VALIDATORS": [SAMPLE_PUBKEY_1], + "GENESIS_VALIDATORS": [ + { + "attestation_pubkey": SAMPLE_PUBKEY_1, + "proposal_pubkey": SAMPLE_PUBKEY_1, + }, + ], } ) with pytest.raises(ValidationError): @@ -177,7 +196,7 @@ def test_validators_not_a_list_raises_error(self) -> None: "GENESIS_VALIDATORS": "not_a_list", } ) - with pytest.raises(ValidationError, match="must be a list"): + with pytest.raises(ValidationError): GenesisConfig.from_yaml(yaml_content) def test_num_validators_mismatch_raises_error(self) -> None: @@ -186,7 +205,16 @@ def test_num_validators_mismatch_raises_error(self) -> None: { "GENESIS_TIME": 1704085200, "NUM_VALIDATORS": 5, - "GENESIS_VALIDATORS": [SAMPLE_PUBKEY_1, SAMPLE_PUBKEY_2], + "GENESIS_VALIDATORS": [ + { + "attestation_pubkey": SAMPLE_PUBKEY_1, + "proposal_pubkey": SAMPLE_PUBKEY_1, + }, + { + "attestation_pubkey": SAMPLE_PUBKEY_2, + "proposal_pubkey": SAMPLE_PUBKEY_2, + }, + ], } ) with pytest.raises(ValidationError, match="does not match"): @@ -198,7 +226,16 @@ def test_num_validators_correct_value_accepted(self) -> None: { "GENESIS_TIME": 1704085200, "NUM_VALIDATORS": 2, - "GENESIS_VALIDATORS": [SAMPLE_PUBKEY_1, SAMPLE_PUBKEY_2], + "GENESIS_VALIDATORS": [ + { + "attestation_pubkey": SAMPLE_PUBKEY_1, + "proposal_pubkey": SAMPLE_PUBKEY_1, + }, + { + "attestation_pubkey": SAMPLE_PUBKEY_2, + "proposal_pubkey": SAMPLE_PUBKEY_2, + }, + ], } ) config = GenesisConfig.from_yaml(yaml_content) @@ -215,7 +252,11 @@ def test_hex_prefixed_pubkeys(self) -> None: yaml_content = yaml.dump( { "GENESIS_TIME": 1704085200, - "GENESIS_VALIDATORS": [PUBKEY_1, PUBKEY_2, PUBKEY_3], + "GENESIS_VALIDATORS": [ + {"attestation_pubkey": PUBKEY_1, "proposal_pubkey": PUBKEY_1}, + {"attestation_pubkey": PUBKEY_2, "proposal_pubkey": PUBKEY_2}, + {"attestation_pubkey": PUBKEY_3, "proposal_pubkey": PUBKEY_3}, + ], } ) config = GenesisConfig.from_yaml(yaml_content) @@ -244,4 +285,5 @@ def test_hex_prefixed_pubkeys(self) -> None: ) ), ] - assert config.genesis_validators == expected_pubkeys + for entry, expected in zip(config.genesis_validators, expected_pubkeys, strict=True): + assert entry.attestation_pubkey == expected diff --git a/tests/lean_spec/subspecs/genesis/test_state.py b/tests/lean_spec/subspecs/genesis/test_state.py index e6a0d12d..0b6a5a5c 100644 --- a/tests/lean_spec/subspecs/genesis/test_state.py +++ b/tests/lean_spec/subspecs/genesis/test_state.py @@ -16,7 +16,8 @@ def test_genesis_block_hash_comparison() -> None: pubkeys1 = [Bytes52(bytes([i + 1] * 52)) for i in range(3)] validators1 = Validators( data=[ - Validator(pubkey=pubkey, index=ValidatorIndex(i)) for i, pubkey in enumerate(pubkeys1) + Validator(attestation_pubkey=pubkey, proposal_pubkey=pubkey, index=ValidatorIndex(i)) + for i, pubkey in enumerate(pubkeys1) ] ) @@ -61,7 +62,8 @@ def test_genesis_block_hash_comparison() -> None: pubkeys2 = [Bytes52(bytes([i + 10] * 52)) for i in range(3)] validators2 = Validators( data=[ - Validator(pubkey=pubkey, index=ValidatorIndex(i)) for i, pubkey in enumerate(pubkeys2) + Validator(attestation_pubkey=pubkey, proposal_pubkey=pubkey, index=ValidatorIndex(i)) + for i, pubkey in enumerate(pubkeys2) ] ) @@ -88,7 +90,8 @@ def test_genesis_block_hash_comparison() -> None: pubkeys3 = [Bytes52(bytes([i + 1] * 52)) for i in range(3)] validators3 = Validators( data=[ - Validator(pubkey=pubkey, index=ValidatorIndex(i)) for i, pubkey in enumerate(pubkeys3) + Validator(attestation_pubkey=pubkey, proposal_pubkey=pubkey, index=ValidatorIndex(i)) + for i, pubkey in enumerate(pubkeys3) ] ) @@ -112,10 +115,10 @@ def test_genesis_block_hash_comparison() -> None: # Compare genesis block hashes with expected hex values hash1_hex = f"0x{genesis_block_hash1.hex()}" - assert hash1_hex == "0xcc03f11dd80dd79a4add86265fad0a141d0a553812d43b8f2c03aa43e4b002e3" + assert hash1_hex == "0xf84d547a47ca863fac7cda4619d3a93a2d3e7f2afdeeb5e4571b393554e19c0d" hash2_hex = f"0x{genesis_block_hash2.hex()}" - assert hash2_hex == "0x6bd5347aa1397c63ed8558079fdd3042112a5f4258066e3a659a659ff75ba14f" + assert hash2_hex == "0x7b90004279c32942009320f284a92c8ec5914e9c4deb7a9c50e17dc22a7c6ce9" hash3_hex = f"0x{genesis_block_hash3.hex()}" - assert hash3_hex == "0xce48a709189aa2b23b6858800996176dc13eb49c0c95d717c39e60042de1ac91" + assert hash3_hex == "0xb66cb6371bde0209ffd63063f89d216feeb1f03328400cb083429d8aead481ff" diff --git a/tests/lean_spec/subspecs/node/test_node.py b/tests/lean_spec/subspecs/node/test_node.py index 4a5be8af..060d4648 100644 --- a/tests/lean_spec/subspecs/node/test_node.py +++ b/tests/lean_spec/subspecs/node/test_node.py @@ -246,7 +246,13 @@ def test_api_server_none_when_no_config(self, node_config: NodeConfig) -> None: def test_validator_service_created_when_registry_provided(self) -> None: """Validator service is created when validator_registry is set.""" registry = ValidatorRegistry() - registry.add(ValidatorEntry(index=ValidatorIndex(0), secret_key=MagicMock())) + registry.add( + ValidatorEntry( + index=ValidatorIndex(0), + attestation_secret_key=MagicMock(), + proposal_secret_key=MagicMock(), + ) + ) config = NodeConfig( genesis_time=GENESIS_TIME, diff --git a/tests/lean_spec/subspecs/ssz/test_block.py b/tests/lean_spec/subspecs/ssz/test_block.py index f1d861e5..d70e1920 100644 --- a/tests/lean_spec/subspecs/ssz/test_block.py +++ b/tests/lean_spec/subspecs/ssz/test_block.py @@ -1,4 +1,4 @@ -from lean_spec.subspecs.containers.attestation import Attestation, AttestationData +from lean_spec.subspecs.containers.attestation import AttestationData, SignedAttestation from lean_spec.subspecs.containers.block import ( Block, BlockBody, @@ -27,7 +27,7 @@ def test_encode_decode_signed_block_with_attestation_roundtrip() -> None: state_root=Bytes32.zero(), body=BlockBody(attestations=AggregatedAttestations(data=[])), ), - proposer_attestation=Attestation( + proposer_attestation=SignedAttestation( validator_id=ValidatorIndex(0), data=AttestationData( slot=Slot(0), @@ -35,6 +35,7 @@ def test_encode_decode_signed_block_with_attestation_roundtrip() -> None: target=Checkpoint(root=Bytes32.zero(), slot=Slot(0)), source=Checkpoint(root=Bytes32.zero(), slot=Slot(0)), ), + signature=make_mock_signature(), ), ), signature=BlockSignatures( diff --git a/tests/lean_spec/subspecs/validator/test_registry.py b/tests/lean_spec/subspecs/validator/test_registry.py index e0b8ac06..df19872c 100644 --- a/tests/lean_spec/subspecs/validator/test_registry.py +++ b/tests/lean_spec/subspecs/validator/test_registry.py @@ -14,9 +14,15 @@ from lean_spec.subspecs.validator.registry import ValidatorEntry, ValidatorManifestEntry -def registry_state(registry: ValidatorRegistry) -> dict[ValidatorIndex, Any]: - """Extract full registry state as index → secret_key mapping.""" - return {idx: registry.get(idx).secret_key for idx in registry.indices()} # type: ignore[union-attr] +def registry_state(registry: ValidatorRegistry) -> dict[ValidatorIndex, tuple[Any, Any]]: + """Extract full registry state as index → (att_sk, prop_sk) mapping.""" + return { + idx: ( + registry.get(idx).attestation_secret_key, # type: ignore[union-attr] + registry.get(idx).proposal_secret_key, # type: ignore[union-attr] + ) + for idx in registry.indices() + } class TestValidatorEntry: @@ -25,7 +31,9 @@ class TestValidatorEntry: def test_entry_is_frozen(self) -> None: """ValidatorEntry is immutable.""" mock_key = MagicMock() - entry = ValidatorEntry(index=ValidatorIndex(0), secret_key=mock_key) + entry = ValidatorEntry( + index=ValidatorIndex(0), attestation_secret_key=mock_key, proposal_secret_key=mock_key + ) with pytest.raises(AttributeError): entry.index = ValidatorIndex(1) # type: ignore[misc] @@ -45,9 +53,13 @@ def test_add_single_entry(self) -> None: """Single entry can be added and retrieved with correct key.""" registry = ValidatorRegistry() key_42 = MagicMock(name="key_42") - registry.add(ValidatorEntry(index=ValidatorIndex(42), secret_key=key_42)) + registry.add( + ValidatorEntry( + index=ValidatorIndex(42), attestation_secret_key=key_42, proposal_secret_key=key_42 + ) + ) - assert registry_state(registry) == {ValidatorIndex(42): key_42} + assert registry_state(registry) == {ValidatorIndex(42): (key_42, key_42)} def test_add_multiple_entries(self) -> None: """Multiple entries maintain correct index-to-key mapping.""" @@ -56,14 +68,26 @@ def test_add_multiple_entries(self) -> None: key_3 = MagicMock(name="key_3") key_4 = MagicMock(name="key_4") - registry.add(ValidatorEntry(index=ValidatorIndex(3), secret_key=key_3)) - registry.add(ValidatorEntry(index=ValidatorIndex(1), secret_key=key_1)) - registry.add(ValidatorEntry(index=ValidatorIndex(4), secret_key=key_4)) + registry.add( + ValidatorEntry( + index=ValidatorIndex(3), attestation_secret_key=key_3, proposal_secret_key=key_3 + ) + ) + registry.add( + ValidatorEntry( + index=ValidatorIndex(1), attestation_secret_key=key_1, proposal_secret_key=key_1 + ) + ) + registry.add( + ValidatorEntry( + index=ValidatorIndex(4), attestation_secret_key=key_4, proposal_secret_key=key_4 + ) + ) assert registry_state(registry) == { - ValidatorIndex(1): key_1, - ValidatorIndex(3): key_3, - ValidatorIndex(4): key_4, + ValidatorIndex(1): (key_1, key_1), + ValidatorIndex(3): (key_3, key_3), + ValidatorIndex(4): (key_4, key_4), } def test_primary_index_returns_none_for_empty_registry(self) -> None: @@ -75,15 +99,31 @@ def test_primary_index_returns_first_index(self) -> None: """Primary index returns the first validator index.""" registry = ValidatorRegistry() key = MagicMock(name="key_5") - registry.add(ValidatorEntry(index=ValidatorIndex(5), secret_key=key)) + registry.add( + ValidatorEntry( + index=ValidatorIndex(5), attestation_secret_key=key, proposal_secret_key=key + ) + ) assert registry.primary_index() == ValidatorIndex(5) def test_primary_index_with_multiple_validators(self) -> None: """Primary index returns the first inserted index.""" registry = ValidatorRegistry() - registry.add(ValidatorEntry(index=ValidatorIndex(3), secret_key=MagicMock())) - registry.add(ValidatorEntry(index=ValidatorIndex(1), secret_key=MagicMock())) + registry.add( + ValidatorEntry( + index=ValidatorIndex(3), + attestation_secret_key=MagicMock(), + proposal_secret_key=MagicMock(), + ) + ) + registry.add( + ValidatorEntry( + index=ValidatorIndex(1), + attestation_secret_key=MagicMock(), + proposal_secret_key=MagicMock(), + ) + ) assert registry.primary_index() == ValidatorIndex(3) @@ -93,10 +133,13 @@ def test_from_secret_keys(self) -> None: key_2 = MagicMock(name="key_2") registry = ValidatorRegistry.from_secret_keys( - {ValidatorIndex(0): key_0, ValidatorIndex(2): key_2} + {ValidatorIndex(0): (key_0, key_0), ValidatorIndex(2): (key_2, key_2)} ) - assert registry_state(registry) == {ValidatorIndex(0): key_0, ValidatorIndex(2): key_2} + assert registry_state(registry) == { + ValidatorIndex(0): (key_0, key_0), + ValidatorIndex(2): (key_2, key_2), + } class TestValidatorRegistryFromYaml: @@ -119,23 +162,46 @@ def test_from_yaml_loads_assigned_validators(self, tmp_path: Path) -> None: "num_active_epochs": 32, "num_validators": 3, "validators": [ - {"index": 0, "pubkey_hex": "0x" + "00" * 52, "privkey_file": "key_0.ssz"}, - {"index": 1, "pubkey_hex": "0x" + "01" * 52, "privkey_file": "key_1.ssz"}, - {"index": 2, "pubkey_hex": "0x" + "02" * 52, "privkey_file": "key_2.ssz"}, + { + "index": 0, + "attestation_pubkey_hex": "0x" + "00" * 52, + "proposal_pubkey_hex": "0x" + "00" * 52, + "attestation_privkey_file": "att_key_0.ssz", + "proposal_privkey_file": "prop_key_0.ssz", + }, + { + "index": 1, + "attestation_pubkey_hex": "0x" + "01" * 52, + "proposal_pubkey_hex": "0x" + "01" * 52, + "attestation_privkey_file": "att_key_1.ssz", + "proposal_privkey_file": "prop_key_1.ssz", + }, + { + "index": 2, + "attestation_pubkey_hex": "0x" + "02" * 52, + "proposal_pubkey_hex": "0x" + "02" * 52, + "attestation_privkey_file": "att_key_2.ssz", + "proposal_privkey_file": "prop_key_2.ssz", + }, ], } ) ) - (tmp_path / "key_0.ssz").write_bytes(b"key0") - (tmp_path / "key_1.ssz").write_bytes(b"key1") + (tmp_path / "att_key_0.ssz").write_bytes(b"att0") + (tmp_path / "prop_key_0.ssz").write_bytes(b"prop0") + (tmp_path / "att_key_1.ssz").write_bytes(b"att1") + (tmp_path / "prop_key_1.ssz").write_bytes(b"prop1") # Use side_effect to return different keys for each call - key_0 = MagicMock(name="key_0") - key_1 = MagicMock(name="key_1") + # Order: att_key_0, prop_key_0, att_key_1, prop_key_1 + att_key_0 = MagicMock(name="att_key_0") + prop_key_0 = MagicMock(name="prop_key_0") + att_key_1 = MagicMock(name="att_key_1") + prop_key_1 = MagicMock(name="prop_key_1") with patch( "lean_spec.subspecs.xmss.SecretKey.decode_bytes", - side_effect=[key_0, key_1], + side_effect=[att_key_0, prop_key_0, att_key_1, prop_key_1], ): registry = ValidatorRegistry.from_yaml( node_id="node_0", @@ -143,7 +209,10 @@ def test_from_yaml_loads_assigned_validators(self, tmp_path: Path) -> None: manifest_path=manifest_file, ) - assert registry_state(registry) == {ValidatorIndex(0): key_0, ValidatorIndex(1): key_1} + assert registry_state(registry) == { + ValidatorIndex(0): (att_key_0, prop_key_0), + ValidatorIndex(1): (att_key_1, prop_key_1), + } def test_from_yaml_unknown_node_returns_empty(self, tmp_path: Path) -> None: """Unknown node ID returns empty registry.""" @@ -191,18 +260,26 @@ def test_from_yaml_skips_missing_manifest_entries(self, tmp_path: Path) -> None: "num_active_epochs": 32, "num_validators": 1, "validators": [ - {"index": 0, "pubkey_hex": "0x" + "00" * 52, "privkey_file": "key_0.ssz"}, + { + "index": 0, + "attestation_pubkey_hex": "0x" + "00" * 52, + "proposal_pubkey_hex": "0x" + "00" * 52, + "attestation_privkey_file": "att_key_0.ssz", + "proposal_privkey_file": "prop_key_0.ssz", + }, ], } ) ) - (tmp_path / "key_0.ssz").write_bytes(b"key0") + (tmp_path / "att_key_0.ssz").write_bytes(b"att0") + (tmp_path / "prop_key_0.ssz").write_bytes(b"prop0") - key_0 = MagicMock(name="key_0") + att_key_0 = MagicMock(name="att_key_0") + prop_key_0 = MagicMock(name="prop_key_0") with patch( "lean_spec.subspecs.xmss.SecretKey.decode_bytes", - return_value=key_0, + side_effect=[att_key_0, prop_key_0], ): registry = ValidatorRegistry.from_yaml( node_id="node_0", @@ -211,7 +288,7 @@ def test_from_yaml_skips_missing_manifest_entries(self, tmp_path: Path) -> None: ) # Only index 0 loaded (99 not in manifest) - assert registry_state(registry) == {ValidatorIndex(0): key_0} + assert registry_state(registry) == {ValidatorIndex(0): (att_key_0, prop_key_0)} def test_from_yaml_empty_file_returns_empty(self, tmp_path: Path) -> None: """Empty validators.yaml returns empty registry.""" @@ -259,13 +336,19 @@ def test_from_yaml_missing_key_file_raises(self, tmp_path: Path) -> None: "num_active_epochs": 32, "num_validators": 1, "validators": [ - {"index": 0, "pubkey_hex": "0x" + "00" * 52, "privkey_file": "missing.ssz"}, + { + "index": 0, + "attestation_pubkey_hex": "0x" + "00" * 52, + "proposal_pubkey_hex": "0x" + "00" * 52, + "attestation_privkey_file": "missing.ssz", + "proposal_privkey_file": "prop.ssz", + }, ], } ) ) - with pytest.raises(ValueError, match="Private key file not found"): + with pytest.raises(ValueError, match="key file not found"): ValidatorRegistry.from_yaml( node_id="node_0", validators_path=validators_file, @@ -289,7 +372,13 @@ def test_from_yaml_invalid_key_file_raises(self, tmp_path: Path) -> None: "num_active_epochs": 32, "num_validators": 1, "validators": [ - {"index": 0, "pubkey_hex": "0x" + "00" * 52, "privkey_file": "invalid.ssz"}, + { + "index": 0, + "attestation_pubkey_hex": "0x" + "00" * 52, + "proposal_pubkey_hex": "0x" + "00" * 52, + "attestation_privkey_file": "invalid.ssz", + "proposal_privkey_file": "prop.ssz", + }, ], } ) @@ -297,7 +386,7 @@ def test_from_yaml_invalid_key_file_raises(self, tmp_path: Path) -> None: (tmp_path / "invalid.ssz").write_bytes(b"not valid ssz") - with pytest.raises(ValueError, match="Failed to load private key"): + with pytest.raises(ValueError, match="Failed to load attestation key"): ValidatorRegistry.from_yaml( node_id="node_0", validators_path=validators_file, @@ -312,26 +401,35 @@ def test_parse_pubkey_hex_string_passthrough(self) -> None: """String pubkey_hex passes through unchanged.""" entry = ValidatorManifestEntry( index=0, - pubkey_hex="0x" + "ab" * 52, - privkey_file="key.ssz", + attestation_pubkey_hex="0x" + "ab" * 52, + proposal_pubkey_hex="0x" + "cd" * 52, + attestation_privkey_file="att.ssz", + proposal_privkey_file="prop.ssz", ) - assert entry.pubkey_hex == "0x" + "ab" * 52 + assert entry.attestation_pubkey_hex == "0x" + "ab" * 52 + assert entry.proposal_pubkey_hex == "0x" + "cd" * 52 def test_parse_pubkey_hex_integer_conversion(self) -> None: """Integer pubkey_hex converts to padded hex string.""" entry = ValidatorManifestEntry( index=0, - pubkey_hex=0x123, # type: ignore[arg-type] - privkey_file="key.ssz", + attestation_pubkey_hex=0x123, # type: ignore[arg-type] + proposal_pubkey_hex=0x456, # type: ignore[arg-type] + attestation_privkey_file="att.ssz", + proposal_privkey_file="prop.ssz", ) # Padded to 104 hex characters (52 bytes) - assert entry.pubkey_hex == "0x" + "0" * 101 + "123" + assert entry.attestation_pubkey_hex == "0x" + "0" * 101 + "123" + assert entry.proposal_pubkey_hex == "0x" + "0" * 101 + "456" def test_parse_pubkey_hex_zero(self) -> None: """Zero integer converts to all-zeros hex string.""" entry = ValidatorManifestEntry( index=0, - pubkey_hex=0, # type: ignore[arg-type] - privkey_file="key.ssz", + attestation_pubkey_hex=0, # type: ignore[arg-type] + proposal_pubkey_hex=0, # type: ignore[arg-type] + attestation_privkey_file="att.ssz", + proposal_privkey_file="prop.ssz", ) - assert entry.pubkey_hex == "0x" + "0" * 104 + assert entry.attestation_pubkey_hex == "0x" + "0" * 104 + assert entry.proposal_pubkey_hex == "0x" + "0" * 104 diff --git a/tests/lean_spec/subspecs/validator/test_service.py b/tests/lean_spec/subspecs/validator/test_service.py index 7019db76..9643c4fa 100644 --- a/tests/lean_spec/subspecs/validator/test_service.py +++ b/tests/lean_spec/subspecs/validator/test_service.py @@ -50,7 +50,13 @@ def mock_registry() -> ValidatorRegistry: registry = ValidatorRegistry() for i in [0, 1]: mock_key = MagicMock() - registry.add(ValidatorEntry(index=ValidatorIndex(i), secret_key=mock_key)) + registry.add( + ValidatorEntry( + index=ValidatorIndex(i), + attestation_secret_key=mock_key, + proposal_secret_key=mock_key, + ) + ) return registry @@ -105,7 +111,13 @@ async def test_no_block_when_not_proposer( # Registry with validator 2 only registry = ValidatorRegistry() mock_key = MagicMock() - registry.add(ValidatorEntry(index=ValidatorIndex(2), secret_key=mock_key)) + registry.add( + ValidatorEntry( + index=ValidatorIndex(2), + attestation_secret_key=mock_key, + proposal_secret_key=mock_key, + ) + ) blocks_received: list[SignedBlockWithAttestation] = [] @@ -253,18 +265,18 @@ async def capture_sleep(duration: float) -> None: assert abs(captured_duration - expected) < 0.001 -class TestProposerSkipping: - """Tests for proposer skipping during attestation production.""" +class TestProposerGossipAttestation: + """Tests for proposer gossip attestation at interval 1.""" - async def test_proposer_skipped_in_attestation_production( + async def test_proposer_also_attests_at_interval_1( self, sync_service: SyncService, ) -> None: - """Proposer is skipped when producing attestations at interval 1. + """Proposer produces a gossip attestation alongside all other validators. - At slot 0, validator 0 is the proposer (0 % 3 == 0). - When controlling validators 0 and 1, only validator 1 should produce an attestation - since validator 0 already attested within their block. + With dual keys, the proposer signs the block envelope with the proposal + key and gossips a separate attestation with the attestation key. + Both validators 0 and 1 should produce attestations. """ clock = SlotClock(genesis_time=Uint64(0)) @@ -272,7 +284,13 @@ async def test_proposer_skipped_in_attestation_production( registry = ValidatorRegistry() for i in [0, 1]: mock_key = MagicMock() - registry.add(ValidatorEntry(index=ValidatorIndex(i), secret_key=mock_key)) + registry.add( + ValidatorEntry( + index=ValidatorIndex(i), + attestation_secret_key=mock_key, + proposal_secret_key=mock_key, + ) + ) # Track which validators had _sign_attestation called. signed_validator_ids: list[ValidatorIndex] = [] @@ -292,6 +310,7 @@ def mock_sign_attestation( ) # Slot 0: validator 0 is proposer (0 % 3 == 0). + # Both validators should produce gossip attestations. with patch.object( ValidatorService, "_sign_attestation", @@ -299,66 +318,18 @@ def mock_sign_attestation( ): await service._produce_attestations(Slot(0)) - # Only validator 1 should have signed an attestation. - assert len(signed_validator_ids) == 1 - assert signed_validator_ids[0] == ValidatorIndex(1) - assert service.attestations_produced == 1 - - async def test_non_proposer_still_attests( - self, - sync_service: SyncService, - ) -> None: - """Non-proposer validators still produce attestations. - - At slot 1, validator 1 is the proposer (1 % 3 == 1). - Validator 0 is not the proposer so should produce an attestation. - """ - clock = SlotClock(genesis_time=Uint64(0)) - - # Registry with only validator 0. - registry = ValidatorRegistry() - mock_key = MagicMock() - registry.add(ValidatorEntry(index=ValidatorIndex(0), secret_key=mock_key)) - - # Track which validators had _sign_attestation called. - signed_validator_ids: list[ValidatorIndex] = [] - - def mock_sign_attestation( - self: ValidatorService, # noqa: ARG001 - attestation_data: object, # noqa: ARG001 - validator_index: ValidatorIndex, - ) -> SignedAttestation: - signed_validator_ids.append(validator_index) - return MagicMock(spec=SignedAttestation, validator_id=validator_index) - - service = ValidatorService( - sync_service=sync_service, - clock=clock, - registry=registry, - ) - - # Slot 1: validator 1 is proposer (1 % 3 == 1). - # Validator 0 is not proposer, should attest. - with patch.object( - ValidatorService, - "_sign_attestation", - mock_sign_attestation, - ): - await service._produce_attestations(Slot(1)) - - # Validator 0 should have signed an attestation. - assert len(signed_validator_ids) == 1 - assert signed_validator_ids[0] == ValidatorIndex(0) - assert service.attestations_produced == 1 + assert sorted(signed_validator_ids) == [ValidatorIndex(0), ValidatorIndex(1)] + assert service.attestations_produced == 2 - async def test_multiple_validators_only_non_proposers_attest( + async def test_all_validators_attest_including_proposer( self, sync_service: SyncService, ) -> None: - """With multiple validators, only non-proposers produce attestations. + """All validators produce gossip attestations, including the proposer. At slot 2, validator 2 is the proposer (2 % 3 == 2). - Controlling validators 0, 1, and 2, only validators 0 and 1 should attest. + All three validators (0, 1, 2) should produce gossip attestations + since the proposer uses a separate attestation key. """ clock = SlotClock(genesis_time=Uint64(0)) @@ -366,7 +337,13 @@ async def test_multiple_validators_only_non_proposers_attest( registry = ValidatorRegistry() for i in [0, 1, 2]: mock_key = MagicMock() - registry.add(ValidatorEntry(index=ValidatorIndex(i), secret_key=mock_key)) + registry.add( + ValidatorEntry( + index=ValidatorIndex(i), + attestation_secret_key=mock_key, + proposal_secret_key=mock_key, + ) + ) # Track which validators had _sign_attestation called. signed_validator_ids: list[ValidatorIndex] = [] @@ -386,6 +363,7 @@ def mock_sign_attestation( ) # Slot 2: validator 2 is proposer (2 % 3 == 2). + # All validators should attest. with patch.object( ValidatorService, "_sign_attestation", @@ -393,13 +371,13 @@ def mock_sign_attestation( ): await service._produce_attestations(Slot(2)) - # Validators 0 and 1 should have signed attestations. - assert len(signed_validator_ids) == 2 - assert set(signed_validator_ids) == {ValidatorIndex(0), ValidatorIndex(1)} - assert service.attestations_produced == 2 - - # Verify validator 2 (proposer) did not sign. - assert ValidatorIndex(2) not in signed_validator_ids + assert len(signed_validator_ids) == 3 + assert set(signed_validator_ids) == { + ValidatorIndex(0), + ValidatorIndex(1), + ValidatorIndex(2), + } + assert service.attestations_produced == 3 class TestSigningMissingValidator: @@ -491,8 +469,14 @@ def real_registry(self, key_manager: XmssKeyManager) -> ValidatorRegistry: registry = ValidatorRegistry() for i in range(6): validator_index = ValidatorIndex(i) - secret_key = key_manager[validator_index].secret - registry.add(ValidatorEntry(index=validator_index, secret_key=secret_key)) + kp = key_manager[validator_index] + registry.add( + ValidatorEntry( + index=validator_index, + attestation_secret_key=kp.attestation_secret, + proposal_secret_key=kp.proposal_secret, + ) + ) return registry async def test_produce_real_block_with_valid_signature( @@ -531,9 +515,9 @@ async def capture_block(block: SignedBlockWithAttestation) -> None: # Verify proposer signature is cryptographically valid proposer_index = signed_block.message.block.proposer_index - proposer_public_key = key_manager.get_public_key(proposer_index) proposer_attestation_data = signed_block.message.proposer_attestation.data message_bytes = proposer_attestation_data.data_root_bytes() + proposer_public_key = key_manager.get_proposal_public_key(proposer_index) is_valid = TARGET_SIGNATURE_SCHEME.verify( pk=proposer_public_key, @@ -543,6 +527,14 @@ async def capture_block(block: SignedBlockWithAttestation) -> None: ) assert is_valid, "Proposer signature failed verification" + attestation_public_key = key_manager.get_attestation_public_key(proposer_index) + assert TARGET_SIGNATURE_SCHEME.verify( + pk=attestation_public_key, + slot=signed_block.message.block.slot, + message=message_bytes, + sig=signed_block.message.proposer_attestation.signature, + ) + async def test_produce_real_attestation_with_valid_signature( self, key_manager: XmssKeyManager, @@ -567,16 +559,15 @@ async def capture_attestation(attestation: SignedAttestation) -> None: on_attestation=capture_attestation, ) - # Slot 1: proposer is validator 1, so validators 0, 2, 3, 4, 5 should attest + # Slot 1: all 6 validators should attest (including proposer 1) await service._produce_attestations(Slot(1)) - # 5 validators should have attested (all except proposer 1) - assert len(attestations_produced) == 5 + assert len(attestations_produced) == 6 # Verify each attestation signature for signed_att in attestations_produced: validator_id = signed_att.validator_id - public_key = key_manager.get_public_key(validator_id) + public_key = key_manager.get_attestation_public_key(validator_id) message_bytes = signed_att.data.data_root_bytes() is_valid = TARGET_SIGNATURE_SCHEME.verify( @@ -672,8 +663,8 @@ async def capture_block(block: SignedBlockWithAttestation) -> None: assert proposer_attestation.data.slot == signed_block.message.block.slot # Verify proposer attestation signature is valid - public_key = key_manager.get_public_key(proposer_index) message_bytes = proposer_attestation.data.data_root_bytes() + public_key = key_manager.get_proposal_public_key(proposer_index) is_valid = TARGET_SIGNATURE_SCHEME.verify( pk=public_key, @@ -683,6 +674,14 @@ async def capture_block(block: SignedBlockWithAttestation) -> None: ) assert is_valid + att_public_key = key_manager.get_attestation_public_key(proposer_index) + assert TARGET_SIGNATURE_SCHEME.verify( + pk=att_public_key, + slot=signed_block.message.block.slot, + message=message_bytes, + sig=proposer_attestation.signature, + ) + async def test_block_includes_pending_attestations( self, key_manager: XmssKeyManager, @@ -708,7 +707,7 @@ async def test_block_includes_pending_attestations( for vid in participants: sig = key_manager.sign_attestation_data(vid, attestation_data) signatures.append(sig) - public_keys.append(key_manager.get_public_key(vid)) + public_keys.append(key_manager.get_attestation_public_key(vid)) attestation_map[vid] = attestation_data proof = AggregatedSignatureProof.aggregate( @@ -798,17 +797,17 @@ async def capture_attestation(attestation: SignedAttestation) -> None: for att in attestations_by_slot[Slot(2)]: assert att.data.slot == Slot(2) - async def test_proposer_does_not_double_attest( + async def test_proposer_also_gossips_attestation( self, key_manager: XmssKeyManager, real_sync_service: SyncService, real_registry: ValidatorRegistry, ) -> None: """ - Verify proposer does not produce a separate attestation after producing a block. + Verify proposer also produces a gossip attestation at interval 1. - The proposer's attestation is bundled in the block at interval 0. - At interval 1, the proposer should be skipped to prevent double-attestation. + The proposer signs the block envelope with the proposal key at interval 0. + At interval 1, the proposer also gossips with the attestation key. """ clock = SlotClock(genesis_time=Uint64(0)) blocks_produced: list[SignedBlockWithAttestation] = [] @@ -840,12 +839,9 @@ async def capture_attestation(attestation: SignedAttestation) -> None: assert len(blocks_produced) == 1 assert blocks_produced[0].message.block.proposer_index == proposer_index - # Proposer should NOT appear in attestations_produced + # ALL validators should have attested (including proposer) attestation_validator_ids = {att.validator_id for att in attestations_produced} - assert proposer_index not in attestation_validator_ids - - # All other validators should have attested - expected_attesters = {ValidatorIndex(i) for i in range(6) if i != int(proposer_index)} + expected_attesters = {ValidatorIndex(i) for i in range(6)} assert attestation_validator_ids == expected_attesters async def test_block_state_root_is_valid( @@ -922,7 +918,7 @@ async def capture_attestation(attestation: SignedAttestation) -> None: # Verify each signature was created with the correct slot for signed_att in attestations_produced: validator_id = signed_att.validator_id - public_key = key_manager.get_public_key(validator_id) + public_key = key_manager.get_attestation_public_key(validator_id) message_bytes = signed_att.data.data_root_bytes() # Verification must use the same slot that was used for signing