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_depthtừ 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…0000là đúng, không phải hỏng.
Bằng chứng chứa những gì
| Trường | Ý nghĩa |
|---|---|
merkle_proof | các băm anh em, [0] sâu nhất (gần lá nhất) |
proof_depth | số lượng anh em — phải bằng merkle_proof.length |
proof_terminal | thứ nằm ở cuối đường đi: Occupied, Vacant hoặc Blocked |
smt_root | gố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.