solana_oasis_node/
types.rs1use 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}