Skip to content

Commit

Permalink
refactor(block_program): Factor out fee legality verification
Browse files Browse the repository at this point in the history
Factored out blob does *not* consume the transaction kernel mast
hash because we might need that for other, similar blobs in the
future.

Co-authored-by: Alan Szepieniec <[email protected]>
  • Loading branch information
Sword-Smith and aszepieniec committed Dec 19, 2024
1 parent 2eab824 commit 9813c6b
Showing 1 changed file with 87 additions and 71 deletions.
158 changes: 87 additions & 71 deletions src/models/blockchain/block/validity/block_program.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,91 @@ impl ConsensusProgram for BlockProgram {
let block_witness_field_claims = field!(BlockProofWitness::claims);
let block_witness_field_proofs = field!(BlockProofWitness::proofs);

let merkle_verify = library.import(Box::new(MerkleVerify));
let coin_size = NeptuneCoins::static_length().unwrap();
let hash_fee = library.import(Box::new(HashStaticSize { size: coin_size }));
let push_max_amount = NeptuneCoins::max().push_to_stack();
let u128_lt = library.import(Box::new(tasm_lib::arithmetic::u128::lt::Lt));
let verify_fee_legality = triton_asm!(
// _ [bbd] *w [txkmh]

dup 4
dup 4
dup 4
dup 4
dup 4
push {TransactionKernel::MAST_HEIGHT}
// _ [bbd] *w [txkmh] [txkmh] txkm_height

push {TransactionKernelField::Fee as u32}
// _ [bbd] *w [txkmh] [txkmh] txkm_height fee_leaf_index

dup 12 {&block_body_field} {&body_field_kernel} {&kernel_field_fee}
// _ [bbd] *w [txkmh] [txkmh] txkm_height fee_leaf_index *fee

dup 0 addi {coin_size - 1} read_mem {coin_size} pop 1
// _ [bbd] *w [txkmh] [txkmh] txkm_height fee_leaf_index *fee [fee]

{&push_max_amount}
call {u128_lt}
push 0 eq
// _ [bbd] *w [txkmh] [txkmh] txkm_height fee_leaf_index *fee (max >= fee)

assert error_id {Self::ILLEGAL_FEE}
// _ [bbd] *w [txkmh] [txkmh] txkm_height fee_leaf_index *fee

call {hash_fee} pop 1
// _ [bbd] *w [txkmh] [txkmh] txkm_height fee_leaf_index [fee_hash]

call {merkle_verify}
// _ [bbd] *w [txkmh]

push 0
push 0
push 0
push 0
push 1
dup 9
dup 9
dup 9
dup 9
dup 9
// _ [bbd] *w [txkmh] 0 0 0 0 1 [txkmh]
// _ [bbd] *w [txkmh] [padded-txkmh] <-- rename

sponge_init
sponge_absorb
sponge_squeeze

pick 5 pop 1
pick 5 pop 1
pick 5 pop 1
pick 5 pop 1
pick 5 pop 1
// _ [bbd] *w [txkmh] [txkmh_hash]

dup 15
dup 15
dup 15
dup 15
dup 15
// _ [bbd] *w [txkmh] [txkmh_hash] [bbd]

push {BlockBody::MAST_HEIGHT}
push {BlockBodyField::TransactionKernel as u32}
// _ [bbd] *w [txkmh] [txkmh_hash] [bbd] block_body_mast_height txk_leaf_index

pick 11
pick 11
pick 11
pick 11
pick 11
// _ [bbd] *w [txkmh] [bbd] block_body_mast_height txk_leaf_index [txkmh_hash]

call {merkle_verify}
// _ [bbd] *w [txkmh]
);

let hash_varlen = library.import(Box::new(HashVarlen));
let print_claim_hash = triton_asm!(
// _ *claim[i]_si
Expand Down Expand Up @@ -160,11 +245,6 @@ impl ConsensusProgram for BlockProgram {
recurse
};

let coin_size = NeptuneCoins::static_length().unwrap();
let hash_fee = library.import(Box::new(HashStaticSize { size: coin_size }));
let merkle_verify = library.import(Box::new(MerkleVerify));
let push_max_amount = NeptuneCoins::max().push_to_stack();
let u128_lt = library.import(Box::new(tasm_lib::arithmetic::u128::lt::Lt));
let code = triton_asm! {
// _

Expand All @@ -178,76 +258,12 @@ impl ConsensusProgram for BlockProgram {
divine {Digest::LEN}
// _ [bbd] *w [txkmh]

dup 4
dup 4
dup 4
dup 4
dup 4
push {TransactionKernel::MAST_HEIGHT}
// _ [bbd] *w [txkmh] [txkmh] txkm_height

push {TransactionKernelField::Fee as u32}
// _ [bbd] *w [txkmh] [txkmh] txkm_height fee_leaf_index

dup 12 {&block_body_field} {&body_field_kernel} {&kernel_field_fee}
// _ [bbd] *w [txkmh] [txkmh] txkm_height fee_leaf_index *fee

dup 0 addi {coin_size - 1} read_mem {coin_size} pop 1
// _ [bbd] *w [txkmh] [txkmh] txkm_height fee_leaf_index *fee [fee]

{&push_max_amount}
call {u128_lt}
push 0 eq
// _ [bbd] *w [txkmh] [txkmh] txkm_height fee_leaf_index *fee (max >= fee)

assert error_id {Self::ILLEGAL_FEE}
// _ [bbd] *w [txkmh] [txkmh] txkm_height fee_leaf_index *fee

call {hash_fee} pop 1
// _ [bbd] *w [txkmh] [txkmh] txkm_height fee_leaf_index [fee_hash]

call {merkle_verify}
{&verify_fee_legality}
// _ [bbd] *w [txkmh]

push 0 place 5
push 0 place 5
push 0 place 5
push 0 place 5
push 1 place 5

sponge_init
sponge_absorb
sponge_squeeze

pick 5 pop 1
pick 5 pop 1
pick 5 pop 1
pick 5 pop 1
pick 5 pop 1
// _ [bbd] *w [txkmh_hash]

dup 10
dup 10
dup 10
dup 10
dup 10
// _ [bbd] *w [txkmh_hash] [bbd]

push {BlockBody::MAST_HEIGHT}
push {BlockBodyField::TransactionKernel as u32}
// _ [bbd] *w [txkmh_hash] [bbd] block_body_mast_height txk_leaf_index

pick 11
pick 11
pick 11
pick 11
pick 11
// _ [bbd] *w [bbd] block_body_mast_height txk_leaf_index [txkmh_hash]

call {merkle_verify}
pop {Digest::LEN}
// _ [bbd] *w


/* verify appendix claims */
dup 0 {&block_witness_field_claims}
hint claims = stack[0]
Expand Down

0 comments on commit 9813c6b

Please sign in to comment.