Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
btc address: 1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHf
& b5 d; e9 j4 `
6 o  [2 }6 u' l% a5 C/ d1 p5 ?eth address: 0xd91c747b4a76B8013Aa336Cbc52FD95a7a9BD3D9- E$ P' Q1 h% }6 z
- B. z# Z+ [  r
以太坊生成地址的方式跟比特币比较类似,也是 私钥 -> 公钥 -> 地址,以太坊只是在公钥 -> 地址做了简化。* y9 C3 m; l! f5 \" _# f9 t" y
7 h+ O5 f0 r' E" U4 h' k, e
以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。
& ?2 O  J# H4 {" b$ f% k" H8 h2 t% T. k: k/ g
得到公钥后,对公钥做Keccak-256哈希运算,然后取最后的40位16进制字符,得到的就是以太坊地址。' L/ Y! _5 w, D0 a( Z; J7 T

3 S5 C9 ?  v$ Z# M# l生成以太坊地址跟比特币地址都是不需要连接网络的7 E" U8 N4 H( N' S* f
8 G; ]3 ?. P1 h+ v0 P
python code 生成以太坊地址
; U) X. A- ~! `" p! z
& A9 L& [6 l1 F5 Q7 j2 A2 X$ Npython首先安装类库# V* P' r9 q3 N. l' R& ?

' s' W3 g5 E6 T! B8 x/ ~pip install ecdsa
, Z# r* k( J" C7 S8 S9 y6 ~; `  A5 o1 `( B8 \* ^- t/ j
pip install pysha37 a" l; ?' G3 m) F

, d$ F) g; z( s8 n( q* Wimport binascii( f$ u. n& \0 v; ~/ I1 g

. ^8 e) N6 L/ b$ {: Q' g8 P# Wimport sha3& k. O( M/ M" C3 c9 d

# m1 Q' V3 P  q8 e. Vfrom ecdsa import SigningKey, SECP256k1
: z0 w" n5 x) m+ O( O9 Y. ^0 R
& b% a% e  O, L9 k+ T' ipriv = SigningKey.generate(curve=SECP256k1) #生成私钥2 D7 u  P5 t7 j8 ~# P& W

4 o! `4 y! m" V6 ~pub = priv.get_verifying_key() #生成公钥
3 Y1 V( R9 [4 _: Y1 \$ Y$ H) w' r
keccak = sha3.keccak_256()  ?; i1 O0 M5 F# ^4 l* i( l' F

: F! ~$ Q. F% A2 Y- u8 @: l+ Dkeccak.update( pub.to_string()) #keccak_256哈希运算
6 i: c$ P% i* F- b3 l" N+ b' S, j/ G) @
address = "0x" + keccak.hexdigest()[24:]/ M' D. |+ {) i8 o- H! V
$ T! |+ `1 R$ ?8 F& v
priv_key = binascii.hexlify( priv.to_string())
( G. Y6 o6 m, R9 |! P2 b/ U. V- _' `, G- l
pub_key = binascii.hexlify( pub.to_string())
  U* o$ j* c! Y! J% \
+ a& E8 i7 A& o' B; Jprint("Private key: " + priv_key.decode() )
; c& o2 [, B0 g0 u" Q' T" K
& `$ _: C5 C2 v9 ~* Dprint("Public key:  " + pub_key.decode() )4 a; B* M( n0 j0 f4 q& O% r1 [  ~! E

' x( e9 t9 ^5 X  yprint("Address:     " + address): O# H+ F4 [# p/ }( z# m. l

% S9 z) B0 ^  m$ b# Address: 0xd38d3c226d0a86ce9932608edac39163fcbc550e  k9 r  V0 F% q: m; l9 F1 I

) ~, x2 Y5 ]# K! M来个骚操作,用同一份私钥来管理比特币与以太坊' _7 J2 J5 ?8 a2 N

6 j* ?  D7 h, r# Z7 A$ d' p既然以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。' u; d) |, U6 N( V. I5 W

) z1 R/ t1 e- s; H那我们就用 Bitcoin地址是如何生成的得到的公钥0 A, d) B' e' J* S: a
- e6 S  D/ \0 X5 L1 i0 h
04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d,生成一个以太坊地址。
2 [8 d: u1 S/ \2 T
6 d# p# H% I' t这个公钥是通过openSSL得到的未压缩公钥,以太坊不需要使用这种类型的公钥,只要把首位的04去掉即可。- w4 {' J, l+ p
$ l7 z5 n2 l& r& p& }
import sha3  M+ r5 Y7 F& P/ a; }, b( G

( ?# Y) G* w/ [* \4 N* Q; C4 M+ D' Cimport binascii+ y+ `0 H( I6 A+ u- r; @9 K. w& K- Z
1 T$ G- O# Y+ l' g
_openssl_pub_key= "04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d"
  R2 S: n( O) m6 o- ~' E: V, q0 E% L
_pub_key = _openssl_pub_key[2:]
$ Z# v) e& `. @. d  j
/ H3 R' M: f. j: \8 O6 n. b# y_pub_hex = binascii.unhexlify(_pub_key)+ z5 `7 T2 }2 W+ u. l8 v
8 S, ?; P. x& i7 q; u
keccak = sha3.keccak_256()- H" R6 v+ l2 t) g: B

' m  P2 r* e8 q: zkeccak.update(_pub_hex)
8 y! m8 O8 ]' r$ ^# f
' {% z1 }9 A" W* baddress = "0x" + keccak.hexdigest()[24:]
, Y7 I% k$ G" E( ?9 e! o% b6 I
& F5 k5 ^# B% o, Bprint address # 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f4 B3 Y+ i7 d3 D# I
' `6 b" g* k( }( A: Y" p
这说明啥?我用完全相同的私钥,分别生成了比特币地址与以太坊地址,这两个完全不一样的地址用的是同一个私钥。
$ _: M8 D$ ~8 X/ R; J1 I
# ^0 c; C! ^! m: `/ o以太坊地址 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f
% H- k2 D( \+ \/ w
- f) r2 J9 P/ v0 g与比特币地址 14xfJr1DArtYR156XBs28FoYk6sQqirT2s的私钥竟然是相同的。
6 G. I  z7 ]& l
/ ]/ a# q( E, a' H这给资产管理带来很大方便,但如果一份私钥泄露了,2份资产都有可能被盗。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16