Skip to content

Latest commit

 

History

History
216 lines (159 loc) · 7.76 KB

deployment-guide.md

File metadata and controls

216 lines (159 loc) · 7.76 KB

RISC Zero View Call Proofs ERC20 Example Ethereum Deployment Guide

Note: This software is not production ready. Do not use in production.

Welcome to the RISC Zero View Call Proofs ERC20 Example Ethereum Deployment guide!

You can either:

Deploy on a local network

You can deploy your contracts and run an end-to-end test or demo as follows:

  1. Start a local testnet with anvil by running:

    anvil

    Once anvil is started, keep it running in the terminal, and switch to a new terminal.

  2. Set your environment variables:

    Note: This requires having access to a Bonsai API Key. To request an API key complete the form here.

    Alternatively you can generate your proofs locally, assuming you have a machine with an x86 architecture and Docker installed. In this case do not export Bonsai related env variables.

    # Anvil sets up a number of default wallets, and this private key is one of them.
    export ETH_WALLET_PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
    export BONSAI_API_KEY="YOUR_API_KEY" # see form linked in the previous section
    export BONSAI_API_URL="BONSAI_API_URL" # provided with your api key
  3. Deploy the ERC20 Toyken contract:

    forge script --rpc-url http://localhost:8545 --broadcast script/DeployERC20.s.sol
    

    Save the ERC20 Toyken contract address to an env variable:

    export TOYKEN_ADDRESS=#COPY ERC20 TOYKEN ADDRESS FROM DEPLOY LOGS
    

    You can also use the following command to set the contract address if you have jq installed:

    export TOYKEN_ADDRESS=$(jq -re '.transactions[] | select(.contractName == "ERC20") | .contractAddress' ./broadcast/DeployERC20.s.sol/31337/run-latest.json)
  4. Mint some Toyken:

    cast send --private-key $ETH_WALLET_PRIVATE_KEY --rpc-url http://localhost:8545 $TOYKEN_ADDRESS 'mint(address, uint256)' 0x9737100D2F42a196DE56ED0d1f6fF598a250E7E4 100
    

    Now the account at address 0x9737100D2F42a196DE56ED0d1f6fF598a250E7E4 should have 100 Toyken.

  5. Build the project:

    Before building the project, make sure the contract address on both the methods/guest/src/bin/balance_of.rs as well apps/src/bin/publisher.rs is set to the value of your deployed TOYKEN_ADDRESS:

    const CONTRACT: Address = address!("<PLACE YOUR TOYKEN ADDRESS HERE>");

    Then run:

    cargo build
  6. Deploy the Counter contract by running:

    forge script --rpc-url http://localhost:8545 --broadcast script/DeployCounter.s.sol

    This command should output something similar to:

    ...
    == Logs ==
    Deployed RiscZeroGroth16Verifier to 0x5FbDB2315678afecb367f032d93F642f64180aa3
    Deployed Counter to 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512
    ...

    Save the Counter contract address to an env variable:

    export COUNTER_ADDRESS=#COPY COUNTER ADDRESS FROM DEPLOY LOGS

    You can also use the following command to set the contract address if you have jq installed:

    export COUNTER_ADDRESS=$(jq -re '.transactions[] | select(.contractName == "Counter") | .contractAddress' ./broadcast/DeployCounter.s.sol/31337/run-latest.json)

Interact with your local deployment

  1. Query the state:

    cast call --rpc-url http://localhost:8545 ${COUNTER_ADDRESS:?} 'get()(uint256)'
  2. Publish a new state

    cargo run --bin publisher -- \
        --chain-id=31337 \
        --rpc-url=http://localhost:8545 \
        --contract=${COUNTER_ADDRESS:?} \
        --account=0x9737100D2F42a196DE56ED0d1f6fF598a250E7E4
  3. Query the state again to see the change:

    cast call --rpc-url http://localhost:8545 ${COUNTER_ADDRESS:?} 'get()(uint256)'

Deploy your project on a testnet

You can deploy the Counter contract on a testnet such as Sepolia and run an end-to-end test or demo as follows:

Note: we'll be using an existing ERC20 contract for this example, specifically the USDT ERC20 contract deployed on Sepolia at address 0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0.

  1. Get access to Bonsai and an Ethereum node running on a given testnet, e.g., Sepolia (in this example, we will be using Alchemy as our Ethereum node provider) and export the following environment variables:

    Note: This requires having access to a Bonsai API Key. To request an API key complete the form here.

    Alternatively you can generate your proofs locally, assuming you have a machine with an x86 architecture and Docker installed. In this case do not export Bonsai related env variables.

    export BONSAI_API_KEY="YOUR_API_KEY" # see form linked in the previous section
    export BONSAI_API_URL="BONSAI_API_URL" # provided with your api key
    export ALCHEMY_API_KEY="YOUR_ALCHEMY_API_KEY" # the API_KEY provided with an alchemy account
    export ETH_WALLET_PRIVATE_KEY="YOUR_WALLET_PRIVATE_KEY" # the private hex-encoded key of your Sepolia testnet wallet
  2. Build the project:

    Before building the project, make sure the contract address on both the methods/guest/src/bin/balance_of.rs as well apps/src/bin/publisher.rs is set to aA8E23Fb1079EA71e0a56F48a2aA51851D8433D0

    const CONTRACT: Address = address!("aA8E23Fb1079EA71e0a56F48a2aA51851D8433D0");

    Then run:

    cargo build
  3. Deploy the Counter contract by running:

    forge script script/DeployCounter.s.sol --rpc-url https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY:?} --broadcast

    This command should output something similar to:

    ...
    == Logs ==
    Deployed RiscZeroGroth16Verifier to 0x5FbDB2315678afecb367f032d93F642f64180aa3
    Deployed Counter to 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512
    ...

    Save the Counter contract address to an env variable:

    export COUNTER_ADDRESS=#COPY COUNTER ADDRESS FROM DEPLOY LOGS

    You can also use the following command to set the contract address if you have jq installed:

    export COUNTER_ADDRESS=$(jq -re '.transactions[] | select(.contractName == "Counter") | .contractAddress' ./broadcast/DeployCounter.s.sol/11155111/run-latest.json)

Interact with your testnet deployment

  1. Query the state:

    cast call --rpc-url https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY:?} ${COUNTER_ADDRESS:?} 'get()(uint256)'
  2. Publish a new state

    cargo run --bin publisher -- \
        --chain-id=11155111 \
        --rpc-url=https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY:?} \
        --contract=${COUNTER_ADDRESS:?} \
        --account=0x9737100D2F42a196DE56ED0d1f6fF598a250E7E4
  3. Query the state again to see the change:

    cast call --rpc-url https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY:?} ${COUNTER_ADDRESS:?} 'get()(uint256)'