有一种有效的学习方法叫费曼学习法。它的做法是把你学到的东西系统性的讲述出来,如果别人通过你的描述也能理解其中内容,这说明你对所学知识有了一定程度的掌握。目前我正在系统性的研究区块链技术,因此想借助费曼学习法,把我掌握的信息系统性的输出,一来能帮助自己更好的理解消化知识,另一方面也希望能帮助对这方面有兴趣的同学。当然区块链的技术信息汗牛充栋,相比与其他资料,我觉得我的优势在于能体会初学者的难处,因为我自己就是初学者。
在我看来区块链技术的两大基础在于加解密和分布式。因此系统性的掌握区块链就需要系统性的掌握这两块。首先我们从加解密这块入手,其中这块中最基础的就是椭圆曲线。
从上面图形可以看到,椭圆曲线其实就是一个最高指数为3的多项式,这里需要注意的是多项式的计算要基于除法求余的基础,也就是它的计算方式如下:
y ^ 2 mod p = x^3 + a*x + b mod p
对于区块链而言他需要专门指定公式中a, b , p 这个几个参数。因此它也有一个专有名字叫secp256k1,我们看看几个参数的具体数值:
p = 2 ^ 256 - 2 ^32 - 2 ^ 9 - 2 ^ 8 - 2 ^ 7 - 2 ^ 6 - 2 ^ 4 - 1
a = 0
b = 7
在运用中,x只取整数,我们使用代码看看椭圆曲线的例子;
def is_on_blockchain_curve(point):
'''
p = 2 ^ 256 - 2 ^32 - 2 ^ 9 - 2 ^ 8 - 2 ^ 7 - 2 ^ 6 - 2 ^ 4 - 1
a = 0
b = 7
该函数判断给定的点是否在椭圆曲线上, 其中point包含两个数值(x,y)
'''
p = 2 ** 256 - 2 ** 32 - 2 ** 9 - 2 ** 8 - 2 ** 7 - 2 ** 6 - 2 ** 4 - 1
return (point[1] ** 2) % p == (point[0] ** 3 + 7) % p
p = (55066263022277343669578718895168534326250603453777594175500187360389116729240,
32670510020758816978083085130507043184471273380659243275938904335757337482424)
print(f"is point p on curve: {
is_on_blockchain_curve(