-
Notifications
You must be signed in to change notification settings - Fork 0
/
STARK101_Parte4_click.py
150 lines (127 loc) · 6.73 KB
/
STARK101_Parte4_click.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# Parte 4: Fase de Consulta (Query Phase):
from channel import Channel
from tutorial_sessions import part1, part3
_, _, _, _, _, _, _, f_eval, f_merkle, _ = part1()
fri_polys, fri_domains, fri_layers, fri_merkles, _ = part3()
print('Éxito 1!')
# Decommit en una consulta:
'''
Nuestro objetivo en esta parte es generar toda la información necesaria para verificar los compromisos de las tres partes anteriores.
En esta parte escribimos dos funciones: decommit_on_fri_layers y decommit_on_query.
'''
# Decommit on the FRI Layers:
def decommit_on_fri_layers(idx, channel):
for layer, merkle in zip(fri_layers[:-1], fri_merkles[:-1]):
length = len(layer)
idx = idx % length
sib_idx = (idx + length // 2) % length
channel.send(str(layer[idx]))
channel.send(str(merkle.get_authentication_path(idx)))
channel.send(str(layer[sib_idx]))
channel.send(str(merkle.get_authentication_path(sib_idx)))
channel.send(str(fri_layers[-1][0]))
# Prueba usando un hash previamente calculado:
test_channel = Channel()
for query in [7527, 8168, 1190, 2668, 1262, 1889, 3828, 5798, 396, 2518]:
decommit_on_fri_layers(query, test_channel)
assert test_channel.state == 'ad4fe9aaee0fbbad0130ae0fda896393b879c5078bf57d6c705ec41ce240861b', 'El estado del channel es incorrecto.'
print('Éxito 2!')
# Decommit en el polinomio de traza:
'''
Para probar que efectivamente las capas FRI sobre las que nos descomprometemos se generaron
a partir de la evaluación del polinomio de composición, también debemos enviar:
El valor de f(x) y su ruta de autenticación.
El valor de f(gx) y su ruta de autenticación.
El valor de f(g^2x) y su ruta de autenticación.
Por lo tanto, la función decommit_on_query debería enviar lo anterior a través del canal y, a continuación,
llamar a decommit_on_fri_layers.
'''
def decommit_on_query(idx, channel):
assert idx + 16 < len(f_eval), f'índice de consulta: {idx} está fuera de rango. Longitud de la capa: {len(f_eval)}.'
channel.send(str(f_eval[idx])) # f(x).
channel.send(str(f_merkle.get_authentication_path(idx))) # ruta de autenticación para f(x).
channel.send(str(f_eval[idx + 8])) # f(gx).
channel.send(str(f_merkle.get_authentication_path(idx + 8))) # ruta de autenticación para f(gx).
channel.send(str(f_eval[idx + 16])) # f(g^2x).
channel.send(str(f_merkle.get_authentication_path(idx + 16))) # ruta de autenticación para f(g^2x).
decommit_on_fri_layers(idx, channel)
# Prueba usando un hash previamente calculado:
test_channel = Channel()
for query in [8134, 1110, 1134, 6106, 7149, 4796, 144, 4738, 957]:
decommit_on_query(query, test_channel)
assert test_channel.state == '16a72acce8d10ffb318f8f5cd557930e38cdba236a40439c9cf04aaf650cfb96', 'El estado del channel es incorrecto.'
print('Éxito 3!')
# Decommit en un conjunto de consultas:
'''
Para finalizar la prueba, el probador obtiene un conjunto de consultas aleatorias del channel, y se descompromete.
Usa la función decommit_on_query() y Channel.receive_random_int para generar 3 consultas aleatorias y descomprometerse en cada una de ellas.
'''
def decommit_fri(channel):
for query in range(3):
# Obtener un índice aleatorio del verificador y enviar el decommitment correspondiente.
decommit_on_query(channel.receive_random_int(0, 8191-16), channel)
test_channel = Channel()
decommit_fri(test_channel)
assert test_channel.state == 'eb96b3b77fe6cd48cfb388467c72440bdf035c51d0cfe8b4c003dd1e65e952fd', 'El estado del channel es incorrecto.'
print('Éxito 4!')
# Llegó la hora!
'''
Uniendo lo anterior y ejecutando todo el código, imprimimos la prueba:
'''
import time
from tutorial_sessions import part1, part3
start = time.time()
start_all = start
print("Generando la traza...")
_, _, _, _, _, _, _, f_eval, f_merkle, _ = part1()
print(f'{time.time() - start}s')
start = time.time()
print("Generando el polinomio de composición y las capas FRI...")
fri_polys, fri_domains, fri_layers, fri_merkles, channel = part3()
print(f'{time.time() - start}s')
start = time.time()
print("Generando consultas y descompromisos...")
decommit_fri(channel)
print(f'{time.time() - start}s')
start = time.time()
print(channel.proof)
print(f'Overall time: {time.time() - start_all}s')
print(f'Uncompressed proof length in characters: {len(str(channel.proof))}')
import io
import sys
dibujo = """\ Ha creado su primera prueba STARKs de Pioneros 101, FELICIDADES
%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/(%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%# %%%%%%%%%%%%%
%%%%%%%%%%%%%%%#/**,*/(%%%%%%%%%%%%%%%%%%%%%%%%%%(. ./%%%%%%%%%%
%%%%%%%%%%, ,#%%%%%%%%%%%%%%%%%%%%/ /%%%%%%%%%%%%%%
%%%%%%%( #%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%
%%%%%%* /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%( ... ,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% /(((((((((((((((. #%%%%%%%%%%%%%%%%%%%%%%/%%%
%%%%%%%#((((((((((((((((((, #%%%%%%%%%%%%, %%%%
%%%%%%%%%%%%((((((((((((((((/ 101 Pioneros #%%%%
%%%%%%%%%%%%%%#(((((((((((((((* /%%%%%
%%%%%%%%%%%%%%%%%%(((((((((((((((* Stark Proof - Completada .(%%%%%
%%%%%%%%%%%%%%%%%%%%%(((((((((((((((( .(#%%%%%
%%%%%%%%%%%%%%%%%%%%%%#(((((((((((((((((, .(((%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%((((((((((((((((((((*. .,((((((%%%%%%%%
%%%%%%%%%%%*,#%%%%%%%%%%%%#((((((((((((((((((((((((((((((((%%%%%%%%%%
%%%%%%%%% %%%%%%%%%%%%%%%%%#(((((((((((((((((((((((%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#(((((((##%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Ahora comienza el Juego, Bienvenido al ecosistema STARKs...
"""
# Imprimir el dibujo de ASCII en la terminal
sys.stdout.write(dibujo)