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 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
use std::fmt; use casper_types::{auction::EraId, bytesrepr, Key, ProtocolVersion}; use crate::{ core::engine_state::execution_effect::ExecutionEffect, shared::{newtypes::Blake2bHash, wasm_config::WasmConfig, TypeMismatch}, storage::global_state::CommitResult, }; pub type ActivationPoint = u64; #[derive(Debug)] 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_config: Option<WasmConfig>, activation_point: Option<ActivationPoint>, new_validator_slots: Option<u32>, new_auction_delay: Option<u64>, new_locked_funds_period: Option<EraId>, } impl UpgradeConfig { #[allow(clippy::too_many_arguments)] 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_config: Option<WasmConfig>, activation_point: Option<ActivationPoint>, new_validator_slots: Option<u32>, new_auction_delay: Option<u64>, new_locked_funds_period: Option<EraId>, ) -> Self { UpgradeConfig { pre_state_hash, current_protocol_version, new_protocol_version, upgrade_installer_args, upgrade_installer_bytes, wasm_config, activation_point, new_validator_slots, new_auction_delay, new_locked_funds_period, } } 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_config(&self) -> Option<&WasmConfig> { self.wasm_config.as_ref() } pub fn activation_point(&self) -> Option<u64> { self.activation_point } pub fn new_validator_slots(&self) -> Option<u32> { self.new_validator_slots } pub fn new_auction_delay(&self) -> Option<u64> { self.new_auction_delay } pub fn new_locked_funds_period(&self) -> Option<EraId> { self.new_locked_funds_period } }