Skip to content

Commit

Permalink
Use sha2 for block hash calculation (#1823)
Browse files Browse the repository at this point in the history
  • Loading branch information
exeokan authored Feb 7, 2025
1 parent f6eb357 commit 91120a9
Showing 1 changed file with 36 additions and 2 deletions.
38 changes: 36 additions & 2 deletions crates/bitcoin-da/src/spec/header.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
use core::ops::Deref;

use bitcoin::block::{Header as BitcoinHeader, Version};
use bitcoin::consensus::Encodable;
use bitcoin::hashes::Hash;
use bitcoin::{BlockHash, CompactTarget, TxMerkleNode};
use borsh::{BorshDeserialize, BorshSerialize};
use serde::{Deserialize, Serialize};
use sov_rollup_interface::da::BlockHeaderTrait;

use super::block_hash::BlockHashWrapper;
use crate::helpers::calculate_double_sha256;

// HeaderWrapper is a wrapper around BlockHash to implement BlockHeaderTrait
#[derive(
Expand All @@ -33,7 +35,7 @@ impl BlockHeaderTrait for HeaderWrapper {
}

fn verify_hash(&self) -> bool {
self.hash() == BlockHashWrapper::from(self.header.block_hash().to_byte_array())
self.hash() == BlockHashWrapper(self.block_hash())
}

fn txs_commitment(&self) -> Self::Hash {
Expand Down Expand Up @@ -70,7 +72,11 @@ impl HeaderWrapper {
}

pub fn block_hash(&self) -> BlockHash {
self.header.block_hash()
let mut enc = vec![];
self.header
.consensus_encode(&mut enc)
.expect("engines don't error");
BlockHash::from_raw_hash(Hash::from_byte_array(calculate_double_sha256(&enc)))
}

pub fn merkle_root(&self) -> [u8; 32] {
Expand Down Expand Up @@ -135,3 +141,31 @@ impl From<BitcoinHeader> for BitcoinHeaderWrapper {
Self(header)
}
}

#[cfg(test)]
mod tests {
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::ops::Deref;

use borsh::BorshDeserialize;

use super::BitcoinHeaderWrapper;
use crate::spec::header::HeaderWrapper;

#[test]
fn calculate_block_hash() {
let file = File::open("test_data/testnet4/headers-40310-42346.txt").unwrap();
let reader = BufReader::new(file);
for (line, height) in reader.lines().zip(40310..=42346) {
let header_hex = line.unwrap();
let header_bytes = hex::decode(&header_hex).unwrap();

let inner_header =
BitcoinHeaderWrapper::deserialize(&mut header_bytes.as_ref()).unwrap();
let header = HeaderWrapper::new(*inner_header.deref(), 0, height, [0; 32]);

assert_eq!(inner_header.block_hash(), header.block_hash())
}
}
}

0 comments on commit 91120a9

Please sign in to comment.