op_pool: re-jig deposit handling (needs more work)
This commit is contained in:
parent
604fe2d97f
commit
7fe458af45
@ -509,8 +509,7 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
|
||||
&self,
|
||||
deposit: Deposit,
|
||||
) -> Result<DepositInsertStatus, DepositValidationError> {
|
||||
self.op_pool
|
||||
.insert_deposit(deposit, &*self.state.read(), &self.spec)
|
||||
self.op_pool.insert_deposit(deposit)
|
||||
}
|
||||
|
||||
/// Accept some exit and queue it for inclusion in an appropriate block.
|
||||
|
@ -14,8 +14,6 @@ use state_processing::per_block_processing::errors::{
|
||||
AttestationValidationError, AttesterSlashingValidationError, DepositValidationError,
|
||||
ExitValidationError, ProposerSlashingValidationError, TransferValidationError,
|
||||
};
|
||||
#[cfg(not(test))]
|
||||
use state_processing::per_block_processing::verify_deposit_merkle_proof;
|
||||
use state_processing::per_block_processing::{
|
||||
get_slashable_indices_modular, validate_attestation,
|
||||
validate_attestation_time_independent_only, verify_attester_slashing, verify_exit,
|
||||
@ -151,20 +149,14 @@ impl<T: EthSpec> OperationPool<T> {
|
||||
/// Add a deposit to the pool.
|
||||
///
|
||||
/// No two distinct deposits should be added with the same index.
|
||||
#[cfg_attr(test, allow(unused_variables))]
|
||||
pub fn insert_deposit(
|
||||
&self,
|
||||
deposit: Deposit,
|
||||
state: &BeaconState<T>,
|
||||
spec: &ChainSpec,
|
||||
) -> Result<DepositInsertStatus, DepositValidationError> {
|
||||
use DepositInsertStatus::*;
|
||||
|
||||
match self.deposits.write().entry(deposit.index) {
|
||||
Entry::Vacant(entry) => {
|
||||
// TODO: fix tests to generate valid merkle proofs
|
||||
#[cfg(not(test))]
|
||||
verify_deposit_merkle_proof(state, &deposit, spec)?;
|
||||
entry.insert(deposit);
|
||||
Ok(Fresh)
|
||||
}
|
||||
@ -172,9 +164,6 @@ impl<T: EthSpec> OperationPool<T> {
|
||||
if entry.get() == &deposit {
|
||||
Ok(Duplicate)
|
||||
} else {
|
||||
// TODO: fix tests to generate valid merkle proofs
|
||||
#[cfg(not(test))]
|
||||
verify_deposit_merkle_proof(state, &deposit, spec)?;
|
||||
Ok(Replaced(Box::new(entry.insert(deposit))))
|
||||
}
|
||||
}
|
||||
@ -185,7 +174,9 @@ impl<T: EthSpec> OperationPool<T> {
|
||||
///
|
||||
/// Take at most the maximum number of deposits, beginning from the current deposit index.
|
||||
pub fn get_deposits(&self, state: &BeaconState<T>, spec: &ChainSpec) -> Vec<Deposit> {
|
||||
// TODO: might want to re-check the Merkle proof to account for Eth1 forking
|
||||
// TODO: We need to update the Merkle proofs for existing deposits as more deposits
|
||||
// are added. It probably makes sense to construct the proofs from scratch when forming
|
||||
// a block, using fresh info from the ETH1 chain for the current deposit root.
|
||||
let start_idx = state.deposit_index;
|
||||
(start_idx..start_idx + spec.max_deposits)
|
||||
.map(|idx| self.deposits.read().get(&idx).cloned())
|
||||
@ -461,22 +452,15 @@ mod tests {
|
||||
#[test]
|
||||
fn insert_deposit() {
|
||||
let rng = &mut XorShiftRng::from_seed([42; 16]);
|
||||
let (ref spec, ref state) = test_state(rng);
|
||||
let op_pool = OperationPool::new();
|
||||
let op_pool = OperationPool::<MinimalEthSpec>::new();
|
||||
let deposit1 = make_deposit(rng);
|
||||
let mut deposit2 = make_deposit(rng);
|
||||
deposit2.index = deposit1.index;
|
||||
|
||||
assert_eq!(op_pool.insert_deposit(deposit1.clone()), Ok(Fresh));
|
||||
assert_eq!(op_pool.insert_deposit(deposit1.clone()), Ok(Duplicate));
|
||||
assert_eq!(
|
||||
op_pool.insert_deposit(deposit1.clone(), state, spec),
|
||||
Ok(Fresh)
|
||||
);
|
||||
assert_eq!(
|
||||
op_pool.insert_deposit(deposit1.clone(), state, spec),
|
||||
Ok(Duplicate)
|
||||
);
|
||||
assert_eq!(
|
||||
op_pool.insert_deposit(deposit2, state, spec),
|
||||
op_pool.insert_deposit(deposit2),
|
||||
Ok(Replaced(Box::new(deposit1)))
|
||||
);
|
||||
}
|
||||
@ -495,10 +479,7 @@ mod tests {
|
||||
let deposits = dummy_deposits(rng, start, max_deposits + extra);
|
||||
|
||||
for deposit in &deposits {
|
||||
assert_eq!(
|
||||
op_pool.insert_deposit(deposit.clone(), &state, &spec),
|
||||
Ok(Fresh)
|
||||
);
|
||||
assert_eq!(op_pool.insert_deposit(deposit.clone()), Ok(Fresh));
|
||||
}
|
||||
|
||||
state.deposit_index = start + offset;
|
||||
@ -514,8 +495,7 @@ mod tests {
|
||||
#[test]
|
||||
fn prune_deposits() {
|
||||
let rng = &mut XorShiftRng::from_seed([42; 16]);
|
||||
let (spec, state) = test_state(rng);
|
||||
let op_pool = OperationPool::new();
|
||||
let op_pool = OperationPool::<MinimalEthSpec>::new();
|
||||
|
||||
let start1 = 100;
|
||||
// test is super slow in debug mode if this parameter is too high
|
||||
@ -527,7 +507,7 @@ mod tests {
|
||||
let deposits2 = dummy_deposits(rng, start2, count);
|
||||
|
||||
for d in deposits1.into_iter().chain(deposits2) {
|
||||
assert!(op_pool.insert_deposit(d, &state, &spec).is_ok());
|
||||
assert!(op_pool.insert_deposit(d).is_ok());
|
||||
}
|
||||
|
||||
assert_eq!(op_pool.num_deposits(), 2 * count as usize);
|
||||
|
Loading…
Reference in New Issue
Block a user