來自簡書python
btc address: 1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHf
eth address: 0xd91c747b4a76B8013Aa336Cbc52FD95a7a9BD3D9
算法
以太坊生成地址的方式跟比特幣比較相似,也是 私鑰 -> 公鑰 -> 地址,以太坊只是在公鑰 -> 地址作了簡化。
以太坊使用Secp256k1橢圓曲線獲得私鑰、公鑰,比特幣使用的也是相同的橢圓曲線算法。
獲得公鑰後,對公鑰作Keccak-256哈希運算,而後取最後的40位16進制字符,獲得的就是以太坊地址。網絡
生成以太坊地址跟比特幣地址都是不須要鏈接網絡的ide
python首先安裝類庫pip install ecdsa
pip install pysha3
spa
import binascii import sha3 from ecdsa import SigningKey, SECP256k1 priv = SigningKey.generate(curve=SECP256k1) #生成私鑰 pub = priv.get_verifying_key() #生成公鑰 keccak = sha3.keccak_256() keccak.update( pub.to_string()) #keccak_256哈希運算 address = "0x" + keccak.hexdigest()[24:] priv_key = binascii.hexlify( priv.to_string()) pub_key = binascii.hexlify( pub.to_string()) print("Private key: " + priv_key.decode() ) print("Public key: " + pub_key.decode() ) print("Address: " + address) # Address: 0xd38d3c226d0a86ce9932608edac39163fcbc550e
既然以太坊使用Secp256k1橢圓曲線獲得私鑰、公鑰,比特幣使用的也是相同的橢圓曲線算法。code
那咱們就用 Bitcoin地址是如何生成的獲得的公鑰04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d
,生成一個以太坊地址。
這個公鑰是經過openSSL獲得的未壓縮公鑰,以太坊不須要使用這種類型的公鑰,只要把首位的04
去掉便可。blog
import sha3 import binascii _openssl_pub_key= "04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d" _pub_key = _openssl_pub_key[2:] _pub_hex = binascii.unhexlify(_pub_key) keccak = sha3.keccak_256() keccak.update(_pub_hex) address = "0x" + keccak.hexdigest()[24:] print address #0x9156a7cdab767ffe161ed21a0cb0b688b545b01f
這說明啥?我用徹底相同的私鑰,分別生成了比特幣地址與以太坊地址,這兩個徹底不同的地址用的是同一個私鑰。ip
以太坊地址 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f
與比特幣地址 14xfJr1DArtYR156XBs28FoYk6sQqirT2s的私鑰居然是相同的。
這給資產管理帶來了很大方便,但若是一份私鑰泄露了,2份資產都有可能被盜。 管理一時爽,泄露全都火葬場。ssl
參考:
http://blog.luoyuanhang.com/2...
https://www.jianshu.com/p/efc...
https://www.bilibili.com/vide...
https://zhuanlan.zhihu.com/p/...
https://www.myetherwallet.com/ci