Untitled

 avatar
unknown
rust
18 days ago
2.0 kB
5
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