Доказы Меркла
Кожнае вырашэнне імя, якое вяртае API, суправаджаецца доказам Меркла. Ён дазваляе зверыць адказ з коранем стану, а не давяраць серверу, які яго прыслаў.
Дрэва
PiNS захоўвае ўсе імёны ў кампактным разрэджаным дрэве Меркла над 128-бітавай прасторай
ключоў. Ключ імя — гэта першыя 16 байтаў SHA-256(domain_name), таму імёны размяркоўваюцца
раўнамерна і ніхто не можа выбраць, куды трапіць яго імя.
«Кампактнае» азначае, што ліст размяшчаецца на мінімальнай глыбіні, дзе прэфікс яго ключа ўнікальны, а не на фіксаванай глыбіні 128. У дрэве з некалькімі тысячамі імёнаў большасць доказаў складаецца ўсяго з дзясятка з невялікім хэшаў — дастаткова мала, каб праверыць іх на тэлефоне, у пашырэнні браўзера ці ўнутры гаманца.
Два наступствы, пра якія варта ведаць, перш чым пісаць верыфікатар:
- Даўжыня доказу непастаянная. Чытайце
proof_depthз адказу і ніколі не разлічвайце на фіксаваны памер. - Пустое паддрэва — гэта 32 нулявыя байты на любой вышыні. Таму корань пустога дрэва
складаецца з адных нулёў: толькі што ініцыялізаваны індэксатар, які паведамляе
0000…0000, працуе правільна, а не зламаны.
Што змяшчае доказ
| Поле | Значэнне |
|---|---|
merkle_proof | суседнія хэшы, [0] — самы глыбокі (бліжэйшы да ліста) |
proof_depth | колькасць суседзяў — мусіць супадаць з merkle_proof.length |
proof_terminal | што знаходзіцца ў канцы шляху: Occupied, Vacant або Blocked |
smt_root | корань, які аднаўляюць гэтыя суседзі |
Наяўнасць і адсутнасць
Менавіта тэрмінал дазваляе доказу сцвярджаць «гэтае імя не зарэгістравана» гэтак жа пераканаўча, як і «зарэгістравана»:
Occupied— у канцы шляху стаіць уласны ліст гэтага ключа. Імя існуе, і выдадзены вам запіс — той самы, што ляжыць у дрэве.Vacant— там пустое паддрэва. Імя не зарэгістравана.Blocked— гэтую пазіцыю займае ліст іншага імя. Імя не зарэгістравана; адказ нясе блакіруючы запіс, так што вы можаце пераканацца, што ён хэшуецца ў знойдзены там ліст і што яго ключ сапраўды падзяляе той жа прэфікс.
Без Blocked індэксатар мог бы схаваць рэгістрацыю, заявіўшы, што слот пусты. Паколькі
блакіруючы запіс уключаны цалкам, гэтую заяву можна праверыць, а не прыняць на веру.
Праверка
Захэшуйце запіс у ліст, затым згарніце суседзяў назад да кораня, вызначаючы на кожным кроку па
бітах ключа, ісці налева ці направа. Калі вы прыйшлі да smt_root, запіс — роўна тое, што фіксуе
дрэва.
Застаецца адно пытанне: а smt_root — гэта сапраўдны корань? Адказ дае якарны кантракт у BNB
Smart Chain. Абодва крокі, з правераным кодам на Python, PHP і JavaScript, апісаны ў раздзеле
Праверка доказаў.