Untitled
unknown
rust
a year ago
2.0 kB
8
Indexable
pub fn get_commitment_hash(
outpoint: Outpoint,
scriptcode: &[u8],
value: u32,
outputs: Vec<Utxo>,
) -> Result<Vec<u8>,SpendError> {
// Version
let version: u32 = 1;
let sequence: u32 = 0xFFFFFFFF;
let locktime: u32 = 0;
let sighash: u32 = 1 ;
let mut hasher = Sha256::new();
let mut prevout_data = Vec::new();
prevout_data.extend_from_slice(&outpoint.txid);
prevout_data.extend_from_slice(&outpoint.index.to_le_bytes());
let prevout_hash = {
let first_hash = Sha256::digest(&prevout_data);
Sha256::digest(&first_hash).to_vec()
};
let mut sequence_data = Vec::new();
sequence_data.extend_from_slice(&sequence.to_le_bytes());
let hash_sequence = {
let first_hash = Sha256::digest(&sequence_data);
Sha256::digest(&first_hash).to_vec()
};
let mut output_data = Vec::new();
for output in &outputs {
output_data.extend_from_slice(&output.amount.to_le_bytes());
output_data.extend_from_slice(&encode_varint(output.script_pubkey.len() as u64));
output_data.extend_from_slice(&output.script_pubkey);
}
let hash_output = {
let first_hash = Sha256::digest(&output_data);
Sha256::digest(&first_hash).to_vec()
};
let mut pre_image = Vec::new();
pre_image.extend_from_slice(&version.to_le_bytes());
pre_image.extend_from_slice(&prevout_hash);
pre_image.extend_from_slice(&hash_sequence);
pre_image.extend_from_slice(&outpoint.txid);
pre_image.extend_from_slice(&outpoint.index.to_le_bytes());
pre_image.extend_from_slice(&scriptcode);
pre_image.extend_from_slice(&(value as u64).to_le_bytes());
pre_image.extend_from_slice(&sequence.to_le_bytes());
pre_image.extend_from_slice(&hash_output);
pre_image.extend_from_slice(&locktime.to_le_bytes());
pre_image.extend_from_slice(&sighash.to_le_bytes());
let hash1 = Sha256::digest(&pre_image);
return Ok(Sha256::digest(&hash1).to_vec());
}Editor is loading...
Leave a Comment