Skip to main content

ergo_lib_c_core/
block_header.rs

1//! Block header
2
3use std::convert::{TryFrom, TryInto};
4
5use crate::{
6    error::*,
7    util::{const_ptr_as_ref, mut_ptr_as_mut},
8};
9use ergo_lib::ergo_chain_types::{Base16DecodedBytes, Header};
10
11/// Block header
12#[derive(PartialEq, Eq, Debug, Clone)]
13pub struct BlockHeader(pub Header);
14pub type BlockHeaderPtr = *mut BlockHeader;
15pub type ConstBlockHeaderPtr = *const BlockHeader;
16
17/// Parse BlockHeader array from JSON (Node API)
18pub unsafe fn block_header_from_json(
19    json: &str,
20    block_header_out: *mut BlockHeaderPtr,
21) -> Result<(), Error> {
22    let block_header_out = mut_ptr_as_mut(block_header_out, "block_header_out")?;
23    let header = serde_json::from_str(json).map(BlockHeader)?;
24    *block_header_out = Box::into_raw(Box::new(header));
25    Ok(())
26}
27
28/// Get `BlockHeader`s id
29pub unsafe fn block_header_id(
30    block_header_ptr: ConstBlockHeaderPtr,
31    block_id_out: *mut BlockIdPtr,
32) -> Result<(), Error> {
33    let block_header = const_ptr_as_ref(block_header_ptr, "block_header_ptr")?;
34    let block_id_out = mut_ptr_as_mut(block_id_out, "block_id_out")?;
35    *block_id_out = Box::into_raw(Box::new(BlockId(block_header.0.id)));
36    Ok(())
37}
38
39/// Copy the contents of `transactions_root` field to `output`. Key assumption: exactly 32 bytes of
40/// memory have been allocated at the address pointed-to by `output`.
41pub unsafe fn block_header_transactions_root(
42    block_header_ptr: ConstBlockHeaderPtr,
43    output: *mut u8,
44) -> Result<(), Error> {
45    let block_header = const_ptr_as_ref(block_header_ptr, "block_header_ptr")?;
46    let src = Vec::<u8>::from(block_header.0.transaction_root);
47    std::ptr::copy_nonoverlapping(src.as_ptr(), output, src.len());
48    Ok(())
49}
50
51/// Block id
52#[derive(PartialEq, Eq, Debug, Clone)]
53pub struct BlockId(pub(crate) ergo_lib::ergo_chain_types::BlockId);
54
55pub type BlockIdPtr = *mut BlockId;
56pub type ConstBlockIdPtr = *const BlockId;
57
58/// Convert a hex string into a BlockId
59pub unsafe fn block_id_from_str(str: &str, block_id_out: *mut BlockIdPtr) -> Result<(), Error> {
60    let block_id_out = mut_ptr_as_mut(block_id_out, "block_id_out")?;
61    let bytes = Base16DecodedBytes::try_from(str.to_string())?;
62    let block_id = bytes
63        .try_into()
64        .map(|digest| BlockId(ergo_lib::ergo_chain_types::BlockId(digest)))?;
65    *block_id_out = Box::into_raw(Box::new(block_id));
66    Ok(())
67}