Перейти к основному содержимому

Проверка доказательств

Проверка доказательств самостоятельно

Доказательства представляют собой стандартные сжатые доказательства SP1. Проверьте их с помощью 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)?;

Ключ проверки является детерминированным, полученным из двоичного файла гостевой программы. Любой может воспроизвести это.
Неизменяемость гостевой программы ZkEVM SP1 подтверждается Program Key. Исходный код прувера доступен на GitHub. Любой желающий может скомпилировать его и сравнить ключи программы. Программный ключ будет изменен, если в гостевой программе SP1 будут выполнены какие-либо изменения.

Проверка проверки имен

Когда вы разрешаете имя, API возвращает подтверждение членства внутри поля merkle_proof, состоящего из 128 одноуровневых хешей. Вы можете использовать эти одноуровневые хэши для проверки соответствия между именем домена и целевым адресом shielded локально.

Вот примеры на Python, PHP и JavaScript, показывающие, как проверить доказательство разрешенного имени с помощью разреженного дерева Меркла (SMT):

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