paint-brush
ओह जस्ट ए स्टार्क तकनीकी विश्लेषणद्वारा@sin7y
4,570 रीडिंग
4,570 रीडिंग

ओह जस्ट ए स्टार्क तकनीकी विश्लेषण

द्वारा Sin7Y2022/06/11
Read on Terminal Reader
Read this story w/o Javascript

बहुत लंबा; पढ़ने के लिए

STARK का एक गहन तकनीकी विश्लेषण, प्रूफ सिस्टम। इसमें मोटे तौर पर 3 प्रमुख चरण होते हैं, बिल्डिंग ट्रेस, प्रोवर फॉर ट्रेस और प्रूफ का सत्यापन। चरण 2, "प्रोवर फॉर ट्रेस" में 'एआईआर इंस्टेंटेशन' से 'प्रूफ ऑब्जेक्ट्स की स्थापना' तक शुरू होने वाले 9 उप चरण शामिल हैं। और चरण 3, "सबूत का सत्यापन" में 4 उप चरण होते हैं, अर्थात् 'ओड कंसिस्टेंसी चेक', 'इंस्टेंट द एफआरआई-वेरिफायर ऑब्जेक्ट', 'क्वेरी पोजीशन पर डीप पॉली की गणना करें' और 'एफआरआई सत्यापन प्रक्रिया निष्पादित करें'।

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - ओह जस्ट ए स्टार्क तकनीकी विश्लेषण
Sin7Y HackerNoon profile picture



नीचे STARK की गहन प्रक्रियाओं की जांच करने वाले कई चरण दिए गए हैं।


चरण 1 - ट्रेस बनाएं (फ़ाइब 2-उदाहरण)

'लाल' में चिह्नित नंबर सार्वजनिक जानकारी हैं।


 Some assertion: Form: [register, step, value] examples: [0,0,1], [1,0,1], [1,7,987]

Step2 - ट्रेस के लिए प्रोवर

प्रोटोकॉल पैरामीटर का चयन:


 pub struct ProofOptions { num_queries: u8, // number of queries to increase reliability blowup_factor: u8, // domain extension factor grinding_factor: u8, // ?nonce security parameter, for the security selection of query position hash_fn: HashFunction, // Hash Function blake3-259/192, sha3-256 field_extension: FieldExtension, // Whether the field extension is conducted fri_folding_factor: u8, // The folding factor of Fri protocol 4-8-16 fri_max_remainder_size: u8, // The max remainder of Fri protocol }

1. एआईआर इंस्टेंटेशन

 FibAir { context: AirContext::new(trace_info, degrees, options), result: pub_inputs, } AirContext { options, // protocol parameters trace_info, // trace parameters: row number and col number transition_constraint_degrees, // transition the constraint degree, and if the multiplication of two registers is involved, then degree = 2; similarly, if the multiplication of three registers is involved, then degree = 3; if periodic column exists, then degree = base + period.length – 1 ce_blowup_factor, // constraint computational domain extension factor trace_domain < ce_domain < lde_domain trace_domain_generator: B::get_root_of_unity(log2(trace_length)), lde_domain_generator: B::get_root_of_unity(log2(lde_domain_size)), }

2. एआईआर और ट्रेस की संगति सत्यापित करें (डीबग मॉड्यूल)

2.1 बुनियादी पैरामीटर सत्यापित करें

 Trace.width = air.trace_width

2.2 अभिकथन की वैधता सत्यापित करें (सीमा सीएस)

 Trace[assertion_i.register][assertion_i.step] = assertion_i.value

2.2 सत्यापित करें कि क्या ट्रेस ट्रांज़िशन सीएस (डीबग मॉड्यूल) रखता है

 Loop: For every two adjacent rows: pub struct EvaluationFrame<E: FieldElement> { current: Vec<E>, next: Vec<E>, } Holds: next[0] == cur[0] + cur[1] next[1] == next[0] + cur[1] The number of times of Loop: Trace.length - 1

प्रतिलिपि

 write.into(air, public info)

3. ट्रेस के लिए प्रतिबद्ध

डोमेन पैरामीटर चयन:


 StarkDomain { trace_twiddles, /ntt twiddle factor ce_domain_size: air.ce_domain_size(), //constraint computational domain ce_to_lde_blowup: air.lde_domain_size() / air.ce_domain_size(), // LDE domain domain_offset: air.domain_offset(), //domain offset }

3.1 इंटरपोलेट -> एलडीई -> एलडीई-डोमेन पर मूल्यांकन करें

3.2 प्रतिबद्धता

प्रतिलिपि

 write.into(cm_to_trace)

4.मूल्यांकन सीएस

4.1 रैखिक संरचना गुणांक प्राप्त करें

 Ok(ConstraintCompositionCoefficients { transition: t_coefficients, boundary: b_coefficients, })


गुणांक की संख्या बाधाओं के अनुरूप है
इस उदाहरण में (फाइब 2-उदाहरण), 2 संक्रमण सीएस और 3 सीमा सीएस हैं।

4.2 टी-सीएस और बी-सीएस . के लिए मूल्यांकनकर्ता स्थापित करें

4.2.1 टी-सीएस


 1. Obtain the degree of t-cs (In this example, the degree is [1,1], refer to Chapter 2.3) 2. Establish the t-cs group (record the parameters needed for reaching the object of degree -> compose degree(ce_domain_size - 1) Loop: Calculate the evaluate-degree = base * (trace.length - 1) + tracce.length / period.cycle *(period.length - 1) of every t-cs Establish the t-cs group according to the degree: TransitionConstraintGroup { degree, // the degree of t-cs degree_adjustment, // The space to reach the object degree, target_degree = composition_degree + trace_poly_degree(vanish poly-degree), degree_adjustment = (target_degree - evaluation_degree) indexes: vec![], coefficients: vec![], } Record index and distribution coefficient “coef” Cycle each t-cs (In fib2-example, cycle twice) 3. Establish the period value table 4. Set the divisor for t-cs, with all t-cs having the same form z(x) = x^n-1 / x - g^{n-1} // The last value does not satisfy the condition


4.2.2 बी-सीएस


 1. The divisor of each b-cs is not necessarily the same 2. Judge that if the number of assertions is the same as the number of coefficients to be distributed assertion.len() == coefficients.len() 3. Establish the b-cs group Loop: Obtain the type and initial step of the assertion Establish the b-cs group BoundaryConstraintGroup { constraints: Vec::new(), divisor, // The divisor corresponding to the boundary degree_adjustment, target//The space to reach the object degree, target_degree = composition_degree + divisor.degree(),degree_adjustment = (target_degree - trace_poly_degree) } Add b-cs forms air::BoundaryConstraint { register: assertion.register, // Corresponding register index poly, // assertion value polynomial, interpolation is required for multiple values; otherwise, it is a single value poly_offset, //offset information. If the assert is in the first step, it is [0,1], otherwise it is [1, T] cc, // Coefficient distributed to this b-cs } prover::BoundaryConstraintGroup { degree_adjustment: group.degree_adjustment(), single_value_constraints: Vec::new(),// corresponding Sigle value assertion small_poly_constraints: Vec::new(),//assertion whose assertion value num is smaller than 63 large_poly_constraints: Vec::new(),//assertion whose assertion value num is larger than 63, the values in ce_domain are needed to conduct Pre_compute };

4.3 ce_domain पर t/s-cs का मूल्यांकन करें

4.3.1 मूल्यांकनकर्ता तालिका को परिभाषित करें


 ConstraintEvaluationTable<B: StarkField, E: FieldElement<BaseField = B>> { evaluations: Vec<Vec<E>>, //[ce_domain_size][t_cs_merge_value (0): b_cs_values(1...)] divisors: Vec<ConstraintDivisor<B>>, // [t-cs divisor, b-cs divisor] domain_offset: B, trace_length: usize, #[cfg(debug_assertions)] t_evaluations: Vec<Vec<B>>, #[cfg(debug_assertions)] t_expected_degrees: Vec<usize>, } evaluations[step_i][0] += sum_{j}(evaluation[j] * (coefficients.0 + coefficients.1 * xp) // The divisor is identical. evaluations[step_i][j] += (evframe.cur().state[register] - value) * (coefficients.0 + coefficients.1 * xp) // for single assertion evaluations[step_i][j] += (evframe.cur().state[register] - polynom::eval(&self.poly, x * self.x_offset)) * (coefficients.0 + coefficients.1 * xp) // for multiassertion // for multi-assertion evaluations[step_i][j] += (evframe.cur().state[register] - self.values[values_index]) * (coefficients.0 + coefficients.1 * xp) // for multiassertion // for multi-assertion large poly

5. सीएस का मूल्यांकन करने की प्रतिबद्धता

5.1 बाधाओं को स्थापित करें संरचना बहुपद

5.2 संरचना पाली के प्रति प्रतिबद्धता

उदाहरण:
Compose_poly = a * x^3 + b * x^2 + c * x + d = (a * x^2 + c) * x^ + (b * x^2 + d) (a * x^2 + c ) और (b *x^2 +d) क्रमशः दो स्तंभों के अनुरूप हैं।


6. DEEP संरचना बहुपद स्थापित करें

सामान्य औपचारिक: f(x) = q(x)* t(x)
यादृच्छिक z . पर जाँच की आवश्यकता है


  1. एफ (जेड) = क्यू (जेड) * टी (जेड)


  2. f(x),q(x),t(x) वास्तव में क्रमशः बराबर f(z), q(z), t(z)


  3. Deep_composition की गणना करें = (q(x) - q(z)) / (x - z)


  4. Q_q(x) के लिए LDT जांचें

6.1 डोमेन में से z का चयन करें (ood)

एक आउट-ऑफ-डोमेन बिंदु z बनाएं। ई के प्रकार के आधार पर, बिंदु या तो आधार क्षेत्र से या ई द्वारा परिभाषित विस्तार क्षेत्र से खींचा जाता है।
यहां (आधार क्षेत्र के बजाय) विस्तार क्षेत्र से नमूना लेने का उद्देश्य सुरक्षा बढ़ाना है

6.2 OOD बिंदु z . पर ट्रेस और बाधा बहुपदों का मूल्यांकन करें

6.2.1 z & z * g . पर ट्रेस_पॉली


 ood_frame = {cur: [trace_poly_0(z), trace_poly_1(z)], next: [trace_poly_0(z * g), trace_poly_1(z * g)]}


6.2.2 संरचना पाली z . पर


 iter!(self.columns).map(|p| polynom::eval(p, z^m)).collect() // m is the column num of the composition poly

6.3 गहरी संरचना बहुपद स्थापित करें

6.3.1 यादृच्छिक संख्याएँ उत्पन्न करें


 pub struct DeepCompositionCoefficients<E: FieldElement> { /// Trace polynomial composition coefficients $\alpha_i$, $\beta_i$, and $\gamma_i$. pub trace: Vec<(E, E, E)>, /// Constraint column polynomial composition coefficients $\delta_j$. pub constraints: Vec<E>, /// Degree adjustment composition coefficients $\lambda$ and $\mu$. pub degree: (E, E), }


6.3.2 कैल भागफल पॉली


 => for trace polynomial T`(x) = alpha * (T(x) - T(z)) // degree = trace.length - 1 T``(x) = beta * (T(x) - T(z * g)) T```(x) = gamma * (T(x) - T(z_conjugate)) merge_trace_composition_poly = T(x) / (x - z) + T``(x) / (x - z * g) + T```(x) / (x - z_conjugate) Degree = trace.lengh - 2 => for composition polynomial compute H'_i(x) = (H_i(x) - H_i(z^m)) / (x - z^m) sum(H`_i(x) * cc_i) Deep_composition_polynomial = merge_trace_composition_poly + sum(H`_i(x) * cc_i) Degree = trace.length - 2 => Deep_composition_polynomial degree adjustment Deep_composition_polynomial = Deep_composition_polynomial * (cc_0 + x * cc_1) Degree = trace.length – 1

6.4 एलडीई पर गहराई से मूल्यांकन करें

 deep_evaluations<lde_domain_size> = deep_composition_poly.evaluate(&domain);

7. दीप की एफआरआई परत संख्या की गणना करें

 trace.length() = fold_factor ^ Layer_num + remainder_size; fold_factor = {4, 8, 16} remainder_size < remainder_max_size == 256 

8. प्रश्न की स्थिति निर्धारित करें

lde_domain से क्वेरी की अनेक स्थितियों का चयन करें।

 fold_position = source_position % (fold_domain) fold_domain = source_domain / fold_factor

9. सबूत वस्तुओं की स्थापना

9.1 एफआरआई प्रमाण उत्पन्न करें

 pub struct FriProof { layers: Vec<FriProofLayer>, remainder: Vec<u8>, // last poly <all coefficients> num_partitions: u8, // stored as power of 2 } pub struct FriProofLayer { values: Vec<u8>, paths: Vec<u8>, } 


9.2 उपरोक्त पदों पर क्वेरी ट्रेस पॉली

उपरोक्त के समान


 Queries::new(trace_proof, trace_states)

9.3 उपरोक्त पदों पर प्रश्न बाधा पाली

उपरोक्त के समान


 Queries::new(merkle_proof, evaluations)

9.4 स्टार्क प्रूफ स्थापित करें

 StarkProof { context: self.context, commitments: self.commitments, ood_frame: self.ood_frame, trace_queries, constraint_queries, fri_proof, pow_nonce: self.pow_nonce, }

Step3 - सबूत सत्यापित करें

प्रासंगिक डेटा प्राप्त करने और फिर सत्यापन प्रक्रिया को निष्पादित करने के लिए प्रतिलेख से पब-जानकारी पढ़ें।

1. ओड संगति जांच

अध्याय 5.2 . में वर्णित गणितीय संबंध की संगति को सत्यापित करें


 => for Boundary b(z) = q_b(x) * b_divisor(z) => for composition poly t(z) = q_z(x) * t_divisor(z)

2. एफआरआई-सत्यापनकर्ता वस्तु को त्वरित करें

 pub struct FriVerifier<B, E, C, H> where B: StarkField, E: FieldElement<BaseField = B>, C: VerifierChannel<E, Hasher = H>, H: ElementHasher<BaseField = B>, { max_poly_degree: usize, domain_size: usize, domain_generator: B, layer_commitments: Vec<H::Digest>, //flod_poly commitment layer_alphas: Vec<E>, // random numbers options: FriOptions, num_partitions: usize, _channel: PhantomData<C>, }

3. क्वेरी पोजीशन पर डीप पॉली की गणना करें

गणना विधि वही है जो अध्याय 6.4 . में है

4. एफआरआई सत्यापन प्रक्रिया निष्पादित करें