Skip to main content

Доказы Меркла

Кожнае вырашэнне імя, якое вяртае 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, апісаны ў раздзеле Праверка доказаў.