Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
btc address: 1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHf
! U; c: w8 C  e& @% B3 K& @) W; y
eth address: 0xd91c747b4a76B8013Aa336Cbc52FD95a7a9BD3D92 Q, v- c7 D' U6 G1 p
! X/ J+ s) x  `- [/ V. o) w
以太坊生成地址的方式跟比特币比较类似,也是 私钥 -> 公钥 -> 地址,以太坊只是在公钥 -> 地址做了简化。
1 y& O3 N/ S3 W
- s8 }! B3 ?( }7 m( u4 w以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。
& f& O/ u* T9 S: `6 N+ ]$ m
7 W( c3 {7 E# k3 \  i得到公钥后,对公钥做Keccak-256哈希运算,然后取最后的40位16进制字符,得到的就是以太坊地址。! y: I9 `) {, F0 r
) }- z( y) F+ J$ ]9 ^5 _
生成以太坊地址跟比特币地址都是不需要连接网络的' _- p0 O% K! D: u

$ _1 D3 \* n* g6 T% S% ]& Mpython code 生成以太坊地址
* p3 N% h: y" K4 c2 F! B6 O; c; _  `3 O9 A' M, y
python首先安装类库
$ c8 d/ p/ t: n9 R8 H
, ~! H$ u6 R  ~* ~7 d8 Epip install ecdsa6 I; k1 `- h: }9 k/ n$ ?+ ~1 |

8 {0 q. y5 q- ~. n1 q8 f: x5 ipip install pysha35 D  q+ S% s4 ^  P  H& w) Y# q

( H2 J5 z4 Z  {) A# limport binascii
# k% j+ A# m1 I* ~) H
+ N7 H3 x% q! ?+ |! O* Jimport sha3% o0 j" m- v) ^7 p" d
) B( |9 ?" E6 F2 o2 N5 }" L
from ecdsa import SigningKey, SECP256k1
7 h- i% ?, \- `' p  G) v) T  N4 N
  Y7 v9 u, ~; _  Q+ o" S' wpriv = SigningKey.generate(curve=SECP256k1) #生成私钥
2 n2 W; i9 L' u. z+ r' ^" W) x2 S. F7 d
pub = priv.get_verifying_key() #生成公钥; E$ {" V) H5 y6 B3 o: j
. T2 _+ I- r0 z6 ]
keccak = sha3.keccak_256()2 P6 y$ M: t- r2 x
5 h" [. t) D( }( S2 |' Q: {- I+ G
keccak.update( pub.to_string()) #keccak_256哈希运算
1 l/ V3 l8 U9 z- X# H( ?8 e4 \; y0 O1 F5 W- N- |
address = "0x" + keccak.hexdigest()[24:]" M7 F- X& o  M/ ^

$ z: n. Y2 O% e8 g4 rpriv_key = binascii.hexlify( priv.to_string())
/ a/ N9 [" g+ l" Q0 G, ]+ L2 O, x0 ?; i! j
pub_key = binascii.hexlify( pub.to_string())
6 ?0 I6 [$ O7 }! R; L) Z; V7 v( b) k  S5 j
print("Private key: " + priv_key.decode() )( O$ y: Y% r- A+ r- J
. U/ L2 M, B' p6 r# z$ p. Y
print("Public key:  " + pub_key.decode() )  U6 g/ r6 ~' I3 }

9 F* L7 _  m& D# }7 p" B$ Zprint("Address:     " + address)
- }1 I& E, ~! ^/ c) x9 C0 p
9 Z- l& @! v1 |5 V& e# Address: 0xd38d3c226d0a86ce9932608edac39163fcbc550e3 m- C9 t- g/ I7 v) V; Q

7 c7 q: M) `( p; X( d$ \来个骚操作,用同一份私钥来管理比特币与以太坊+ V+ L0 W/ T% K9 ~+ J  Z8 s; f

( o9 F0 q# j6 F/ |: L9 c4 P既然以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。
" ]( E2 @% l4 s7 Q4 Q
: v. _  i8 N7 _6 ~  d那我们就用 Bitcoin地址是如何生成的得到的公钥2 K" J  L, u+ V. G

' r4 a% ]( s9 ^1 e5 `$ c0 F04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d,生成一个以太坊地址。5 ^' T6 ~: b8 t% \7 B

4 X4 ^) I& }. J+ S) w- {1 P这个公钥是通过openSSL得到的未压缩公钥,以太坊不需要使用这种类型的公钥,只要把首位的04去掉即可。
, ~( x  }: U7 }2 B; F4 n9 K9 \9 h9 J, o& `  ?$ G5 C3 r" Y( N
import sha3; P+ v4 L7 w8 I7 V5 f' Q

( H' ]8 w. [6 N- cimport binascii- S+ g& I( I* |) K; [6 p
" `1 ~: I8 \, D$ n4 E& e; t
_openssl_pub_key= "04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d", Z* R& e9 g' u5 r

0 {2 v( i; I6 \0 G9 k& M- U3 t: g& W_pub_key = _openssl_pub_key[2:]
4 }0 `5 T' z+ Q$ R) R/ v3 l1 E; _3 ~9 |0 l# S) _- x4 i5 Q
_pub_hex = binascii.unhexlify(_pub_key)
6 y: m. x6 Y& A
/ y9 @; Q  U" l- y: ukeccak = sha3.keccak_256(). f( B7 V. t* r* u. T+ l

7 K8 f% j$ B( i& d" S& S2 w! akeccak.update(_pub_hex)
2 e  ?- k6 v( }* S* X; c0 ~! c4 z2 W! \* M! g9 w9 \
address = "0x" + keccak.hexdigest()[24:]
6 D# s3 @! ]$ W; y7 C$ V+ U  p1 M* t8 ^+ a0 A. B1 M6 d/ r
print address # 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f
) H! H) z6 c' S- t2 c8 O
- Z, f! U- c: ^* ?# W+ A7 \这说明啥?我用完全相同的私钥,分别生成了比特币地址与以太坊地址,这两个完全不一样的地址用的是同一个私钥。- P* z  D% E8 k( P* H, Y

2 }0 m4 b% j! v% V/ ]以太坊地址 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f" o2 g5 d9 l( T" G$ P

& {5 F2 B8 N/ ?$ ~$ J" ]: C与比特币地址 14xfJr1DArtYR156XBs28FoYk6sQqirT2s的私钥竟然是相同的。* R# @$ d# o4 p9 j+ U) h

) K% ^/ ?5 s! Z8 o. c5 I# P6 d这给资产管理带来很大方便,但如果一份私钥泄露了,2份资产都有可能被盗。
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

zmhg799417 初中生
  • 粉丝

    0

  • 关注

    0

  • 主题

    16