Add unfinished attesation code

This commit is contained in:
Paul Hauner
2019-11-18 19:24:16 +11:00
parent b0b2010700
commit ad40c4ac47
2 changed files with 65 additions and 1 deletions

View File

@@ -60,6 +60,44 @@ fn sign_block<T: BeaconChainTypes>(
block.signature = Signature::new(&message, domain, &keypair.sk);
}
#[test]
fn validator_produce_attestation() {
let mut env = build_env();
let node = LocalBeaconNode::production(env.core_context());
let remote_node = node.remote_node().expect("should produce remote node");
let beacon_chain = node
.client
.beacon_chain()
.expect("client should have beacon chain");
let state = beacon_chain.head().beacon_state.clone();
let validator_index = 0;
let validator_pubkey = state.validators[validator_index].pubkey.clone();
let duties = state
.get_attestation_duties(validator_index, RelativeEpoch::Current)
.expect("should have attestation duties cache")
.expect("should have attestation duties");
let attestation = env
.runtime()
.block_on(remote_node.http.validator().produce_attestation(
duties.slot,
duties.shard,
&validator_pubkey,
false,
))
.expect("should fetch attestation from http api");
assert_eq!(
attestation.data.crosslink.shard, duties.shard,
"should have same shard"
);
// TODO: try to push the attestation.
}
#[test]
fn validator_duties() {
let mut env = build_env();

View File

@@ -13,7 +13,9 @@ use ssz::Encode;
use std::marker::PhantomData;
use std::net::SocketAddr;
use std::time::Duration;
use types::{BeaconBlock, BeaconState, Epoch, EthSpec, Hash256, PublicKey, Signature, Slot};
use types::{
Attestation, BeaconBlock, BeaconState, Epoch, EthSpec, Hash256, PublicKey, Signature, Slot,
};
use url::Url;
pub use rest_api::{HeadResponse, ValidatorDuty};
@@ -161,6 +163,30 @@ impl<E: EthSpec> Validator<E> {
.map_err(Into::into)
}
/// Produces an unsigned attestation.
pub fn produce_attestation(
&self,
slot: Slot,
shard: u64,
validator_pubkey: &PublicKey,
poc_bit: bool,
) -> impl Future<Item = Attestation<E>, Error = Error> {
let query_params = vec![
("slot".into(), format!("{}", slot)),
("shard".into(), format!("{}", shard)),
("poc_bit".into(), format!("{}", poc_bit as u8)),
(
"validator_pubkey".into(),
pubkey_as_string(validator_pubkey),
),
];
let client = self.0.clone();
self.url("attestation")
.into_future()
.and_then(move |url| client.json_get(url, query_params))
}
/// Returns the duties required of the given validator pubkeys in the given epoch.
pub fn get_duties(
&self,