Skip to content

Commit bb5c8ae

Browse files
authored
Merge pull request #2936 from ProvableHQ/fix/caller-in-closure
[Fix] Set console caller and signer when executing closures.
2 parents 9f06db4 + e8af1d2 commit bb5c8ae

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed

synthesizer/process/src/stack/execute.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,19 @@ impl<N: Network> Stack<N> {
4848

4949
// Initialize the registers.
5050
let mut registers = Registers::new(call_stack, self.get_register_types(closure.name())?.clone());
51+
52+
use circuit::Eject;
53+
54+
// Set the transaction signer.
55+
registers.set_signer(signer.eject_value());
5156
// Set the transition signer, as a circuit.
5257
registers.set_signer_circuit(signer);
58+
// Set the transaction caller.
59+
registers.set_caller(caller.eject_value());
5360
// Set the transition caller, as a circuit.
5461
registers.set_caller_circuit(caller);
62+
// Set the transition view key.
63+
registers.set_tvk(tvk.eject_value());
5564
// Set the transition view key, as a circuit.
5665
registers.set_tvk_circuit(tvk);
5766
lap!(timer, "Initialize the registers");
@@ -60,7 +69,6 @@ impl<N: Network> Stack<N> {
6069
closure.inputs().iter().map(|i| i.register()).zip_eq(inputs).try_for_each(|(register, input)| {
6170
// If the circuit is in execute mode, then store the console input.
6271
if let CallStack::Execute(..) = registers.call_stack_ref() {
63-
use circuit::Eject;
6472
// Assign the console input to the register.
6573
registers.store(self, register, input.eject_value())?;
6674
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
errors: []
2+
outputs:
3+
- verified: true
4+
execute:
5+
self_caller_in_closure.aleo/dummy:
6+
outputs:
7+
- '{"type":"private","id":"2216227416503041347433412034872956491846811102146440372685849103494739704020field","value":"ciphertext1qyqya6k83s309kj2l82tj5fr80n7e7w7t56ff72ug8ueqhqzevn2vys72rsev"}'
8+
speculate: the execution was accepted
9+
add_next_block: succeeded.
10+
- execute: 'Failed to execute instruction (call check_caller self.caller;): Failed to evaluate instruction (assert.eq self.caller r0 ;): Caller address (console) is not set in the registers.'
11+
additional:
12+
- child_outputs:
13+
credits.aleo/fee_public:
14+
outputs:
15+
- '{"type":"future","id":"7718771598168275830568214808516419506185731287938173896061440207543931919734field","value":"{\n program_id: credits.aleo,\n function_name: fee_public,\n arguments: [\n aleo1gj8900ftrtm5gpjljk9tuv8tmr46m88s5dvugdx8hnmftvpfv5rqempqfd,\n 1334u64\n ]\n}"}'
16+
- {}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
randomness: 63249871089234
3+
cases:
4+
- program: self_caller_in_closure.aleo
5+
function: dummy
6+
inputs: [1u32, 2u32]
7+
- program: self_caller_in_closure.aleo
8+
function: run_check
9+
inputs: []
10+
*/
11+
12+
program self_caller_in_closure.aleo;
13+
14+
closure check_caller:
15+
input r0 as address;
16+
assert.eq self.caller r0;
17+
18+
closure check_signer:
19+
input r0 as address;
20+
assert.eq self.signer r0;
21+
22+
function run_check:
23+
call check_caller self.caller;
24+
call check_signer self.signer;
25+
26+
function dummy:
27+
input r0 as u32.public;
28+
input r1 as u32.private;
29+
add r0 r1 into r2;
30+
output r2 as u32.private;

0 commit comments

Comments
 (0)