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

Bằng chứng Merkle

Mọi kết quả phân giải mà API trả về đều kèm một bằng chứng Merkle. Nó cho phép bạn đối chiếu câu trả lời với một gốc trạng thái thay vì tin vào máy chủ đã gửi nó.

Cây

PiNS lưu mọi tên trong một cây Merkle thưa nén trên không gian khóa 128 bit. Khóa của một tên là 16 byte đầu của SHA-256(domain_name), nên các tên phân bố đều và không ai chọn được tên của mình sẽ rơi vào đâu.

«Nén» nghĩa là một lá nằm ở độ sâu nông nhất mà tiền tố khóa của nó là duy nhất, thay vì ở độ sâu cố định 128. Trong một cây chứa vài nghìn tên, phần lớn bằng chứng chỉ gồm hơn chục băm — đủ nhỏ để kiểm chứng trên điện thoại, trong tiện ích mở rộng trình duyệt hay bên trong một ví.

Hai hệ quả nên biết trước khi viết bộ kiểm chứng:

  • Độ dài bằng chứng thay đổi. Hãy đọc proof_depth từ phản hồi; đừng bao giờ giả định một kích thước cố định.
  • Một cây con rỗng là 32 byte 0 ở mọi độ cao. Vì thế gốc của cây rỗng toàn số 0 — một trình lập chỉ mục vừa khởi tạo báo 0000…0000 là đúng, không phải hỏng.

Bằng chứng chứa những gì

TrườngÝ nghĩa
merkle_proofcác băm anh em, [0] sâu nhất (gần lá nhất)
proof_depthsố lượng anh em — phải bằng merkle_proof.length
proof_terminalthứ nằm ở cuối đường đi: Occupied, Vacant hoặc Blocked
smt_rootgốc mà các anh em này dựng lại

Sự hiện diện và sự vắng mặt

Chính terminal cho phép một bằng chứng khẳng định «tên này chưa được đăng ký» thuyết phục ngang với «đã được đăng ký»:

  • Occupied — ở cuối đường đi là lá của chính khóa đó. Tên tồn tại, và bản ghi bạn nhận được đúng là bản ghi nằm trong cây.
  • Vacant — ở đó là một cây con rỗng. Tên chưa được đăng ký.
  • Blocked — vị trí đó bị lá của một tên khác chiếm giữ. Tên chưa được đăng ký; phản hồi mang theo bản ghi chặn để bạn kiểm chứng rằng nó băm ra đúng lá tìm thấy ở đó và khóa của nó thực sự chia sẻ cùng tiền tố.

Nếu không có Blocked, một trình lập chỉ mục có thể giấu một lần đăng ký bằng cách bảo rằng chỗ đó trống. Vì bản ghi chặn được đưa vào đầy đủ, bạn có thể kiểm chứng lời khẳng định thay vì chấp nhận nó.

Kiểm chứng

Băm bản ghi thành một lá, rồi gấp các anh em ngược về gốc, dùng các bit của khóa để quyết định trái hay phải ở mỗi bước. Nếu bạn đến được smt_root thì bản ghi đúng là thứ mà cây cam kết.

Vẫn còn một câu hỏi: smt_root có phải là gốc thật không? Hãy trả lời bằng cách hỏi hợp đồng neo trên BNB Smart Chain. Cả hai bước, kèm mã đã kiểm thử bằng Python, PHP và JavaScript, đều có tại Kiểm chứng bằng chứng.