/ ledger / puzzle / src / solution_id / mod.rs
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 serialize;
21  mod string;
22  
23  pub use string::SOLUTION_ID_PREFIX;
24  
25  use alphavm_algorithms::crypto_hash::sha256d_to_u64;
26  use console::{account::Address, network::prelude::*};
27  
28  use core::marker::PhantomData;
29  
30  /// The solution ID.
31  #[derive(Copy, Clone, Eq, PartialEq, Hash)]
32  pub struct SolutionID<N: Network>(u64, PhantomData<N>);
33  
34  impl<N: Network> From<u64> for SolutionID<N> {
35      /// Initializes a new instance of the solution ID.
36      fn from(nonce: u64) -> Self {
37          Self(nonce, PhantomData)
38      }
39  }
40  
41  impl<N: Network> SolutionID<N> {
42      /// Initializes the solution ID from the given epoch hash, address, and counter.
43      pub fn new(epoch_hash: N::BlockHash, address: Address<N>, counter: u64) -> Result<Self> {
44          // Construct the nonce as sha256d(epoch_hash_bytes_le[0..8] || address || counter).
45          let mut bytes_le = Vec::new();
46          let lower_bytes = &epoch_hash.to_bytes_le()?[0..8];
47          bytes_le.extend_from_slice(lower_bytes);
48          bytes_le.extend_from_slice(&address.to_bytes_le()?);
49          bytes_le.extend_from_slice(&counter.to_bytes_le()?);
50          Ok(Self::from(sha256d_to_u64(&bytes_le)))
51      }
52  }
53  
54  impl<N: Network> Deref for SolutionID<N> {
55      type Target = u64;
56  
57      fn deref(&self) -> &Self::Target {
58          &self.0
59      }
60  }