• 如何通过私钥创建以太网钱包地址?

    时间:2021-11-17|浏览:125

    我们翻译和出版与密码学货币的私钥、地址和钱包有关的内容,无非是传达几个要点:1. 密码学货币不同于传统银行。你有很多工具可以生成私钥来持有密码学货币。你不需要向银行申请,也不需要向任何人举报。没有人能阻止你拥有自己的私钥和钱包;2. 公钥和用于接收转账的地址是由私钥使用单向数学运算推导出来的。如果不信任现有工具,可以自己使用这些数学运算生成地址;同时,公开地址不会出现安全问题,因为地址不能反向推出公钥或私钥;3. 使用第三方提供的服务时,了解服务的性质,不要向任何人暴露自己的私钥,定期备份。

    如何通过私钥创建以太网钱包地址?

    通过私钥来获得比特币钱包地址的具体流程有些复杂,因此我们会描述简化后的版本。我们需要使用一个哈希函数去获得公钥,还需要使用另一个函数去获得地址。

    现在,让我们开始吧。

    公钥

    这部分内容和之前讨论比特币的文章中所说的相同,所以如果你已经读完了,那么就可以跳过(除非你想要复习一下)。

    首先,我们需要在私钥上使用 ECDSA,即椭圆曲线数字签名算法。椭圆曲线是通过 y² = x³ + ax + b 公式得出的,其中 a 和 b 可以自定义。椭圆曲线家族有很多知名并且广泛应用的案例。比特币使用了 secp256k1 曲线,关于椭圆曲线密码学,如果你想了解更多,可以参考此文章

    以太坊使用了同样的椭圆曲线,secp256k1,因此对于比特币和以太坊来说,获得公钥的流程是相同的。

    对私钥作了 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(字符串),后者则是 byte array(数值)。Python 语言中的密码学运算只能对“bytes”类操作,将 byte 型数据作为输入,并且将输出作为结果。

    但是,这里面有个小问题:作为字符串的“4f3c”和作为 byte array 的 4f3c 是不等同的,string 等于 byte array 和两个元素 O< 的结合。codecs.decode 方法就是将字符串转换为 byte array。本文中使用的密码学操作都要进行这一步骤。

    钱包地址

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

    为了通过公钥得出地址,我们需要做的就是在公钥上应用 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:]

    校验和(checksum)

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

    编者注:校验和(checksum)是一种较为简单的验证数据完整性的方法,具体方法有很多种,比如说对一段数据逐次取 4 个比特,把取出的数全部加起来,最后得到一个 4 个比特的值作为校验和。如果两段数据不一样,产生的校验和有极大概率是不一样的。跟哈希函数的原理有相似之处,但够不上密码学哈希函数那样的强度。)

    例:

    MD5(cvsoiu687y0adbfiq7et5tgho0) = a277a316d38c21786eac518b83af898f

    MD5(wysoiu687y0adbfiq7et5tgho0) = becd314fb8d277cfe20aaadc2b52c177

    在以太坊中,产生地址的流程与此并不相同。最初的时候,以太坊中没有校验和这样的机制来验证秘钥的完整性。但是在 2016 年,Vitalik Buterin 引进了 checksum 机制,现在已经被钱包提供商和交易所使用。

    在以太坊钱包地址上添加 checksum 使得我们可以通过大小写来校验地址的有效性。

    首先,你需要获得地址的 Keccak-256 哈希值。注意,将地址放入哈希函数的时候不可以添加 0x 部分。

    其次,你需要迭代初始地址的字符,如果哈希值中的第 i 个字节(byte)大于或者等于 8,那么你要将地址中的第 i 个字符变为大写,否则就还是保持小写。

    最后,你需要把 0x 添加到结果的开头。如果忽略大小写,那么校验和地址与初始地址是相同的。但是,这种使用大写字母的做法让人们可以随时随地检查地址是否有效。你可以通过这个网页找到有效验证 checksum 的算法。

    如何通过私钥创建以太网钱包地址?


    热点: 比特币 以太坊 比特币钱包 比特币地址 以太坊钱包 银行 数据

    « 上一条| 下一条 »
    区块链币圈-全球区块链数字货币行情、比特币虚拟货币资讯,狗狗币以太坊环保币柚子币莱特币瑞波币等加密数字货币价格非交易行情查询,金色财经巴比特比特范非小号快讯平台。
    乐评商家 乐评资讯趣开心资讯网 Qukaixin.cn ©2020-2024版权所有 桂ICP备19010284号-1