arnaucube
arnaucube/mathPublic Self-hosted repository
math/powersoftau.sage
powersoftau.sageRaw
 1# Sage impl of the powers of tau,
 2# a Go implementation can be found at: https://github.com/arnaucube/eth-kzg-ceremony-alt
 3
 4
 5load("bls12-381.sage") # file from https://github.com/arnaucube/math/blob/master/bls12-381.sage
 6e = Pairing()
 7
 8def new_empty_SRS(nG1, nG2):
 9    g1s = [None] * nG1
10    g2s = [None] * nG2
11    for i in range(0, nG1):
12        g1s[i] = e.G1
13    for i in range(0, nG2):
14        g2s[i] = e.G2
15
16    return [g1s, g2s]
17
18def new_tau(random):
19    return e.F1(random)
20
21def compute_contribution(new_tau, prev_srs):
22    g1s = [None] * len(prev_srs[0])
23    g2s = [None] * len(prev_srs[1])
24    srs = [g1s, g2s]
25    Q = e.r
26
27	# compute [τ'⁰]₁, [τ'¹]₁, [τ'²]₁, ..., [τ'ⁿ⁻¹]₁, where n = len(prev_srs.G1s)
28    for i in range(0, len(prev_srs[0])):
29        srs[0][i] = (new_tau^i) * prev_srs[0][i]
30    
31    # compute [τ'⁰]₂, [τ'¹]₂, [τ'²]₂, ..., [τ'ⁿ⁻¹]₂, where n = len(prev_srs.G2s)
32    for i in range(0, len(prev_srs[1])):
33        srs[1][i] = (new_tau^i) * prev_srs[1][i]
34
35    return srs
36
37def generate_proof(tau, prev_srs, new_srs):
38    # g_1^{tau'} = g_1^{p * tau} = SRS_G1s[1] * p
39    g1_ptau = prev_srs[0][1] * tau
40    # g_2^{p}
41    g2_p = tau * e.G2
42    return [g1_ptau, g2_p]
43
44def verify(prev_srs, new_srs, proof):
45    # 1. check that elements of the newSRS are valid points
46    for i in range(0, len(new_srs[0])-1):
47        assert new_srs[0][i] != None
48        assert new_srs[0][i] != e.E1(0)
49        assert new_srs[0][i] in e.E1
50
51    for i in range(0, len(new_srs[1])-1):
52        assert new_srs[1][i] != None
53        assert new_srs[1][i] != e.E2(0)
54        assert new_srs[1][i] in e.E2
55
56    # 2. check proof.G1PTau == newSRS.G1Powers[1]
57    assert proof[0] == new_srs[0][1]
58
59    # 3. check newSRS.G1s[1] (g₁^τ'), is correctly related to prev_srs.G1s[1] (g₁^τ)
60	#   e([τ]₁, [p]₂) == e([τ']₁, [1]₂)
61    assert e.pair(prev_srs[0][1], proof[1]) == e.pair(new_srs[0][1], e.G2)
62
63    # 4. check newSRS following the powers of tau structure
64    # i) e([τ'ⁱ]₁, [τ']₂) == e([τ'ⁱ⁺¹]₁, [1]₂), for i ∈ [1, n−1]
65    for i in range(0, len(new_srs[0])-1):
66        assert e.pair(new_srs[0][i], new_srs[1][1]) == e.pair(new_srs[0][i+1], e.G2)
67
68    # ii) e([τ']₁, [τ'ʲ]₂) == e([1]₁, [τ'ʲ⁺¹]₂), for j ∈ [1, m−1]
69    for i in range(0, len(new_srs[1])-1):
70        assert e.pair(new_srs[0][1], new_srs[1][i]) == e.pair(e.G1, new_srs[1][i+1])
71
72
73
74
75
76(prev_srs) = new_empty_SRS(5, 3)
77
78random = 12345
79tau = new_tau(random)
80
81new_srs = compute_contribution(tau, prev_srs)
82
83proof = generate_proof(tau, prev_srs, new_srs)
84
85verify(prev_srs, new_srs, proof)