新手学习以太坊相关知识,如果有问题或建议,请在g此z处h留言。[互联网去中心化小白手册]
上一节了解了私钥和公钥的基础概念,这节具体解释一下以太坊地址是如何生成的,同时粗略介绍一个椭圆曲线加密算法和加密哈希算法。
1 椭圆加密算法
以太坊使用的椭圆曲线加密算法是 secp256k1,使用的是一种 Koblitz 曲线,即 y² = x³ + 7(mod p),这种曲线在椭圆曲线密码学中具有良好的效率和安全性,表示曲线位于素数阶p的有限域中,其中p是非常大的素数。
前面介绍了模运算(取余运算)是数学中一种基础的运算,用来计算一个数在除以另一个数后的余数。a mod p,结果是a除以p的余数。
上图是以17阶为例子做的点图
2 椭圆曲线上的运算
椭圆曲线上很多数学运算和整数世界的数学运算类似,它并不是做数字之间的加法,而是把曲线上的两个点相加。椭圆曲线上加法运算的定义就是给定椭圆曲线上的两个点P1和P2 ,椭圆曲线上存在第三个点,满足P3 =P1 +P2,乘法就是k个相加。
从几何学的意义上来说,第三个点的计算其实是在A和B之间画一条线,这条线会与椭圆曲线存在唯一的相交点,这个称为-(A+B),对应x轴的到了A+B
如果2A,就是A+A,这条线应该是椭圆曲线A点的切线,这条切线会跟椭圆曲线存在唯一的相交点,乘法就是加法的延伸。
3 生成公钥
我们从随机的来的私钥k,256位(比特)的二进制,使用椭圆曲线上预先定义好的名为生成点的G点来产生另一个位于椭圆曲线上的点,者就是对应的公钥K,K = k*G 。
Gx=0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
Gy=0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
生成点始终不变,所以使用一个私钥k与生成点G计算之后,总会得到相同的公钥K,k是二进制的,实际上运算时候是按照十进制来的。
通过私钥可以推算出公钥,但是通过公钥无法反向计算得出私钥
4 哈希函数
韩系函数是一个可以将任意长度数据映射成固定长度数据的数学函数。哈希函数的输出数据称为哈希,加密哈希函数是一种单向的哈希函数,密码哈希函数重要特性:
- 确定性:同样的输入信息总是会产生相同的输出哈希
- 可验证性
- 无关联性:对于输入消息的微笑变化都会对输出结果的哈希造成巨大的变化
- 不可逆性
- 碰撞保护:几乎不可能找到能够得到同一哈希输出的两个不同信息
以太坊协议中多处用到了名为Keccak-256的哈希函数。
5 以太坊地址
以太坊地址是唯一标识符,从公钥或者合约通过单向哈希函数Keccak-256计算而来。我们是从私钥开始的,通过椭圆曲线乘法运算获得一个公钥(x和y坐标组合以后以十六进制的方式表示),在进行以太坊地址运算时,公钥的前缀必须时十六进制的04,这是规则决定的,然后只保留后20位,很多情况下,你会看到以太坊的地址带有0x的前缀,表示采用16进制的方式表示,可以关注gzh互联网去中心化小白手册进行前面的补充阅读
0x4D4e06B803e94126e454f5bD7CA416773e660701
6 致谢
- ETH 《精通以太坊》[1]
- 以太坊官网 密码学[2]
参考资料
[1]ethereum_book: https://github.com/inoutcode/ethereum_book/tree/master?tab=readme-ov-file
[2]以太坊官网: https://ethereum.org
本文使用 markdown.com.cn 排版