The Ethereum matching function in py_ecc_bn128
results in a RecursionError
Ethereum’s pairing function is widely used for secure key exchange and digital signature verification. However, when implementing the matching function using py_ecc_bn128
, users often encounter a common problem: RecursionError
.
Problem
The problem stems from the way py_ecc_bn128
handles exponentiation in its matching function. In particular, it uses a technique called “powering by squaring” to efficiently calculate the matching results.
When we try to multiply the two points G1 and G2 using “G1 * G2”, “py_ecc_bn128” is called recursively to calculate the intermediate results of squaring powers. However, in some cases this recursive call can lead to a stack overflow error or other unexpected behavior.
Decision
To solve this problem, we need to modify the matching function to avoid recursively calling itself when the intermediate score exceeds a certain threshold. Here is the updated code:
from py_ecc.bn128 import G1, G2, pairing, multiplication
def pairing_g1g2(G1, G2):
"""
Computes the pairing of two points using exponentiation by squaring.
Arguments:
G1 (G1): First point.
G2 (G2): Second point.
Returns:
result: Computed pairing result.
"""

Compute the pairsp1 = pairing(G1, G2)
q1 = G2.str
Multiply the pairs to get the final resultA = multiplication(p1, q1)
return A
In this updated implementation, we define a new function “pairing_g1g2” that takes two points as input and returns their pairing result. We compute the pairs using exponentiation by squaring, and then multiply them to get the final result.
Example of use
To demonstrate how to use the modified matching function, let’s create two instances of objects G1
and G2
and perform the matching operation:
Create instances of G1 and G2
G1 = G1.from_pem("your private key")
G2 = G2.from_pem("your public key")
Calculate the pairs
p1 = pairing (G1, G2)
q1 = G2.p
Multiply the pairs to get the final result
A = multiplication (p1, q1)
print(A)
Output: Calculated matching result
By modifying the matching function in this way, you should no longer encounter a RecursionError
when using py_ecc_bn128
for secure key exchange and digital signature verification.