AI prompts
base on Multi-proofs for Taiko. SNARKS, STARKS and Trusted Execution Enclave. Our previous ZK-EVM circuits are deprecated. # raiko
Taiko's multi-prover for Taiko & Ethereum blocks. Currently supports Risc0, SP1, and SGX.
## Usage
### Installing
To download all dependencies for all provers you can run:
```shell
make install
```
You can also download all required dependencies for each prover separately, for example to install SP1:
```shell
TARGET=sp1 make install
```
### Building
After installing dependencies of the selected prover, the following command internally calls cargo to build the prover's guest target with the `--release` profile by default, for example:
```shell
TARGET=sp1 make build
```
If you set `DEBUG=1`, then the target will be compiled without optimization (not recommended for zkVM elfs).
### Running
Note that you have to run `make build` first before running zkVM provers, otherwise the guest elf may not be up to date and can result in proof failures.
```shell
TARGET=sp1 make run
```
Just for development with the native prover which runs through the block execution without producing any ZK/SGX proof:
```shell
cargo run
```
The `run` command will start the host service that listens to proof requests, then in another terminal you can do requests like this, which proves the 10th block with the native prover on Taiko's A7 testnet:
```shell
./script/prove-block.sh taiko_a7 native 10
```
### Task Management
The script `prove-block.sh` always sends a POST request to Raiko server and enqueue a proving task. If you repeately send the same request, it will pull the latest status of the task and return the proof if ready. To check the progress of all tasks:
```shell
curl --location --request POST 'http://localhost:8080/proof/report'
```
To list all requested proofs with (chainID, blockhash, proofsys_id) and ID generated by the proof system:
```shell
curl --location --request POST 'http://localhost:8080/proof/list'
```
To prune all tasks (the cancellation feature that kills prover is still WIP):
```shell
curl --location --request POST 'http://localhost:8080/proof/prune'
```
Look into `prove-block.sh` for the available options or run the script without inputs for hints. You can also automatically sync with the tip of the chain and prove all new blocks:
```shell
./script/prove-block.sh taiko_a7 native sync
```
### Task Management
The script `prove-block.sh` always sends a POST request to Raiko server and enqueue a proving task. If you repeately send the same request, it will pull the latest status of the task and return the proof if ready.
To check the progress of all tasks:
```shell
curl --location --request POST 'http://localhost:8080/proof/report'
```
To prune all tasks (the cancellation feature that kills prover is still WIP):
```shell
curl --location --request POST 'http://localhost:8080/proof/prune'
```
## Provers
For all host programs, you can enable CPU optimization through exporting `CPU_OPT=1`.
### Risc zero
To install, build, and run in one step:
```shell
export TARGET=risc0
make install && make build && make run
```
To build and run tests on Risc0 zkVM:
```shell
TARGET=risc0 make test
```
#### Bonsai
If you are using the Bonsai service, edit `run-bonsai.sh` to setup your API key, endpoint, and on-chain verifier address.
```shell
./script/setup-bonsai.sh
./script/prove-block.sh taiko_a7 risc0-bonsai 10
```
#### GPU
If you have a GPU with CUDA or Apple's GPU API to accelerate Risc0 proofs, you can do:
```shell
// cuda
cargo run -F cuda --release --features risc0
// metal
cargo run -F metal --release --features risc0
```
Note that CUDA needs to be installed when using `cuda`: https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html.
### SP1
To install, build, and run in one step:
```shell
export TARGET=sp1
make install && make build && make run
```
To build and run tests on the SP1 zkVM:
```shell
TARGET=sp1 make test
```
Some optimized configurations tailored to the host can be found [here](docs/README_SP1.md).
### SGX
To install, build, and run in one step:
```shell
export TARGET=sgx
make install && make build && make run
```
To build and run test related SGX provers:
```shell
TARGET=sgx make test
```
If your CPU doesn't support SGX, you can still run the SGX code through gramine like it would on an SGX machine:
```shell
MOCK=1 TARGET=sgx make run
```
## Misc docs
- [Docker & Remote Attestation Support](docs/README_Docker_and_RA.md)
- [Metrics](docs/README_Metrics.md)
## Execution Trace
You can generate an execution trace for the block that is being proven by enabling the `tracer` feature:
```shell
cargo run --features tracer
```
A `traces` folder will be created inside the root directory. This folder will contain json files with the trace of each valid transaction in the block.
## OpenAPI
When running any of the features/provers, OpenAPI UIs are available in both Swagger and Scalar flavors on `/swagger-ui` and `/scalar` respectively.
## Smart Contract Verification
Raiko support Sp1 Smart Contract Verification, see how to verify a proof in solidity test [here](/provers/sp1/contracts/README.md)", Assign "at most 3 tags" to the expected json: {"id":"10333","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"