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

imToken 是一款全球领先的区块链数字资产管理工具[ZB],帮助你安全管理BTC, ETH, ATOM, EOS, TRX, CKB, BCH, LTC, DOT, KSM, FIL, XTZ 资产,同时支持去中心化币币兑换功能 ...

从私钥创建比特币钱包地址有点复杂。在这里,我们会使过程更加简单化。我们需要应用一个哈希函数来获取公钥,另一个哈希函数来获取地址。让我们开始吧。

比特币钱包和以太坊钱包

公钥

区块链比特币以太坊

我们需要做的第一件事是将ECDSA或椭圆曲线数字签名算法应用于我们的私钥。椭圆曲线是由等式 y²=x³+ax+b 定义的曲线,选择a和b。有一整套这样的曲线是公认并在使用的。比特币使用曲线。

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

通过将ECDSA应用于私钥 efc2以太坊和比特币区块链钱包,我们得到一个64字节的整数,它是两个32字节的整数,表示椭圆曲线上的点的X和Y,连接在一起。

对于我们的例子,我们得到了 。

在中,它看起来像这样:

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

注意:正如你从上面的代码中看到的,我使用了 ecdsa 模块中的方法,并使用 解码了私钥。这与相关,而不是算法本身,但我将解释我们在这里做了什么来消除可能的混淆。

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

现在,有一个小问题:一个字符串,比方说imToken, 4f3c 不等于字节数组 4f3c 。相反,它等于具有两个元素的字节数组, O& lt;。这就是 . 方法所做的:它将字符串转换为字节数组。对于我们将在本文中进行的所有加密操作,这都是相同的。

钱包地址

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

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

这是代码:

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 bytes
wallet_len = 40
wallet = ‘0x’ + keccak_digest[-wallet_len:]

校验

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

在以太坊,这不是事情的运作方式。最初,没有校验和机制来验证密钥的完整性。然而,在2016年, 引入了校验和机制,后来被钱包和交易所采用。

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

首先,你需要获取地址的-256哈希值。请注意,此地址应传递给没有 0x 部分的哈希函数。

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

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

正如你将在提案中读到的,对于此校验和方案,“平均每个地址将有15个校验位,如果错误输入,随机生成的地址将意外通过检查的净概率为0.0247%。”

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

checksum = ‘0x’
# Remove ‘0x’ from the address
address = 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应用于公钥,然后应用-256,最后获取该哈希的最后20个字节。

如果你想使用代码,我将其发布到 存储库 。

======================================================================

分享一些比特币、以太坊、EOS、等区块链相关的交互式在线编程实战教程:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

返回顶部
跳到底部

Copyright © 2002-2024 imToken钱包下载官网 Rights Reserved.
备案号:晋ICP备13003952号

谷歌地图 | 百度地图
Powered by Z-BlogPHP Theme By open开发