Skip to content

Commit be0c59d

Browse files
committed
genesis: eliminate a bunch of allocations and panic paths
Oops :) apparently I did not review this code as well as I should have.
1 parent 400650d commit be0c59d

2 files changed

Lines changed: 16 additions & 11 deletions

File tree

src/genesis.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ use secp256k1_zkp::Tweak;
1919
use crate::hashes::{sha256, sha256d, Hash, HashEngine};
2020
use crate::opcodes::all::OP_RETURN;
2121
use crate::opcodes::OP_TRUE;
22-
use crate::pset::serialize::Serialize;
2322
use crate::{confidential, script, AssetId, Block, BlockExtData, BlockHash, BlockHeader, LockTime, Script, Sequence, Transaction, TxIn, TxInWitness, TxOut, TxOutWitness};
2423
use crate::{AssetIssuance, ContractHash, OutPoint, Txid};
2524
use crate::confidential::Nonce;
@@ -89,12 +88,18 @@ impl NetworkParams {
8988
}
9089

9190
/// Hash commitment of network parameters for a given Network
92-
pub fn commit_to_custom_network_parameters(params: &NetworkParams) -> Vec<u8> {
91+
pub fn commit_to_custom_network_parameters(params: &NetworkParams) -> sha256::Hash {
92+
use hex::{BytesToHexIter, Case};
93+
9394
let mut eng = sha256::Hash::engine();
9495
eng.input(params.network_id.clone().as_bytes());
95-
eng.input(format!("{:x}", params.fedpeg_script).as_bytes());
96-
eng.input(format!("{:x}", params.sign_block_script).as_bytes());
97-
sha256::Hash::from_engine(eng).serialize()
96+
for ch in BytesToHexIter::new(params.fedpeg_script[..].iter(), Case::Lower).flatten() {
97+
eng.input(&[ch.into()]);
98+
}
99+
for ch in BytesToHexIter::new(params.sign_block_script[..].iter(), Case::Lower).flatten() {
100+
eng.input(&[ch.into()]);
101+
}
102+
sha256::Hash::from_engine(eng)
98103
}
99104

100105
/// Produce the genesis transaction for a given elements Network
@@ -105,7 +110,7 @@ fn liquid_genesis_tx(network_params: &NetworkParams) -> Transaction {
105110
previous_output: OutPoint::default(),
106111
is_pegin: false,
107112
script_sig: script::Builder::new()
108-
.push_slice(commit.as_slice())
113+
.push_slice(commit.as_byte_array())
109114
.into_script(),
110115
sequence: Sequence::default(),
111116
asset_issuance: AssetIssuance::default(),
@@ -135,7 +140,7 @@ fn liquid_genesis_asset_tx(network_params: &NetworkParams) -> Option<Transaction
135140
if asset_amount == 0 {
136141
return None;
137142
}
138-
let asset_outpoint = OutPoint::new(Txid::from_slice(commit.as_slice()).expect("txid"), 0);
143+
let asset_outpoint = OutPoint::new(Txid::from_byte_array(commit.to_byte_array()), 0);
139144
let contract_hash = ContractHash::from_byte_array([0u8; 32]);
140145
let asset_entropy = AssetId::generate_asset_entropy(asset_outpoint, contract_hash);
141146
let asset_id = AssetId::from_entropy(asset_entropy);
@@ -183,8 +188,8 @@ pub fn genesis_block(params: &NetworkParams) -> Block {
183188
let merkle_root: sha256d::Hash =
184189
if let Some(asset_tx) = liquid_genesis_asset_tx(params) {
185190
txdata.push(asset_tx.clone());
186-
let tx_hashes = vec![tx.txid().to_raw_hash(), asset_tx.txid().to_raw_hash()];
187-
bitcoin::merkle_tree::calculate_root(tx_hashes.into_iter())
191+
let tx_hashes = [tx.txid().to_raw_hash(), asset_tx.txid().to_raw_hash()];
192+
bitcoin::merkle_tree::calculate_root(tx_hashes.iter().copied())
188193
.expect("merkle root")
189194
} else {
190195
tx.txid().to_raw_hash()

src/issuance.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,8 @@ impl AssetId {
167167
/// a Regtest parent network
168168
fn pegged_asset_id_for_params_and_parent_chain_hash(params: &NetworkParams, parent_chainhash: bitcoin::blockdata::constants::ChainHash) -> AssetId {
169169
let commit = commit_to_custom_network_parameters(params);
170-
let asset_outpoint = OutPoint::new(Txid::from_slice(commit.as_slice()).expect("txid"), 0);
171-
let asset_entropy = AssetId::generate_asset_entropy(asset_outpoint, ContractHash::from_slice(parent_chainhash.to_bytes().as_slice()).unwrap());
170+
let asset_outpoint = OutPoint::new(Txid::from_byte_array(commit.to_byte_array()), 0);
171+
let asset_entropy = AssetId::generate_asset_entropy(asset_outpoint, ContractHash::from_byte_array(*parent_chainhash.as_ref()));
172172
AssetId::from_entropy(asset_entropy)
173173
}
174174
}

0 commit comments

Comments
 (0)