use super::*;
impl<N: Network, P: ProgramStorage<N>> VM<N, P> {
#[inline]
pub fn finalize(&mut self, transaction: &Transaction<N>) -> Result<()> {
ensure!(self.verify(transaction), "Invalid transaction: failed to verify");
match transaction {
Transaction::Deploy(_, deployment, _) => self.finalize_deployment(deployment),
Transaction::Execute(_, execution, _) => self.finalize_execution(execution),
}
}
#[inline]
fn finalize_deployment(&mut self, deployment: &Deployment<N>) -> Result<()> {
match N::ID {
console::network::Testnet3::ID => {
let process = (&self.process as &dyn std::any::Any)
.downcast_ref::<Arc<RwLock<Process<N>>>>()
.ok_or_else(|| anyhow!("Failed to downcast {}", stringify!(self.process)))?;
process.write().finalize_deployment::<P>(&self.store, deployment)
}
_ => Err(anyhow!("Unsupported VM configuration for network: {}", N::ID)),
}
}
#[inline]
fn finalize_execution(&mut self, execution: &Execution<N>) -> Result<()> {
match N::ID {
console::network::Testnet3::ID => {
let process = (&self.process as &dyn std::any::Any)
.downcast_ref::<Arc<RwLock<Process<N>>>>()
.ok_or_else(|| anyhow!("Failed to downcast {}", stringify!(self.process)))?;
process.write().finalize_execution::<P>(&self.store, execution)
}
_ => Err(anyhow!("Unsupported VM configuration for network: {}", N::ID)),
}
}
}
#[cfg(test)]
mod tests {
use crate::ledger::vm::test_helpers::sample_program;
use snarkvm_utilities::test_crypto_rng;
#[test]
fn test_finalize() {
let mut vm = crate::ledger::vm::test_helpers::sample_vm();
let deployment_transaction = crate::ledger::vm::test_helpers::sample_deployment_transaction();
vm.finalize(&deployment_transaction).unwrap();
assert!(vm.finalize(&deployment_transaction).is_err());
}
#[test]
fn test_finalize_deployment() {
let rng = &mut test_crypto_rng();
let mut vm = crate::ledger::vm::test_helpers::sample_vm();
let program = sample_program();
let deployment = vm.deploy(&program, rng).unwrap();
assert!(!vm.contains_program(program.id()));
vm.finalize_deployment(&deployment).unwrap();
assert!(vm.contains_program(program.id()));
}
}