1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
use std::fmt; use engine_shared::{newtypes::Blake2bHash, TypeMismatch}; use engine_storage::global_state::CommitResult; use engine_wasm_prep::wasm_costs::WasmCosts; use types::{bytesrepr, Key, ProtocolVersion}; use crate::engine_state::execution_effect::ExecutionEffect; pub type ActivationPoint = u64; pub enum UpgradeResult { RootNotFound, KeyNotFound(Key), TypeMismatch(TypeMismatch), Serialization(bytesrepr::Error), Success { post_state_hash: Blake2bHash, effect: ExecutionEffect, }, } impl fmt::Display for UpgradeResult { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { match self { UpgradeResult::RootNotFound => write!(f, "Root not found"), UpgradeResult::KeyNotFound(key) => write!(f, "Key not found: {}", key), UpgradeResult::TypeMismatch(type_mismatch) => { write!(f, "Type mismatch: {:?}", type_mismatch) } UpgradeResult::Serialization(error) => write!(f, "Serialization error: {:?}", error), UpgradeResult::Success { post_state_hash, effect, } => write!(f, "Success: {} {:?}", post_state_hash, effect), } } } impl UpgradeResult { pub fn from_commit_result(commit_result: CommitResult, effect: ExecutionEffect) -> Self { match commit_result { CommitResult::RootNotFound => UpgradeResult::RootNotFound, CommitResult::KeyNotFound(key) => UpgradeResult::KeyNotFound(key), CommitResult::TypeMismatch(type_mismatch) => UpgradeResult::TypeMismatch(type_mismatch), CommitResult::Serialization(error) => UpgradeResult::Serialization(error), CommitResult::Success { state_root, .. } => UpgradeResult::Success { post_state_hash: state_root, effect, }, } } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct UpgradeConfig { pre_state_hash: Blake2bHash, current_protocol_version: ProtocolVersion, new_protocol_version: ProtocolVersion, upgrade_installer_args: Option<Vec<u8>>, upgrade_installer_bytes: Option<Vec<u8>>, wasm_costs: Option<WasmCosts>, activation_point: Option<ActivationPoint>, } impl UpgradeConfig { pub fn new( pre_state_hash: Blake2bHash, current_protocol_version: ProtocolVersion, new_protocol_version: ProtocolVersion, upgrade_installer_args: Option<Vec<u8>>, upgrade_installer_bytes: Option<Vec<u8>>, wasm_costs: Option<WasmCosts>, activation_point: Option<ActivationPoint>, ) -> Self { UpgradeConfig { pre_state_hash, current_protocol_version, new_protocol_version, upgrade_installer_args, upgrade_installer_bytes, wasm_costs, activation_point, } } pub fn pre_state_hash(&self) -> Blake2bHash { self.pre_state_hash } pub fn current_protocol_version(&self) -> ProtocolVersion { self.current_protocol_version } pub fn new_protocol_version(&self) -> ProtocolVersion { self.new_protocol_version } pub fn upgrade_installer_args(&self) -> Option<&[u8]> { let args = self.upgrade_installer_args.as_ref()?; Some(args.as_slice()) } pub fn upgrade_installer_bytes(&self) -> Option<&[u8]> { let bytes = self.upgrade_installer_bytes.as_ref()?; Some(bytes.as_slice()) } pub fn wasm_costs(&self) -> Option<WasmCosts> { self.wasm_costs } pub fn activation_point(&self) -> Option<u64> { self.activation_point } }