主页 > imtoken钱包下载安卓最新版本 > 如何从私钥创建以太坊钱包地址?

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

编者按:我们翻译和发布加密货币私钥、地址和钱包相关的内容,只是想传达几个重点: 1. 加密货币不同于传统银行,你有很多工具可以生成私钥你不需要向银行申请或向任何人举报,没有人能阻止你拥有自己的私钥和钱包; 2. 公钥和用于接收转账的地址都是通过单向数学运算从私钥派生出来的。 如果您不信任现有的工具,您可以使用这些数学运算自行生成地址; 同时,公共地址不会造成安全问题,因为不能从公钥推导出地址。 , 且私钥不可逆; 3、使用第三方提供的服务时,弄清楚服务的性质,不要向任何人透露自己的私钥,并定期备份。

比特币hd钱包找零地址_比特币的钱包地址是什么_比特币qt钱包地址

在本系列的第一篇文章中,我们得到了如下的比特币私钥:

60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2

编者按:私钥的生成过程这里就不写了。 简单来说,私钥就是一串随机的十六进制字符串。 为了安全(私钥不被他人暴露或复制),生成这串随机数的环境应该尽可能随机和不可预测。 性,不可再生性。 因此,千万不要自己写一串数字作为私钥,因为你认为的“随机”往往不是很随机,很不安全。 (理论上确实可以抛256枚硬币,生成满足长度要求(64位)的随机数,但还是不推荐。)

在本文中,我们将演示如何使用该私钥获取公钥,以及私钥对应的以太坊钱包地址。

通过私钥获取比特币钱包地址的具体过程有些复杂,我们就简单介绍一下。 我们需要使用哈希函数来获取公钥,并使用另一个函数来获取地址。

现在,让我们开始吧。

公钥

这部分与之前讨论比特币的文章相同,所以如果你已经阅读过它,你可以跳过它(除非你想复习)。

首先,我们需要在私钥上使用 ECDSA,即椭圆曲线数字签名算法。 椭圆曲线由公式y² = x³ + ax + b得到比特币的钱包地址是什么,其中a和b可以自定义。 椭圆曲线族有许多著名和广泛使用的案例。 比特币使用 secp256k1 曲线。 关于椭圆曲线密码学,如果想了解更多,可以参考这篇文章。

以太坊使用相同的椭圆曲线,secp256k1,所以比特币和以太坊获取公钥的过程是一样的。

比特币的钱包地址是什么_比特币qt钱包地址_比特币hd钱包找零地址

对私钥进行ECDSA运算后,我们得到一个64字节的整数,它由两个32字节的整数串联而成,代表椭圆曲线上某点的X值和Y值。

在 Python 程序中,代码如下所示:

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模块,通过编码器对私钥进行了解码。 写这篇更多是因为Python的关系,与算法本身无关。 为了避免误会,我仔细解释一下。

在Python语言中,至少有两种数据类型可以存储私钥和公​​钥:“str”和“bytes”。 前者对应的是字符串(string),后者是字节数组(value)。 Python语言中的密码运算只能对“bytes”类进行运算,以字节数据为输入,以字节数据为输出。

但是,这里有一个小问题:“4f3c”作为一个字符串并不等同于作为字节数组的 4f3c。 字符串等于字节数组和两个元素 O< 的组合。 codecs.decode 方法是将字符串转换为字节数组。 本文中使用的所有密码操作都必须执行此步骤。

比特币qt钱包地址_比特币hd钱包找零地址_比特币的钱包地址是什么

钱包地址

一旦获得公钥,我们就可以计算出钱包地址,与比特币不同,以太坊在主网和所有测试网上的地址都是相同的。 用户在发起转账和签名时,需要选择相应的网络。

要从公钥中获取地址,我们需要做的就是对公钥应用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 bytes
wallet_len = 40

比特币的钱包地址是什么_比特币qt钱包地址_比特币hd钱包找零地址

wallet = ‘0x’ + keccak_digest[-wallet_len:]

校验和(checksum)

我们都知道比特币对公钥使用哈希算法,然后取结果的前 4 位数字来创建校验和。 这适用于所有比特币地址,因此如果不添加校验和字节,用户将无法获得有效地址。

编者按:校验和(checksum)是一种比较简单的验证数据完整性的方法。 具体方法有很多。 比如,一个数据取4位,把取出来的数全部相加,最后得到一个4位的值,作为校验和。 如果两份数据不同,则生成的校验和很可能不同。 它与哈希函数的原理类似,但不如密码学哈希函数强。 )

例子:

MD5(cvsoiu687y0adbfiq7et5tgho0) = a277a316d38c21786eac518b83af898f

MD5(wysoiu687y0adbfiq7et5tgho0) = becd314fb8d277cfe20aaadc2b52c177

在以太坊中,生成地址的过程是不同的。 最初,以太坊中没有校验和这样的机制来验证密钥的完整性。 但在 2016 年,Vitalik Buterin 引入了校验和机制,现在被钱包提供商和交易所使用。

将校验和添加到以太坊钱包地址可以让我们逐个验证地址的有效性。

首先比特币的钱包地址是什么,您需要获取地址的 Keccak-256 哈希值。 注意,将地址放入哈希函数时不能添加0x部分。

比特币的钱包地址是什么_比特币qt钱包地址_比特币hd钱包找零地址

其次,您需要迭代初始地址的字符。 如果哈希值中的第i个字节大于等于8,则需要将地址中的第i个字符改为大写,否则保持小写。

最后,您需要将 0x 添加到结果的开头。 如果忽略大小写,则校验和地址与原始地址相同。 但是,这种使用大写字母的做法,让人可以随时随地查看地址是否有效。 您可以在此页面上找到用于验证校验和的有效算法。

通过checksum校验方式,我们可以得到以下结论:

“平均每个地址有 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)

比特币的钱包地址是什么_比特币qt钱包地址_比特币hd钱包找零地址

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个字节作为地址。

比特币qt钱包地址_比特币的钱包地址是什么_比特币hd钱包找零地址

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