solana_oasis_node/
types.rs

1use serde::{Deserialize, Serialize};
2use sha2::{Digest, Sha256};
3
4#[derive(Clone, Debug, Serialize, Deserialize)]
5pub struct Block {
6    pub number: u64,
7    pub previous_hash: [u8; 32],
8    pub transactions: Vec<Transaction>,
9    pub transactions_root: Vec<u8>,
10    pub timestamp: i64,
11}
12
13impl Block {
14    pub fn new(
15        number: u64,
16        previous_hash: [u8; 32],
17        transactions: Vec<Transaction>,
18        timestamp: i64,
19    ) -> Self {
20        let mut block = Self {
21            number,
22            previous_hash,
23            transactions,
24            transactions_root: Vec::new(),
25            timestamp,
26        };
27        block.update_transactions_root();
28        block
29    }
30
31    pub fn update_transactions_root(&mut self) {
32        let mut hasher = Sha256::new();
33        hasher.update(bincode::serialize(&self.transactions).unwrap_or_default());
34        self.transactions_root = hasher.finalize().to_vec();
35    }
36
37    pub fn hash(&self) -> Vec<u8> {
38        let mut hasher = Sha256::new();
39        hasher.update(bincode::serialize(self).unwrap_or_default());
40        hasher.finalize().to_vec()
41    }
42}
43
44#[derive(Clone, Debug, Serialize, Deserialize)]
45pub enum Transaction {
46    Transfer {
47        from: [u8; 32],
48        to: [u8; 32],
49        amount: u64,
50    },
51}
52
53#[derive(Clone, Debug, Serialize, Deserialize)]
54pub enum Message {
55    Transaction(Transaction),
56    Block(Block),
57    State(Vec<u8>),
58    Compute(Vec<u8>),
59}
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64    use chrono::Utc;
65
66    #[test]
67    fn test_block_hash() {
68        let transactions = vec![Transaction::Transfer {
69            from: [1u8; 32],
70            to: [2u8; 32],
71            amount: 100,
72        }];
73
74        let block = Block::new(1, [0u8; 32], transactions, Utc::now().timestamp());
75        let hash = block.hash();
76        assert_eq!(hash.len(), 32);
77    }
78}