Skip to content

FastPQ

FastPQ нь Iroha-ийн сонгогдсон гүйцэтгэх үр нөлөөний STARK баталгааны зам юм. Энэ нь хэвийн транзакцын гүйцэтгэл эсвэл санал нэгдлийг залгамжладаггүй. Транзакцын аливаа үйл ажиллагаа нь хэвийн байдлаар ISI, IVM болон Sumeragi-ээр явагддаг; FastPQ нь тодорхойлолт гүйцэтгэх гэрчиг хэрэглэж, дэмжсэн үр дагаврыг баталгааны багц руу хувиргана.

Одоогийн хөтөч интеграцынд гурван гол зам байдаг:

  • Блок гүйцэтгэх явцад бүртгэгдсэн санхүүгийн хөрөнгийн ил тод шилжилт
  • Nexus баталгаажуулсан замын релейн AXT хяналтын хувилбар нь FastPQ хамааралтай
  • SCCP нээлттэй хяналтын хуудастай FastPQ баталгааг буулгасан ил тод мэдээллийн баталгаажуулах туслах

Гэрчлэлийн замыг шилжүүлнэ

Ил тод санхүүгийн шилжилт нь заавар тэнцвэрийг өөрчлөх үед бүтэцтэй шилжилтийн шилжилтийг бий болгож байна.

  • эх сурвалж, түлхүүжилтийн сан, хөрөнгийн тодорхойлолтын хэмжээ
  • Гаалийн өмнө болон дараагийн дамжуулагч, хүлээн авагчийн үлдэгдэл
  • бүтээн байгуулалтын нэвтрүүлгийн цэг хэши нь бац хэшээр ашиглагддаг
  • Гаалийн бүртгэлээс үүдэлтэй эрх мэдлийн тэмдэг
  • "Poseidon digest" нь нэг делта-тай шилжилт хийхэд

Багтын шилжүүлэн суулгах нь хэд хэдэн делтатай нэг бичгийг ашигладаг. Энэ тохиолдолд "Посейдон"-ын нэг делта шинжилгээгүй байна.

Блок эцэслэхэд Iroha эдгээр транскриптүүдийг нэвтрэх нүктейн хэшээр бүлэглэдэг. гүйцэтгэх гэрч нь дараа нь эх сурвалжийн транскриптын багц болон проверд бэлтгэсэн FastPQ шилжилтийн хувилбарыг авч байна.

Трансфер дельта нь хоёр шилжилтийн шугам болж байна:

Зураг .Нүүрний хэлбэрАлбан үнэлгээЭдгээрийн дараа
Гаалийн төлбөрasset/<asset-definition>/<source-account>төлөөлөгчийн тэнцвэр өмнөтөлөөлөгчийн тэнцвэр дараа
Хөрөнгө авдагч .asset/<asset-definition>/<destination-account>хүлээн авагчдын үлдэгдэл өмнөхүлээн авагчдын үлдэгдэл

Санхүүгийн үнэ цэнэүүдийг бүрэн тоот гэрчийн нэгжүүдэд хэвийн болгодог. FastPQ цуврал нь сонгогдсон арван шатны хэмжээнд манлай бус u64 хэлбэрээр илэрхийлж чадахгүй бол үнэ цэнэг татгалзах юм.

Төрийн хөрөнгө оруулалт

FastPQ шилжих хэсгээс бүрт нь баталгааг блок болон гүйцэтгэх хүрээнд холбодог олон нийтийн өгөгдлийг авч байна:

НэвтрүүлэгЭнэ нь юу вэ?
dsidМэдээллийн орон тооны тодруулгыг бага хэмжээний байт гэж кодлуулсан
slotБлок үүсгэх хугацаа нь нано секундээр хувиргагдлаа
old_rootТухайн цаазын гэрчээс гаргасан эцэг эх улсын үндэсний .
new_rootЦагдаагийн цагдаагийн албаны гэрчээс үүдэлтэй .
perm_rootАжилтай үүрэг гүйцэтгэх зөвшөөрлийн талаар Посейдоны үүрэг
tx_set_hashХашиг тавигдсан транзакцын болон цаг хугацааны хөдөлгөөнт нэвтрэх нүктейн хашиг

Үйлчлөгч нь fastpq-lane-balanced -ийг эдгээр цувралын санхүүгийн параметрын хувьд ашигладаг.

Математикийн загвар

Энэ хэсэг нь одоогийн Rust провер болон санхүүжүүлэгчээр хэрэгжүүлж буй аритметикийн талаар тодорхойлдог. Доорх бүх талбайн үйлдэл нь Голдилокс үндсэн талбай дээр байна:

F=Fp,p=264232+1 F = \mathbb{F}_p,\qquad p = 2^{64} - 2^{32} + 1

FastPQ Poseidon2 дээр ашигладаг F Хөдөөний үүрэг гүйцэтгэгчдэд зориулсан. t = 3, түвшин r = 2, болон хүчин чадал 1. Хаш нь талбайн элементүүдийг түвшин-2 блок дээр шатааж, нэг талбарын элементийг нэмнэ 1 эцсийн өөрчлөлтийн өмнө:

HF(x0,,xm1)=Poseidon2F(x0,,xm1,1) H_F(x_0,\ldots,x_{m-1}) = \operatorname{Poseidon2}_F(x_0,\ldots,x_{m-1},1)

Байт шугам нь 7 байтын жижиг андиан бөмбөгүүдэд багтаж байгаа тул бөмбэг бүр p -ээс гүнзгий доош байна:

pack(b)j=i=06b7j+i28i,0pack(b)j<p \operatorname{pack}(b)_j = \sum_{i=0}^{6} b_{7j+i}2^{8i},\qquad 0 \leq \operatorname{pack}(b)_j < p

Доменийн хоорондоо хуваагдсан талбарын хашиг дараах байдлаар илэрхийлэх:

HD(m)=HF(pack(D),pack(D),pack(m),pack(m)) H_D(m) = H_F( |\operatorname{pack}(D)|,\operatorname{pack}(D), |\operatorname{pack}(m)|,\operatorname{pack}(m) )

Байт доменийн дизестээс эхэлж буй хашийн хувьд FastPQ эхний найман жижиг андиан байтыг талбайд зурдаг:

seed(D)=le64(Hash(D)[0..8])modp \operatorname{seed}(D)= \operatorname{le64}(\operatorname{Hash}(D)[0..8])\bmod p

Энд Hash нь Iroha-ийн iroha_crypto::Hash::new, Blake2bVar-ын 32 байтын хоолой гэсэн утгатай бөгөөд тодорхой хэлбэрээр Poseidon2 эсвэл SHA-256 гэж нэрлэдэггүй бол.

Газарны аритметикийн

Үндсэн хуулийн Rust код нь талбайн элементийг каноник хэлбэрээр илэрхийлдэг u64 түвшинд [0,p). Үүнд нэмэлт, хатуулах нь:

a+Fb=(a+b)modp a +_F b = (a+b)\bmod p

aFb=(ab)modp a -_F b = (a-b)\bmod p

Хөдөлгөөн нь хамгийн түрүүнд 128 битүүний бүтээгдэхүүнийг тооцоодог:

ab=lo+264hi a\cdot b = \operatorname{lo} + 2^{64}\operatorname{hi}

Дараа нь Goldilocks бууруулалтын нэрсийг ашигладаг:

2642321(modp) 2^{64}\equiv2^{32}-1\pmod p

Хэрэв:

hi=hilo+232hihi \operatorname{hi}=\operatorname{hi}_{lo}+2^{32}\operatorname{hi}_{hi}

Дараа нь буурч тооцоолдог:

lo+232hilohilohihi(modp) \operatorname{lo} +2^{32}\operatorname{hi}_{lo} -\operatorname{hi}_{lo} -\operatorname{hi}_{hi} \pmod p

Хөдөлгөөн нь p -ийг нэмж, буцааж, үр дүн нь каноник байх хүртэл нөхцөлтэй. Балансын делта гэх мэт гарын үсэг зурсан бүрэн дугаардыг:

field(x)=xmodp,0field(x)<p \operatorname{field}(x)=x\bmod p,\qquad 0\leq\operatorname{field}(x)<p

Poseidon2 Пермутация

Poseidon2 -ийн өөрчлөлтийн байдал:

x=(x0,x1,x2)F3 \mathbf{x}=(x_0,x_1,x_2)\in F^3

Түүний S-бокс нь:

S(x)=x5 S(x)=x^5

FastPQ дөрвөн бүрэн эргэлт, 57 хэсэгчилсэн эргэлт дараа нь дөрвөн илүү бүрэн эргэлтийн ашигладаг. c_r = (c_{r,0}, c_{r,1}, c_{r,2}) нь:

x=M[S(x0+cr,0)S(x1+cr,1)S(x2+cr,2)] \mathbf{x}' = M\cdot \begin{bmatrix} S(x_0+c_{r,0})\\ S(x_1+c_{r,1})\\ S(x_2+c_{r,2}) \end{bmatrix}

Үргэлт нь:

x=M[S(x0+cr,0)x1+cr,1x2+cr,2] \mathbf{x}' = M\cdot \begin{bmatrix} S(x_0+c_{r,0})\\ x_1+c_{r,1}\\ x_2+c_{r,2} \end{bmatrix}

Бүх нэмэлт, үрчлэл нь F. Каноникийн MDS матриц бол:

M=[0x982513a23d22b5920xa3115db8cf1d9c900x46ba684b9eee84b70xbe3dce25491db7680xfb0a6f731943519f0xfce5bd953cde18960xe624719c41eb1a090xd2221b0f1aa2ebc40x1ab5e60d03ad44bc] M= \begin{bmatrix} \texttt{0x982513a23d22b592} & \texttt{0xa3115db8cf1d9c90} & \texttt{0x46ba684b9eee84b7}\\ \texttt{0xbe3dce25491db768} & \texttt{0xfb0a6f731943519f} & \texttt{0xfce5bd953cde1896}\\ \texttt{0xe624719c41eb1a09} & \texttt{0xd2221b0f1aa2ebc4} & \texttt{0x1ab5e60d03ad44bc} \end{bmatrix}

Барилгын хэш нь нурууны байдалд эхэлдэг. Бүхэл бүтэн түвшинд-2 блок (u,v):

(x0,x1,x2)Poseidon2(x0+u,x1+v,x2) (x_0,x_1,x_2)\leftarrow \operatorname{Poseidon2}(x_0+u,x_1+v,x_2)

Хамгийн сүүлчийн блок нь 1 Хамгийн сүүлд нэг удаа эргэлт хийхээс өмнө, x_0.

Олон нийтийн мэдээллийн хэрэгслийг хамаардаг

Хост нь u64 -ийн үнэ цэнийг 16 байтын талбайны эхний найман жижиг андиан байт руу бичиж өгөгдлийн орон тооны ID-ийг кодлож байна:

dsid_bytes(d)[0..8]=le64(d),dsid_bytes(d)[8..16]=0 \operatorname{dsid\_bytes}(d)[0..8]=\operatorname{le64}(d), \qquad \operatorname{dsid\_bytes}(d)[8..16]=0

Блок үүсгэх хугацаа нь миллисекундээс наносекундад шилжиж байна:

slot=saturating_mul(creation_time_ms,1,000,000) \operatorname{slot}=\operatorname{saturating\_mul} (\operatorname{creation\_time\_ms},1{,}000{,}000)

Транзакцын багтаамж хэш нь байт доменийн хэшүүдээс ангилагдсан нэвтрэх цэгүүдийн хэшүүд:

tx_set_hash=Hash(fastpq:v1:tx_seth0hn1) \operatorname{tx\_set\_hash} = \operatorname{Hash}( \texttt{fastpq:v1:tx\_set}\|h_0\|\cdots\|h_{n-1} )

h_i нь транзакцын болон цаг хугацааг үүсгэн шилжүүлэгч хашийг ангижруулсан байдаг. Үнэлгээний олон нийтийн IO дээр, perm_root эсвэл tx_set_hash нь бүгд нөлөөтэй бол провер дутагдлын үнсийг дүүргэдэг:

perm_root={032,if there are no permission hashesHash(fastpq:v1:perm_rootp0pn1),otherwise \operatorname{perm\_root} = \begin{cases} 0^{32},& \text{if there are no permission hashes}\\ \operatorname{Hash}(\texttt{fastpq:v1:perm\_root}\|p_0\|\cdots\|p_{n-1}), & \text{otherwise} \end{cases}

tx_set_hashfallback=Hash(fastpq:v1:tx_setordering_hash) \operatorname{tx\_set\_hash}_{fallback} = \operatorname{Hash}(\texttt{fastpq:v1:tx\_set}\|\operatorname{ordering\_hash})

Санхүүгийн нормализац

Хөдөлмөрийн тухайн дельтагийн хувьд зорилтот арван шатны шкала нь хэмжээ болон хоёр тэнцвэрлэлийн хяналтын сүүлд хамгийн их хуваарилсан шкала:

s=max(scale(a),scale(f0),scale(f1),scale(t0),scale(t1)) s = \max( \operatorname{scale}(a), \operatorname{scale}(f_0), \operatorname{scale}(f_1), \operatorname{scale}(t_0), \operatorname{scale}(t_1) )

А Numeric мантиссатай үнэ цэнэ m болон хэмжээ q Зөвхөн m >= 0 болон q <= s. Энэ нь FastPQ Гэрчний үнэ нь:

norms(m,q)=m10sq \operatorname{norm}_s(m,q)=m\cdot10^{s-q}

Хөгжлийн үр дүн нь u64 хэмжээнд тохирох ёстой.

Каноникийн захирамж

Тэмцээний бүтээн байгуулалтын өмнө тавилга нь шилжилтийн товч, үйл ажиллагааны зэрэглэл, анхны оруулсан индексээр ангилагдана:

r(Transfer)=0,r(Mint)=1,r(Burn)=2,r(RoleGrant)=3,r(RoleRevoke)=4,r(MetaSet)=5 r(\operatorname{Transfer})=0,\quad r(\operatorname{Mint})=1,\quad r(\operatorname{Burn})=2,\quad r(\operatorname{RoleGrant})=3,\quad r(\operatorname{RoleRevoke})=4,\quad r(\operatorname{MetaSet})=5

Захиргааны үүрэг нь fastpq:v1:ordering доменийн болон Norito кодлагдсан шилжилтийн Poseidon2 талбайг хашижлах:

ordering_hash=HF(P(Do),P(Do),P(E(T)),P(E(T))) \operatorname{ordering\_hash} = H_F( |P(D_o)|,P(D_o),|P(E(T^\star))|,P(E(T^\star)) )

P нь 7-байтын багтаалт, E нь Norito код, D_o нь fastpq:v1:ordering бөгөөд T* бол ангилагдсан шилжилтийн жагсаалт юм.

Хөдөлмөрийн тэгшитгэл

Хөдөлмөрийн хөрөнгийн хэмжээ a, төлөөлөгчийн тэнцвэр f, болон хүлээн авагчдын тэнцвэр t, FastPQ илтгэлийг бүрдүүлэхээс өмнө дүрэмчилсэн гэрчийн үнэ цэнэүүдийг баталгаажуулна:

f0a f_0 \geq a

f1=f0a f_1 = f_0 - a

t1=t0+a t_1 = t_0 + a

Дараа нь шилжилтийн шугамд:

Δsender=f1f0=a \Delta_{\text{sender}} = f_1 - f_0 = -a

Δreceiver=t1t0=a \Delta_{\text{receiver}} = t_1 - t_0 = a

Тэмцээний дотор гарын үсэг зурсан делтаг F хэмжээнд бууруулна:

δi=(postiprei)modp \delta_i = (\operatorname{post}_i - \operatorname{pre}_i)\bmod p

Зөвлөлийн нэг-дельта шилжүүлэн суулгах дуудлага нь кодлогдсон шилжүүлэлтийн урьдчилсан зургийг гүйцэтгэдэг:

dtransfer=PoseidonHashBytes(E(from)E(to)E(asset)E(a)batch_hash) d_{\text{transfer}} = \operatorname{PoseidonHashBytes}( E(\text{from})\|E(\text{to})\|E(\text{asset})\|E(a)\|\text{batch\_hash} )

Олон дельта дамжуулах транскриптийн хувьд одоогийн формат нь энэ дээд түвшний дигест байхгүй байх шаардлагыг тавьдаг.

Үйлчлүүлэгч байгууллагаас шилжүүлэн суулгах бичиг баримт бичгийг нь:

dauthority=Hash(iroha:fastpq:v1:authority|E(authority_account)) d_{\text{authority}} = \operatorname{Hash}(\texttt{iroha:fastpq:v1:authority|}\|E(\text{authority\_account}))

Хөгжилтийн шугам

Үргэлтийн жагсаалт нь n бодит шугамтай байх ёстой. Хөгжлийн урт нь дараагийн хоёр хүчин чадал:

N=2log2(max(1,n)) N = 2^{\lceil\log_2(\max(1,n))\rceil}

0..n-1 шугам нь идэвхтэй, n..N-1 шугам нь хаалтын шугам юм. Үнэн шугам бүр нэг үйлдлийн сонгогч багтаамжтай:

sactive=stransfer+smint+sburn+srole_grant+srole_revoke+smeta_set s_{\text{active}} = s_{\text{transfer}}+ s_{\text{mint}}+ s_{\text{burn}}+ s_{\text{role\_grant}}+ s_{\text{role\_revoke}}+ s_{\text{meta\_set}}

Бүх сонгогч түвшүүд бол Булийн:

s(s1)=0 s(s-1)=0

Тусгай зөвшөөрлийн хайлтын шугам нь яг үүрэг олгох, үүргийг цуцлах шугам юм:

sperm=srole_grant+srole_revoke s_{\text{perm}} = s_{\text{role\_grant}} + s_{\text{role\_revoke}}

Сангийн үйлдлийн шугамд:

δi=value_newi,0value_oldi,0 \delta_i = \operatorname{value\_new}_{i,0} - \operatorname{value\_old}_{i,0}

Барилгын ажилтан мөн нэг хөрөнгийн тухайн делтаны үйл ажиллагааг дагаж мөрдөж байна:

Ri(a)=Ri1(a)+δifor transfer, mint, and burn rows of asset a R_i(a)=R_{i-1}(a)+\delta_i \quad\text{for transfer, mint, and burn rows of asset }a

Зөвхөн "Mint" болон "Burning" шугам нь хангамжийн тоог шинэчлэгддэг:

Si(a)=Si1(a)+{δi,if row i is mint or burn0,otherwise S_i(a)=S_{i-1}(a)+ \begin{cases} \delta_i,& \text{if row }i\text{ is mint or burn}\\ 0,& \text{otherwise} \end{cases}

Мэдээлэл мэдээлэл, өгөгдлийн орон зайн сүүрийн түвшүүд нь шурганы материализацын өмнө үүссэн талбайн хэши:

metadata_hash={0,if metadata is emptyHD(E(metadata)),otherwise \operatorname{metadata\_hash} = \begin{cases} 0,& \text{if metadata is empty}\\ H_D(E(\text{metadata})),& \text{otherwise} \end{cases}

dsid_trace=HD(public_input_dsid) \operatorname{dsid\_trace}=H_D(\operatorname{public\_input\_dsid})

Metadata hash, dataspace hash, slot нь ойр дотроо оршин суугаа шугамд тогтвортой байна:

metadata_hashi=metadata_hashi+1 \operatorname{metadata\_hash}_i=\operatorname{metadata\_hash}_{i+1}

dsidi=dsidi+1 \operatorname{dsid}_i=\operatorname{dsid}_{i+1}

sloti=sloti+1 \operatorname{slot}_i=\operatorname{slot}_{i+1}

Merkle-ийн баганаг шилжүүлнэ

Хөдөлмөрийн шугам нь 32 түвшний хялбар Merkle замыг агуулж байдаг. Үйлчлүүлэгч баталгаа байхгүй бол провер шугамны цэг, урьдчилсан тэнцвэр, шугам нь илгээгч эсвэл хүлээн авагчийн талд байгаа эсэхээс тодорхой чиглэлийг синтезлэдэг.

Синтетик замны хувьд амттай тус fastpq:smt:from илгээгч шугам, хүлээн авагч шугамд fastpq:smt:to:

K=Hash(fastpq:smt:key|saltkey) K = \operatorname{Hash}(\texttt{fastpq:smt:key|}\|\operatorname{salt}\|\operatorname{key})

V=Hash(fastpq:smt:value|saltle64(balance)) V = \operatorname{Hash}(\texttt{fastpq:smt:value|}\|\operatorname{salt}\|\operatorname{le64}(\operatorname{balance}))

b=bit(K) b_\ell = \operatorname{bit}_\ell(K)

s=Hash(fastpq:smt:sibling|le64()Kle64(balance)salt) s_\ell = \operatorname{Hash}( \texttt{fastpq:smt:sibling|}\| \operatorname{le64}(\ell)\|K\|\operatorname{le64}(\operatorname{balance})\|\operatorname{salt} )

Синтетик булан, дотоод түймэр нь:

L=Hash(fastpq:smt:leaf|KV) L = \operatorname{Hash}( \texttt{fastpq:smt:leaf|}\| K\|V )

N+1=Hash(fastpq:smt:node|leftright) N_{\ell+1} = \operatorname{Hash}( \texttt{fastpq:smt:node|}\| \operatorname{left}_\ell\| \operatorname{right}_\ell )

Тэмцээний нөөцийг бүртгэдэг b_l, ах дүү s_l, нэвтрүүлгийн түймэр x_l, болон гарааны цэг x_{l+1} Кодны салбар конвенцийн дагуу:

(left,right)={(s,x),b=0(x,s),b=1 (\operatorname{left}_\ell,\operatorname{right}_\ell)= \begin{cases} (s_\ell,x_\ell),& b_\ell=0\\ (x_\ell,s_\ell),& b_\ell=1 \end{cases}

Тусгай зөвшөөрлийн хэшүүд

Роль олгох, цуцлах шугам нь зөвшөөрлийн гэрч хэш:

hperm=HF(P(role_idpermission_idepochle)) h_{\text{perm}} = H_F(P(\operatorname{role\_id}\|\operatorname{permission\_id}\|\operatorname{epoch}_{le}))

Үйлчлүүлэгч зөвшөөрлийн ширээний гарын талыг үүргийн байт, зөвшөөрлийн байт, эпохийн байтгаар ангилдаг бөгөөд дараа нь Poseidon2 Merkle мод барьдаг:

M0[j]=hperm,j M_0[j]=h_{\text{perm},j}

Mk+1[j]=HF(seed(fastpq:v1:poseidon_node),Mk[2j],Mk[2j+1]) M_{k+1}[j] = H_F(\operatorname{seed}(\texttt{fastpq:v1:poseidon\_node}),M_k[2j],M_k[2j+1])

Хэдэн өргөн хэмжээний түвшин нь эцсийн элементийг давхарч байна.

Урьдчилгааны үүрэг

Арьсны мөрний багана c, FastPQ нь хамгийн түрүүнд арьсын доменийн дагуу баганагийн үнэ цэнэүүдийг интерполяж, коэффициент векторыг хэшээр:

Cc=HF(seed(fastpq:v1:trace:column:c),coeffs(c)) C_c = H_F( \operatorname{seed}(\texttt{fastpq:v1:trace:column:}c), \operatorname{coeffs}(c) )

Тэсний түлхүүр нь Poseidon2 Merkle-ийн түлхүүд дээр үүрэг гүйцэтгэгч:

Rtrace=MerkleRoot(C0,,Cm1) R_{\text{trace}} = \operatorname{MerkleRoot}(C_0,\ldots,C_{m-1})

Хамгийн сүүлд эзлэх үүрэг нь домен, параметрын багц, эзэлтийн хэлбэр, түвшний хоолой болон эзэлтийн чулуун дээр байт хэши юм:

commitment=Hash(len(Dc)Dclen(parameter)parameternNmC0Cm1Rtrace) \operatorname{commitment} = \operatorname{Hash}( \operatorname{len}(D_c)\|D_c\| \operatorname{len}(\text{parameter})\|\text{parameter}\| n\|N\|m\|C_0\|\cdots\|C_{m-1}\|R_{\text{trace}} )

D_c нь fastpq:v1:trace_commitment

AIR Байгууллага

V1 AIR бүрэлдэхүүний үнэ нь шугам орон нутгийн үлдэгдлийн сүлжээнд хамаардаг. Үргэлж нь хоёр бэрхшээлтэй байна:

α0,α1F \alpha_0,\alpha_1 \in F

Захиргагч нь (i,i+1) дэргэдэх арьсын хосуудын бүртгэлийн хувьд:

Ai=jαjmod2ρi,j A_i=\sum_j \alpha_{j\bmod2}\rho_{i,j}

Үндсэн үлдэгдэл rho нь:

ρ=s(s1)for each selector column \rho=s(s-1) \quad\text{for each selector column}

ρ=sactive(stransfer+smint+sburn+srole_grant+srole_revoke+smeta_set) \rho = s_{\text{active}} - (s_{\text{transfer}}+s_{\text{mint}}+s_{\text{burn}}+ s_{\text{role\_grant}}+s_{\text{role\_revoke}}+s_{\text{meta\_set}})

ρ=sperm(srole_grant+srole_revoke) \rho = s_{\text{perm}}-(s_{\text{role\_grant}}+s_{\text{role\_revoke}})

ρ=sactive,i+1(1sactive,i) \rho = s_{\text{active},i+1}(1-s_{\text{active},i})

Санхүүгийн баганатай шугам:

ρ=(stransfer+smint+sburn)((value_new0value_old0)δ) \rho = (s_{\text{transfer}}+s_{\text{mint}}+s_{\text{burn}}) \cdot ((\operatorname{value\_new}_{0}-\operatorname{value\_old}_{0})-\delta)

Мөн тогтвортой цувралтын хүрээлэн буй багана:

ρ=metadata_hashimetadata_hashi+1 \rho = \operatorname{metadata\_hash}_i-\operatorname{metadata\_hash}_{i+1}

ρ=dsididsidi+1 \rho = \operatorname{dsid}_i-\operatorname{dsid}_{i+1}

ρ=slotisloti+1 \rho = \operatorname{slot}_i-\operatorname{slot}_{i+1}

Хяналтын ажилтан шинээр A_i нь үзлэгт хамрагдсан шугамны нээлттэй ордыг тооцож, AIR -ийн бүрэлдэхүүнтэй Merkle гаралтай харьцуулахад санхүүжилтийн үнэлгээг шалгана.

Тэмцээний бүтээгдэхүүн

Тус зөвшөөрлийн хайлтын аккумулятор нь Fiat-Shamir сорилт gamma -ийг ашигладаг. s_perm болон perm_hash -ийн бага зэргийн өргөжинжилтийн үнэлгээний явцад хэрэгжиж буй бүтээгдэхүүн нь:

z0=1 z_0=1

zi+1={zi(wi+γ),sperm,i0zi,sperm,i=0 z_{i+1}= \begin{cases} z_i\cdot(w_i+\gamma),& s_{\text{perm},i}\ne0\\ z_i,& s_{\text{perm},i}=0 \end{cases}

Дашрамдсан баримт:

lookup_grand_product=HF(z0,z1,) \operatorname{lookup\_grand\_product}=H_F(z_0,z_1,\ldots)

Хэдэн зэргийн өргөтгөлт

Бичих omega_T нөөцийн доменийн генератор байх, omega_E үнэлгээний доменийн генератор, g конфигуруулсан coset offset нь. v_i, Interpolation нь коэффициентийг бий болгодог. a_j иймэрхүү:

f(ωTi)=vi f(\omega_T^i)=v_i

Төмөр зэргийн өргөтгөлийн нь косетийн ижил олон талт хэсгийг үнэлж:

LDEf(i)=f(gωEi) \operatorname{LDE}_f(i)=f(g\cdot\omega_E^i)

Энэ үзүүлэлтийг хэрэгжүүлэн FFT өмнөх coset ofset-ийн хүчин чадалтай коефициентийг дахин нэмэгдүүлэх замаар тооцож байна:

aj=ajgj a'_j = a_j g^j

дараа нь a' -ийг үнэлгээний бүсэд үнэлэх.

CPU FFT нь бутаар эргэн шилжүүлсэн өгөгдлийн дээр эргэлттэй радикс-2 Cooley-Tukey өөрчлөлт юм. Сцэний урт L, хагас урт H=L/2, шатны гарал:

ωL=ωN/L \omega_L=\omega^{N/L}

бүр бөмбөрцөг нь:

u=xj u=x_j

v=xj+HωLj v=x_{j+H}\cdot\omega_L^j

xj=u+v,xj+H=uv x_j'=u+v,\qquad x_{j+H}'=u-v

Инверс FFT нь omega^{-1} -тай ижил өөрчлөлтийг гүйцэтгэж, инверс доменын хэмжээгээр хэмждэг:

IFFT(x)=N1FFTω1(x) \operatorname{IFFT}(x)=N^{-1}\cdot\operatorname{FFT}_{\omega^{-1}}(x)

Каталогын гарал нь ашиглахаас өмнө баталгаажуулна:

ω2k=1 \omega^{2^k}=1

ω2k11(k>0) \omega^{2^{k-1}}\ne1\qquad(k>0)

Catalogue root-ээс үүдэлтэй жижиг доменүүдийн хувьд генератор нь:

ω=ωmax2kmax \omega_{\ell}=\omega_{\max}^{2^{k_{\max}-\ell}}

Зураг, арьс хаш

LDE-ийн дараа, FastPQ нь LDE шорондоох аливаа шугамаар хэшиглэдэг. m шорондоо:

ri=HF(i,m,xi,0,xi,1,,xi,m1) r_i = H_F(i,m,x_{i,0},x_{i,1},\ldots,x_{i,m-1})

Хэрэв шугам хэшүүд нь үнэлгээний доменийн оронд зардлын домен дээр хэвээр байгаа бол провер энэ нэг шугам хэшийг интерполаж, ижил coset LDE үйл явцтай өргөжүүлнэ.

Merkle-ийн нээлттэй байр

LDE хэмжээнүүд нь дараах хэсэгт хуваагддаг:

Blde=8fri_arity B_{\text{lde}}=8\cdot\operatorname{fri\_arity}

Нэг бүр нь:

Lj=HD(jvjBvjB+B1) L_j=H_D(j\|v_{jB}\|\cdots\|v_{jB+B-1})

Merkle-ийн эцэг эх нь:

Pj=HF(seed(fastpq:v1:trace:node),L2j,L2j+1) P_j = H_F(\operatorname{seed}(\texttt{fastpq:v1:trace:node}),L_{2j},L_{2j+1})

Хоёр түвшин нь хамгийн сүүлчийн түймрийг давхарч байна. Судалгааны замыг ар зүүн эсвэл баруун хэшийн дагуу шалгаруулалтын хавсрын индексийн тэнцвэрт байдлаас шалтгаалж баталгаажуулна.

Энэтхэгийн i ногооны хувьд (s_0,\ldots,s_{d-1}) зам нь R гаралтай харьцуулахад дахин давтагдалтайгаар баталгаажуулдаг:

y0=Li y_0=L_i

yk+1={HF(seed(fastpq:v1:trace:node),yk,sk),i/2k0(mod2)HF(seed(fastpq:v1:trace:node),sk,yk),i/2k1(mod2) y_{k+1}= \begin{cases} H_F(\operatorname{seed}(\texttt{fastpq:v1:trace:node}),y_k,s_k), & \lfloor i/2^k\rfloor \equiv 0 \pmod 2\\ H_F(\operatorname{seed}(\texttt{fastpq:v1:trace:node}),s_k,y_k), & \lfloor i/2^k\rfloor \equiv 1 \pmod 2 \end{cases}

Зөвхөн дараах тохиолдолд шалгалтыг хүлээн авах:

yd=R y_d=R

AIR арьсны шугам нь:

Liair=HD(imxi,0xi,m1) L^{\text{air}}_i = H_D(i\|m\|x_{i,0}\|\cdots\|x_{i,m-1})

AIR бүрэлдэхүүнтэй ногоо нь:

Licomp=HD(iAi) L^{\text{comp}}_i = H_D(i\|A_i)

LDE асуултын нээлт нь мөн үнэлгээний индекс i -д нээгдсэн үнэ цэнийг баталгаажуулсан хэсэгт орсон эсэхийг шалгаж байна.

chunk_index=iBlde \operatorname{chunk\_index}=\left\lfloor\frac{i}{B_{\text{lde}}}\right\rfloor

chunk_offset=imodBlde \operatorname{chunk\_offset}=i\bmod B_{\text{lde}}

chunk[chunk_offset]=vi \operatorname{chunk}[\operatorname{chunk\_offset}]=v_i

FRI Худаллах

FRI үүрэг гүйцэтгэдэг AIR бүрэлдэхүүний үнэлгээ. l, Үндсэн тэмдэгтийн шинжилгээний асуудал beta_l. Сүлэг нь хамгийн сүүлчийн үнэ цэнийг давтахад арьтын үр дүнг бүрдүүлж байна. Арьтын хэмжээний бүлэг бүр:

yl+1,j=k=0a1yl,ja+kβlk y_{l+1,j} = \sum_{k=0}^{a-1} y_{l,ja+k}\beta_l^k

a нь FRI хэмжээнд байдаг. Тавилгач үзлэгт хамрагдсан хайлтын сүлжээний хувьд:

yl+1,i/a=k=0a1yl,i/aa+kβlk y_{l+1,\lfloor i/a\rfloor} = \sum_{k=0}^{a-1} y_{l,\lfloor i/a\rfloor a+k}\beta_l^k

болон FRI бүлэгт нээгдсэн бүрт холбогдох FRI шатахуун гаралтайгаар баталгаажуулна.

"Fiat-Shamir Transcript"

Canonical Parameters Catalogue нь транскрипт хэшийг SHA3-256 гэж тэмдэглэдэг. Одоогийн провер болон санхүүжүүлэгч хэрэгжилтэд бэрхшээлтэй байтыг iroha_crypto::Hash::new буюу Blake2bVar-ийн 32 байтын дизестээр гаргаж, дараа нь эхний найман бага андиан байтыг F -д буулгаж байна:

χ(tag)=le64(Hash(statelen(tag)tag)[0..8])modp \chi(\text{tag}) = \operatorname{le64}(\operatorname{Hash}(\text{state}\|\operatorname{len}(\text{tag})\|\text{tag})[0..8]) \bmod p

Хөгдөлмөрийн шилжилтийн дараалал нь:

  1. олон нийтийн IO, протоколын хувилбар, параметрын хувилбар болон параметрын нэр
  2. LDE гарал, арьс гарал
  3. gamma
  4. AIR бүрэлдэхүүнд тулгамдсан асуудал alpha_0, alpha_1
  5. AIR арьс суурь, AIR бүрэлдэхүүний суурь
  6. хайлтын агуу бүтээгдэхүүн
  7. FRI шатахууны гаралт болон beta_l бэрхшээл
  8. үлгэр жишээтэй хайлтын индекс

Судалгааны шинжилгээ нь 32 байтын сорилт хэсгийг гаргаж, сурагчилсан өвөрмөц индексийн тоог олж авах хүртэл u64 бага хэмжээний хэсгүүдээр уншиж байна:

q=le64(digest chunk)modNeval q = \operatorname{le64}(\text{digest chunk})\bmod N_{\text{eval}}

Үргэлж авсан цуврал нь төрөлжсөн дараалан эргэн ирдэг.

Үнэлгээгчийн дахин тоглолт

Хяналтын ажилтан хамгийн түрүүнд цувралны үүрэг гүйцэтгэгчдийг дахин тооцоолон:

commitmentexpected=trace_commitment(params,batch) \operatorname{commitment}_{expected} =\operatorname{trace\_commitment}(\operatorname{params},\operatorname{batch})

болон дараах шаардлагыг:

commitmentexpected=proof.trace_commitment \operatorname{commitment}_{expected} =\operatorname{proof.trace\_commitment}

Түүнчлэн IO олон нийтэд сэргээн босгож байна:

PublicIO=(dsid,slot,old_root,new_root,perm_root,tx_set_hash,ordering_hash,permission_hashes) \operatorname{PublicIO}= (\operatorname{dsid},\operatorname{slot},\operatorname{old\_root}, \operatorname{new\_root},\operatorname{perm\_root}, \operatorname{tx\_set\_hash},\operatorname{ordering\_hash}, \operatorname{permission\_hashes})

Бүх талбар нь баталгааны олон нийт IO байт-байттай нийцэх ёстой. Дараа нь шалгагч ижил транскриптыг дахин боловсруулж, мөнгийг гаргадаг:

γ,α0,α1,β0,,β1,q0,,qt1 \gamma,\quad \alpha_0,\alpha_1,\quad \beta_0,\ldots,\beta_{\ell-1},\quad q_0,\ldots,q_{t-1}

Шалгалтын үзлэгт бүртгэгдсэн q асуулгад дараах нь шалгана:

MerkleVerify(Rlde,Lq/Blde,q/Blde,πlde) \operatorname{MerkleVerify}( R_{\text{lde}}, L_{\lfloor q/B_{\text{lde}}\rfloor}, \lfloor q/B_{\text{lde}}\rfloor, \pi_{\text{lde}} )

MerkleVerify(Rair,Lqair,q,πair,current) \operatorname{MerkleVerify}( R_{\text{air}}, L^{\text{air}}_q, q, \pi_{\text{air,current}} )

MerkleVerify(Rair,Lq+1modNevalair,q+1modNeval,πair,next) \operatorname{MerkleVerify}( R_{\text{air}}, L^{\text{air}}_{q+1\bmod N_{\text{eval}}}, q+1\bmod N_{\text{eval}}, \pi_{\text{air,next}} )

болон:

Aq=AIRComposition(rowq,rowq+1,α0,α1) A_q = \operatorname{AIRComposition}( \operatorname{row}_q,\operatorname{row}_{q+1},\alpha_0,\alpha_1 )

Үндсэн хуулийн AIR бүрэлдэхүүнд нээлт хийх нь R_air_composition. Үндсэн хуулийн FRI дараа нь зангилаа ижилээс эхэлнэ A_q болон баталгаажуулсан эцсийн бичигт дуусах ёстой FRI гарын үсгийн дэргэдэх FRI гаралтай.

Ухаан зохиолч юуг шалгадаг вэ

FastPQ провер нь урсгалыг үүсгэхээс өмнө хувьчлалын түлхүүр, үйл ажиллагааны зэрэгцээгээр цувралтын жагсаалтыг санхүүжүүлдэг. нэвтрүүлгийн дараалал. Үргэлтийн шугам нь мөн транскриптын метабараа шаарддаг. Хөдөлмөрийн шилжүүлэн суулгах шугамтай, аливаа шилжилтийн тэмдэглэлгүй цуврал хүчингүй.

Хөдөлмөрийн шилжүүлэн суулгах бичиг баримтын хувьд даатгалын талд дараахь шалгалтууд байна:

  • төлөөлөгчийн тэнцвэр нь бага хэмжээний урсгалыг явуулахгүй байх
  • sender_after нь sender_before - amount тэнцүү байх ёстой.
  • receiver_after нь receiver_before + amount тэнцүү байх ёстой.
  • шилжилт нь цуврал дахь шилжүүлэн суулгах бүх шугамг хамрах ёстой
  • "Poseidon"-ын нэг делта-тай хоолой, бүрэлдэхүүнтэй бол транскриптын урьдчилсан зурагтай нийцнэ.
  • Урьдчилсан хялбар-Merkle батламж нь 1-р хувилбаар шилжүүлнэ; алдагдаагүй замыг тодорхойлох синтетик батламжтай дүүргэж байна

Трэйс нь шилжүүлэн суулгах, мөрийн тэмдэг, шатаах, үүрэг олгох, үүргийг цуцлах, метадэтгэлийн багц, зөвшөөрлийн хайлтын шугам зэрэг сонгогч түвшүүдийг эзэлдэг. Санхүүгийн үйлдлийн шугамд мөн гарын үсэг зурсан делта, хөрөнгийн бүртгэлтэй делта болон нийлүүлэлтийн тоологчид байдаг.

Пробэр Лэйн

irohad нь эхлүүлэх үед FastPQ провер замыг эхлүүлж байгаа бол провер бэкэнд эхэлж болно. Lane нь хязгаарлагдмал шугамтай үндсэн ажил юм. Блок гүйцэтгэх шаһид гаргасны дараа, commit зам блок хэш, өндөр, үзэл болон шаһид бүхий провер замаар хүргүүлнэ.

Хэрэв замын хөдөлгөөн явагдахгүй эсвэл шуурхай нь дүүрэн бол ажил дуусч, хэвийн блок боловсруулалт үргэлжилнэ. Энэ нь түүнээс болж задгийн провер замыг транзакцын хүлээн зөвшөөрөл болон санал нэгдсэн хаалга биш юм.

Захиргааны заал нь:

text
parameter = "fastpq-lane-balanced"
execution_mode = auto | cpu | gpu
poseidon_mode = auto | cpu | gpu

auto шалгаруулагчаар ашиглах боломжтой хяналтын хэсгийг сонгохыг зөвшөөрнө. cpu Пинс гүйцэтгэх CPU. gpu сонгодог GPU гүйцэтгэх, CPU түлхүүр нь хүссэн цөмийн хэрэглээг ашиглаж чадахгүй тохиолдолд.

Хяналт шалгах

FastPQ баталгаажуулалтын баталгаажуулалт нь каноник хувилбарын үүргийг сэргээн босгож, олон нийтийн транскриптыг дахин боловсруулдаг. Үнэлгээгч протоколын хувилбар, параметр-саалсан хувилбарыг, нөхөн тоглоомын хязгаарлалт, мөрний үүрэг гүйцэтгэх үүрэг, олон нитгэл, үлгэр жишээтэй Merkle нээлттэй байршил, AIR нээлттэйг болон FRI хайлтын зангилаа шалгаж байна.

Үндсэн дүрслэлийн хязгаарлалтад:

ХязгаарлалтҮндсэн хуулийн дагуу
Хөгжлийн шугам256
Барилгын ачааны хэмжээ256 KiB
FRI давхаргууд16
Судалгааны нээлт128

Nexus Бүртгэгдсэн реле

Nexus AXT баталгааны хуудас нь AxtFastpqBinding. Хэзээ RegisterVerifiedLaneRelay гүйцэтгэдэг, Iroha:

  1. замын хяналтын дугуйны хувцас болон FastPQ батлан хамгаалах материалыг шалгаж байна
  2. өгөгдлийн орон зай, гарын үсэгний суурь
  3. AXT баталгааны хувилбарыг нэвтрүүлэх
  4. fastpq_binding
  5. FastPQ цувралг тухайн хамаас сэргээн босгож,
  6. Нэмэгдсэн FastPQ баталгааг буулгаж байна
  7. FastPQ баталгаажуулагчаар сэргээн босгосон цуврал болон батлагыг дууддаг.

Хэрэв шалгалт амжилттай болсон бол Iroha нь VerifiedLaneRelayRecord -ийг хадгалах бөгөөд ээлжит дуудлага, эх хуудас, баталгаажуулах ачаалал хэш, шалгалтын өндөр, манфист түшиг болон FastPQ -ийн холболттай.

Тээврийн релейн хуудас нь мөн компакт FastPQ баталгааны материалтай байдаг. Материал нь тээврийн идентификатор, мэдээллийн орчны идентификатор, блок өндөр, шалгалтын өндөр, блок толгой хэш, тохиролцооны хэш, манифест түлхнээс дээш хоолой юм. Рэле нь QC болон FastPQ баталгааны материалтай бол зөвхөн нэгтгэх боломжтой юм.

AXT Байгууллагатай математик

Nexus AXT хуурлуудын хувьд, AxtFastpqBinding нь баталгааны дахин тоглолтоос өмнө цуглуулах болно. Халуун параметрын үнэ цэнэ бол fastpq-lane-balanced; халуун шалгаруулалтын ID болон хувилбарын үндсэн тэмдэг бол fastpq болон v1; дуудлагын хэлбэр буурагдаж, доод ангилалд ордог.

AXT FastPQ олон нийтийн нэвтрүүлэг нь тодорхойлох байт хэшүүд юм:

dsid=dsid_bytes(source_dsid) \operatorname{dsid}=\operatorname{dsid\_bytes}(\operatorname{source\_dsid})

slot=le64(source_tx_commitment[0..8]) \operatorname{slot}=\operatorname{le64}(\operatorname{source\_tx\_commitment}[0..8])

old_root=Hash(fastpq-json:old_rootsource_tx_commitmentpolicy_commitmenteffect_type) \operatorname{old\_root} = \operatorname{Hash}( \texttt{fastpq-json:old\_root}\| \operatorname{source\_tx\_commitment}\| \operatorname{policy\_commitment}\| \operatorname{effect\_type} )

new_root=Hash(fastpq-json:new_rootsource_tx_commitmentclaim_digesteffect_type) \operatorname{new\_root} = \operatorname{Hash}( \texttt{fastpq-json:new\_root}\| \operatorname{source\_tx\_commitment}\| \operatorname{claim\_digest}\| \operatorname{effect\_type} )

perm_root=Hash(fastpq-json:perm_rootpolicy_commitmentverifier_idverifier_version) \operatorname{perm\_root} = \operatorname{Hash}( \texttt{fastpq-json:perm\_root}\| \operatorname{policy\_commitment}\| \operatorname{verifier\_id}\| \operatorname{verifier\_version} )

tx_set_hash=Hash(fastpq-json:tx_set_hashsource_tx_commitmentclaim_digestwitness_commitment) \operatorname{tx\_set\_hash} = \operatorname{Hash}( \texttt{fastpq-json:tx\_set\_hash}\| \operatorname{source\_tx\_commitment}\| \operatorname{claim\_digest}\| \operatorname{witness\_commitment} )

AXT шилжих түлхүүр нь:

key(prefix,x,y)=prefix/x/y \operatorname{key}(\operatorname{prefix},x,y)= \operatorname{prefix}\|\texttt{/}\|x\|\texttt{/}\|y

authorization нэхэмжлэлд тусгай зөвшөөрөл олгох шугамаар:

role_id=claim_digest \operatorname{role\_id}=\operatorname{claim\_digest}

permission_id=witness_commitment \operatorname{permission\_id}=\operatorname{witness\_commitment}

epoch=le64(policy_commitment[0..8]) \operatorname{epoch}= \operatorname{le64}(\operatorname{policy\_commitment}[0..8])

compliance дуудлага нь хоёр метадэт өгөгдлийн шугам: нэг нь бодлого, нэг нь зорилтот мэдээллийн бүс нутгийн хувьд оруулдаг.

tx_predicate болон value_conservation-ийн хувьд холболт нь эерэг эх үүсвэр эсвэл зорилтот хэмжээтэй бол тодорхой нөлөөний хэмжээг ашигладаг. Үгүй бол код нь хязгаарлагдмал дэтерминист хэмжээг гаргаж өгдөг:

bounded(d,min,span)=min+(le64(d[0..8])modmax(span,1)) \operatorname{bounded}(d,\min,\operatorname{span}) = \min + (\operatorname{le64}(d[0..8])\bmod\max(\operatorname{span},1))

Дараа нь мөн адил шилжүүлэн суулгах тэгшитгэлийг ашигладаг:

sender_after=sender_beforea \operatorname{sender\_after}=\operatorname{sender\_before}-a

receiver_after=receiver_before+a \operatorname{receiver\_after}=\operatorname{receiver\_before}+a

Синтетик төлөөлөгч, хүлээн авагчдын дансны тодруулгыг гол үржмэлээс үүсгэдэг:

seed=Hash(labelentropy)[0..32] \operatorname{seed}= \operatorname{Hash}(\operatorname{label}\|\operatorname{entropy})[0..32]

Хөдөлмөрийн шилжилтийн хэш нь:

batch_hash=Hash(labelcorridorsource_tx_commitmentclaim_digest) \operatorname{batch\_hash} = \operatorname{Hash}( \operatorname{label}\| \operatorname{corridor}\| \operatorname{source\_tx\_commitment}\| \operatorname{claim\_digest} )

AXT цувралгийн илтгэлийг SHA-256 нь Norito шилжилтийн халуун байнгын дээр:

manifest_digest=SHA256(E(canonical_binding)) \operatorname{manifest\_digest} = \operatorname{SHA256}(E(\operatorname{canonical\_binding}))

SCCP Ил тод мэдээний баталгаа

SCCP туслах хайрцаг нь ил тод сүлжээний хяналтын мэдээллийг баталгаажуулахын тулд FastPQ-ийг ашигладаг. Энэ замыг irohad дэргэдэх дамжуулагч шугамнаас тусгаарладаг. Энэ нь FastPQ хэсгийг шууд SCCP мэдээний баталгаажуулалтын багц болон манифестээс барьж, дараа нь үр дүнд хүрсэн баталгааг нээлттэй шалгаруулалтаар хуримтлах юм.

SCCP цуврал нь fastpq-lane-balanced болон гурван метадангийн шилжилт ашигладаг:

Төмөр .Үйл ажиллагаа
sccp:transparent:v1:statementMetaSet
sccp:transparent:v1:contextMetaSet
sccp:transparent:v1:payloadMetaSet

Түүний олон нийтийн өгөгдлийг SCCP ил тод дотоод баталгаанаас гаргаж авсан:

FastPQ нэвтрүүлэгSCCP эх сурвалж
dsidБлейк2Б-ийн анхны 16 байт хэшийн дагуу .
slotСүүлийн үеийн өндөр .
old_rootХөдөлмөрийн ачаалал хэш
new_rootЗохиоллын үндэс
perm_rootУрьдчилсан блок хэш
tx_set_hashМэдээллийн хаш

SCCP каноник кодер нь бүтэн тоот тоог бага хэмжээгээр бичиж, өөрчлөгдөх урттай байт хэсгийг дараах байдлаар кодлуулдаг:

vec(x)=le32(x)x \operatorname{vec}(x)=\operatorname{le32}(|x|)\|x

Олон нийтийн нэвтрүүлгийн байтын ил тод шугам нь:

P=versionmessage_idpayload_hashle32(target_domain)commitment_rootle64(finality_height)finality_block_hash P = \operatorname{version}\| \operatorname{message\_id}\| \operatorname{payload\_hash}\| \operatorname{le32}(\operatorname{target\_domain})\| \operatorname{commitment\_root}\| \operatorname{le64}(\operatorname{finality\_height})\| \operatorname{finality\_block\_hash}

Мэдээллийн ил тод байт нь хувилбар, сүлжээний гэр бүл, орон нутгийн болон өрсөлдөгчийн доменүүд, аюулгүй байдлын загвар, зөөврийн удирдлага, дансны кодек, эцсийн төлөвлөгөөний загвар, баталгаажуулагчаар чиглэсэн зорилго, баталгаажлагчаар дагаж мөрдөх гэр бүл, урттай урьдчилсан сүлжээ / дагаж мөрдөнө / ил тод талбай, зорилтот холбогч хэш юм. Тодруулгын кодэк товч, ашиг ачааллын төрөл, олон нийтийн өгөгдлийн байт, ашиг ачаалал хэш.

statement_hash=Blake2bVar32(sccp:transparent:statement:v1statement) \operatorname{statement\_hash} = \operatorname{Blake2bVar}_{32}( \texttt{sccp:transparent:statement:v1}\|\operatorname{statement} )

Энэ баталгааны замын FastPQ өгөгдлийн орон тооны идентификатор нь Blake2b-ийн өөр нэг дэглэмийн эхний зургаан байт:

dsid=Blake2bVar32(sccp:transparent:fastpq:dsid:v1statement_hash)[0..16] \operatorname{dsid} = \operatorname{Blake2bVar}_{32}( \texttt{sccp:transparent:fastpq:dsid:v1}\|\operatorname{statement\_hash} )[0..16]

SCCP FastPQ цуврал нь яг:

(sccp:transparent:v1:statement,,statement,MetaSet) (\texttt{sccp:transparent:v1:statement},\varnothing,\operatorname{statement},\operatorname{MetaSet})

(sccp:transparent:v1:context,,E(inner_proof),MetaSet) (\texttt{sccp:transparent:v1:context},\varnothing,E(\operatorname{inner\_proof}),\operatorname{MetaSet})

(sccp:transparent:v1:payload,,canonical_payload,MetaSet) (\texttt{sccp:transparent:v1:payload},\varnothing,\operatorname{canonical\_payload},\operatorname{MetaSet})

дараа нь ижил FastPQ захиалгын дүрэмээр ангилагдана.

OpenVerify баталгаажуулагчийн үүрэг гүйцэтгэх нь SHA-256, SCCP мэдээллийн хяналтын нэр болон FastPQ санхүүгийн баталгаажуулалтын тодорхойлогч дээр:

vk_hash=SHA256(message_backendverifier_descriptor) \operatorname{vk\_hash} = \operatorname{SHA256}( \operatorname{message\_backend}\|\operatorname{verifier\_descriptor} )

FastPQ-ийн түүхий эдийг баталгаажуулах баримт нь Norito-ээр StarkFriOpenProofV1 -д шифрлэгдсэн бөгөөд дараа нь OpenVerifyEnvelope -д сүлжээнд Stark хамруулсан. SCCP -ийн санхүүжилтийн үйл ажиллагаа нь ижил FastPQ -ний хувилбарыг багц болон манфистээс сэргээн босгож, нээлттэй санхүүжилтний хавсрын метадалыг шалгадаг. FastPQ баталгаажуулагчаар сэргээн босгосон цуврал болон батламж дээр дууддаг.

Параметрын багц

Canonical Parameters Catalogue нь хоёр параметрын багц илрүүлж байна. Үйлчлүүлэгч провер лен нь одоо fastpq-lane-balanced ашигладаг.

ПараметрЗорилгоГазарХашсFRI
fastpq-lane-balancedтүвшний дамжуулалт тэнцвэртэйГолдлайкс дөрвөлжин өргөтгөлийнPoseidon2 үүрэг, SHA3 жагсаалтын тэмдэг8 дугаар бүлэг, 8, 46 асуулт
fastpq-lane-latencyхориотой замаарГолдлайкс дөрвөлжин өргөтгөлийнPoseidon2 үүрэг, SHA3 жагсаалтын тэмдэг16 дахь хэсэг, 16 дэх хэсэг, 34 дахь хэсэг.

Хоёр нь 128-биттай аюулгүй байдлыг хангах зорилготой бөгөөд 2^16 доменийн зардлын хэмжээг ашигладаг. Rust V1 шилжилтийн дахин тоглох код нь одоогийн байдлаар SHA3-256-ийг шууд дуудлахын оронд Fiat-Shamir сорилтын байтдыг iroha_crypto::Hash::new-ээр дамжуулж байна.

Rust сангийн хэрэглэгддэг тохирсон каталогийн тогтмол нь:

Байнгын .fastpq-lane-balancedfastpq-lane-latency
target_security128128
grinding_bits2321
trace_log_size1616
trace_root0x002a247f81c6f8500x6a9f4eb38fb9b892
lde_log_size1920
lde_root0x60263388dbbf9b2a0x9c9c3a571b6f89ac
permutation_size65,53665,536
lookup_log_size1920
omega_coset0x6af325e825ad5c180x3a5fd4171e3c3a4d
fri_arity816
fri_blowup816
fri_max_reductions86
fri_queries4634

Байгууллага

FastPQ бүтэц нь zk.fastpq дэргэд байрладаг.

toml
[zk.fastpq]
execution_mode = "auto"
poseidon_mode = "auto"

# Optional telemetry labels.
device_class = "apple-m4"
chip_family = "m4"
gpu_kind = "integrated"

# Optional Metal backend tuning.
metal_queue_fanout = 3
metal_queue_column_threshold = 24
metal_max_in_flight = 5
metal_threadgroup_width = 128
metal_trace = false
metal_debug_enum = false
metal_debug_fused = false

Үүнтэй ижил гүйцэтгэх болон телеметрийн тэмдэгүүдийг irohad дээр нь давж залах боломжтой:

shell
irohad --fastpq-execution-mode auto
irohad --fastpq-poseidon-mode cpu
irohad --fastpq-device-class apple-m4
irohad --fastpq-chip-family m4
irohad --fastpq-gpu-kind integrated

Байгаль орчны өөрчлөлтийг конфигурацийн талбайд ч дэмждэг. FastPQ -ийн онцлог өөрчлөлтүүдийг нь:

  • FASTPQ_EXECUTION_MODE
  • FASTPQ_POSEIDON_MODE
  • FASTPQ_DEVICE_CLASS
  • FASTPQ_CHIP_FAMILY
  • FASTPQ_GPU_KIND
  • FASTPQ_METAL_QUEUE_FANOUT
  • FASTPQ_METAL_COLUMN_THRESHOLD
  • FASTPQ_METAL_MAX_IN_FLIGHT
  • FASTPQ_METAL_THREADGROUP
  • FASTPQ_METAL_TRACE
  • FASTPQ_DEBUG_METAL_ENUM
  • FASTPQ_DEBUG_FUSED

Метрикийн үзүүлэлт

Телеметри ашиглах боломжтой бол FastPQ нь бэкэнд сонгон шалгаруулалтын болон Metal Runtime үйлдлийн үзүүлэлтийг экспортлох:

МетрикЭнэ нь юу вэ?
fastpq_execution_mode_totalЗахиалгасан болон шийдвэрлэсэн гүйцэтгэх хэв маяг бэкэнд болон төхөөрөмжийн тэмдэглэлээр
fastpq_poseidon_pipeline_totalХүссэн болон шийдвэрлэсэн Poseidon урсгалын замыг
fastpq_metal_queue_depthМеталлын шугам хязгаар, нислэгт хамгийн их тоо, илгээлийн тоо, үзэсгэлэн авах цонх
fastpq_metal_queue_ratioМеталлын шугам хөдөлгөөнтэй , давхаргын харьцаа
fastpq_zero_fill_duration_msМеталлын гүйлгээний тоног төхөөрөмжийн 0 цаг хугацаа .
fastpq_zero_fill_bandwidth_gbpsҮр дүнтэй нурын өргөн нэвтрүүлэг

Бүхэл бүтэн гүйцэтгэлийг ангилахын тулд тэдгээрийг Үүнд гүйцэтгэл, метрик -д жагсаалсан санал нэгдсэн болон шуурхайгийн сигналуудтайгаар ашигла.