Skip to content

FastPQ ​

FastPQ-ը Iroha-ի կողմից ընտրված կատարման ազդեցությունների համար STARK ապացուցող ուղին է: Այն չի փոխարինում գործարքի սովորական կատարումը կամ համաձայնությունը: Գործարքները դեռ շարունակվում են ISI, IVM, եւ Sumeragi-ով, ինչպես միշտ; FastPQ սպառում է դետերմինիստական կատարման վկան եւ վերածում աջակցվող ազդեցությունները ապացույցների խմբերի:

Ներկայիս հյուրընկալող ինտեգրումը ունի երեք հիմնական ուղիներ.

  • բլոկի կատարման ընթացքում գրանցված թվային ակտիվների թափանցիկ փոխանցումները
  • Nexus ստուգված երթուղային ռեալեր, որոնց AXT ապացուցման փաթեթը պարունակում է FastPQ կապում
  • SCCP թափանցիկ հաղորդագրության ապացույցի օգնականներ, որոնք փակում են FastPQ ապացույցը բաց ստուգման փաթեթի մեջ

Վկաների երթուղին փոխանցելը ​

Թվային փոխանցումները ստեղծում են կառուցվածքային փոխանցման տրանսկրիպտ, երբ հրահանգը փոխակերպում է հավասարակշռությունները:

  • աղբյուրի հաշվին, նպատակային հաշվին, ակտիվների սահմանմանը եւ գումարը
  • ուղարկողի եւ ստացողի հավասարակշռությունը փոխանցումից առաջ եւ հետո
  • գործարքի մուտքային կետի hash-ը, որը օգտագործվում է որպես խմբաքանակի hash
  • ներկայացնող հաշվետվությունից ստացված իշխանության ցուցակը
  • Պոզեյդոնի դիժեսը մեկ դելտային տրանսկրիպտի համար

Բաժանային փոխանցումներում օգտագործվում է մի քանի դելտա պարունակող տեքստ, այդ դեպքում բացակայում է մեկ դելտայի Պոզեյդոնի թեստը:

Բլոկի վերջնականացման ժամանակ Iroha խմբավորում է այս տրանսկրիպտերը մուտքային կետի хэշի համաձայն: Գործադրման վկանը ապա տեղափոխում է ինչպես սկզբնական տրանսկրիտների փաթեթները, այնպես էլ FastPQ անցումային խմբաքանակները, որոնք պատրաստված են պրոֆերի համար:

Յուրաքանչյուր տրանսֆերային դելտա դառնում է երկու անցումային շարքեր.

ՍարքԳլխավոր ձեւՆախագծային արժեքՀետագա արժեք
Հեռորդի դեբետasset/<asset-definition>/<source-account>նախորդ ուղարկողի հավասարակշռությունըուղարկողի հավասարակշռությունը
Գնորդի վարկըasset/<asset-definition>/<destination-account>ստացողի հաշվեկշիռը նախստացողի հաշվեկշիռը

Թվային արժեքները նորմալացվում են ամբողջական թվերի վկայական միավորներով: FastPQ խմբավորման համար մի արժեք մերժվում է, եթե այն չի կարող ներկայացվել որպես ոչ բացասական u64 ընտրված տասնամյակային մասշտաբում:

Հանրային ներդրումներ ​

Յուրաքանչյուր FastPQ անցումային խմբաքանակ ունի հանրային մուտքագրություններ, որոնք ապացույցը կապում են բլոկի եւ կատարման համատեքստին.

ՆերմուծումՆշում
dsidՏվյալների տիրույթի նույնականացողը կոդավորվում է որպես փոքր բայթներ
slotԲլոկի ստեղծման ժամանակը վերածվել է նանոսեկունդ:
old_rootԾնողական պետության արմատը ստացվել է մահապատժի վկանից
new_rootPoststate արմատը ստացվել է մահապատժի վկանից
perm_rootՊոզեյդոնի պարտավորությունը ակտիվ դերային թույլտվությունների նկատմամբ
tx_set_hashՀաշիվը վերապատրաստված գործարքի եւ ժամանակային դրդող մուտքային կետի հաշիվները

Հյուրընկալողը օգտագործում է fastpq-lane-balanced որպես այդ խմբերի համար սահմանված կանոնիկական պարամետր:

Մաթեմատիկական մոդել ​

Այս բաժինը նկարագրում է ընթացիկ Rust ստուգիչի եւ հաստատողի կողմից իրականացվող հաշվետվությունը: Ստորեւ ներկայացված բոլոր դաշտային գործողությունները կատարվում են Goldilocks- ի առաջնային դաշտից:

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

FastPQ Օգտագործում է Poseidon2 F դաշտի պարտավորությունների համար: Սպոնջը լայն է t = 3, տոկոսադրույք r = 2, եւ հզորություն 1. Hash- ը ներբեռնում է դաշտի տարրերը rate-2 բլոկներում եւ մի քանի դաշտային տարրեր ավելացնում 1 նախքան վերջնական փոխարկումը.

HF(x0,…,xm−1)=Poseidon2⁡F(x0,…,xm−1,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,0≤pack⁡(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]) mod p \operatorname{seed}(D)= \operatorname{le64}(\operatorname{Hash}(D)[0..8])\bmod p

Այստեղ Hash նշանակում է Iroha-ի iroha_crypto::Hash::new 32-բայթ Blake2bVar դիժեսը, եթե բանաձեւում բացարձակ անվանում չկա Poseidon2 կամ SHA-256:

Դաշտի հաշվետվություն ​

Rust կոդը ներկայացնում է դաշտի տարրերը որպես u64 վարկանիշներ [0,p): Բարելավումը եւ հանումը հետեւյալն են.

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

a−Fb=(a−b) mod p a -_F b = (a-b)\bmod p

բազմապատկումը առաջին հերթին հաշվարկում է 128-բիթային արտադրանքը.

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

Goldilocks կրճատման ապա օգտագործում է նույնականությունը:

264≡232−1(modp) 2^{64}\equiv2^{32}-1\pmod p

Եթե:

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

ապա կրճատիչը հաշվարկում է.

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

Իրագործումը պայմանական կերպով ավելացնում կամ հանում է p մինչեւ արդյունքը կանոնիկ լինի: ստորագրված ամբողջ թվերը, ինչպիսիք են հավասարակշռման դելտանները, ներմուծվում են հետեւյալ կերպ.

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

Պոզեյդոն 2 Փերմուտացիա ​

Պոզեյդոն 2 փոխարկման վիճակը հետեւյալն է.

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-ում օգտագործվում է չորս ամբողջական փուլ, քսանհինգ յոթ մասնակի փուլ, ապա եւս չորս լիակատար փուլ: Ամբողջական փուլ ՝ պարագային կայուններով 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}

Field hash- ը սկսվում է զրոյական վիճակից: Յուրաքանչյուր ամբողջական rate-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 է:

Հասարակական մուտքի պարտավորություն ​

Հյուրընկալողը կոդավորում է տվյալների տարածքի ID- ն ՝ գրելով դրա u64 արժեքը 16-բայթային դաշտի առաջին ութ փոքր-հասարակական բայտներում.

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)

Transaction-set hash-ը բայթային տիրույթի hash-ն է սորտիացված մուտքի կետի hash-ների վրա.

tx_set_hash⁡=Hash⁡(fastpq:v1:tx_set∥h0∥⋯∥hn−1) \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_root∥p0∥⋯∥pn−1),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_hash⁡fallback=Hash⁡(fastpq:v1:tx_set∥ordering_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 արժեքը mantissa- ի հետ m եւ մասշտաբ q ընդունվում է միայն, երբ m >= 0 եւ q <= s. Իրենց FastPQ վկա արժեքը հետեւյալն է.

norm⁡s(m,q)=m⋅10s−q \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

Հրամանագրման պարտավորությունը Poseidon2- ի դաշտի հաշինգն է fastpq:v1:ordering տիրույթի եւ կարգավորված անցումների Norito կոդավորման վրա:

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 հավաստիացնում է վկաների նորմալացված արժեքները նախքան հետագա կառուցումը.

f0≥a f_0 \geq a

f1=f0−a f_1 = f_0 - a

t1=t0+a t_1 = t_0 + a

Դրանից հետո անցումային շարքերը կոդավորում են.

Δsender=f1−f0=−a \Delta_{\text{sender}} = f_1 - f_0 = -a

Δreceiver=t1−t0=a \Delta_{\text{receiver}} = t_1 - t_0 = a

Դիտարկման մեջ ստորագրված դելտաները կրճատվում են F:

δi=(post⁡i−pre⁡i) mod p \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=2⌈log⁡2(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(s−1)=0 s(s-1)=0

Թույլտվության որոնման շարքերը ճիշտ են դերի տրամադրման եւ դերի չեղարկման շարքեր.

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

Թվային գործողությունների շարքերի համար'

δi=value_new⁡i,0−value_old⁡i,0 \delta_i = \operatorname{value\_new}_{i,0} - \operatorname{value\_old}_{i,0}

Շինարարը նաեւ հետեւում է ակտիվի հաշվով իրականացվող դելտաների:

Ri(a)=Ri−1(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

Միայն մինետի եւ այրման շարքերը թարմացնում են մատակարարման հաշվիչը.

Si(a)=Si−1(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⁡i=metadata_hash⁡i+1 \operatorname{metadata\_hash}_i=\operatorname{metadata\_hash}_{i+1}

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

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

Տեղափոխել Merkle սյունակները ​

Փոխանցման տողերը կրում են 32 մակարդակի պակաս Merkle ուղին: Եթե բացակայում է հյուրընկալող ապացույցը, prover- ը համադրում է որոշիչ ուղին տողերի բանալից, նախնական հավասարակշռությունից եւ թե արդյոք տողը ուղարկողի կամ ստացողի կողմն է:

Սինթետիկ ուղիների համար ճաշակային աղը fastpq:smt:from է ուղարկող շարքերի համար եւ fastpq:smt:to՝ ստացողի շարքերի համար:

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

V=Hash⁡(fastpq:smt:value|∥salt⁡∥le64⁡(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⁡(ℓ)∥K∥le64⁡(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|∥K∥V) L = \operatorname{Hash}( \texttt{fastpq:smt:leaf|}\| K\|V )

Nℓ+1=Hash⁡(fastpq:smt:node|∥left⁡ℓ∥right⁡ℓ) 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}

Թույլտվության շիշեր ​

Դասերի տրամադրել եւ վերացնել շարքերը hash թույլտվության վկան:

hperm=HF(P(role_id⁡∥permission_id⁡∥epoch⁡le)) 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 առաջին հերթին ինտերպոլում է տողերի արժեքները տողային դոմենի վրա եւ hashes կոֆիենցիոն վեկտորը:

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,…,Cm−1) R_{\text{trace}} = \operatorname{MerkleRoot}(C_0,\ldots,C_{m-1})

Վերջին հանձնառությունը տիրույթի, պարամետրերի հավաքածուի վրա բայթային хэշ է, տիրույթի ձեւը, գնդակի դիժեստը եւ տիրույթի արմատը.

commitment⁡=Hash⁡(len⁡(Dc)∥Dc∥len⁡(parameter)∥parameter∥n∥N∥m∥C0∥⋯∥Cm−1∥Rtrace) \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 բաղադրության արժեքը շարքի տեղական մնացորդների գծային համադրություն է: Transcript նմուշները ներառում են երկու մարտահրավերներ.

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

Յուրաքանչյուր հարակից զույգ տողերի համար (i,i+1) ստուգիչը հաշվարկում է՝

Ai=∑jαj mod 2ρi,j A_i=\sum_j \alpha_{j\bmod2}\rho_{i,j}

մնացորդները rho, կոդային կարգով, հետեւյալն են.

ρ=s(s−1)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(1−sactive,i) \rho = s_{\text{active},i+1}(1-s_{\text{active},i})

Թվային սյունակներով շարքերի համար'

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

եւ կայուն խմբաքանակի համատեքստային գծերի համար.

ρ=metadata_hash⁡i−metadata_hash⁡i+1 \rho = \operatorname{metadata\_hash}_i-\operatorname{metadata\_hash}_{i+1}

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

ρ=slot⁡i−slot⁡i+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,i≠0zi,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 ՝ կոնֆigurված կոսեթային փոխհատուցումը: Որպես արժեքներ ունեցող հետեւողական սյունակի համար v_i, ինտերպոլացիան արտադրում է koeffensive a_j այնպիսի, որ

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

ցածր աստիճանի ընդլայնումը գնահատում է նույն բազմաբնույթը կոսետի վրա.

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

Կազմակերպումը հաշվարկում է այն՝ բազմապատկելով կոֆեսիոնալ գործակիցները մինչեւ FFT:

aj′=ajgj a'_j = a_j g^j

եւ այնուհետեւ գնահատում a' գնահատման դոմենի վրա:

CPU FFT-ը կրկնվող արմատ-2 Կուլի-Թուքեյի փոխակերպում է բիթ-վերադարձ մուտքերի վրա: Դարաշրջանի երկարությամբ 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′=u−v x_j'=u+v,\qquad x_{j+H}'=u-v

FFT հակադարձը կատարում է նույն փոխակերպումը, ինչպես omega^{-1} եւ չափվում է հակառակ դոմենի չափով.

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

Կատալոգի արմատները նախքան օգտագործումը հաստատվում են.

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

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

Catalogue root-ից ստացված ավելի փոքր տիրույթների համար գեներատորը հետեւյալն է.

ωℓ=ωmax⁡2kmax⁡−ℓ \omega_{\ell}=\omega_{\max}^{2^{k_{\max}-\ell}}

Գծերի եւ տերեւների շիշներ ​

Հետո LDE, FastPQ hashes յուրաքանչյուր շարքը ամբողջությամբ LDE սյունակները: m սյունակներ.

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

Եթե շարքի հաշեները դեռեւս գտնվում են գնահատման դոմենի փոխարեն հետագա տիրույթում, prover- ը ինտերպոլատացնում եւ ընդլայնում է այդ մեկ գիծային-հաշե սյունակը նույն coset LDE գործընթացով:

Merkle- ի բացումները ​

LDE արժեքները խմբավորվում են հետեւյալ մասերի:

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

Յուրաքանչյուր կտոր տերեւը հետեւյալն է.

Lj=HD(j∥vjB∥⋯∥vjB+B−1) L_j=H_D(j\|v_{jB}\|\cdots\|v_{jB+B-1})

Մերքլի ծնողները հետեւյալն են.

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/2k⌋≡0(mod2)HF(seed⁡(fastpq:v1:trace:node),sk,yk),⌊i/2k⌋≡1(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(i∥m∥xi,0∥⋯∥xi,m−1) L^{\text{air}}_i = H_D(i\|m\|x_{i,0}\|\cdots\|x_{i,m-1})

AIR կազմի տերեւները հետեւյալն են.

Licomp=HD(i∥Ai) 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⁡=i mod Blde \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=0a−1yl,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=0a−1yl,⌊i/a⌋a+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 տրանսկրիպտ ​

Քանոնիկ պարամետրերի կատալոգը վերագրման хэշը նշում է որպես SHA3-256. Ներկայիս պրովեր եւ ստուգիչի իրականացումը բխում է մարտահրավերային բայտներից ՝ iroha_crypto::Hash::new, որը 32-բայթ Blake2bVar դիժեսն է, այնուհետեւ նվազեցնում է առաջին ութ փոքր-հանդիսական բայտները F:

χ(tag)=le64⁡(Hash⁡(state∥len⁡(tag)∥tag)[0..8]) mod p \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. searchup մեծ արտադրանքը
  7. FRI շերտերի արմատների եւ beta_l մարտահրավերների
  8. նմուշագրված հարցման ցուցանիշները

Հարցազրույցի նմուշագրությունը շարունակում է նկարել 32-բայթանոց մարտահրավերային դիջետներ եւ կարդալ դրանք որպես փոքր-ինչ u64 կտորներ, մինչեւ այն ունենա պահանջված յուրահատուկ ինդեքսների թիվը.

q=le64⁡(digest chunk) mod Neval q = \operatorname{le64}(\text{digest chunk})\bmod N_{\text{eval}}

Նմուշների հավաքածուն վերադարձվում է կարգավորված կարգով:

Վավերացողի կրկնօրինակում ​

Վավերացնողը նախ վերաշվարկում է խմբաքանակի պարտավորությունը.

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

եւ պահանջում է:

commitment⁡expected=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,…,qt−1 \gamma,\quad \alpha_0,\alpha_1,\quad \beta_0,\ldots,\beta_{\ell-1},\quad q_0,\ldots,q_{t-1}

Յուրաքանչյուր ցուցադրված հարցման համար q, այն ստուգում է՝

MerkleVerify⁡(Rlde,L⌊q/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+1 mod Nevalair,q+1 mod Neval,π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⁡(row⁡q,row⁡q+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
  • վերագրը պետք է ընդգրկի խմբաքանակում գտնվող յուրաքանչյուր փոխանցման տող
  • Պոզեյդոնի մեկ դելտա պարունակող դիժեսը, երբ ներկա է, պետք է համապատասխանի տրանսկրիպտի նախանկարի պատկերին
  • provided sparse-Merkle proofs must decode as version 1; missing paths are filled with deterministic synthetic proofs (հետաքրքիր է, որ պակասող ուղիները լցված են դետերմինիստիկ սինթետիկ ապացույցներով)

Հետեւանքը պարունակում է ընտրող սյունակներ փոխանցման, մինետի, այրման, դերի տրամադրման, դերակատարության հետաձգման, մետադատա հավաքածու եւ թույլտվությունների որոնման շարքերի համար: Թվային գործառույթների շարքերը նաեւ կրում են ստորագրված դելտաներ, գործում են յուրաքանչյուր ակտիվի դելթաններ եւ մատակարարման հաշվիչներ:

Պրոբեր Լեյն ​

irohad սկսում է FastPQ պրովեր լեյնը մեկնարկելիս, եթե պրովերի հետագա վերջը կարող է նախաձեռնվել: Լեյնը ֆոնային խնդիր է սահմանված հերթով: Երբ բլոկը արտադրում է կատարման վկան, commit ուղին ներկայացնում է պրովոր աշխատանք, որը պարունակում է բլոկի շիշը, բարձրությունը, տեսքը եւ վկանը:

Եթե երթուղին չի աշխատում կամ հերթը լցված է, աշխատանքը բաց է թողնում եւ բլոկի սովորական մշակումը շարունակվում է: Սա նշանակում է, որ ֆոնային պրովեր երթուղինը գործարքի ընդունման կամ համաձայնության դարպաս չէ: Այն ապացուցող արտադրության ուղին է պետության վրա, որը արդեն կատարվել է:

Դարպասը կառուցում է պրովեր, որն ունի

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

auto թույլ է տալիս ստուգողին ընտրել մատչելի հետագա վերջը: cpu pins կատարման է CPU. gpu նախընտրում է GPU կատարում, CPU fallback, երբ backend- ը չի կարող օգտագործել պահանջված միջուկները:

Փորձարկում ​

FastPQ ապացույցի ստուգումը վերակառուցում է քանոնիկ խմբաքանակի պարտավորությունը եւ փոխարինում է հանրային տրանսկրիպտը: Վավերացնողը ստուգում է արձանագրության տարբերակը, պարամետրերի սահմանված տարբերակը, կրկնօրինակման սահմանափակումները, հետեւողական պարտավորությունները, հանրային մուտքերը, նմուշավորված Merkle բացումները, AIR բացումները եւ FRI հարցման շղթան:

Նախադրյալ կրկնօրինակման սահմանները ներառում են.

ՍահմանափակՆախադրյալ
անցումային շարքեր256
Բարշային բեռի չափը256 KiB
FRI շերտեր16
Հարցազրույցներ128

Nexus Փորձարկված ռեալեր ​

Nexus AXT ապացույցի փաթեթները կարող են ներմուծել AxtFastpqBinding։ Երբ RegisterVerifiedLaneRelay կատարում է, Iroha:

  1. ստուգում է երթուղի ռելեյի փաթեթը եւ FastPQ ապացույցային նյութը:
  2. ստուգում է տվյալների տարածքը եւ manifest root- ը
  3. վերագրում է AXT ապացույցի փաթեթը:
  4. պահանջում է fastpq_binding
  5. վերակառուցում է FastPQ խմբաքանակը այդ կապից
  6. կոդավորում է ներմուծված FastPQ ապացույցը:
  7. զանգահարում է FastPQ ստուգողին վերակառուցված խմբաքանակի եւ ապացույցների վերաբերյալ

Եթե ստուգումը հաջողվում է, Iroha-ը պահում է VerifiedLaneRelayRecord, որը պարունակում է ռելեյի հղումը, օրիգինալ փաթեթը, ապացուցման օգտակար բեռնվածության хэշը, ստուգման բարձրությունը, manifest root-ը եւ FastPQ կոճակը։

Փողոցային ռելեյի փաթեթները նաեւ համապարփակ են FastPQ ապացուցման նյութը: Մատेरियलն անցնում է երթուղի ID, տվյալների տարածքի ID, բլոկ բարձրությունը, ստուգման բարձրությունը, բլոք գլխավորության hash, Settlement hash, եւ manifest root. Relay միավորումը թույլատրելի է միայն այն դեպքում, երբ այն ունի երկու 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_root∥source_tx_commitment⁡∥policy_commitment⁡∥effect_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_root∥source_tx_commitment⁡∥claim_digest⁡∥effect_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_root∥policy_commitment⁡∥verifier_id⁡∥verifier_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_hash∥source_tx_commitment⁡∥claim_digest⁡∥witness_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]) mod max⁡(span⁡,1)) \operatorname{bounded}(d,\min,\operatorname{span}) = \min + (\operatorname{le64}(d[0..8])\bmod\max(\operatorname{span},1))

Այնուհետեւ օգտագործվում են նույն փոխանցման հավասարումները.

sender_after⁡=sender_before⁡−a \operatorname{sender\_after}=\operatorname{sender\_before}-a

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

Սինթետիկ ուղարկողի եւ ստացողի հաշիվի ID-ները ստեղծվում են առանցքային սերմերից.

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

Տրանսֆերային խմբաքանակի շիշը հետեւյալն է.

batch_hash⁡=Hash⁡(label⁡∥corridor⁡∥source_tx_commitment⁡∥claim_digest⁡) \operatorname{batch\_hash} = \operatorname{Hash}( \operatorname{label}\| \operatorname{corridor}\| \operatorname{source\_tx\_commitment}\| \operatorname{claim\_digest} )

AXT խմբաքանակի manifest digest-ը կազմում է 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 աղբյուր
dsidBlake2b-ի առաջին 16 բայթը բլեյք 2բ հայտարարության վրա
slotՎերջնականության բարձրություն
old_rootՕգտագործելի բեռի շիշ
new_rootՀանձնառության արմատը
perm_rootՎերջնական բլոկ hash
tx_set_hashԶեկույցի շիշ

SCCP քանոնիկ կոդավորիչները գրում են ամբողջական թվերը փոքր-հասակ եւ կոդավորում են փոփոխական երկարության բայթային շարքերը որպես.

vec⁡(x)=le32⁡(∣x∣)∥x \operatorname{vec}(x)=\operatorname{le32}(|x|)\|x

Հանրային մուտքի թափանցիկ բայտ շղթան հետեւյալն է.

P=version⁡∥message_id⁡∥payload_hash⁡∥le32⁡(target_domain⁡)∥commitment_root⁡∥le64⁡(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}

Անցանցիկ հայտարարության բայթները են տարբերակի, շղթայի ընտանիքի, տեղական եւ հակառակորդի տիրույթների համազերծումը, անվտանգության մոդելը, օղակային կառավարումը, հաշիվի կոդեկը, վերջնականության մոդելը, վավերացողի թիրախը, վերիֆիկատորի հետադարձ ընտանությունը, երկարությամբ նախանշված շղթա/հետադարձ/մանիֆիստ դոմեյնները, նպատակային կապակցող хэշը, հաշիվի կոդեկ բանալին, payload տեսակը, հանրային մուտքի բայթները, եւ payload hash.

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

Այս ապացույցի ուղու համար FastPQ տվյալների տարածքի ID- ը եւս մեկ նախանշված Blake2b պարունակության առաջին տասնվեց բայթներն են.

dsid⁡=Blake2bVar⁡32(sccp:transparent:fastpq:dsid:v1∥statement_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_backend⁡∥verifier_descriptor⁡) \operatorname{vk\_hash} = \operatorname{SHA256}( \operatorname{message\_backend}\|\operatorname{verifier\_descriptor} )

Կարմիր FastPQ ապացույցը Norito-կոդավորված է StarkFriOpenProofV1, ապա փակված է OpenVerifyEnvelope հետագա ավարտով Stark. SCCP ստուգման վերակառուցում է նույն FastPQ փաթեթից եւ manifesto, ստուգում է բաց վավերացման փաթեթի մետադատային տվյալները, եւ կանչում է FastPQ վերակառուցված խմբաքանակի ստուգիչը եւ ապացույցը:

պարամետրերի հավաքածուներ ​

Կանոնիկ պարամետրերի կատալոգը բացահայտում է երկու պարամետրային հավաքածու: Host prover lane- ը ներկայումս օգտագործում է fastpq-lane-balanced.

ՊարամետրՆպատակդաշտՀիշերFRI
fastpq-lane-balancedհավասարակշռված պրովերային անցումGoldilocks քառակուսի ընդլայնումPoseidon2 պարտավորությունները, կատալոգը SHA3Արթուր 8, պայթյուն 8, 46 հարցեր
fastpq-lane-latencyլատենցիային զգայուն ուղիներըGoldilocks քառակուսի ընդլայնումPoseidon2 պարտավորությունները, կատալոգը SHA3Arity 16, blowup 16, 34 հարցեր

Երկուսն էլ նպատակ են դնում 128-բիթային անվտանգության եւ օգտագործում են 2^16 տիրույթի չափը: Rust V1 վերագրական կրկնօրինակման կոդը ներկայումս արտացոլում է Fiat-Shamir մարտահրավեր բայթները ՝ օգտագործելով iroha_crypto::Hash::new, այլ ոչ թե ուղղակիորեն հրավիրելով SHA3-256:

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Պահանջված եւ լուծված կատարման ռեժիմը ՝ ըստ backend- ի եւ սարքի տեքստերի
fastpq_poseidon_pipeline_totalՊահանջված եւ լուծված Պոզեյդոնի գազատարի ուղին
fastpq_metal_queue_depthՄետաղական հերթի սահմանը, թռիչքի ընթացքում առավելագույն թիվը, առաքման թիվը եւ նմուշների հավաքման պատուհանը
fastpq_metal_queue_ratioՄետաղական հերթը զբաղված է եւ փոխկապակցում հարաբերությունները
fastpq_zero_fill_duration_msՀյուրընկալող զրոյական լցման տեւողությունը մետաղի համար:
fastpq_zero_fill_bandwidth_gbpsՊահանջված զրոյական լրիվության թողունակություն

Գլխավոր կատարողականի դասակարգման համար օգտագործեք դրանք կատարողականի եւ չափանիշների ցուցակում նշված կոնսենսուսի եւ հերթի ազդանշաններով: