省流: 地址应该用(非压缩公钥)经过keccak_256生成。
背景:
- 公钥地址33bytes,其中第一个byte表示压缩方式(0x02或0x03),例如:
pub_key = 0x0384e6a2d72a63567c9848e7a1f6442f39d62b5f4dd526b1194c4ea674b37ca11d
- 地址是20bytes,例如
0x5B27517A7071Dc3C660F102E1b4653D13b994DA6
二、公钥生成地址步骤
1. 由公钥得到椭圆曲线上的点
point_x = pub_key[1:33] # 舍弃压缩标志
point_y = mod_sqrt(x^3+b) # 需要根据压缩标志,恢复point_y
mod_sqrt是根据椭圆曲线上的模开方,不是数学开方,具体需要自己代码实现,或者借用现成库。
2. 生成hash值
hash = keccak_256(point_x+point_y)
注意: point_x+point_y是bytes相加,组成64bytes,也就是非压缩公钥。我发现很少有地方强调这个,自己傻傻得直接用公钥计算,结果总不对!
3. 生成地址
address = hash[-20:0] # 低20bytes