Skip to content

Instantly share code, notes, and snippets.

@artem-bakuta
Last active February 6, 2024 09:56
Show Gist options
  • Save artem-bakuta/143c0c759cab99596e44ef7086b2b6bc to your computer and use it in GitHub Desktop.
Save artem-bakuta/143c0c759cab99596e44ef7086b2b6bc to your computer and use it in GitHub Desktop.
Python Script to verify vk.json and compression-snark.json with generating them from https://github.com/artem-bakuta/Nova/tree/solidity-verifier-pp-spartan-keys_verifier
import subprocess
import sys
import os
import re
def execute_shell_command(command):
try:
result = subprocess.run(command, shell=True, capture_output=True, text=True)
return result.stdout
except subprocess.CalledProcessError as e:
print(f"Error occurred: {e}")
return None
def extract_contract_addresses(input_string):
# Regular expression pattern to match contract addresses
pattern = r'Contract Address: (0x[0-9a-fA-F]+)'
# Find all matches using re.findall()
matches = re.findall(pattern, input_string)
return matches
# python3 VkCompressionSnarkVerifier.py https://github.com/artem-bakuta/Nova.git 24563368378592c41ddb551238b593863f7b136b http://127.0.0.1:8545 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
if __name__ == "__main__":
# Configurations
nova_repo_url = sys.argv[1]
solidity_verifier_repo_url = "https://github.com/lurk-lab/solidity-verifier.git"
nova_commit_hash = sys.argv[2]
node_url = sys.argv[3]
node_private_key = sys.argv[4]
target_directory = "verify_cache"
nova_directory = "nova"
solidity_verifier_directory = "solidity-verifier"
# Main logic
if os.path.exists(target_directory):
subprocess.run(['rm', '-rf', target_directory], check=True)
os.mkdir(target_directory)
os.mkdir(target_directory + "/" + nova_directory)
os.mkdir(target_directory + "/" + solidity_verifier_directory)
os.chdir(target_directory)
os.system(f"git clone {nova_repo_url} {nova_directory}")
os.chdir(nova_directory)
os.system(f"git checkout {nova_commit_hash}")
os.system(f"cargo +nightly test solidity_compatibility_e2e_pasta --release")
os.chdir("..")
os.system(f"git clone {solidity_verifier_repo_url} {solidity_verifier_directory}")
os.chdir(solidity_verifier_directory)
os.system(f"git checkout pasta")
os.system(f"git pull")
os.system(f"forge clean")
os.system(f"forge build")
output = execute_shell_command(f"forge script script/Deployment.s.sol NovaVerifierDeployer --fork-url {node_url} --private-key {node_private_key} --broadcast --non-interactive")
contract_addresses = extract_contract_addresses(output)
contract_address = contract_addresses[-1]
print("Copy generated keys form Nova...")
os.system(f"cp ../{nova_directory}/vk.json ../{nova_directory}/compressed-snark.json .")
print("Loading keys into contract...")
os.system(f"python3 loader.py vk.json compressed-snark.json {contract_address} {node_url} {node_private_key}")
print("Deploying contract...")
print("Result:")
os.system(f"cast call {contract_address} \"verify(uint32,uint256[],uint256[],bool)(bool)\" \"3\" \"[1]\" \"[0]\" \"true\" --rpc-url {node_url} --private-key {node_private_key}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment