6
6
7
7
use dusk_plonk:: prelude:: * ;
8
8
use once_cell:: sync:: Lazy ;
9
- use piecrust:: { contract_bytecode, ContractData , Error , SessionData , VM } ;
9
+ use piecrust:: {
10
+ contract_bytecode, ContractData , Error , Session , SessionData , VM ,
11
+ } ;
12
+ use piecrust_uplink:: ContractId ;
10
13
use rand:: rngs:: OsRng ;
11
14
use rkyv:: Deserialize ;
12
15
@@ -30,7 +33,7 @@ fn get_prover_verifier() -> &'static (Prover, Verifier) {
30
33
& PROVER_VERIFIER
31
34
}
32
35
33
- fn hash ( buf : & mut [ u8 ] , len : u32 ) -> u32 {
36
+ fn hash ( _ : & mut Session , buf : & mut [ u8 ] , len : u32 ) -> u32 {
34
37
let a = unsafe { rkyv:: archived_root :: < Vec < u8 > > ( & buf[ ..len as usize ] ) } ;
35
38
let v: Vec < u8 > = a. deserialize ( & mut rkyv:: Infallible ) . unwrap ( ) ;
36
39
@@ -40,7 +43,7 @@ fn hash(buf: &mut [u8], len: u32) -> u32 {
40
43
32
41
44
}
42
45
43
- fn verify_proof ( buf : & mut [ u8 ] , len : u32 ) -> u32 {
46
+ fn verify_proof ( _ : & mut Session , buf : & mut [ u8 ] , len : u32 ) -> u32 {
44
47
let a = unsafe {
45
48
rkyv:: archived_root :: < ( Proof , Vec < BlsScalar > ) > ( & buf[ ..len as usize ] )
46
49
} ;
@@ -58,10 +61,24 @@ fn verify_proof(buf: &mut [u8], len: u32) -> u32 {
58
61
valid_bytes. len ( ) as u32
59
62
}
60
63
64
+ pub const COUNTER_ID : ContractId = ContractId :: from_bytes ( [ 1 ; 32 ] ) ;
65
+
66
+ fn get_counter ( session : & mut Session , buf : & mut [ u8 ] , _: u32 ) -> u32 {
67
+ let receipt = session
68
+ . call_raw ( COUNTER_ID , "read_value" , & * buf, u64:: MAX )
69
+ . expect ( "calling the counter contract should succeed" ) ;
70
+
71
+ let data = receipt. data ;
72
+ buf[ ..data. len ( ) ] . copy_from_slice ( & data) ;
73
+
74
+ data. len ( ) as u32
75
+ }
76
+
61
77
fn new_ephemeral_vm ( ) -> Result < VM , Error > {
62
78
let mut vm = VM :: ephemeral ( ) ?;
63
79
vm. register_host_query ( "hash" , hash) ;
64
80
vm. register_host_query ( "verify_proof" , verify_proof) ;
81
+ vm. register_host_query ( "get_counter" , get_counter) ;
65
82
Ok ( vm)
66
83
}
67
84
@@ -87,6 +104,35 @@ pub fn host_hash() -> Result<(), Error> {
87
104
Ok ( ( ) )
88
105
}
89
106
107
+ /// Queries a contract for the value held in the counter contract through the
108
+ /// host, using a host query.
109
+ #[ test]
110
+ fn host_counter ( ) -> Result < ( ) , Error > {
111
+ let vm = new_ephemeral_vm ( ) ?;
112
+
113
+ let mut session = vm. session ( SessionData :: builder ( ) ) ?;
114
+
115
+ session. deploy (
116
+ contract_bytecode ! ( "counter" ) ,
117
+ ContractData :: builder ( OWNER ) . contract_id ( COUNTER_ID ) ,
118
+ LIMIT ,
119
+ ) ?;
120
+
121
+ let id = session. deploy (
122
+ contract_bytecode ! ( "host" ) ,
123
+ ContractData :: builder ( OWNER ) ,
124
+ LIMIT ,
125
+ ) ?;
126
+
127
+ let counter = session
128
+ . call :: < _ , i64 > ( id, "host_get_counter" , & ( ) , LIMIT ) ?
129
+ . data ;
130
+
131
+ assert_eq ! ( counter, 0xfc ) ;
132
+
133
+ Ok ( ( ) )
134
+ }
135
+
90
136
/// Proves that we know a number `c` such that `a + b = c`.
91
137
#[ derive( Default ) ]
92
138
struct TestCircuit {
0 commit comments