# Running Code

## <mark style="color:blue;">System Requirements</mark>

1. Ubuntu version 20 or higher\
   WSL (Windows Subsystem for Linux) is also supported.\
   Other similar Linux distros should also work.

{% hint style="info" %}
For WSL installation guide, [read here](https://learn.microsoft.com/en-us/windows/wsl/install#install-wsl-command).
{% endhint %}

2. Some APT package dependencies\
   Run the following to install the required packages:

```
sudo apt install build-essential
sudo apt install pkg-config
sudo apt install libssl-dev
```

3. Rust compiler toolchain\
   Follow this 2-step instruction to install the Rust toolchain.

```bash
# 1: install cargo toolchain
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
```

```
# 2: source the cargo env for the first time
source "$HOME/.cargo/env"
```

## <mark style="color:blue;">Installing the SDK and Run zkpass-demo</mark>

Follow these steps to install the zkPass SDK and to run the demo application.

{% hint style="info" %}
For the purposes of this guide, the `zkpass-sdk` repository is cloned under the home directory of the current user, retaining its default name. This places the root directory for the `zkpass-sdk` repository at `~/zkpass-sdk`. As a result, the directory for the Rust/Linux binding of the SDK is set at `~/zkpass-sdk/rust`.

Should you choose to clone the `zkpass-sdk` repository into a different location, ensure that you adjust any referenced paths in the instructions to match your chosen directory structure.
{% endhint %}

1. Clone the zkpass-sdk repo

```bash
git clone https://github.com/gl-zkPass/zkpass-sdk.git
```

2. Enter `zkpass-sdk/rust` Directory

```bash
cd zkpass-sdk/rust
```

3. Set up environment variables (Use zkpass-demo/.env.example as starting point)

```bash
cp zkpass-demo/.env.example zkpass-demo/.env
```

4. From the `zkpass-sdk/rust` directory, execute `test.sh` script to build the SDK and run the demo application:

```bash
./test.sh
```

The correct output of zkpass-demo should look like the following:

```
<== Using Single User Data ==>
#### starting zkpass proof generation...
2024-09-03T07:23:42.591248Z  INFO run_data_holder{zkvm="r0" ... (omitted for clarity) ... >> generate_zkpass_proof
2024-09-03T07:23:42.626726Z  INFO run_data_holder{zkvm="r0" ... (omitted for clarity) ... Fetching public keys from https://playground-zkpass.ssi.id/.well-known/jwks.json
2024-09-03T07:23:48.169443Z  INFO run_data_holder{zkvm="r0" ... (omitted for clarity) ... << generate_zkpass_proof
#### generation completed [time=5.833258046s]

#### starting zkpass proof verification...
2024-09-03T07:23:48.424559Z  INFO run_data_holder{zkvm="r0" ... (omitted for clarity) ... >> verify_zkpass_proof_internal
2024-09-03T07:23:48.461295Z  INFO run_data_holder{zkvm="r0" ... (omitted for clarity) ... Fetching public keys from https://playground-zkpass.ssi.id/.well-known/jwks.json
2024-09-03T07:23:48.729210Z  INFO run_data_holder{zkvm="r0" ... (omitted for clarity) ... >> verify_zkproof
2024-09-03T07:23:48.729437Z  INFO run_data_holder{zkvm="r0" ... (omitted for clarity) ... << verify_zkproof
2024-09-03T07:23:48.732602Z  INFO run_data_holder{zkvm="r0" ... (omitted for clarity) ... << verify_zkpass_proof_internal
#### found dvr: id=868cbebb-9172-4807-846f-7f5bea6d20e3
#### verification completed [time=308.127227ms]
json-result={
  "name": "Dewi",
  "result": true
}
>> output list:
key=name, value=Str("Dewi")
key=result, value=Bool(true)
<< end of list
the query result is true

... (omitted for clarity) ...


<== Using Multiple User Data ==>
#### starting zkpass proof generation...
... (omitted for clarity) ...
#### generation completed [time=5.33967994s]

#### starting zkpass proof verification...
... (omitted for clarity) ...
#### verification completed [time=221.231359ms]
json-result={
  "name": "Dewi",
  "result": true
}
>> output list:
key=name, value=Str("Dewi")
key=result, value=Bool(true)
<< end of list
the query result is true

... (omitted for clarity) ...


<== Using Example ==>
#### starting zkpass proof generation...
... (omitted for clarity) ...
#### generation completed [time=5.55306725s]

#### starting zkpass proof verification...
... (omitted for clarity) ...
#### verification completed [time=288.768931ms]
json-result={
  "title": "Loan Query Results",
  "result": true,
  "name": "Ramana",
  "email": "Ramana.Maharshi@karma.org"
}
>> output list:
key=title, value=Str("Loan Query Results")
key=result, value=Bool(true)
key=name, value=Str("Ramana")
key=email, value=Str("Ramana.Maharshi@karma.org")
<< end of list
the query result is true
```

## <mark style="color:blue;">Troubleshooting</mark>

### Fetch Timeout

This demo will download a binary file. If the download process times out, try the following solutions:

1. Ensure you have a stable internet connection when running the script.
2. Turn off any active VPNs and try again.

### Missing/Corrupt .so Files

The error message "cannot open shared object file: No such file or directory" indicates an issue. This may occur due to missing or corrupted .so. Here are some possible solutions:

1. Ensure you have a stable internet connection when running the script.
2. Turn off any active VPNs and try again.
3. Manually download the .so file:
   1. Download [`libdvr_client.so`](https://github.com/gl-zkPass/zkpass-sdk/releases/download/playground-lib/libdvr_client.so) file from the website.
   2. Move these files to `zkpass-sdk/rust/lib` folder.
   3. Comment out `download-so.sh` in `test.sh`script.
   4. Run the `test.sh` script again; the error should be resolved.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gl-docs.gitbook.io/zkpass/zkpass-developers-guide/sdk-tutorial/rust/running-code.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
