使用以下代码进行测试
import py_ecc.bn128.bn128_curve as curve
import py_ecc.bn128.bn128_pairing as pairing
Z = pairing.pairing(curve.G2, curve.G1)
print(Z)
会遇到异常退出或者直接结束而不输出结果
经过调试发现是库中 fields/field_elements.py 文件的 FQP类中的 ** 重载在运行中出现了栈溢出,导致程序异常结束定位到函数 __pow__()
,如下面内容
def __pow__(self: T_FQP, other: int) -> T_FQP:
if other == 0:
return type(self)([1] + [0] * (self.degree - 1))
elif other == 1:
return type(self)(self.coeffs)
elif other % 2 == 0:
return (self * self) ** (other // 2)
else:
return ((self * self) ** int(other // 2)) * self
将其如下修改
def __pow__(self, other):
return self.pow(other)
def pow(self, other):
if other == 0:
return self.__class__([1] + [0] * (self.degree - 1))
elif other == 1:
return self.__class__(self.coeffs)
elif other % 2 == 0:
base = self * self
power = other // 2
return (base).pow(power)
else:
base = self * self
power = int(other // 2)
return ((base).pow(power)) * self
即可解决问题