btc address: 1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHf
eth address: 0xd91c747b4a76B8013Aa336Cbc52FD95a7a9BD3D9
以太坊生成地址的方式跟比特币比较类似,也是 私钥 -> 公钥 -> 地址,以太坊只是在公钥 -> 地址做了简化。
以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。
得到公钥后,对公钥做Keccak-256哈希运算,然后取最后的40位16进制字符,得到的就是以太坊地址。
生成以太坊地址跟比特币地址都是不需要连接网络的
python code 生成以太坊地址
python首先安装类库
pip install ecdsa
pip install pysha3
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
golang code
package main
import (
"encoding/hex"
"fmt"
"github.com/ethereum/go-ethereum/crypto"
)
func main() {
genEthAddr()
}
func genEthAddr() {
key, _ := crypto.GenerateKey()
privateKey := hex.EncodeToString(key.D.Bytes())
address := crypto.PubkeyToAddress(key.PublicKey).Hex()
fmt.Printf("privateKey: 0x%s\n", privateKey)
fmt.Printf("addr: %s\n", address)
}
// GOOS=linux GOARCH=amd64 go build -o main main.go && zip main.zip main
来个骚操作,用同一份私钥来管理比特币与以太坊
既然以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的是完全相同的算法。
那我们就用 Bitcoin地址是如何生成的得到的公钥
04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d
,生成一个以太坊地址。
这个公钥是通过openSSL得到的未压缩公钥,以太坊不需要使用这种格式的公钥,只要把首位的04
去掉即可。
有未压缩 就有 压缩公钥,压缩公钥与未压缩公钥的区别了解下。
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
这说明啥?我用完全相同的私钥,分别生成了比特币地址与以太坊地址,这两个完全不一样的地址用的是同一个私钥。
以太坊地址 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f
与比特币地址 14xfJr1DArtYR156XBs28FoYk6sQqirT2s的私钥竟然是相同的。
这给资产管理带来了很大方便,但如果一份私钥泄露了,2份资产都有可能被盗。 管理一时爽,泄露全都火葬场。
参考:
http://blog.luoyuanhang.com/2018/04/17/eth-basis-accounts-address-pubkey-prikey/
https://www.jianshu.com/p/efc6bfdf4988
https://www.bilibili.com/video/av27153321
https://zhuanlan.zhihu.com/p/34363341
https://www.myetherwallet.com/