Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
btc address: 1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHf8 E9 o* V2 N, L$ r
3 C$ t0 H5 x2 G; r3 ?6 Q4 B
eth address: 0xd91c747b4a76B8013Aa336Cbc52FD95a7a9BD3D9% `) J1 R  ?; K  R' Z

1 M0 b( ~# `  @/ O2 X( y) K以太坊生成地址的方式跟比特币比较类似,也是 私钥 -> 公钥 -> 地址,以太坊只是在公钥 -> 地址做了简化。
% W' e/ Q  L8 i) l8 @; e; m6 ]8 c5 j, O  c; u
以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。
  Q1 X" H) Q; J# Y$ x. ^% ?! j* }/ m  H4 w/ p, Y
得到公钥后,对公钥做Keccak-256哈希运算,然后取最后的40位16进制字符,得到的就是以太坊地址。
& L0 J3 F! o8 i8 U
; o% n9 V5 T/ n# Y生成以太坊地址跟比特币地址都是不需要连接网络的' X# }. P$ M$ F6 d" n! x. {

2 Z5 B0 P- m4 T7 ?python code 生成以太坊地址6 K% K* u* N$ }! [. f7 v2 h" S& G

( ~$ N1 ?% r: P+ @! h1 ~6 cpython首先安装类库
. G) M$ N) @$ S5 G4 n% a% p7 F, s- p7 s1 Z& c6 Q! u8 O
pip install ecdsa$ q  d3 H4 f" m1 N* l) a
* D' ~- j3 n4 t- ]$ n4 P, H
pip install pysha33 U% B2 _' _4 N; U

* H/ e# r  D2 j4 _7 ?8 b- vimport binascii+ Z8 _+ u( ^3 n8 N2 W- e

* o0 {% U3 k9 l5 D" M. Aimport sha3! i3 M* P; B  c& l* g' w
: t( e6 X/ e& W" H' c! q
from ecdsa import SigningKey, SECP256k13 {5 m! S2 X0 _7 a4 `
/ ~1 n3 e: y" o8 h9 }- }
priv = SigningKey.generate(curve=SECP256k1) #生成私钥3 m7 r0 f- X) o( T

' A2 o. q; A, s; Gpub = priv.get_verifying_key() #生成公钥+ y' @3 e* o% D1 E$ b4 ~9 m3 z
( A) x$ b- f3 k8 K6 c) {
keccak = sha3.keccak_256()
/ c( c. R, H' w- p  G2 r- n) v$ g
, r: S8 j6 I5 L- \keccak.update( pub.to_string()) #keccak_256哈希运算
" x2 a# z+ b7 h1 }/ E1 f# h& J! D" ]5 y7 L8 t/ e
address = "0x" + keccak.hexdigest()[24:], X% J1 e9 I5 T+ t+ N2 k
9 M# Z9 C7 M( l. d9 F, |
priv_key = binascii.hexlify( priv.to_string())
# P; N9 w! ^' t) J) ~
3 P+ v1 {8 |& A/ k4 Tpub_key = binascii.hexlify( pub.to_string())
+ K: v5 M3 V- A: f; Q- o. c/ U4 ]/ ^
print("Private key: " + priv_key.decode() )0 T% L: Y/ a6 b# X' ], b

9 J# X! ^. I- D6 Bprint("Public key:  " + pub_key.decode() )0 f) V& `% M1 A6 z
7 |: v! w* |  t
print("Address:     " + address)
$ D  s! B+ e9 |) {6 l: k  }# n9 i  B$ Q  |
# Address: 0xd38d3c226d0a86ce9932608edac39163fcbc550e5 G$ o) j5 |1 |: e3 S
- H3 C  X+ S; O+ R3 w1 c
来个骚操作,用同一份私钥来管理比特币与以太坊7 V9 ~5 j% i9 A/ e" M; D9 l

9 h! A. o7 o8 {9 F& s5 D0 z既然以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。
' x. g% R4 B4 a5 E3 [
- d8 p3 u/ M9 g那我们就用 Bitcoin地址是如何生成的得到的公钥
4 h( Z" |3 |, C$ u! ^0 h1 J& T& Y) U8 C& A& O) M
04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d,生成一个以太坊地址。2 h- d5 ~. L: G+ c" A3 b/ ^
% ?7 D$ Y+ P5 ?- m0 ^' G" q7 u
这个公钥是通过openSSL得到的未压缩公钥,以太坊不需要使用这种类型的公钥,只要把首位的04去掉即可。
# \+ W" l* r- w& j; q
3 m+ N& |1 y. S; jimport sha3
6 l9 D! T( y2 q5 p  \& p) T( R' a) e" e% C& S
import binascii" {- F  K& ~) f. l) _& \
6 r% J. R  r0 u4 f. I9 r
_openssl_pub_key= "04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d"
' e" d* Q1 w) L# c, T7 \& r6 [
3 \0 W4 t/ K5 ^_pub_key = _openssl_pub_key[2:]
( M: q6 v. o. p5 n! P1 q9 W7 {0 `' @8 C/ E; J1 h/ U  t
_pub_hex = binascii.unhexlify(_pub_key)0 b4 M& \8 M1 p# K9 x6 l
4 [" C7 e  J( X- [/ E/ I
keccak = sha3.keccak_256()9 ?& E; [; Z- O

2 n, ~( q" G# o3 W) ?0 Zkeccak.update(_pub_hex)  A4 j( i6 K) X% M% d8 L

  T) C& h- s/ Aaddress = "0x" + keccak.hexdigest()[24:]$ k: y% W# S% Z5 d: G! j( m

6 ?9 c: u) u% V. Bprint address # 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f! F# ?' V' B% x* W) o: C  {
3 P  V3 F3 V' e& Y. i. d; C
这说明啥?我用完全相同的私钥,分别生成了比特币地址与以太坊地址,这两个完全不一样的地址用的是同一个私钥。0 h3 p8 u* G$ D3 D# ?% N0 a/ ^+ G

$ p) a" ?8 R/ h* d5 y3 I: p+ d以太坊地址 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f4 n2 T" P5 X, p- g/ A

3 F) K& o5 s' u9 n7 q' d1 e6 f2 [与比特币地址 14xfJr1DArtYR156XBs28FoYk6sQqirT2s的私钥竟然是相同的。
# W0 h+ |! }4 ?8 }7 V6 M% [; @* e
这给资产管理带来很大方便,但如果一份私钥泄露了,2份资产都有可能被盗。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16