Skip to content

Multisig tx fails with unauthenticated note #1936

@Fumuran

Description

@Fumuran

Packages versions

rustc: 1.89.0
miden-base: 0.12
miden-vm: 0.17
miden-crypto: 0.15.6

Bug description

Bug revealed during the multisig test creation for the note consumption checker.

Context

The TransactionExecutorError::Unauthorized should be returned during the multisig transaction in case there are not enough signatures: this check is preformed in the multisig component and the error is emitted during the event here.

Failing test

The test below creates the multisig context (without signatures), obtains the transaction summary and creates the signatures from it. This signatures then used during the creation of the new context (tx_context_with_signatures) which then is used to execute the transaction, which should succeed.

I left an inline comments why sometimes it fails with an unexpected error.

#[tokio::test]
async fn test_executor_bug() -> anyhow::Result<()> {
    // Setup keys and authenticators
    let (_secret_keys, public_keys, authenticators) = setup_keys_and_authenticators(2, 2)?;

    // Create multisig account
    let multisig_account = create_multisig_account(2, &public_keys, 10u64)?;

    let mut mock_chain_builder =
        MockChainBuilder::with_accounts([multisig_account.clone()]).unwrap();

    // Create output note using add_p2id_note for spawn note
    let output_note = mock_chain_builder.add_p2id_note(
        multisig_account.id(),
        ACCOUNT_ID_REGULAR_PUBLIC_ACCOUNT_UPDATABLE_CODE.try_into().unwrap(),
        &[FungibleAsset::mock(0)],
        NoteType::Public,
    )?;

    // Create spawn note that will create the output note
    let input_note = mock_chain_builder.add_spawn_note([&output_note])?;

    let mock_chain = mock_chain_builder.build().unwrap();
    let salt = Word::from([Felt::new(1); 4]);

    // get the transaction context without signatures (just to obtain the summary)
    let tx_context_without_signatures = mock_chain
        .build_tx_context(multisig_account.id(), &[input_note.id()], &[])?
        .extend_expected_output_notes(vec![OutputNote::Full(output_note.clone())])
        .auth_args(salt)
        .build()?;

    // execute the transaction to get the summary
    let tx_summary = match tx_context_without_signatures.execute().await.unwrap_err() {
        TransactionExecutorError::Unauthorized(tx_effects) => tx_effects,
        error => panic!("expected abort with tx effects: {error:?}"),
    };

    // Get signatures from both approvers
    let msg = tx_summary.as_ref().to_commitment();
    let tx_summary = SigningInputs::TransactionSummary(tx_summary);

    let sig_1 = authenticators[0].get_signature(public_keys[0].into(), &tx_summary).await?;
    let sig_2 = authenticators[1].get_signature(public_keys[1].into(), &tx_summary).await?;

    // get the transaction context with signatures
    let tx_context_with_signatures = mock_chain
        .build_tx_context(multisig_account.id(), &[input_note.id()], &[])?
        .extend_expected_output_notes(vec![OutputNote::Full(output_note)])
        .add_signature(public_keys[0], msg, sig_1)
        .add_signature(public_keys[1], msg, sig_2)
        .auth_args(salt)
        .build()?;

    // The block below is essentially a copy of the `TransactionContext::execute(&self)` method.
    // The only thing which I will change to demonstrate the bug -- the input notes.
    //---------------------------------------------------------------------------------------------
    let block_num = tx_context_with_signatures.tx_inputs().block_header().block_num();

    // There are two ways of creating the InputNotes: either by requesting it from the context, or
    // doing it by ourselves, using conversion from Vec<Note>.

    // let notes = tx_context_with_signatures.tx_inputs().input_notes().clone();
    //     ^-- these notes are obtained from the context (essentially there is only one
    //         `input_note`), so they are either authenticated or unauthenticated depending on how
    //         did we provide the `input_note` during the `tx_context_with_signatures` creation.

    let notes = vec![input_note].into();
    //  ^-- this notes vector could be created by us and will contain only the unauthenticated
    //         notes (that's how this bug was discovered initially)
    let tx_args = tx_context_with_signatures.tx_args().clone();

    use miden_tx::TransactionExecutor;

    let mut tx_executor = TransactionExecutor::new(&tx_context_with_signatures)
        .with_source_manager(tx_context_with_signatures.source_manager().clone())
        .with_debug_mode();
    if let Some(authenticator) = tx_context_with_signatures.authenticator() {
        tx_executor = tx_executor.with_authenticator(authenticator);
    }

    let result = tx_executor
        .execute_transaction(multisig_account.id(), block_num, notes, tx_args)
        .await;
    //  ^-- execution succeeds if we provide the authenticated note to the executor, but it fails
    //      otherwise: either if we create a transaction context with unauthenticated notes, or if
    //      we create an InputNotes vector by ourselves (which consists of unauthenticated notes).
    //
    //      The most suspicious part is that the transaction is failing with the
    //      `TransactionExecutorError::Unauthorized` error, which should not be anyhow connected to
    //      the note inclusion proof existence. The necessary number of signatures (2) was provided
    //      to the transaction context, so this error should not be returned.

    assert!(result.is_err());
    std::println!("{result:?}");

    Ok(())
}

How can this be reproduced?

  1. Checkout to the branch with this test (assuming you are in next):
    git pull && git checkout andrew-multisig-unauth-note-bug
  2. Run the test:
    cargo test --package miden-testing --test lib -- auth::multisig::test_executor_bug --exact --show-output
    It should return ok indicating that the transaction execution result is error and print the contents of this error to the terminal (to make sure it is Unauthorized error).

This test is located here: https://github.com/0xMiden/miden-base/blob/ea820b442b72892ba62cb1c749787b245328e77a/crates/miden-testing/tests/auth/multisig.rs#L318

Relevant log output

Err(Unauthorized(TransactionSummary { account_delta: AccountDelta { account_id: V0(AccountIdV0 { prefix: 16, suffix: 0 }), storage: AccountStorageDelta { values: {}, maps: {} }, vault: AccountVaultDelta { fungible: FungibleAssetDelta({}), non_fungible: NonFungibleAssetDelta({}) }, nonce_delta: 1 }, input_notes: InputNotes { notes: [Unauthenticated { note: Note { header: NoteHeader { note_id: NoteId(Word([17304745083651536002, 18159581402113010254, 3969965375979733283, 2400691286580916196])), note_metadata: NoteMetadata { sender: V0(AccountIdV0 { prefix: 16, suffix: 0 }), note_type: Public, tag: LocalAny(3221225472), aux: 0, execution_hint: None } }, details: NoteDetails { assets: NoteAssets { assets: [], hash: Word([0, 0, 0, 0]) }, recipient: NoteRecipient { serial_num: Word([4886690302066257259, 8302210660838246050, 6871326041689529825, 8355403846268703160]), script: NoteScript { mast: MastForest { nodes: [External(ExternalNode { digest: Word([14828387193518256539, 1985601929854008387, 6797343308911424415, 2664495001625948119]), before_enter: [], after_exit: [] }), External(ExternalNode { digest: Word([2413931590450137567, 13131787082552614888, 3168649072021527189, 7260532485779335326]), before_enter: [], after_exit: [] }), Call(CallNode { callee: MastNodeId(1), is_syscall: false, digest: Word([9515575703670742393, 9617807683971855440, 14445266385067889120, 9973657096640822568]), before_enter: [], after_exit: [] }), Block(BasicBlockNode { op_batches: [OpBatch { ops: [Push(16), Eq, Assert(6351402360927106120), Pad, Eq, Assert(14710915215965883257), Pad, Pad, Pad, Pad, Pad, Pad, Pad, Pad, Push(7639123972218411772), Push(11233326087045169855), Push(12108297169211667909), Push(7947759170983090723), Pad, Incr, Pad, Incr, Pad], groups: [3485998326288486619, 16, 51631807716399152, 7639123972218411772, 11233326087045169855, 12108297169211667909, 1650441918555, 7947759170983090723], op_counts: [9, 0, 8, 0, 0, 0, 6, 0], num_groups: 8 }, OpBatch { ops: [Push(3942645760)], groups: [91, 3942645760, 0, 0, 0, 0, 0, 0], op_counts: [1, 0, 0, 0, 0, 0, 0, 0], num_groups: 2 }], digest: Word([14455610996325670121, 2271939421785695339, 10801314849213268292, 16106743532009540910]), decorators: [(0, DecoratorId(1)), (1, DecoratorId(2)), (3, DecoratorId(3)), (4, DecoratorId(4)), (6, DecoratorId(5)), (10, DecoratorId(6)), (14, DecoratorId(7)), (18, DecoratorId(8)), (20, DecoratorId(9)), (22, DecoratorId(10)), (23, DecoratorId(11))] }), External(ExternalNode { digest: Word([13085869432427796340, 16313566838484031618, 12493484102259091690, 17061150314081145393]), before_enter: [], after_exit: [] }), Call(CallNode { callee: MastNodeId(4), is_syscall: false, digest: Word([6758359682071315928, 7625777742029598619, 3554676512542877214, 12130607278142353860]), before_enter: [], after_exit: [] }), Block(BasicBlockNode { op_batches: [OpBatch { ops: [Pad, Pad, Push(206708186078720), Push(12249790986447797280)], groups: [192337968, 206708186078720, 12249790986447797280, 0, 0, 0, 0, 0], op_counts: [4, 0, 0, 0, 0, 0, 0, 0], num_groups: 3 }], digest: Word([10141094014742666716, 8867622944465364154, 9683298012539893333, 14699152637805212244]), decorators: [(0, DecoratorId(13))] }), Block(BasicBlockNode { op_batches: [OpBatch { ops: [Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop, Drop], groups: [2977624043394061481, 2977624043394061481, 5289, 0, 0, 0, 0, 0], op_counts: [9, 9, 2, 0, 0, 0, 0, 0], num_groups: 3 }], digest: Word([12249856914680919462, 17542805899091525147, 3769904472041163848, 10071847016823433462]), decorators: [(0, DecoratorId(15)), (4, DecoratorId(15)), (8, DecoratorId(15)), (12, DecoratorId(15)), (16, DecoratorId(15))] }), Join(JoinNode { children: [MastNodeId(0), MastNodeId(3)], digest: Word([10260414280971450076, 9151115827893283636, 16085555802528387781, 15760211077102606642]), before_enter: [], after_exit: [] }), Join(JoinNode { children: [MastNodeId(2), MastNodeId(6)], digest: Word([12526936836721378477, 10379913019562811356, 8820605716950782467, 2561790899720406998]), before_enter: [], after_exit: [] }), Join(JoinNode { children: [MastNodeId(5), MastNodeId(7)], digest: Word([16211417415793417688, 8316940475136733553, 7686157715683867261, 14685089050776350047]), before_enter: [], after_exit: [] }), Join(JoinNode { children: [MastNodeId(8), MastNodeId(9)], digest: Word([18152597756544505031, 8505122122724604405, 9032211054467011009, 17786247335341096381]), before_enter: [], after_exit: [] }), Join(JoinNode { children: [MastNodeId(11), MastNodeId(10)], digest: Word([3956601882298277246, 9803143801439227780, 8315597164503048083, 2195018756890575961]), before_enter: [], after_exit: [] })], roots: [MastNodeId(12)], decorators: [AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(30), end: ByteIndex(66) }), context_name: "$exec::$main", op: "exec.::miden::account::get_native_id", num_cycles: 0, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(151), end: ByteIndex(158) }), context_name: "$exec::$main", op: "push.16", num_cycles: 1, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(159), end: ByteIndex(233) }), context_name: "$exec::$main", op: "assert_eq.err=\"sender ID prefix does not match native account ID's prefix\"", num_cycles: 2, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(292), end: ByteIndex(298) }), context_name: "$exec::$main", op: "push.0", num_cycles: 1, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(299), end: ByteIndex(373) }), context_name: "$exec::$main", op: "assert_eq.err=\"sender ID suffix does not match native account ID's suffix\"", num_cycles: 2, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(403), end: ByteIndex(407) }), context_name: "$exec::$main", op: "padw", num_cycles: 4, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(408), end: ByteIndex(412) }), context_name: "$exec::$main", op: "padw", num_cycles: 4, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(426), end: ByteIndex(497) }), context_name: "$exec::$main", op: "push.[7639123972218411772,11233326087045169855,12108297169211667909,7947759170983090723]", num_cycles: 4, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(510), end: ByteIndex(516) }), context_name: "$exec::$main", op: "push.1", num_cycles: 2, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(529), end: ByteIndex(535) }), context_name: "$exec::$main", op: "push.1", num_cycles: 2, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(548), end: ByteIndex(554) }), context_name: "$exec::$main", op: "push.0", num_cycles: 1, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(567), end: ByteIndex(582) }), context_name: "$exec::$main", op: "push.3942645760", num_cycles: 1, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(595), end: ByteIndex(619) }), context_name: "$exec::$main", op: "call.::miden::output_note::create", num_cycles: 1, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(621), end: ByteIndex(692) }), context_name: "$exec::$main", op: "push.[0,0,206708186078720,12249790986447797280]", num_cycles: 4, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(711), end: ByteIndex(770) }), context_name: "$exec::$main", op: "call.::miden::contracts::wallets::basic::move_asset_to_note", num_cycles: 1, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("note_43d102f05e016d6b7337609be9b986a2"), start: ByteIndex(780), end: ByteIndex(785) }), context_name: "$exec::$main", op: "dropw", num_cycles: 4, should_break: false })], advice_map: AdviceMap({}), error_codes: {6351402360927106120: "sender ID prefix does not match native account ID's prefix", 14710915215965883257: "sender ID suffix does not match native account ID's suffix"} }, entrypoint: MastNodeId(12) }, inputs: NoteInputs { values: [], commitment: Word([0, 0, 0, 0]) }, digest: Word([9800345590909030414, 11479602657317954343, 10183681798596763728, 7636874122121536014]) } }, nullifier: 0x7500485937b37327878e7e60efdb4cfcfd988f22d590e2a88d15c82467600a10 } }], commitment: Word([6203526528546039131, 6666118218557183773, 6280203960085020828, 6487671427559853809]) }, output_notes: OutputNotes { notes: [Full(Note { header: NoteHeader { note_id: NoteId(Word([11601714953068989061, 5610463255931471922, 4203329484812188502, 16488930002128123810])), note_metadata: NoteMetadata { sender: V0(AccountIdV0 { prefix: 16, suffix: 0 }), note_type: Public, tag: LocalAny(3942645760), aux: 0, execution_hint: Always } }, details: NoteDetails { assets: NoteAssets { assets: [Fungible(FungibleAsset { faucet_id: V0(AccountIdV0 { prefix: 12249790986447797280, suffix: 206708186078720 }), amount: 0 })], hash: Word([5002340909270657029, 5686062748331490734, 15746246392717729939, 11948122195496076701]) }, recipient: NoteRecipient { serial_num: Word([8635338869442206704, 11671305615285950885, 15253023094703789604, 7398108415970215319]), script: NoteScript { mast: MastForest { nodes: [External(ExternalNode { digest: Word([14875275380083261199, 1600024303839821126, 8507562978433181071, 8080970232171944721]), before_enter: [], after_exit: [] }), Block(BasicBlockNode { op_batches: [OpBatch { ops: [Pad, Pad, Pad, Pad, Pad], groups: [12986357808, 0, 0, 0, 0, 0, 0, 0], op_counts: [5, 0, 0, 0, 0, 0, 0, 0], num_groups: 1 }], digest: Word([4734168967844288770, 4263232923336887261, 14401669981929182042, 10328677691749746023]), decorators: [(0, DecoratorId(0)), (4, DecoratorId(1))] }), External(ExternalNode { digest: Word([1783183497999254054, 5889137145646566461, 13959663137781871264, 7774158345680485352]), before_enter: [], after_exit: [] }), Block(BasicBlockNode { op_batches: [OpBatch { ops: [Push(2), Eq, Assert(12047766571267101177), MLoadW, Drop, Drop], groups: [1419847930075, 2, 0, 0, 0, 0, 0, 0], op_counts: [6, 0, 0, 0, 0, 0, 0, 0], num_groups: 2 }], digest: Word([8172943537206471896, 14746198792130826100, 9464479570127511265, 12065877669865130207]), decorators: [(0, DecoratorId(3)), (2, DecoratorId(4)), (3, DecoratorId(5)), (4, DecoratorId(6)), (5, DecoratorId(7))] }), External(ExternalNode { digest: Word([18423682388326325359, 4772935070195982670, 4758806658497961073, 15871860816148978653]), before_enter: [], after_exit: [] }), External(ExternalNode { digest: Word([13655542317145927067, 5668793052231672651, 7009768923461540989, 4694507165024367724]), before_enter: [], after_exit: [] }), Block(BasicBlockNode { op_batches: [OpBatch { ops: [Assert(16775440430394368057)], groups: [32, 0, 0, 0, 0, 0, 0, 0], op_counts: [1, 0, 0, 0, 0, 0, 0, 0], num_groups: 1 }], digest: Word([15128080887065630744, 1374599180218299460, 12266450685535648196, 11172547685365752009]), decorators: [(0, DecoratorId(10))] }), Join(JoinNode { children: [MastNodeId(1), MastNodeId(0)], digest: Word([11988638178237032371, 11862428624673178714, 1858126208827384600, 240271209736680235]), before_enter: [], after_exit: [] }), Join(JoinNode { children: [MastNodeId(3), MastNodeId(2)], digest: Word([10628774887104799192, 2389828306807490340, 1267367921277572446, 3369163265462584658]), before_enter: [], after_exit: [] }), Join(JoinNode { children: [MastNodeId(4), MastNodeId(6)], digest: Word([2420760991406049138, 955695499216902133, 3025243754837655104, 2631631190193456494]), before_enter: [], after_exit: [] }), Join(JoinNode { children: [MastNodeId(7), MastNodeId(8)], digest: Word([8704675172850867529, 1480614536228673619, 14235348210019358112, 2021736267186089757]), before_enter: [], after_exit: [] }), Join(JoinNode { children: [MastNodeId(9), MastNodeId(5)], digest: Word([18408392875760945768, 8236188504871683934, 13381147185023303060, 14511966200413219642]), before_enter: [], after_exit: [] }), Join(JoinNode { children: [MastNodeId(10), MastNodeId(11)], digest: Word([15646458894019576736, 9463850593077135479, 7134131355862359892, 16500161566181139074]), before_enter: [], after_exit: [] })], roots: [MastNodeId(12)], decorators: [AsmOp(AssemblyOp { location: Some(Location { uri: Uri("/Users/fumuran/Desktop/Miden/miden-base/target/debug/build/miden-lib-2ec9f62a2161a5d2/out/asm/note_scripts/P2ID.masm"), start: ByteIndex(1234), end: ByteIndex(1238) }), context_name: "$exec::$main", op: "padw", num_cycles: 4, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("/Users/fumuran/Desktop/Miden/miden-base/target/debug/build/miden-lib-2ec9f62a2161a5d2/out/asm/note_scripts/P2ID.masm"), start: ByteIndex(1239), end: ByteIndex(1245) }), context_name: "$exec::$main", op: "push.0", num_cycles: 1, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("/Users/fumuran/Desktop/Miden/miden-base/target/debug/build/miden-lib-2ec9f62a2161a5d2/out/asm/note_scripts/P2ID.masm"), start: ByteIndex(1246), end: ByteIndex(1274) }), context_name: "$exec::$main", op: "exec.::miden::active_note::get_inputs", num_cycles: 0, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("/Users/fumuran/Desktop/Miden/miden-base/target/debug/build/miden-lib-2ec9f62a2161a5d2/out/asm/note_scripts/P2ID.masm"), start: ByteIndex(1368), end: ByteIndex(1372) }), context_name: "$exec::$main", op: "eq.2", num_cycles: 2, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("/Users/fumuran/Desktop/Miden/miden-base/target/debug/build/miden-lib-2ec9f62a2161a5d2/out/asm/note_scripts/P2ID.masm"), start: ByteIndex(1373), end: ByteIndex(1415) }), context_name: "$exec::$main", op: "assert.err=\"P2ID note expects exactly 2 note inputs\"", num_cycles: 1, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("/Users/fumuran/Desktop/Miden/miden-base/target/debug/build/miden-lib-2ec9f62a2161a5d2/out/asm/note_scripts/P2ID.masm"), start: ByteIndex(1509), end: ByteIndex(1518) }), context_name: "$exec::$main", op: "mem_loadw", num_cycles: 1, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("/Users/fumuran/Desktop/Miden/miden-base/target/debug/build/miden-lib-2ec9f62a2161a5d2/out/asm/note_scripts/P2ID.masm"), start: ByteIndex(1519), end: ByteIndex(1523) }), context_name: "$exec::$main", op: "drop", num_cycles: 1, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("/Users/fumuran/Desktop/Miden/miden-base/target/debug/build/miden-lib-2ec9f62a2161a5d2/out/asm/note_scripts/P2ID.masm"), start: ByteIndex(1524), end: ByteIndex(1528) }), context_name: "$exec::$main", op: "drop", num_cycles: 1, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("/Users/fumuran/Desktop/Miden/miden-base/target/debug/build/miden-lib-2ec9f62a2161a5d2/out/asm/note_scripts/P2ID.masm"), start: ByteIndex(1596), end: ByteIndex(1616) }), context_name: "$exec::$main", op: "exec.::miden::account::get_id", num_cycles: 0, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("/Users/fumuran/Desktop/Miden/miden-base/target/debug/build/miden-lib-2ec9f62a2161a5d2/out/asm/note_scripts/P2ID.masm"), start: ByteIndex(1788), end: ByteIndex(1813) }), context_name: "$exec::$main", op: "exec.::miden::account_id::is_equal", num_cycles: 0, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("/Users/fumuran/Desktop/Miden/miden-base/target/debug/build/miden-lib-2ec9f62a2161a5d2/out/asm/note_scripts/P2ID.masm"), start: ByteIndex(1814), end: ByteIndex(1854) }), context_name: "$exec::$main", op: "assert.err=\"P2ID's target account address and transaction address do not match\"", num_cycles: 1, should_break: false }), AsmOp(AssemblyOp { location: Some(Location { uri: Uri("/Users/fumuran/Desktop/Miden/miden-base/target/debug/build/miden-lib-2ec9f62a2161a5d2/out/asm/note_scripts/P2ID.masm"), start: ByteIndex(1872), end: ByteIndex(1911) }), context_name: "$exec::$main", op: "exec.::miden::active_note::add_assets_to_account", num_cycles: 0, should_break: false })], advice_map: AdviceMap({}), error_codes: {12047766571267101177: "P2ID note expects exactly 2 note inputs", 16775440430394368057: "P2ID's target account address and transaction address do not match"} }, entrypoint: MastNodeId(12) }, inputs: NoteInputs { values: [261683767475200, 12393906174523661584], commitment: Word([13558223633044457410, 8650298519403831934, 15570420789236350846, 14949630227468411633]) }, digest: Word([7639123972218411772, 11233326087045169855, 12108297169211667909, 7947759170983090723]) } }, nullifier: 0x317c8a412e7507abad2025161631e06c3f45afe420b8772bdc630ef8b1b427ad })], commitment: Word([13057829668115459641, 5532736932927601715, 1788370888095783591, 15996828325726333987]) }, salt: Word([1, 1, 1, 1]) }))

Metadata

Metadata

Labels

No labels
No labels

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions