Bonsai on Ethereum
Warning: Bonsai is still in early development. Do not use in production.
Bonsai can produce SNARK proofs; allowing efficient verification of any computation, on Ethereum.
There are two main ways to integrate your RISC Zero application with Ethereum:
- Using the Bonsai Relay to process proof requests and send verified results on-chain.
- Using the Bonsai proving service and the verifier contract directly.
Bonsai Relay
The Bonsai Relay is a service makes it simpler to integrate RISC Zero into your applications, leveraging the zk coprocessor model.
At a high level, here's how it works:
- Your application sends a request to run your zkVM guest to the Bonsai Relay. You can either:
- Send your request on-chain, by calling
requestCallback
on theBonsaiRelay
contract. - Send your request off-chain, by sending a request to the Bonsai Relay REST API.
- Send your request on-chain, by calling
- The Bonsai Relay sends the proof request to the Bonsai proving service.
- Bonsai generates a Groth16 SNARK proof of the guest execution, and submits the receipt to the
BonsaiRelay
contract. - The
BonsaiRelay
contract:- Verifies the receipt by using an
IRiscZeroVerifier
contract - Extracts the journal from the verified receipt.
- Sends the journal and image ID in a callback to your application contract.
- Verifies the receipt by using an
Getting Started
The Bonsai Foundry Template provides a template and instructions for developing your application with the Bonsai Relay. More details are provided below on how to send requests to the Bonsai Relay.
Running the Bonsai Relay
With Bonsai in alpha, every application currently needs to run their own deployment of the Bonsai Relay.
Instructions are included in the Bonsai Foundry Template.
This involves running a service binary provided by RISC Zero, and deploying the BonsaiRelay
contract
Off-chain Requests
The Bonsai Relay accepts requests off-chain using its REST API.
Using the off-chain API allows for including data not available to smart contracts in the EVM, and avoids needing to pay transaction fees on Ethereum to initiate a request. When inputs to your guest program and large (e.g. more than a few kilobytes) sending requests on-chain can be cost-prohibitive, while sending large inputs (e.g. up to tens of megabytes) via the REST API has no additional cost.
The Bonsai Relay SDK provides a Rust interface for interacting with the Bonsai Relay.
On-chain Requests
The Bonsai Relay also accepts requests on-chain using the BonsaiRelay
contract.
On-chain requests can be useful for reducing the amount of code you need to maintain. When submitting requests off-chain, some client or indexer needs to be written to assemble the inputs and make the request to the Bonsai Relay. With on-chain requests, the application smart contract can directly issue requests, and so no client or indexer needs to be written or maintained.
Verifier Contract
RISC Zero supports an on-chain verifier for Groth16 SNARK proofs generated by the Bonsai proving service. You can use this contract in your applications.
As described above, the Bonsai Relay forwards requests to the Bonsai proving service, and sends proofs on-chain to be verified in the authentication for for the BonsaiRelay
contract.
An alternative to using the Bonsai Relay is to send requests to the Bonsai proving service directly, and to use the verifier contract in your own application contract.
The verifier contract has the IRiscZeroVerifier
interface.
This interface defines the relevant data structures for the receipt and provides a verify
method.
The IRiscZeroVerifier
interface is implemented by the RiscZeroGroth16Verifier
contract.
While Bonsai is in alpha, you will deploy this contract as part of your application.
The Bonsai SDK provides support for sending requests to the Bonsai proving service. You may also want to check out our Bonsai Quick Start page and/or the Bonsai Overview.