Chuyển tới nội dung chính

Xác minh bằng chứng

Tự mình xác minh bằng chứng

Bằng chứng là bằng chứng nén SP1 tiêu chuẩn. Xác minh chúng bằng SDK SP1:

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

Khóa xác minh có tính xác định, bắt nguồn từ mã nhị phân của chương trình khách. Bất cứ ai cũng có thể sao chép nó.
Tính bất biến của chương trình khách ZkEVM SP1 được chứng minh bằng Khóa chương trình. Mã nguồn chứng minh có sẵn trên GitHub. Bất cứ ai cũng có thể biên dịch nó và so sánh các Khóa chương trình. Khóa chương trình sẽ được thay đổi nếu có bất kỳ thay đổi nào được thực hiện trong chương trình khách SP1.

Kiểm tra bằng chứng tên

Khi bạn giải quyết một tên, API sẽ trả về bằng chứng tư cách thành viên bên trong trường merkle_proof bao gồm 128 hàm băm anh em. Bạn có thể sử dụng các hàm băm anh em này để xác minh việc ánh xạ giữa tên miền và địa chỉ shielded mục tiêu cục bộ.

Dưới đây là các ví dụ bằng Python, PHP và JavaScript cho biết cách xác minh bằng chứng Cây Merkle thưa thớt (SMT) về tên đã được giải quyết:

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