mod.rs
1 // Copyright (c) 2025-2026 ACDC Network 2 // This file is part of the alphavm library. 3 // 4 // Alpha Chain | Delta Chain Protocol 5 // International Monetary Graphite. 6 // 7 // Derived from Aleo (https://aleo.org) and ProvableHQ (https://provable.com). 8 // They built world-class ZK infrastructure. We installed the EASY button. 9 // Their cryptography: elegant. Our modifications: bureaucracy-compatible. 10 // Original brilliance: theirs. Robert's Rules: ours. Bugs: definitely ours. 11 // 12 // Original Aleo/ProvableHQ code subject to Apache 2.0 https://www.apache.org/licenses/LICENSE-2.0 13 // All modifications and new work: CC0 1.0 Universal Public Domain Dedication. 14 // No rights reserved. No permission required. No warranty. No refunds. 15 // 16 // https://creativecommons.org/publicdomain/zero/1.0/ 17 // SPDX-License-Identifier: CC0-1.0 18 19 mod bytes; 20 mod parse; 21 mod serialize; 22 23 use crate::Access; 24 use alphavm_console_network::prelude::*; 25 26 /// A register contains the location data to a value in memory. 27 #[derive(Clone, PartialEq, Eq, Hash)] 28 pub enum Register<N: Network> { 29 /// A register contains its locator in memory. 30 Locator(u64), 31 /// A register access contains its locator and access(es) in memory. 32 Access(u64, Vec<Access<N>>), 33 } 34 35 impl<N: Network> Register<N> { 36 /// Returns the locator of the register. 37 #[inline] 38 pub const fn locator(&self) -> u64 { 39 match self { 40 Self::Locator(locator) => *locator, 41 Self::Access(locator, _) => *locator, 42 } 43 } 44 } 45 46 impl<N: Network> Ord for Register<N> { 47 /// Ordering is determined by the register locator (any accesses are ignored). 48 fn cmp(&self, other: &Self) -> Ordering { 49 self.locator().cmp(&other.locator()) 50 } 51 } 52 53 impl<N: Network> PartialOrd for Register<N> { 54 /// Ordering is determined by the register locator (any accesses are ignored). 55 fn partial_cmp(&self, other: &Self) -> Option<Ordering> { 56 Some(self.cmp(other)) 57 } 58 } 59 60 #[cfg(test)] 61 mod tests { 62 use super::*; 63 use crate::{Identifier, U32}; 64 use alphavm_console_network::MainnetV0; 65 66 type CurrentNetwork = MainnetV0; 67 68 #[test] 69 fn test_register_partial_ord() -> Result<()> { 70 // Register::Locator 71 assert_eq!( 72 Some(Ordering::Equal), 73 Register::<CurrentNetwork>::Locator(0).partial_cmp(&Register::<CurrentNetwork>::Locator(0)) 74 ); 75 assert_eq!( 76 Some(Ordering::Less), 77 Register::<CurrentNetwork>::Locator(0).partial_cmp(&Register::<CurrentNetwork>::Locator(1)) 78 ); 79 assert_eq!( 80 Some(Ordering::Greater), 81 Register::<CurrentNetwork>::Locator(1).partial_cmp(&Register::<CurrentNetwork>::Locator(0)) 82 ); 83 84 // Register::Access with Access::Member 85 assert_eq!( 86 Some(Ordering::Equal), 87 Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]).partial_cmp( 88 &Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]) 89 ) 90 ); 91 assert_eq!( 92 Some(Ordering::Less), 93 Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]).partial_cmp( 94 &Register::<CurrentNetwork>::Access(1, vec![Access::Member(Identifier::from_str("owner")?)]) 95 ) 96 ); 97 assert_eq!( 98 Some(Ordering::Greater), 99 Register::<CurrentNetwork>::Access(1, vec![Access::Member(Identifier::from_str("owner")?)]).partial_cmp( 100 &Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]) 101 ) 102 ); 103 104 // Register::Access with Access::Index 105 assert_eq!( 106 Some(Ordering::Equal), 107 Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]).partial_cmp(&Register::< 108 CurrentNetwork, 109 >::Access( 110 0, 111 vec![Access::Index(U32::new(0))] 112 )) 113 ); 114 assert_eq!( 115 Some(Ordering::Less), 116 Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]).partial_cmp(&Register::< 117 CurrentNetwork, 118 >::Access( 119 1, 120 vec![Access::Index(U32::new(0))] 121 )) 122 ); 123 assert_eq!( 124 Some(Ordering::Greater), 125 Register::<CurrentNetwork>::Access(1, vec![Access::Index(U32::new(0))]).partial_cmp(&Register::< 126 CurrentNetwork, 127 >::Access( 128 0, 129 vec![Access::Index(U32::new(0))] 130 )) 131 ); 132 133 // Register::Access with a combination of Access::Member and Access::Index 134 assert_eq!( 135 Some(Ordering::Equal), 136 Register::<CurrentNetwork>::Access(0, vec![ 137 Access::Member(Identifier::from_str("owner")?), 138 Access::Index(U32::new(0)) 139 ]) 140 .partial_cmp(&Register::<CurrentNetwork>::Access(0, vec![ 141 Access::Member(Identifier::from_str("owner")?), 142 Access::Index(U32::new(0)) 143 ])) 144 ); 145 assert_eq!( 146 Some(Ordering::Less), 147 Register::<CurrentNetwork>::Access(0, vec![ 148 Access::Member(Identifier::from_str("owner")?), 149 Access::Index(U32::new(0)) 150 ]) 151 .partial_cmp(&Register::<CurrentNetwork>::Access(1, vec![ 152 Access::Member(Identifier::from_str("owner")?), 153 Access::Index(U32::new(0)) 154 ])) 155 ); 156 assert_eq!( 157 Some(Ordering::Greater), 158 Register::<CurrentNetwork>::Access(1, vec![ 159 Access::Member(Identifier::from_str("owner")?), 160 Access::Index(U32::new(0)) 161 ]) 162 .partial_cmp(&Register::<CurrentNetwork>::Access(0, vec![ 163 Access::Member(Identifier::from_str("owner")?), 164 Access::Index(U32::new(0)) 165 ])) 166 ); 167 168 Ok(()) 169 } 170 171 #[test] 172 fn test_register_eq() -> Result<()> { 173 // Register::Locator 174 assert_eq!(Register::<CurrentNetwork>::Locator(0), Register::<CurrentNetwork>::Locator(0)); 175 assert_ne!(Register::<CurrentNetwork>::Locator(0), Register::<CurrentNetwork>::Locator(1)); 176 assert_ne!(Register::<CurrentNetwork>::Locator(0), Register::<CurrentNetwork>::Locator(2)); 177 assert_ne!(Register::<CurrentNetwork>::Locator(0), Register::<CurrentNetwork>::Locator(3)); 178 assert_ne!(Register::<CurrentNetwork>::Locator(0), Register::<CurrentNetwork>::Locator(4)); 179 180 // Register::Access with Access::Member 181 assert_eq!( 182 Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]), 183 Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]) 184 ); 185 assert_ne!( 186 Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]), 187 Register::<CurrentNetwork>::Access(1, vec![Access::Member(Identifier::from_str("owner")?)]) 188 ); 189 assert_ne!( 190 Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]), 191 Register::<CurrentNetwork>::Access(2, vec![Access::Member(Identifier::from_str("owner")?)]) 192 ); 193 assert_ne!( 194 Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]), 195 Register::<CurrentNetwork>::Access(3, vec![Access::Member(Identifier::from_str("owner")?)]) 196 ); 197 assert_ne!( 198 Register::<CurrentNetwork>::Access(0, vec![Access::Member(Identifier::from_str("owner")?)]), 199 Register::<CurrentNetwork>::Access(4, vec![Access::Member(Identifier::from_str("owner")?)]) 200 ); 201 202 // Register::Access with Access::Index 203 assert_eq!( 204 Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]), 205 Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]) 206 ); 207 assert_ne!( 208 Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]), 209 Register::<CurrentNetwork>::Access(1, vec![Access::Index(U32::new(0))]) 210 ); 211 assert_ne!( 212 Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]), 213 Register::<CurrentNetwork>::Access(2, vec![Access::Index(U32::new(0))]) 214 ); 215 assert_ne!( 216 Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]), 217 Register::<CurrentNetwork>::Access(3, vec![Access::Index(U32::new(0))]) 218 ); 219 assert_ne!( 220 Register::<CurrentNetwork>::Access(0, vec![Access::Index(U32::new(0))]), 221 Register::<CurrentNetwork>::Access(4, vec![Access::Index(U32::new(0))]) 222 ); 223 224 // Register::Access with a combination of Access::Member and Access::Index 225 assert_eq!( 226 Register::<CurrentNetwork>::Access(0, vec![ 227 Access::Member(Identifier::from_str("owner")?), 228 Access::Index(U32::new(0)) 229 ]), 230 Register::<CurrentNetwork>::Access(0, vec![ 231 Access::Member(Identifier::from_str("owner")?), 232 Access::Index(U32::new(0)) 233 ]) 234 ); 235 assert_ne!( 236 Register::<CurrentNetwork>::Access(0, vec![ 237 Access::Member(Identifier::from_str("owner")?), 238 Access::Index(U32::new(0)) 239 ]), 240 Register::<CurrentNetwork>::Access(1, vec![ 241 Access::Member(Identifier::from_str("owner")?), 242 Access::Index(U32::new(0)) 243 ]) 244 ); 245 assert_ne!( 246 Register::<CurrentNetwork>::Access(0, vec![ 247 Access::Member(Identifier::from_str("owner")?), 248 Access::Index(U32::new(0)) 249 ]), 250 Register::<CurrentNetwork>::Access(2, vec![ 251 Access::Member(Identifier::from_str("owner")?), 252 Access::Index(U32::new(0)) 253 ]) 254 ); 255 assert_ne!( 256 Register::<CurrentNetwork>::Access(0, vec![ 257 Access::Member(Identifier::from_str("owner")?), 258 Access::Index(U32::new(0)) 259 ]), 260 Register::<CurrentNetwork>::Access(3, vec![ 261 Access::Member(Identifier::from_str("owner")?), 262 Access::Index(U32::new(0)) 263 ]) 264 ); 265 assert_ne!( 266 Register::<CurrentNetwork>::Access(0, vec![ 267 Access::Member(Identifier::from_str("owner")?), 268 Access::Index(U32::new(0)) 269 ]), 270 Register::<CurrentNetwork>::Access(4, vec![ 271 Access::Member(Identifier::from_str("owner")?), 272 Access::Index(U32::new(0)) 273 ]) 274 ); 275 276 Ok(()) 277 } 278 }