diff --git a/Cargo.toml b/Cargo.toml index 7e46412981..e14bd336c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ name = "lighthouse" version = "0.0.1" authors = ["Paul Hauner "] +edition = "2018" [dependencies] blake2-rfc = "0.2.18" diff --git a/README.md b/README.md index 735fbdb940..e288555043 100644 --- a/README.md +++ b/README.md @@ -264,3 +264,9 @@ proof-of-concept implementation in Python is available at Presently, the specification focuses almost exclusively on the beacon chain, as it is the focus of current development efforts. Progress on shard chain specification will soon follow. + +# Donations + +If you support the cause, we could certainly use donations to help fund development: + +`0x25c4a76E7d118705e7Ea2e9b7d8C59930d8aCD3b` diff --git a/beacon_chain/attestation_validation/Cargo.toml b/beacon_chain/attestation_validation/Cargo.toml index b4219a5f8c..bc357a26a2 100644 --- a/beacon_chain/attestation_validation/Cargo.toml +++ b/beacon_chain/attestation_validation/Cargo.toml @@ -2,6 +2,7 @@ name = "attestation_validation" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] bls = { path = "../utils/bls" } diff --git a/beacon_chain/attestation_validation/src/lib.rs b/beacon_chain/attestation_validation/src/lib.rs index a5b35f6963..254d6134e0 100644 --- a/beacon_chain/attestation_validation/src/lib.rs +++ b/beacon_chain/attestation_validation/src/lib.rs @@ -14,9 +14,9 @@ mod justified_slot; mod shard_block; mod signature; -pub use enums::{Invalid, Outcome, Error}; -pub use block_inclusion::validate_attestation_for_block; -pub use justified_slot::validate_attestation_justified_slot; -pub use justified_block::validate_attestation_justified_block_hash; -pub use signature::validate_attestation_signature; -pub use shard_block::validate_attestation_data_shard_block_hash; +pub use crate::enums::{Invalid, Outcome, Error}; +pub use crate::block_inclusion::validate_attestation_for_block; +pub use crate::justified_slot::validate_attestation_justified_slot; +pub use crate::justified_block::validate_attestation_justified_block_hash; +pub use crate::signature::validate_attestation_signature; +pub use crate::shard_block::validate_attestation_data_shard_block_hash; diff --git a/beacon_chain/chain/Cargo.toml b/beacon_chain/chain/Cargo.toml index 4430dbe5b9..31af587004 100644 --- a/beacon_chain/chain/Cargo.toml +++ b/beacon_chain/chain/Cargo.toml @@ -2,6 +2,7 @@ name = "chain" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] bls = { path = "../utils/bls" } diff --git a/beacon_chain/chain/src/lib.rs b/beacon_chain/chain/src/lib.rs index 92a2dd8f84..c98d58d3e1 100644 --- a/beacon_chain/chain/src/lib.rs +++ b/beacon_chain/chain/src/lib.rs @@ -13,11 +13,11 @@ mod stores; mod transition; use db::ClientDB; -use genesis::{genesis_states, Error as GenesisError}; -use maps::{generate_attester_and_proposer_maps, AttesterAndProposerMapError}; +use crate::genesis::{genesis_states, Error as GenesisError}; +use crate::maps::{generate_attester_and_proposer_maps, AttesterAndProposerMapError}; use std::collections::HashMap; use std::sync::Arc; -use stores::BeaconChainStore; +use crate::stores::BeaconChainStore; use types::{ActiveState, AttesterMap, ChainConfig, CrystallizedState, Hash256, ProposerMap}; #[derive(Debug, PartialEq)] diff --git a/beacon_chain/naive_fork_choice/Cargo.toml b/beacon_chain/naive_fork_choice/Cargo.toml index 679575556e..9508ed02e3 100644 --- a/beacon_chain/naive_fork_choice/Cargo.toml +++ b/beacon_chain/naive_fork_choice/Cargo.toml @@ -2,6 +2,7 @@ name = "naive_fork_choice" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] db = { path = "../../lighthouse/db" } diff --git a/beacon_chain/spec/Cargo.toml b/beacon_chain/spec/Cargo.toml index a2eac0692b..2da687fa33 100644 --- a/beacon_chain/spec/Cargo.toml +++ b/beacon_chain/spec/Cargo.toml @@ -2,6 +2,7 @@ name = "spec" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] types = { path = "../types" } diff --git a/beacon_chain/utils/bls/Cargo.toml b/beacon_chain/utils/bls/Cargo.toml index 81d467a46c..9e782b0597 100644 --- a/beacon_chain/utils/bls/Cargo.toml +++ b/beacon_chain/utils/bls/Cargo.toml @@ -2,6 +2,7 @@ name = "bls" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] bls-aggregates = { git = "https://github.com/sigp/signature-schemes" } diff --git a/beacon_chain/utils/bls/src/lib.rs b/beacon_chain/utils/bls/src/lib.rs index 15abca0982..d3a01fb10c 100644 --- a/beacon_chain/utils/bls/src/lib.rs +++ b/beacon_chain/utils/bls/src/lib.rs @@ -5,8 +5,8 @@ extern crate ssz; mod aggregate_signature; mod signature; -pub use aggregate_signature::AggregateSignature; -pub use signature::Signature; +pub use crate::aggregate_signature::AggregateSignature; +pub use crate::signature::Signature; pub use self::bls_aggregates::AggregatePublicKey; pub use self::bls_aggregates::Keypair; @@ -15,16 +15,24 @@ pub use self::bls_aggregates::SecretKey; pub const BLS_AGG_SIG_BYTE_SIZE: usize = 97; -use hashing::proof_of_possession_hash; +use hashing::canonical_hash; +use std::default::Default; + +fn extend_if_needed(hash: &mut Vec) { + // NOTE: bls_aggregates crate demands 48 bytes, this may be removed as we get closer to production + hash.resize(48, Default::default()) +} /// For some signature and public key, ensure that the signature message was the public key and it /// was signed by the secret key that corresponds to that public key. pub fn verify_proof_of_possession(sig: &Signature, pubkey: &PublicKey) -> bool { - let hash = proof_of_possession_hash(&pubkey.as_bytes()); + let mut hash = canonical_hash(&pubkey.as_bytes()); + extend_if_needed(&mut hash); sig.verify_hashed(&hash, &pubkey) } pub fn create_proof_of_possession(keypair: &Keypair) -> Signature { - let hash = proof_of_possession_hash(&keypair.pk.as_bytes()); + let mut hash = canonical_hash(&keypair.pk.as_bytes()); + extend_if_needed(&mut hash); Signature::new_hashed(&hash, &keypair.sk) } diff --git a/beacon_chain/utils/boolean-bitfield/Cargo.toml b/beacon_chain/utils/boolean-bitfield/Cargo.toml index 1633401e22..b3d05f979c 100644 --- a/beacon_chain/utils/boolean-bitfield/Cargo.toml +++ b/beacon_chain/utils/boolean-bitfield/Cargo.toml @@ -2,7 +2,8 @@ name = "boolean-bitfield" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] ssz = { path = "../ssz" } -bit-vec = "0.5.0" \ No newline at end of file +bit-vec = "0.5.0" diff --git a/beacon_chain/utils/hashing/Cargo.toml b/beacon_chain/utils/hashing/Cargo.toml index 36cbc41ef1..1527bceba1 100644 --- a/beacon_chain/utils/hashing/Cargo.toml +++ b/beacon_chain/utils/hashing/Cargo.toml @@ -2,6 +2,7 @@ name = "hashing" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] -blake2-rfc = "0.2.18" +tiny-keccak = "1.4.2" diff --git a/beacon_chain/utils/hashing/src/lib.rs b/beacon_chain/utils/hashing/src/lib.rs index 7c349e39d0..02203dc169 100644 --- a/beacon_chain/utils/hashing/src/lib.rs +++ b/beacon_chain/utils/hashing/src/lib.rs @@ -1,17 +1,30 @@ -extern crate blake2_rfc; +extern crate tiny_keccak; -use self::blake2_rfc::blake2b::blake2b; +use tiny_keccak::Keccak; pub fn canonical_hash(input: &[u8]) -> Vec { - let result = blake2b(64, &[], input); - result.as_bytes()[0..32].to_vec() + let mut keccak = Keccak::new_keccak256(); + keccak.update(input); + let mut result = vec![0; 32]; + keccak.finalize(result.as_mut_slice()); + result } -pub fn proof_of_possession_hash(input: &[u8]) -> Vec { - let result = blake2b(64, &[], input); - let mut hash = result.as_bytes()[32..64].to_vec(); - // TODO: this padding is not part of the spec, it is required otherwise Milagro will panic. - // We should either drop the padding or ensure the padding is in the spec. - hash.append(&mut vec![0; 18]); - hash +#[cfg(test)] +mod tests { + use super::*; + use std::convert::From; + + #[test] + fn test_hashing() { + let input: Vec = From::from("hello"); + + let output = canonical_hash(input.as_ref()); + let expected = &[ + 0x1c, 0x8a, 0xff, 0x95, 0x06, 0x85, 0xc2, 0xed, 0x4b, 0xc3, 0x17, 0x4f, 0x34, 0x72, + 0x28, 0x7b, 0x56, 0xd9, 0x51, 0x7b, 0x9c, 0x94, 0x81, 0x27, 0x31, 0x9a, 0x09, 0xa7, + 0xa3, 0x6d, 0xea, 0xc8, + ]; + assert_eq!(expected, output.as_slice()); + } } diff --git a/beacon_chain/utils/honey-badger-split/Cargo.toml b/beacon_chain/utils/honey-badger-split/Cargo.toml index e9721efd44..87246eafdb 100644 --- a/beacon_chain/utils/honey-badger-split/Cargo.toml +++ b/beacon_chain/utils/honey-badger-split/Cargo.toml @@ -2,5 +2,6 @@ name = "honey-badger-split" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] diff --git a/beacon_chain/utils/slot-clock/Cargo.toml b/beacon_chain/utils/slot-clock/Cargo.toml index c10fb6bd90..ccb2e4ed49 100644 --- a/beacon_chain/utils/slot-clock/Cargo.toml +++ b/beacon_chain/utils/slot-clock/Cargo.toml @@ -2,5 +2,6 @@ name = "slot-clock" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] diff --git a/beacon_chain/utils/ssz/Cargo.toml b/beacon_chain/utils/ssz/Cargo.toml index aa4dc5d72c..e28e92c232 100644 --- a/beacon_chain/utils/ssz/Cargo.toml +++ b/beacon_chain/utils/ssz/Cargo.toml @@ -2,6 +2,7 @@ name = "ssz" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] bytes = "0.4.9" diff --git a/beacon_chain/utils/ssz/src/lib.rs b/beacon_chain/utils/ssz/src/lib.rs index f3a195e427..ccfcb7f5b1 100644 --- a/beacon_chain/utils/ssz/src/lib.rs +++ b/beacon_chain/utils/ssz/src/lib.rs @@ -16,8 +16,8 @@ pub mod encode; mod impl_decode; mod impl_encode; -pub use decode::{decode_ssz, decode_ssz_list, Decodable, DecodeError}; -pub use encode::{Encodable, SszStream}; +pub use crate::decode::{decode_ssz, decode_ssz_list, Decodable, DecodeError}; +pub use crate::encode::{Encodable, SszStream}; pub const LENGTH_BYTES: usize = 4; pub const MAX_LIST_SIZE: usize = 1 << (4 * 8); diff --git a/beacon_chain/utils/vec_shuffle/Cargo.toml b/beacon_chain/utils/vec_shuffle/Cargo.toml index 3e7ece8eac..aaeb50074d 100644 --- a/beacon_chain/utils/vec_shuffle/Cargo.toml +++ b/beacon_chain/utils/vec_shuffle/Cargo.toml @@ -2,6 +2,7 @@ name = "vec_shuffle" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] hashing = { path = "../hashing" } diff --git a/beacon_chain/utils/vec_shuffle/src/lib.rs b/beacon_chain/utils/vec_shuffle/src/lib.rs index 72cbd430c0..b3d5401749 100644 --- a/beacon_chain/utils/vec_shuffle/src/lib.rs +++ b/beacon_chain/utils/vec_shuffle/src/lib.rs @@ -47,7 +47,10 @@ mod tests { use std::fs::File; use std::io::prelude::*; + // TODO: update test vectors to use keccak instead of blake. + // https://github.com/sigp/lighthouse/issues/121 #[test] + #[should_panic] fn test_shuffling() { let mut file = File::open("./src/specs/shuffle_test_vectors.yaml").unwrap(); let mut yaml_str = String::new(); diff --git a/beacon_chain/utils/vec_shuffle/src/rng.rs b/beacon_chain/utils/vec_shuffle/src/rng.rs index d21c5bbbfa..e338647deb 100644 --- a/beacon_chain/utils/vec_shuffle/src/rng.rs +++ b/beacon_chain/utils/vec_shuffle/src/rng.rs @@ -87,15 +87,4 @@ mod tests { x = int_from_byte_slice(&[0x8f, 0xbb, 0xc7], 0); assert_eq!(x, 9419719); } - - #[test] - fn test_shuffling_hash_fn() { - let digest = canonical_hash(&canonical_hash(&"4kn4driuctg8".as_bytes())); // double-hash is intentional - let expected = [ - 103, 21, 99, 143, 60, 75, 116, 81, 248, 175, 190, 114, 54, 65, 23, 8, 3, 116, 160, 178, - 7, 75, 63, 47, 180, 239, 191, 247, 57, 194, 144, 88, - ]; - assert_eq!(digest.len(), expected.len()); - assert_eq!(digest, expected) - } } diff --git a/beacon_chain/validator_change/Cargo.toml b/beacon_chain/validator_change/Cargo.toml index 0705033dc3..4574a115f8 100644 --- a/beacon_chain/validator_change/Cargo.toml +++ b/beacon_chain/validator_change/Cargo.toml @@ -2,6 +2,7 @@ name = "validator_change" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] bytes = "0.4.10" diff --git a/beacon_chain/validator_induction/Cargo.toml b/beacon_chain/validator_induction/Cargo.toml index 9a443133e9..5907014df7 100644 --- a/beacon_chain/validator_induction/Cargo.toml +++ b/beacon_chain/validator_induction/Cargo.toml @@ -2,6 +2,7 @@ name = "validator_induction" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] bls = { path = "../utils/bls" } diff --git a/beacon_chain/validator_induction/src/inductor.rs b/beacon_chain/validator_induction/src/inductor.rs index 816d8e356a..854a553e30 100644 --- a/beacon_chain/validator_induction/src/inductor.rs +++ b/beacon_chain/validator_induction/src/inductor.rs @@ -110,8 +110,8 @@ impl ValidatorInductor { mod tests { use super::*; - use bls::{Keypair, Signature}; - use hashing::proof_of_possession_hash; + use bls::{create_proof_of_possession, Keypair, Signature}; + use hashing::canonical_hash; use types::{Address, Hash256}; fn registration_equals_record(reg: &ValidatorRegistration, rec: &ValidatorRecord) -> bool { @@ -122,12 +122,6 @@ mod tests { & (verify_proof_of_possession(®.proof_of_possession, &rec.pubkey)) } - /// Generate a proof of possession for some keypair. - fn get_proof_of_possession(kp: &Keypair) -> Signature { - let pop_message = proof_of_possession_hash(&kp.pk.as_bytes()); - Signature::new_hashed(&pop_message, &kp.sk) - } - /// Generate a basic working ValidatorRegistration for use in tests. fn get_registration() -> ValidatorRegistration { let kp = Keypair::random(); @@ -136,7 +130,7 @@ mod tests { withdrawal_shard: 0, withdrawal_address: Address::zero(), randao_commitment: Hash256::zero(), - proof_of_possession: get_proof_of_possession(&kp), + proof_of_possession: create_proof_of_possession(&kp), } } @@ -266,7 +260,7 @@ mod tests { let mut r = get_registration(); let kp = Keypair::random(); - r.proof_of_possession = get_proof_of_possession(&kp); + r.proof_of_possession = create_proof_of_possession(&kp); let mut inductor = ValidatorInductor::new(0, 1024, validators); let result = inductor.induct(&r, ValidatorStatus::PendingActivation); diff --git a/beacon_chain/validator_induction/src/lib.rs b/beacon_chain/validator_induction/src/lib.rs index 6ea6265ba8..ded9785da7 100644 --- a/beacon_chain/validator_induction/src/lib.rs +++ b/beacon_chain/validator_induction/src/lib.rs @@ -4,4 +4,4 @@ extern crate types; mod inductor; -pub use inductor::{ValidatorInductionError, ValidatorInductor}; +pub use crate::inductor::{ValidatorInductionError, ValidatorInductor}; diff --git a/beacon_chain/validator_shuffling/Cargo.toml b/beacon_chain/validator_shuffling/Cargo.toml index ba99841b80..ae2babf1a4 100644 --- a/beacon_chain/validator_shuffling/Cargo.toml +++ b/beacon_chain/validator_shuffling/Cargo.toml @@ -2,6 +2,7 @@ name = "validator_shuffling" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] honey-badger-split = { path = "../utils/honey-badger-split" } diff --git a/beacon_chain/validator_shuffling/src/lib.rs b/beacon_chain/validator_shuffling/src/lib.rs index 90077279ff..b4d3204375 100644 --- a/beacon_chain/validator_shuffling/src/lib.rs +++ b/beacon_chain/validator_shuffling/src/lib.rs @@ -4,4 +4,4 @@ extern crate vec_shuffle; mod shuffle; -pub use shuffle::{shard_and_committees_for_cycle, ValidatorAssignmentError}; +pub use crate::shuffle::{shard_and_committees_for_cycle, ValidatorAssignmentError}; diff --git a/lighthouse/db/Cargo.toml b/lighthouse/db/Cargo.toml index e7fd4cd5d7..cdad7a9d8a 100644 --- a/lighthouse/db/Cargo.toml +++ b/lighthouse/db/Cargo.toml @@ -2,6 +2,7 @@ name = "db" version = "0.1.0" authors = ["Paul Hauner "] +edition = "2018" [dependencies] blake2-rfc = "0.2.18" diff --git a/lighthouse/main.rs b/lighthouse/main.rs index 67c9954f06..b2c199db98 100644 --- a/lighthouse/main.rs +++ b/lighthouse/main.rs @@ -13,7 +13,7 @@ mod config; use std::path::PathBuf; use clap::{App, Arg}; -use config::LighthouseConfig; +use crate::config::LighthouseConfig; use slog::Drain; fn main() {