编者按:我们翻译发布加密货币的私钥、地址、钱包相关的内容,只希望能明确传达几个重要的观点:
1。加密货币不同于传统银行,你有很多工具生成一个私钥来持有加密货币,不需要向银行申请,也不需要向任何人报备。没有人能阻止你拥有自己的私人钥匙和钱包;
2。公钥和用于接收传输的地址都是使用单向数学运算从私钥中导出的。如果不信任现有的工具,完全可以利用这些数学运算自己生成地址;同时,公开地址不会引起安全问题,因为地址无法推导出公钥或私钥。
3。使用第三方提供的服务时,要搞清楚服务的性质,不要把自己的私钥透露给任何人,并定期备份。[X][X][X][X][X][X]在本系列的第一篇文章中,我们得到了如下的比特币私钥:[X]60cf 347 DBC 59d 31 c 1358 c 8e 5 e 4 b 822 ab 85 b 79 CB 32 a 9 f3d 98184779 a9 EFC 2[X]编者按:此处无。简单来说,私钥就是一串随机的十六进制字符串。为了安全(私钥不会被他人暴露或复制),这串随机数的生成环境要尽可能的随机、不可预测、不可复制。
所以,不要自己写一串数字来做私钥,因为你认为“随机”的东西往往不是那么随机,非常不安全。
(理论上可以连续抛硬币256次,生成满足长度要求(64位)的随机数,但还是不推荐。)在本文中,我们将演示如何使用这个私钥来获取公钥以及这个私钥对应的以太坊钱包地址。通过私钥获取比特币钱包地址的具体过程有些复杂,我们就来描述一下简化版。我们需要使用一个散列函数来获取公钥,并使用另一个函数来获取地址。现在,我们开始。公钥
部分与上一篇关于比特币的文章相同,所以如果你已经看完了,可以跳过(除非你想复习)。首先,我们需要在私钥上使用ECDSA(椭圆曲线数字签名算法)。椭圆由公式y2=x3 ax b获得,其中A和B可以自定义。椭圆曲线族有很多广为人知且应用广泛的案例。比特币使用secp256k1曲线。如果想了解更多关于椭圆曲线密码的知识,可以参考这篇文章。以太坊使用的是同一个椭圆曲线secp256k1,所以比特币和以太坊获取公钥的过程是一样的。对私钥进行ECDSA运算后,我们得到一2022尚力财经小编个64字节的整数,由两个32字节的整数串联而成,代表椭圆曲线上一点的x值和y值。在Python程序中,代码如下所示:private _ key _ bytes=codecs . decode(private _ key,' hex ')# Get ECD sa public key key=ECD sa。signing key . from _ string(private _ key _ bytes,Curve=ecdsa.secp256k1)。vericking _ key _ bytes=key . to _ string()key _ hex=codecs . encode(key _ bytes,' hex')
注意:从上面的代码可以看出,我使用了ecdsa模块,通过编码器对私钥进行了解码。我写的多是因为Python,而不是算法本身。为了避免误解,我来好好解释一下。在Python中,至少有两种数据类型可以保存私钥和公钥:“str”和“bytes”。前者对应一个字符串(string),后者是一个字节数组(数值)。Python中的加密操作只能在“bytes”类上操作,以字节数据为输入,以输出为结果。不过有个小问题:作为字符串的“4f3c”和作为字节数组的4f3c不一样,字符串等于字节数组和两个元素o的组合,codecs.decode的方法是将字符串转换成字节数组。本文中使用的所有加密操作都需要这一步。
钱包地址
一旦我们得到了公钥,就可以计算出钱包地址。与比特币不同,以太坊在主网络和所有测试网络中的地址是相同的。用户发起转账和签名时,需要选择相应的网络。为了通过公钥得到地址,我们需要做的就是在公钥上应用KECC CAK-256加密算法,然后取出结果的最后20个字节,就这样。整个过程不需要其他哈希函数、Base58编码或任何其他转换。你唯一需要做的就是在地址的开头2022尚力财经小编加上“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 . hex digest()#取最后20个字节wallet _ len=40 wallet='0x ' keccak _ digest[-wallet _ len:]checksum
我们都知道比特币在公钥和这适用于所有比特币地址,因此用户在添加校验和字节之前无法获得有效地址。编者按:校验和是一种比较简单的验证数据完整性的方法。具体方法有很多,比如一段数据一个一个取4位,把取出的所有数加起来,最后得到一个4位的值作为校验和。如果这两个数据不同,则生成的校验和很有可能不同。它类似于哈希函数的原理,但不如加密哈希函数强大。)例:MD5(CVS iou 687y 0 adbfiq 7 et 5t gho 0)=a 277 a 316d 38c 21786 EAC 518 b 83 a f 898 fMD5(wysiou 687y 0 adbfiq 7 et 5t gho 0)=起初以太坊中没有校验和这种机制来验证密钥的完整性。但在2016年,Vitalik Buterin引入了校验和机制,该机制现在被钱包提供商和交易所使用。在以太坊钱包地址中加入校验和,可以让我们逐例检查地址的有效性。首先,您需要获得地址的KECC CAK-256哈希值。请注意,当您将地址放入哈希函数时,不能添加0x部分。其次,你需要迭代初始地址的字符。如果哈希值中的第I个字节大于或等于8,那么你必须将地址中的第I个字符改为大写,否则,保持小写。最后,你需要在结果的开头加上0x。如果忽略大小写,校验和地址与初始地址相同。但是,这种大写字母的使用让人们可以随时随地检查地址是否有效。你可以通过这个网页找到一个有效的算法来验证校验和。通过校验和验证的方法,可以得到如下结论:“平均每个地址有15个校验位,随机得到的错误地址能通过测试的概率是0.0247%。”接下来是将校验和添加到以太坊地址的代码:checksum='0x' #从地址中删除'0x ' 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 . hex digest()for I in range(len(address)):address _ char=address[I]kekcak _ char=charupper()else:checksum=str(address _ char)结论
如文中所述。我们需要做的是用私钥在ECDSA上找出公钥,然后用Keccak-256算法,以最终哈希值的最后20个字节作为地址。如果你想使用这些代码,我已经把它们发布到这个GitHub库了。
编者按:如上图所示,以太坊的公钥和地址是由私钥生成的,其生成所需的数学运算是完全公开的。
以上是区块链钱包的科普:如何通过私钥创建以太坊钱包地址的细节。更多关于通过私钥创建以太坊钱包地址的信息,请关注coir.com其他相关文章!