从私钥创建比特币钱包地址有点复杂。在这里,我们会使过程更加简单化。我们需要应用一个哈希函数来获取公钥,另一个哈希函数来获取地址。让我们开始吧。
我们需要做的第一件事是将ECDSA或椭圆曲线数字签名算法应用于我们的私钥。椭圆曲线是由等式 y²=x³+ax+b
定义的曲线,选择a和b。有一整套这样的曲线是公认并在使用的。比特币使用secp256k1曲线。
以太坊使用相同的椭圆曲线secp256k1,因此获取公钥的过程在两种加密货币中都是相同的。
通过将ECDSA应用于私钥 60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2
,我们得到一个64字节的整数,它是两个32字节的整数,表示椭圆曲线上的点的X和Y,连接在一起。
对于我们的例子,我们得到了 1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7
。
在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’)
PYthon学习企鹅裙:88198-2657 领取python自动化编程资料教程
注意:正如你从上面的代码中看到的,我使用了 ecdsa
模块中的方法,并使用 codecs
解码了私钥。这与Python相关,而不是算法本身,但我将解释我们在这里做了什么来消除可能的混淆。
在Python中,至少有两个类可以保留私钥和公钥:“str”和“bytes”。第一个是字符串,第二个是字节数组。Python中的加密方法使用“bytes”类,将其作为输入并将其作为结果返回。
现在,有一个小问题:一个字符串,比方说, 4f3c
不等于字节数组 4f3c
。相反,它等于具有两个元素的字节数组, O&
lt;。这就是 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 bytes
wallet_len = 40
wallet = ‘0x’ + keccak_digest[-wallet_len:]
PYthon学习企鹅裙:88198-2657 领取python自动化编程资料教程
现在,你可能还记得,比特币通过哈希公钥并获取结果的前4个字节来创建校验和。对于所有比特币地址都是如此,因此如果不添加校验和字节,则无法获得有效地址。
在以太坊,这不是事情的运作方式。最初,没有校验和机制来验证密钥的完整性。然而,在2016年,Vitalik Buterin 引入了校验和机制,后来被钱包和交易所采用。
将校验和添加到以太坊钱包地址会使其区分大小写。
首先,你需要获取地址的Keccak-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)
PYthon学习企鹅裙:88198-2657 领取python自动化编程资料教程
如你所见,为以太坊创建地址比比特币简单得多。我们需要做的就是将ECDSA应用于公钥,然后应用Keccak-256,最后获取该哈希的最后20个字节。
如果你想使用代码,我将其发布到 GitHub存储库 。
======================================================================
分享一些比特币、以太坊、EOS、Fabric等区块链相关的交互式在线编程实战教程: