Using SHARP (Shared Prover)¶
SHARP (formerly known as GPS) is a service that generates proofs attesting to the validity of the executions of Cairo programs. Then, it sends those proofs to an Ethereum testnet (Goerli) where they are verified by a smart contract. You can read more in Cairo for Blockchain Developers and in Playground & GPS Alpha.
To send a proof you can use the cairo-sharp
command line utility.
It allows you to send programs to SHARP and to query their status, until they are successfully
verified on-chain.
Sending a program to SHARP¶
Let’s create a small program (proving that you know the square root of a given number)
to send to SHARP. Create a file named sharp_test.cairo
with the following code:
%builtins output
func main(output_ptr: felt*) -> (output_ptr: felt*) {
alloc_locals;
local x;
%{ ids.x = program_input['x'] %}
assert [output_ptr] = x * x;
return (output_ptr=output_ptr + 1);
}
Create a file named input.json
with the program input:
{
"x": 17
}
The following command will compile the program, run it on the given input and send it to SHARP. Make sure you have the latest version of the cairo-lang package installed (currently, 0.11.0.2), see Setting up the environment.
cairo-sharp submit --source sharp_test.cairo \
--program_input input.json
The output should look like:
Compiling...
Running...
Submitting to SHARP...
Job sent.
Job key: 1f38cbf0-7153-4114-9442-44501bfed8eb
Fact: 0xf457e4311f8229ab7b08191a6658112a29a962a9f2fe95d7a3d4f1200eef0195
The job key is a unique identifier assigned to your job by SHARP. The fact is the result of a hash function on the program hash and the program output (which in our case includes the square of \(x\)). See Playground & GPS Alpha.
You can now use the job key to query the state of the job in the SHARP service:
cairo-sharp status 1f38cbf0-7153-4114-9442-44501bfed8eb
Once the status of your job is PROCESSED
, it means that it was sent to the blockchain for
verification.
To see if when your fact is successfully registered you can use cairo-sharp is_verified
(make sure to use the job’s fact and not the job key and to supply the URL of an Ethereum node):
cairo-sharp is_verified \
0xf457e4311f8229ab7b08191a6658112a29a962a9f2fe95d7a3d4f1200eef0195 \
--node_url=<URL_of_an_Ethereum_node>