neo3/neo_protocol/responses/
neo_block.rs

1use crate::{
2	deserialize_h256, deserialize_h256_option,
3	neo_protocol::{NeoWitness, RTransaction},
4	serialize_h256, serialize_h256_option,
5};
6use primitive_types::H256;
7use serde::{Deserialize, Serialize};
8use std::num::ParseIntError;
9
10#[derive(Serialize, Deserialize, Clone, Debug)]
11pub struct NeoBlock {
12	// Transaction, TransactionResult
13	#[serde(serialize_with = "serialize_h256")]
14	#[serde(deserialize_with = "deserialize_h256")]
15	pub hash: H256,
16	pub size: i32,
17	pub version: i32,
18	#[serde(serialize_with = "serialize_h256")]
19	#[serde(deserialize_with = "deserialize_h256")]
20	#[serde(rename = "previousblockhash")]
21	pub prev_block_hash: H256,
22	#[serde(serialize_with = "serialize_h256")]
23	#[serde(deserialize_with = "deserialize_h256")]
24	#[serde(rename = "merkleroot")]
25	pub merkle_root_hash: H256,
26	pub time: i32,
27	pub nonce: String,
28	pub index: i32,
29	pub primary: Option<i32>,
30	#[serde(rename = "nextconsensus")]
31	pub next_consensus: String,
32	pub witnesses: Option<Vec<NeoWitness>>,
33	#[serde(rename = "tx", default = "default_transactions")]
34	pub transactions: Option<Vec<RTransaction>>,
35	pub confirmations: i32,
36	#[serde(serialize_with = "serialize_h256_option")]
37	#[serde(deserialize_with = "deserialize_h256_option")]
38	#[serde(rename = "nextblockhash")]
39	pub next_block_hash: Option<H256>,
40}
41
42impl NeoBlock {
43	// Method to convert nonce from hexadecimal string to u64
44	pub fn get_nonce_as_u64(&self) -> Result<u64, ParseIntError> {
45		u64::from_str_radix(&self.nonce, 16)
46	}
47}
48
49impl std::hash::Hash for NeoBlock {
50	fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
51		self.hash.hash(state);
52		self.size.hash(state);
53		self.version.hash(state);
54		self.prev_block_hash.hash(state);
55		self.merkle_root_hash.hash(state);
56		self.time.hash(state);
57		self.nonce.hash(state);
58		self.index.hash(state);
59		self.primary.hash(state);
60		self.next_consensus.hash(state);
61		self.witnesses.hash(state);
62		// Skip transactions as RTransaction doesn't implement Hash
63		self.confirmations.hash(state);
64		self.next_block_hash.hash(state);
65	}
66}
67
68fn default_transactions() -> Option<Vec<RTransaction>> {
69	Some(Vec::new())
70}