Skip to content

Commit

Permalink
fix: apply zkquiz fixes from v052 to v060 (#946)
Browse files Browse the repository at this point in the history
Co-authored-by: taturosati <[email protected]>
  • Loading branch information
uri-99 and taturosati authored Sep 9, 2024
1 parent dd52e7c commit bdda0d2
Show file tree
Hide file tree
Showing 11 changed files with 161 additions and 90 deletions.
66 changes: 26 additions & 40 deletions docs/guides/2_integrating_aligned_into_your_application.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,12 +116,13 @@ The proof submission and verification can be done either with the SDK or by usin

#### Using the SDK

To submit a proof using the SDK, you can use the `submit` function, and then you can use the `verify_proof_onchain` function to check if the proof was correctly verified in Aligned.

To submit a proof using the SDK, you can use the `submit_and_wait_verification` function.
This function submits the proof to aligned and waits for it to be verified in Aligned.
Alternatively you can call `submit` if you dont want to wait for proof verification.
The following code is an example of how to submit a proof using the SDK:

```rust
use aligned_sdk::sdk::{submit, get_next_nonce};
use aligned_sdk::sdk::{submit_and_wait_verification, get_next_nonce};
use aligned_sdk::types::{ProvingSystemId, VerificationData};
use ethers::prelude::*;

Expand All @@ -147,13 +148,33 @@ async fn submit_proof_to_aligned(
.await
.map_err(|e| anyhow::anyhow!("Failed to get next nonce: {:?}", e))?;

submit(BATCHER_URL, &verification_data, wallet, nonce).await
.map_err(|e| anyhow::anyhow!("Failed to submit proof: {:?}", e))
match submit_and_wait_verification(
BATCHER_URL,
&rpc_url,
Chain::Holesky,
&verification_data,
wallet.clone(),
nonce,
BATCHER_PAYMENTS_ADDRESS
)

submit_and_wait_verification(
BATCHER_URL,
RPC_URL,
Chain::Holesky,
&verification_data,
wallet,
nonce,
BATCHER_CONTRACT_ADDRESS
).await.map_err(|e| anyhow::anyhow!("Failed to submit proof: {:?}", e))
}

#[tokio::main]
async fn main() {
let wallet = // Initialize wallet

let wallet = wallet.with_chain_id(17000u64)

let proof = // Generate or obtain proof

match submit_proof_to_aligned(proof, wallet).await {
Expand All @@ -163,41 +184,6 @@ async fn main() {
}
```

The following code is an example of how to verify the proof was correctly verified in Aligned using the SDK:

```rust
use aligned_sdk::sdk::verify_proof_onchain;
use aligned_sdk::types::{AlignedVerificationData, Chain};
use ethers::prelude::*;
use tokio::time::{sleep, Duration};

async fn wait_for_proof_verification(
aligned_verification_data: AlignedVerificationData,
rpc_url: String,
) -> Result<(), anyhow::Error> {
for _ in 0..10 {
if verify_proof_onchain(aligned_verification_data.clone(), Chain::Holesky, rpc_url.as_str()).await.is_ok_and(|r| r) {
println!("Proof verified successfully.");
return Ok(());
}
println!("Proof not verified yet. Waiting 10 seconds before checking again...");
sleep(Duration::from_secs(10)).await;
}
anyhow::bail!("Proof verification failed")
}

#[tokio::main]
async fn main() {
let aligned_verification_data = // Obtain aligned verification data
let rpc_url = "https://ethereum-holesky-rpc.publicnode.com".to_string();

match wait_for_proof_verification(aligned_verification_data, rpc_url).await {
Ok(_) => println!("Proof verified"),
Err(err) => println!("Error: {:?}", err),
}
}
```

You can find an example of the proof submission and verification in the [ZKQuiz Program](../../examples/zkquiz/quiz/script/src/main.rs).

This example generates a proof, instantiates a wallet to submit the proof, and then submits the proof to Aligned for verification. It then waits for the proof to be verified in Aligned.
Expand Down
2 changes: 1 addition & 1 deletion examples/zkquiz/Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
deploy_verifier:
@. ./contracts/.env && . ./contracts/deploy.sh

CONTRACT_ADDRESS=0x8dB9e6f1393c3486F30181d606312ec632189621
CONTRACT_ADDRESS=0xA828f1463074d26FB761c662F80194f5dB2d31D0
RPC_URL=https://ethereum-holesky-rpc.publicnode.com
VERIFICATION_DATA=./aligned_verification_data/0a1fab5df88a71e48633cbdeedc8d1a234b790d15a8a2fd04cd6a03c1e05b5ef_212.json

Expand Down
1 change: 1 addition & 0 deletions examples/zkquiz/contracts/.env.example
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
RPC_URL=<rpc_url>
PRIVATE_KEY=<private_key>
ALIGNED_SERVICE_MANAGER_ADDRESS=<aligned_service_manager_addr># 0x58F280BeBE9B34c9939C3C39e0890C81f163B623 for Holesky
BATCHER_PAYMENT_SERVICE_ADDRESS=<batcher_payment_service_addr># 0x815aeCA64a974297942D2Bbf034ABEe22a38A003
ETHERSCAN_API_KEY=<etherscan_api_key>
9 changes: 7 additions & 2 deletions examples/zkquiz/contracts/deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ if [ -z "$ALIGNED_SERVICE_MANAGER_ADDRESS" ]; then
exit 1
fi

if [ -z "$BATCHER_PAYMENT_SERVICE_ADDRESS" ]; then
echo "BATCHER_PAYMENT_SERVICE_ADDRESS is not set. Please set it in .env"
exit 1
fi

if [ -z "$RPC_URL" ]; then
echo "RPC_URL is not set. Please set it in .env"
exit 1
Expand All @@ -24,8 +29,8 @@ fi
forge install

forge script script/Deployer.s.sol \
"$ALIGNED_SERVICE_MANAGER_ADDRESS" \
"$ALIGNED_SERVICE_MANAGER_ADDRESS" "$BATCHER_PAYMENT_SERVICE_ADDRESS" \
--rpc-url "$RPC_URL" \
--private-key "$PRIVATE_KEY" \
--broadcast \
--sig "run(address _alignedServiceManager)"
--sig "run(address _alignedServiceManager, address _paymentService)"
10 changes: 8 additions & 2 deletions examples/zkquiz/contracts/script/Deployer.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,16 @@ import {VerifierContract} from "../src/VerifierContract.sol";
contract CounterScript is Script {
function setUp() public {}

function run(address _targetContract) external returns (address) {
function run(
address _alignedServiceManager,
address _paymentService
) external returns (address) {
vm.startBroadcast();

VerifierContract verifyBatchInclusionCaller = new VerifierContract(_targetContract);
VerifierContract verifyBatchInclusionCaller = new VerifierContract(
_alignedServiceManager,
_paymentService
);

vm.stopBroadcast();

Expand Down
62 changes: 44 additions & 18 deletions examples/zkquiz/contracts/src/VerifierContract.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,20 @@ contract VerifierContract is ERC721URIStorage {
uint256 private _nextTokenId;

address public alignedServiceManager;
address public paymentServiceAddr;

bytes32 public elfCommitment = 0x35dd40ab04e180712996495caec915b8a7c488433acbb50c4d8d912cb55bf1f1;
bytes32 public elfCommitment =
0x35dd40ab04e180712996495caec915b8a7c488433acbb50c4d8d912cb55bf1f1;

// map to check if proof has already been submitted
mapping(bytes32 => bool) public mintedProofs;

constructor(address _alignedServiceManager) ERC721("Aligned Layer ZK Quiz", "AZKQ") {
constructor(
address _alignedServiceManager,
address _paymentServiceAddr
) ERC721("Aligned Layer ZK Quiz", "AZKQ") {
alignedServiceManager = _alignedServiceManager;
paymentServiceAddr = _paymentServiceAddr;
}

function verifyBatchInclusion(
Expand All @@ -27,25 +33,41 @@ contract VerifierContract is ERC721URIStorage {
bytes memory merkleProof,
uint256 verificationDataBatchIndex
) external returns (uint256) {
require(elfCommitment == provingSystemAuxDataCommitment, "ELF does not match");
require(address(proofGeneratorAddr) == msg.sender, "proofGeneratorAddr does not match");

bytes32 fullHash = keccak256(abi.encodePacked(proofCommitment,
pubInputCommitment, provingSystemAuxDataCommitment, proofGeneratorAddr));
require(!mintedProofs[fullHash], "proof already minted");
require(
elfCommitment == provingSystemAuxDataCommitment,
"ELF does not match"
);
require(
address(proofGeneratorAddr) == msg.sender,
"proofGeneratorAddr does not match"
);

(bool callWasSuccessfull, bytes memory proofIsIncluded) = alignedServiceManager.staticcall(
abi.encodeWithSignature(
"verifyBatchInclusion(bytes32,bytes32,bytes32,bytes20,bytes32,bytes,uint256)",
bytes32 fullHash = keccak256(
abi.encodePacked(
proofCommitment,
pubInputCommitment,
provingSystemAuxDataCommitment,
proofGeneratorAddr,
batchMerkleRoot,
merkleProof,
verificationDataBatchIndex
proofGeneratorAddr
)
);
require(!mintedProofs[fullHash], "proof already minted");

(
bool callWasSuccessfull,
bytes memory proofIsIncluded
) = alignedServiceManager.staticcall(
abi.encodeWithSignature(
"verifyBatchInclusion(bytes32,bytes32,bytes32,bytes20,bytes32,bytes,uint256,address)",
proofCommitment,
pubInputCommitment,
provingSystemAuxDataCommitment,
proofGeneratorAddr,
batchMerkleRoot,
merkleProof,
verificationDataBatchIndex,
paymentServiceAddr
)
);

require(callWasSuccessfull, "static_call failed");

Expand All @@ -56,15 +78,19 @@ contract VerifierContract is ERC721URIStorage {

uint256 tokenId = _nextTokenId++;
_mint(msg.sender, tokenId);
_setTokenURI(tokenId, "ipfs://QmUKviny9x2oQUegyJFFBAUU2q5rvu5CsPzrUaBSDukpHQ");
_setTokenURI(
tokenId,
"ipfs://QmUKviny9x2oQUegyJFFBAUU2q5rvu5CsPzrUaBSDukpHQ"
);

return tokenId;
}

function tokenURI(uint256 tokenId) public override view virtual returns (string memory) {
function tokenURI(
uint256 tokenId
) public view virtual override returns (string memory) {
_requireOwned(tokenId);

return "ipfs://QmUKviny9x2oQUegyJFFBAUU2q5rvu5CsPzrUaBSDukpHQ";
}

}
4 changes: 3 additions & 1 deletion examples/zkquiz/quiz/program/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@ edition = "2021"

[dependencies]
sp1-zkvm = { git = "https://github.com/succinctlabs/sp1.git", rev = "v1.0.8-testnet" }
tiny-keccak = { git = "https://github.com/sp1-patches/tiny-keccak", branch = "patch-v2.0.2", features = ["sha3"] }
tiny-keccak = { git = "https://github.com/sp1-patches/tiny-keccak", branch = "patch-v2.0.2", features = [
"sha3",
] }
52 changes: 51 additions & 1 deletion examples/zkquiz/quiz/script/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion examples/zkquiz/quiz/script/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ edition = "2021"

[dependencies]
sp1-sdk = { git = "https://github.com/succinctlabs/sp1.git", rev = "v1.0.1" }
aligned-sdk = { git = "https://github.com/yetanotherco/aligned_layer", tag = "v0.4.0" }
aligned-sdk = { git = "https://github.com/yetanotherco/aligned_layer", rev = "6908110aaa04ec3107f15ab8a8bb2603e7bbead9" }
ethers = { tag = "v2.0.15-fix-reconnections", features = [
"ws",
"rustls",
Expand Down
2 changes: 1 addition & 1 deletion examples/zkquiz/quiz/script/VerifierContract.json

Large diffs are not rendered by default.

Loading

0 comments on commit bdda0d2

Please sign in to comment.