95c8e476bc
* Remove ping protocol * Initial renaming of network services * Correct rebasing relative to latest master * Start updating types * Adds HashMapDelay struct to utils * Initial network restructure * Network restructure. Adds new types for v0.2.0 * Removes build artefacts * Shift validation to beacon chain * Temporarily remove gossip validation This is to be updated to match current optimisation efforts. * Adds AggregateAndProof * Begin rebuilding pubsub encoding/decoding * Signature hacking * Shift gossipsup decoding into eth2_libp2p * Existing EF tests passing with fake_crypto * Shifts block encoding/decoding into RPC * Delete outdated API spec * All release tests passing bar genesis state parsing * Update and test YamlConfig * Update to spec v0.10 compatible BLS * Updates to BLS EF tests * Add EF test for AggregateVerify And delete unused hash2curve tests for uncompressed points * Update EF tests to v0.10.1 * Use optional block root correctly in block proc * Use genesis fork in deposit domain. All tests pass * Fast aggregate verify test * Update REST API docs * Fix unused import * Bump spec tags to v0.10.1 * Add `seconds_per_eth1_block` to chainspec * Update to timestamp based eth1 voting scheme * Return None from `get_votes_to_consider` if block cache is empty * Handle overflows in `is_candidate_block` * Revert to failing tests * Fix eth1 data sets test * Choose default vote according to spec * Fix collect_valid_votes tests * Fix `get_votes_to_consider` to choose all eligible blocks * Uncomment winning_vote tests * Add comments; remove unused code * Reduce seconds_per_eth1_block for simulation * Addressed review comments * Add test for default vote case * Fix logs * Remove unused functions * Meter default eth1 votes * Fix comments * Progress on attestation service * Address review comments; remove unused dependency * Initial work on removing libp2p lock * Add LRU caches to store (rollup) * Update attestation validation for DB changes (WIP) * Initial version of should_forward_block * Scaffold * Progress on attestation validation Also, consolidate prod+testing slot clocks so that they share much of the same implementation and can both handle sub-slot time changes. * Removes lock from libp2p service * Completed network lock removal * Finish(?) attestation processing * Correct network termination future * Add slot check to block check * Correct fmt issues * Remove Drop implementation for network service * Add first attempt at attestation proc. re-write * Add version 2 of attestation processing * Minor fixes * Add validator pubkey cache * Make get_indexed_attestation take a committee * Link signature processing into new attn verification * First working version * Ensure pubkey cache is updated * Add more metrics, slight optimizations * Clone committee cache during attestation processing * Update shuffling cache during block processing * Remove old commented-out code * Fix shuffling cache insert bug * Used indexed attestation in fork choice * Restructure attn processing, add metrics * Add more detailed metrics * Tidy, fix failing tests * Fix failing tests, tidy * Address reviewers suggestions * Disable/delete two outdated tests * Modification of validator for subscriptions * Add slot signing to validator client * Further progress on validation subscription * Adds necessary validator subscription functionality * Add new Pubkeys struct to signature_sets * Refactor with functional approach * Update beacon chain * Clean up validator <-> beacon node http types * Add aggregator status to ValidatorDuty * Impl Clone for manual slot clock * Fix minor errors * Further progress validator client subscription * Initial subscription and aggregation handling * Remove decompressed member from pubkey bytes * Progress to modifying val client for attestation aggregation * First draft of validator client upgrade for aggregate attestations * Add hashmap for indices lookup * Add state cache, remove store cache * Only build the head committee cache * Removes lock on a network channel * Partially implement beacon node subscription http api * Correct compilation issues * Change `get_attesting_indices` to use Vec * Fix failing test * Partial implementation of timer * Adds timer, removes exit_future, http api to op pool * Partial multiple aggregate attestation handling * Permits bulk messages accross gossipsub network channel * Correct compile issues * Improve gosispsub messaging and correct rest api helpers * Added global gossipsub subscriptions * Update validator subscriptions data structs * Tidy * Re-structure validator subscriptions * Initial handling of subscriptions * Re-structure network service * Add pubkey cache persistence file * Add more comments * Integrate persistence file into builder * Add pubkey cache tests * Add HashSetDelay and introduce into attestation service * Handles validator subscriptions * Add data_dir to beacon chain builder * Remove Option in pubkey cache persistence file * Ensure consistency between datadir/data_dir * Fix failing network test * Peer subnet discovery gets queued for future subscriptions * Reorganise attestation service functions * Initial wiring of attestation service * First draft of attestation service timing logic * Correct minor typos * Tidy * Fix todos * Improve tests * Add PeerInfo to connected peers mapping * Fix compile error * Fix compile error from merge * Split up block processing metrics * Tidy * Refactor get_pubkey_from_state * Remove commented-out code * Rename state_cache -> checkpoint_cache * Rename Checkpoint -> Snapshot * Tidy, add comments * Tidy up find_head function * Change some checkpoint -> snapshot * Add tests * Expose max_len * Remove dead code * Tidy * Fix bug * Add sync-speed metric * Add first attempt at VerifiableBlock * Start integrating into beacon chain * Integrate VerifiableBlock * Rename VerifableBlock -> PartialBlockVerification * Add start of typed methods * Add progress * Add further progress * Rename structs * Add full block verification to block_processing.rs * Further beacon chain integration * Update checks for gossip * Add todo * Start adding segement verification * Add passing chain segement test * Initial integration with batch sync * Minor changes * Tidy, add more error checking * Start adding chain_segment tests * Finish invalid signature tests * Include single and gossip verified blocks in tests * Add gossip verification tests * Start adding docs * Finish adding comments to block_processing.rs * Rename block_processing.rs -> block_verification * Start removing old block processing code * Fixes beacon_chain compilation * Fix project-wide compile errors * Remove old code * Correct code to pass all tests * Fix bug with beacon proposer index * Fix shim for BlockProcessingError * Only process one epoch at a time * Fix loop in chain segment processing * Correct tests from master merge * Add caching for state.eth1_data_votes * Add BeaconChain::validator_pubkey * Revert "Add caching for state.eth1_data_votes" This reverts commit cd73dcd6434fb8d8e6bf30c5356355598ea7b78e. Co-authored-by: Grant Wuerker <gwuerker@gmail.com> Co-authored-by: Michael Sproul <michael@sigmaprime.io> Co-authored-by: Michael Sproul <micsproul@gmail.com> Co-authored-by: pawan <pawandhananjay@gmail.com> Co-authored-by: Paul Hauner <paul@paulhauner.com>
176 lines
4.8 KiB
Rust
176 lines
4.8 KiB
Rust
use super::{SecretKey, BLS_PUBLIC_KEY_BYTE_SIZE};
|
|
use milagro_bls::G1Point;
|
|
use milagro_bls::PublicKey as RawPublicKey;
|
|
use serde::de::{Deserialize, Deserializer};
|
|
use serde::ser::{Serialize, Serializer};
|
|
use serde_hex::{encode as hex_encode, PrefixedHexVisitor};
|
|
use ssz::{ssz_encode, Decode, DecodeError, Encode};
|
|
use std::default;
|
|
use std::fmt;
|
|
use std::hash::{Hash, Hasher};
|
|
|
|
/// A single BLS signature.
|
|
///
|
|
/// This struct is a wrapper upon a base type and provides helper functions (e.g., SSZ
|
|
/// serialization).
|
|
#[derive(Clone, Eq)]
|
|
pub struct FakePublicKey {
|
|
bytes: Vec<u8>,
|
|
/// Never used, only use for compatibility with "real" `PublicKey`.
|
|
pub point: G1Point,
|
|
}
|
|
|
|
impl FakePublicKey {
|
|
pub fn from_secret_key(_secret_key: &SecretKey) -> Self {
|
|
Self::zero()
|
|
}
|
|
|
|
pub fn from_raw(raw: RawPublicKey) -> Self {
|
|
Self {
|
|
bytes: raw.clone().as_bytes(),
|
|
point: G1Point::new(),
|
|
}
|
|
}
|
|
|
|
/// Creates a new all-zero's public key
|
|
pub fn zero() -> Self {
|
|
Self {
|
|
bytes: vec![0; BLS_PUBLIC_KEY_BYTE_SIZE],
|
|
point: G1Point::new(),
|
|
}
|
|
}
|
|
|
|
/// Returns the underlying point as compressed bytes.
|
|
///
|
|
/// Identical to `self.as_uncompressed_bytes()`.
|
|
pub fn as_bytes(&self) -> Vec<u8> {
|
|
self.bytes.clone()
|
|
}
|
|
|
|
/// Converts compressed bytes to FakePublicKey
|
|
pub fn from_bytes(bytes: &[u8]) -> Result<Self, DecodeError> {
|
|
Ok(Self {
|
|
bytes: bytes.to_vec(),
|
|
point: G1Point::new(),
|
|
})
|
|
}
|
|
|
|
/// Returns the FakePublicKey as (x, y) bytes
|
|
pub fn as_uncompressed_bytes(&self) -> Vec<u8> {
|
|
self.as_bytes()
|
|
}
|
|
|
|
/// Converts (x, y) bytes to FakePublicKey
|
|
pub fn from_uncompressed_bytes(bytes: &[u8]) -> Result<Self, DecodeError> {
|
|
Self::from_bytes(bytes)
|
|
}
|
|
|
|
/// Returns the last 6 bytes of the SSZ encoding of the public key, as a hex string.
|
|
///
|
|
/// Useful for providing a short identifier to the user.
|
|
pub fn concatenated_hex_id(&self) -> String {
|
|
let bytes = ssz_encode(self);
|
|
let end_bytes = &bytes[bytes.len().saturating_sub(6)..bytes.len()];
|
|
hex_encode(end_bytes)
|
|
}
|
|
|
|
/// Returns the point as a hex string of the SSZ encoding.
|
|
///
|
|
/// Note: the string is prefixed with `0x`.
|
|
pub fn as_hex_string(&self) -> String {
|
|
hex_encode(self.as_ssz_bytes())
|
|
}
|
|
|
|
// Returns itself
|
|
pub fn as_raw(&self) -> &Self {
|
|
self
|
|
}
|
|
|
|
pub fn as_point(&self) -> &G1Point {
|
|
&self.point
|
|
}
|
|
|
|
pub fn into_point(self) -> G1Point {
|
|
self.point
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for FakePublicKey {
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
write!(f, "{}", self.concatenated_hex_id())
|
|
}
|
|
}
|
|
|
|
impl fmt::Debug for FakePublicKey {
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
write!(f, "0x{}", self.as_hex_string())
|
|
}
|
|
}
|
|
|
|
impl default::Default for FakePublicKey {
|
|
fn default() -> Self {
|
|
let secret_key = SecretKey::random();
|
|
FakePublicKey::from_secret_key(&secret_key)
|
|
}
|
|
}
|
|
|
|
impl_ssz!(FakePublicKey, BLS_PUBLIC_KEY_BYTE_SIZE, "FakePublicKey");
|
|
|
|
impl_tree_hash!(FakePublicKey, BLS_PUBLIC_KEY_BYTE_SIZE);
|
|
|
|
impl Serialize for FakePublicKey {
|
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
|
where
|
|
S: Serializer,
|
|
{
|
|
serializer.serialize_str(&hex_encode(self.as_bytes()))
|
|
}
|
|
}
|
|
|
|
impl<'de> Deserialize<'de> for FakePublicKey {
|
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
where
|
|
D: Deserializer<'de>,
|
|
{
|
|
let bytes = deserializer.deserialize_str(PrefixedHexVisitor)?;
|
|
let pubkey = Self::from_ssz_bytes(&bytes[..])
|
|
.map_err(|e| serde::de::Error::custom(format!("invalid pubkey ({:?})", e)))?;
|
|
Ok(pubkey)
|
|
}
|
|
}
|
|
|
|
impl PartialEq for FakePublicKey {
|
|
fn eq(&self, other: &FakePublicKey) -> bool {
|
|
ssz_encode(self) == ssz_encode(other)
|
|
}
|
|
}
|
|
|
|
impl Hash for FakePublicKey {
|
|
/// Note: this is distinct from consensus serialization, it will produce a different hash.
|
|
///
|
|
/// This method uses the uncompressed bytes, which are much faster to obtain than the
|
|
/// compressed bytes required for consensus serialization.
|
|
///
|
|
/// Use `ssz::Encode` to obtain the bytes required for consensus hashing.
|
|
fn hash<H: Hasher>(&self, state: &mut H) {
|
|
self.as_uncompressed_bytes().hash(state)
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use ssz::ssz_encode;
|
|
|
|
#[test]
|
|
pub fn test_ssz_round_trip() {
|
|
let sk = SecretKey::random();
|
|
let original = FakePublicKey::from_secret_key(&sk);
|
|
|
|
let bytes = ssz_encode(&original);
|
|
let decoded = FakePublicKey::from_ssz_bytes(&bytes).unwrap();
|
|
|
|
assert_eq!(original, decoded);
|
|
}
|
|
}
|