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、等区块链相关的交互式在线编程实战教程:
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。