建议和反馈

请填写你的反馈内容

如何从私钥创建以太坊钱包地址

2020-01-19 ·708次阅读 ·读完需要7分钟

在本系列的第一篇文章中,我们生成了一个比特币私钥:60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2

在这里,我们将使用该密钥获取公共地址,然后获取该私有密钥的以太坊钱包地址。

从私钥创建比特币钱包地址有点复杂。在这里,过程将简单得多。我们需要应用一个哈希函数来获取公共密钥,而应用另一个哈希函数来获取地址。

因此,让我们开始吧。

公钥

这部分与我们在比特币文章中讨论的部分几乎相同,因此,如果您阅读了该部分,则可以跳过(除非需要复习)。

我们需要做的第一件事是将ECDSA或椭圆曲线数字签名算法应用于我们的私钥。椭圆曲线是由方程式定义的曲线,y² = x³ + ax + b具有选定的ab这类曲线有一个完整的家族,已广为人知和使用。比特币使用secp256k1曲线。如果您想了解有关椭圆曲线密码学的更多信息,请参考本文

以太坊使用相同的椭圆曲线secp256k1,因此两种加密货币中获取公钥的过程都是相同的。

通过将ECDSA应用于私钥,我们得到一个64字节的整数,这是两个32字节的整数,它们代表椭圆曲线上该点的X和Y并置在一起。

对于我们的示例,我们得到了1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7

在Python中,它看起来像这样:

private_key_bytes = codecs.decode(private_key, ‘hex’)# Get ECDSA public keykey = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1).verifying_keykey_bytes = key.to_string()key_hex = codecs.encode(key_bytes, ‘hex’)

注意:从上面的代码中可以看到,我使用了ecdsa模块中的方法,并使用解码了私钥codecs这与Python无关,而与算法本身无关,但我将在此说明我们在做什么以消除可能的混淆。

在Python中,至少有两个可以保留私钥和公钥的类:“ str”和“ bytes”。第一个是字符串,第二个是字节数组。Python中的加密方法使用“字节”类,将其作为输入并返回结果。

现在,有一个小问题:一个字符串4f3c不等于字节数组4f3c相反,它等于具有两个元素O< 的字节数组这就是t he codecs.decode方法的作用:它将字符串转换为字节数组。对于本文中将进行的所有加密操作,这都是相同的。

钱包地址

一旦获得公钥,我们就可以计算地址。现在,与比特币不同,以太坊在主要和所有测试网络上都有相同的地址。用户在进行交易和签署交易时指定他们想在过程中稍后使用的网络。

要从公共密钥中获取地址,我们要做的就是将Keccak-256应用于密钥,然后获取结果的最后20个字节。就是这样。没有其他哈希函数,没有Base58或任何其他转换。您唯一需要做的就是在地址的开头添加“ 0x”。

这是Python代码:

public_key_bytes = codecs.decode(public_key, ‘hex’)keccak_hash = keccak.new(digest_bits=256)keccak_hash.update(public_key_bytes)keccak_digest = keccak_hash.hexdigest()# Take the last 20 byteswallet_len = 40wallet = ‘0x’ + keccak_digest[-wallet_len:]

校验

现在,您可能还记得,比特币通过散列公钥并获取结果的前4个字节来创建校验和。所有比特币地址都是如此,因此,如果不添加校验和字节就无法获得有效地址。

在以太坊中,事情并非如此。最初,没有校验和机制来验证密钥的完整性。但是,在2016年,Vitalik Buterin 引入了一种校验和机制,此机制已被钱包和交易所采用。

向以太坊钱包地址添加校验和使其区分大小写。

首先,您需要获取地址的Keccak-256哈希。请注意,此地址应不带0x部分地传递给哈希函数

其次,您遍历初始地址的字符。如果哈希的第i个字节大于或等于8,则将i个地址的字符转换为大写,否则将其转换为小写。

最后,0x在结果字符串的开头添加回去。如果忽略大小写,则校验和地址与初始地址相同。但是大写字母可以让任何人检查该地址是否确实有效。您可以在此处链接的页面上找到校验和验证的算法。

正如您将在提案中阅读的那样,对于此校验和方案,

“平均每个地址将有15个校验位,如果错误输入一个随机生成的地址会意外通过校验,则净概率为0.0247%。”

这是将校验和添加到以太坊地址的代码:

checksum = ‘0x’# Remove ‘0x’ from the addressaddress = address[2:]address_byte_array = address.encode(‘utf-8’)keccak_hash = keccak.new(digest_bits=256)keccak_hash.update(address_byte_array)keccak_digest = keccak_hash.hexdigest()for i in range(len(address)):
    address_char = address[i]
    keccak_char = keccak_digest[i]
    if int(keccak_char, 16) >= 8:
        checksum += address_char.upper()
    else:
        checksum += str(address_char)

结论

如您所见,为以太坊创建地址比为比特币创建地址简单得多。我们需要做的就是将ECDSA应用于公钥,然后应用Keccak-256,最后获取该哈希的最后20个字节。

如果您想使用该代码,我将其发布到GitHub存储库中。


评论(0)问答(0)
请先登录或注册

请先登陆或注册

相关推荐

区块链承兑商币支付平台搭建,数字货币入金通道系统开发

区块链承兑商币支付平台搭建,数字货币入金通道系统开发数字货币是基于区块链技术开发的应用,而支付是数字货币与生俱来的定位,数字货币自带的不受地域限制,去中心化的特色与支付行业一拍即合,解决了传统支付方式......
wx13823151761 · 2020-01-22
458阅读 · 0赞赏 · 0问答

维基链WICC | 项目进展周报第58期(1.13~1.19)

技术 & 产品周报公链建设优化挂单交易为2种交易:交易所授权交易、用户授权交易。100%改进结算交易,支持成交对携带结算费率信息。100%完成四大数据治理开发。100%添加对日志文件大小限制的......
维基链 · 2020-01-21
540阅读 · 0赞赏 · 0问答

数字货币OTC交易所搭建,区块链币币场外交易平台开发

数字货币OTC交易所搭建,区块链币币场外交易平台开发源中瑞科技,09年开始励志研发区块链技术,11年成功熟练掌控区块链数字货币相关技术,12年开始开发交易所、钱包等项目,多年来我们一直奔波在区块链技术......
wx13823151761 · 2020-01-19
517阅读 · 0赞赏 · 0问答

数字货币USDT承兑商支付系统搭建,区块链支付平台开发

数字货币USDT承兑商支付系统搭建,区块链支付平台开发之前传统的支付方式大多数以第三方和第四方支付为主,但随之的问题也是频繁出现,比如接口不稳定、收费高,可能上午刚对接完成,下午就给关掉,对于跨境支付......
wx13823151761 · 2020-01-15
546阅读 · 0赞赏 · 0问答

MetaMask钱包如何安装和设置?

浏览器中的以太坊钱包,MetaMask钱包是最方便的钱包之一,用于存储和交易以太坊和基于以太坊的令牌。TokenMarket平台支持MetaMask,您可以利用MetaMask和TokenMarket......
区块链社区 · 2020-01-14
629阅读 · 0赞赏 · 0问答

1591

LK币

18

粉丝

77

笔记

感谢"区块链网"

这篇精彩的笔记,目前已经帮助

  • 0
  • 0
  • 7
  • 0
  • 8
喜欢0
链客社群 加入

微博进入

商务合作>

广告投放>

公司名称:北京链客行科技有限公司

联系方式:010-67707199

ICP备案号:京ICP备18032136号

Copyright:链客区块链技术问答社区 版权所有

感谢您的提问,问题被社区永久收入以便新人查看。一定要记得采纳最佳答案哦!加油!

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!