Move header digest to transparent merkle proof

This commit is contained in:
Hanh 2023-05-01 19:53:19 +10:00
parent 58b36ad321
commit 839102cb14
3 changed files with 16 additions and 14 deletions

View File

@ -85,14 +85,7 @@ pub async fn build_broadcast_tx(
transparent_builder.taddr, tx_plan.taddr);
}
// Compute header digest
let mut h = create_hasher(b"ZTxIdHeadersHash");
h.update(&hex!("050000800a27a726b4d0d6c200000000"));
h.write_u32::<LE>(tx_plan.expiry_height)?;
let header_digest = h.finalize();
let master_seed = ledger_init_tx(header_digest.as_bytes()).await?;
let master_seed = ledger_init_tx().await?;
// For testing only
// let esk = "secret-extended-key-main1qwy5cttzqqqqpq8ksfmzqgz90r73yevcw6mvwuv5zuddak9zgl9epp6x308pczzez3hse753heepdk886yf7dmse5qvyl5jsuk5w4ejhtm30cpa862kq0pfu0z4zxxvyd523zeta3rr6lj0vg30mshf6wrlfucg47jv3ldspe0sv464uewwlglr0dzakssj8tdx27vq3dnerfa5z5fgf8vjutlcey3lwn4m6ncg8y4n2cgl64rd768uqg0yfvshljqt3g4x83kngv4guq06xx";
@ -139,6 +132,13 @@ pub async fn build_broadcast_tx(
let alpha = h.finalize();
let mut alpha_rng = ChaChaRng::from_seed(alpha.as_bytes().try_into().unwrap());
// Compute header digest
let mut h = create_hasher(b"ZTxIdHeadersHash");
h.update(&hex!("050000800a27a726b4d0d6c200000000"));
h.write_u32::<LE>(tx_plan.expiry_height)?;
let header_digest = h.finalize();
for sp in tx_plan.spends.iter() {
match sp.source {
Source::Transparent { txid, index } => {
@ -173,7 +173,7 @@ pub async fn build_broadcast_tx(
.await?;
}
}
transparent_builder.set_merkle_proof().await?;
transparent_builder.set_merkle_proof(header_digest.as_bytes()).await?;
ledger_set_stage(3).await?;
for output in tx_plan.outputs.iter() {

View File

@ -99,7 +99,7 @@ impl TransparentBuilder {
Ok(())
}
pub async fn set_merkle_proof(&self) -> Result<()> {
pub async fn set_merkle_proof(&self, header_hash: &[u8]) -> Result<()> {
let prevouts_digest = self.prevouts_hasher.finalize();
log::info!("PREVOUTS {}", hex::encode(prevouts_digest));
let pubscripts_digest = self.trscripts_hasher.finalize();
@ -108,6 +108,7 @@ impl TransparentBuilder {
log::info!("SEQUENCES {}", hex::encode(sequences_digest));
ledger_set_transparent_merkle_proof(
header_hash,
prevouts_digest.as_bytes(),
pubscripts_digest.as_bytes(),
sequences_digest.as_bytes(),

View File

@ -95,10 +95,9 @@ pub async fn ledger_get_o_fvk() -> Result<Vec<u8>> {
Ok(pk)
}
pub async fn ledger_init_tx(header_digest: &[u8]) -> Result<Vec<u8>> {
pub async fn ledger_init_tx() -> Result<Vec<u8>> {
let mut bb: Vec<u8> = vec![];
bb.write_all(&hex!("E010000020"))?;
bb.write_all(header_digest)?;
bb.write_all(&hex!("E010000000"))?;
let main_seed = apdu(&bb).await?;
Ok(main_seed)
}
@ -113,12 +112,14 @@ pub async fn ledger_set_stage(stage: u8) -> Result<()> {
}
pub async fn ledger_set_transparent_merkle_proof(
header_digest: &[u8],
prevouts_digest: &[u8],
pubscripts_digest: &[u8],
sequences_digest: &[u8],
) -> Result<()> {
let mut bb: Vec<u8> = vec![];
bb.write_all(&hex!("E012000060"))?;
bb.write_all(&hex!("E012000080"))?;
bb.write_all(header_digest)?;
bb.write_all(prevouts_digest)?;
bb.write_all(pubscripts_digest)?;
bb.write_all(sequences_digest)?;