Zum Hauptinhalt springen

Beweise überprüfen

Beweise selbst überprüfen

Bei den Beweisen handelt es sich um komprimierte Standard-SP1-Proofe. Überprüfen Sie sie mit dem SP1 SDK:

use sp1_sdk::{ProverClient, SP1ProofWithPublicValues};

let client = ProverClient::from_env();
let (_, vk) = client.setup(ELF);
let proof = SP1ProofWithPublicValues::load("proof.bin")?;
client.verify(&proof, &vk)?;

Der Verifizierungsschlüssel ist deterministisch und wird von der Binärdatei des Gastprogramms abgeleitet. Jeder kann es reproduzieren.
Die Unveränderlichkeit des ZkEVM SP1-Gastprogramms wird durch Program Key bewiesen. Der Quellcode des Prüfers ist unter GitHub verfügbar. Jeder kann es kompilieren und die Programmschlüssel vergleichen. Der Programmschlüssel wird geändert, wenn Änderungen im SP1-Gastprogramm vorgenommen werden.

Überprüfung des Namensnachweises

Wenn Sie einen Namen auflösen, gibt die API einen Mitgliedschaftsnachweis im Feld merkle_proof zurück, der aus 128 Geschwister-Hashes besteht. Sie können diese Geschwister-Hashes verwenden, um die Zuordnung zwischen dem Domänennamen und der Zieladresse shielded lokal zu überprüfen.

Hier sind Beispiele in Python, PHP und JavaScript, die zeigen, wie der Sparse Merkle Tree (SMT)-Beweis eines aufgelösten Namens überprüft wird:

import hashlib

def get_bit(key_bytes, bit_idx):
"""
Returns the bit value (0 or 1) at a given index (0 to 127)
from MSB to LSB of the 16-byte key.
"""
byte_pos = bit_idx // 8
bit_pos = 7 - (bit_idx % 8)
return (key_bytes[byte_pos] >> bit_pos) & 1

def verify_smt_proof(domain_name, target_address, merkle_proof, expected_root):
# 1. Compute key as SHA-256 of lowercase domain name
key_hash = hashlib.sha256(domain_name.lower().encode('utf-8')).digest()
# Take first 16 bytes (128 bits) for a depth-128 SMT
key = key_hash[:16]

# 2. Compute leaf hash as SHA-256 of target address
current = hashlib.sha256(target_address.encode('utf-8')).digest()

# 3. Hash up the tree using the 128 sibling hashes
# Sibling proof array goes from bottom (closest to leaf, index 0) to top (closest to root, index 127)
for i in range(128):
sibling = bytes.fromhex(merkle_proof[i])

# Level 127 (index 0) corresponds to the bottom-most bit (bit 127)
# Level 0 (index 127) corresponds to the top-most bit (bit 0)
bit_idx = 127 - i
bit = get_bit(key, bit_idx)

if bit == 1:
# Current node is on the right, sibling is on the left
current = hashlib.sha256(sibling + current).digest()
else:
# Current node is on the left, sibling is on the right
current = hashlib.sha256(current + sibling).digest()

return current.hex() == expected_root.lower()