Ana içeriğe geç

Kanıtların Doğrulanması

Kanıtları Kendiniz Doğrulamak

Kanıtlar standart SP1 sıkıştırılmış provalardır. Bunları SP1 SDK'sıyla doğrulayın:

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)?;

Doğrulama anahtarı deterministiktir ve konuk programın ikili dosyasından türetilir. Herkes onu çoğaltabilir.
ZkEVM SP1 misafir programının değişmezliği Program Anahtarı ile kanıtlanmıştır. Doğrulayıcının kaynak kodu GitHub adresinde mevcuttur. Herkes bunu derleyebilir ve Program Anahtarlarını karşılaştırabilir. SP1 konuk programında herhangi bir değişiklik yapılması durumunda Program Anahtarı değiştirilecektir.

İsim kanıtını kontrol etme

Bir adı çözümlediğinizde, API, merkle_proof alanı içinde 128 kardeş karmadan oluşan bir üyelik kanıtı döndürür. Etki alanı adı ile hedef shielded adresi arasındaki eşlemeyi yerel olarak doğrulamak için bu kardeş karmaları kullanabilirsiniz.

Çözümlenmiş bir adın Seyrek Merkle Ağacı (SMT) kanıtının nasıl doğrulanacağını gösteren Python, PHP ve JavaScript örnekleri:

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()