当前位置:主页 > 区块链 > 区块链技术 > 以太坊地址知识分享

以太坊地址是怎么来的 以太坊地址生成过程

2021-03-30 10:28:05 | 来源:区块天眼 | 作者:佚名
这篇文章主要介绍了以太坊地址是怎么来的?以太坊地址生成过程,地址的生成的流程是:私钥 -> 公钥 -> 地址。因此地址的生成需要三步:1、生成一个随机的私钥(32字节)2、通过私钥生成公钥(64字节)3、通过公钥得到地址(20字节),具体的内容请大家参考内容吧!

以太坊地址是怎么来的 以太坊地址生成过程

以太坊地址是怎么来的

以私钥为原材料

  生成私钥的过程依赖于伪随机数生成器(PRNG)和足够大的熵。关于私钥,最重要的一点是,它是从 1 到 2²⁵⁶-1 的范围内随机选出的整数。只要是在这个范围内的数,都可以用作私钥。

以太坊地址是怎么来的 以太坊地址生成过程

  既然我们已经初步学习了私钥背后的数学知识,接下来就可以自己生成有效的私钥了(译者注:教育目的,可跟随作者的思路学习,但不推荐自己生成。)。我们不妨将私钥生成过程想象成一个长达 78 位的水平数字组合锁(其可能组合数量恰好等于 2²⁵⁶-1),然后我们把这个密码锁分成 3 排,每排有 26 位。你可以把 PRNG 函数想象成一个会随机打乱数字,打乱出一个数字组合的东西:一开始每一位都是 0,然后毫无章法地在每一位上选出一个具体的数字。假设我们使用 PRNG 函数生成乱序的数字组合,得到以下三排数字:

  (1) 04406941321102621719184878;

  (2) 43014596507006094171646853;

  (3) 06780198554267270848908554;

以太坊地址是怎么来的 以太坊地址生成过程

  - 浏览器使用 Web Cryptography API (提供 Crypto.getRandomValues(32) 之类的密码学原语,或者等价的 32 字节缓冲区)作为 PRNG。这个 PRNG 使用你的计算机熵源 作为随机种子来生成随机数。在生成随机数的时候,请一定要使用电子熵源,因为一些研究表明,人类比较不擅长选择随机数字(人自己选出来的数字是有模式的,到不到伪随机的要求) -

  恭喜!你现在已经是私钥

  44069413211026217191848784301459650700609417164685306780198554267270848908554 的所有者了。

  我们可以使用这个私钥生成一个比特币或以太坊地址,或者任何以 1 至 2²⁵⁶-1 为私钥范围的区块链的地址。

  要根据这个私钥生成一个以太坊地址,我们需要使用椭圆曲线点乘算法(需要一篇专门的文章才能讲清楚)。因此,简单起见,我们会把它交给计算机处理。为此,我们需要把这个私钥“告诉”计算机。麻烦的是,计算机不会处理十进制形式的信息,它只能理解二进制代码。目前,我们的只有十进制数形式的私钥。因此,我们先要将这个私钥从十进制数形式转换为计算机可以理解的比特(bit,也译成 “位” 或 “位元”)和字节(byte,一个字节等于 8 个比特)。

  位和字节

  在进行下一步操作之前,我们需要先了解什么是比特和字节。任何数字设备都只能理解由 0 和 1 组成的信息,通常被称为比特。比特就是“二进制数字”,即,仅使用 1 和 0 表示的数字。虽然我们的智能手机和电脑都可以显示汉字和图片,还能播放歌曲,它们最终都是比特来表示并处理这些信息的。位越多,表示的信息越大,但说到底无非是一堆 0 和 1 而已。

  根据上下文,多个位可以表示字符(如,在使用 ASCII 编码时,字母 a 的定义就是 01100001)或数字(01100001 也可以用来表示十进制数 97)。在将十进制整数转换为二进制形式时,就是将其转换成以 2 为底数的幂之和,其中每个幂的指数递增。例如,我们通常采用十进制形式记数,十进制数就是以 10 为底数的幂之和。因此,在使用二进制时,在 2 的N 次幂以内的整数,我们就可以用 n 个位来表示和存储。

以太坊地址是怎么来的 以太坊地址生成过程

  - 8 位电子游戏机最高能够表达的十进制数是 255,因为它们使用的中央处理单元(CPU)最多只能执行 8 位操作(译者注:上图的左边解释了为什么 N 个位就可以表示 2 的 N 次幂以内的数 -- 因为其数字组合有 2 的 N 次幂种可能性;右边则演示了一个二进 制数意味着多大的整数,即相互转换的计算规则 -

  虽然我们可以使用二进制形式来表达任何数字,但是二进制形式过于“繁冗”。如果要表示 97,我们需要 8 个二进制数字。二进制数对于计算机来说很容易处理,但是不方便人类阅读。因此,计算机通常会使用十六进制而非二进制来表示数据:位置数字系统以 16 为底数来表示数字。一位十六进制数可表示四位二进制数。我们可以用十六进制数 61 来表示二进制数 01100001 或十进制数 97,这样就比二进制少了 6 位数。十六进制数使用 ABCDEF 来表示 10 至 15,通常用来缩小数据。

  私钥有多少个比特?

  再说回私钥,我们知道私钥的范围是 1 至 2²⁵⁶-1。我们该如何用位来表示它?需要用到多少位?如上文所述,在将十进制整数转换为二进制形式时,就是将其转换成以 2 为底数的幂之和。在使用 8 位二进制数时,我们能表示的最大的数是 2⁷ + 2⁶ + 2⁵ + 2⁴ + 2³ + 2² + 2¹ + 2⁰,即,整数 255。我们可以看出,要表达 2^n 以内的数,我们就需要 n 个位。由此可推得,我们需要 256 位,或者说 32 字节(256/8),来表示我们的私钥。

以太坊地址是怎么来的 以太坊地址生成过程

  - 十六进制数据表示旨在减少表示数字所需的位数。但是,计算机依然只能使用二进制来处理数据 -

  如果我们一致同意需要使用 32 字节来表示我们在 [1, 2²⁵⁶-1] 范围内的私钥,那么在十六进制形式下,我们需要 64 个数来表示私钥。现在,我们可以将原始私钥

  44069413211026217191848784301459650700609417164685306780198554267270848908554

  转换成十六进制形式:

  616E6769652E6A6A706572657A616775696E6167612E6574682E6C696E6B0D0A

  看到十六进制私钥中多出的字母 A、B、C、D、E 了吗?看到这些字母,我们就可以轻易辨别出这个数是十六进制的。

  从私钥到公钥

  现在,我们可以把这个十六进制私钥告诉我们的计算机了。我们可以使用 JavaScript 之类的编程语言轻松导入这个十六进制私钥,以便用于之后的乘法运算。在以下代码中,之前得到的十六进制数被导入作为私钥(“sk”是 secret_key 的缩写,是密码学中的标准记法)。这个十六进制数是以 16 为底数的。

以太坊地址是怎么来的 以太坊地址生成过程

  - 通过使用 BigNumber 库,我们可以确保转换过程中不会丢失任何小数。这些数字通常会被表达成指数(例如,4.406941321102622e+76),而且如果我们直接将其解析成十六进制,就会失去精度。如果不使用 BigNumber 库,我们得到的十六进制私钥就会变成

  616e6769652e6c00000000000000000000000000000000000000000000000000 -

  导入私钥之后,下一步就是创建公钥。你可能还记得,我们在第一篇文章中提到过,在获取以太坊地址之前,我们先要通过私钥来生成公钥。根据以太坊黄皮书所述,公钥生成过程遵循的是标准的 ECDSA 公钥生成算法,其中,我们将私钥乘以生成器点得到一个坐标,将该坐标的 x 值和 y 值前后拼在一起就是公钥。我们的公钥(在密码学中记为“pk”)可以用来生成我们的以太坊地址。

以太坊地址是怎么来的 以太坊地址生成过程

  - x 和 y 是使用椭圆曲线上的点乘以我们的私钥(sk)得到的。虽然私钥可以在任意区块链中作为一个地址的唯一生成器,以 太坊专门使用椭圆曲线 secp256k1 生成公钥;因此,私钥的签名操作也跟这条曲线有关 -

  终于到了最后一步。有了公钥,我们就执行黄皮书中的最后一个操作:

  给定某个私钥,以太坊地址 A 是对应 ECDSA 公钥的 Keccak 哈希值的最右边 160 位。

  鉴于我们已经有了自己的 ECDSA 公钥,剩下的唯一一件事是在我们的公钥上执行 Keccak 哈希函数,取结果最右边的 160 位。当我们将这些操作结果存储在“缓冲区”(就好像存储信息的小盒子)时,我们可以“丢掉”(切片)前 24 个十六进制数,只留下后 40 个十六进制数,或者更准确地说,20 个字节(这就是以太坊地址的长度)。

以太坊地址是怎么来的 以太坊地址生成过程

  - 以太坊地址被设计为 20 个字节。有人认为删掉一些字节(具体来说是 12 个字节)可能会引起碰撞,导致两个私钥生成相同的以太坊地址。不过到目前为止,还没发生过这种情况 -

  你的个人专属钱包

  如你所见,只要一个数(虽然很长)就可以生成一个以太坊地址来存储各类资产:从代表虚拟猫、磁带、袜子和门票等物品的 NFT 到具有增值潜力的密码学资产等等。你的以太坊地址是公开的,而且像你的家庭住址一样,但是只能通过钥匙打开。如果你不想自己来处理所有这些流程,你可以在 Portis 上注册一个账户。Portis 会自动为你创建私钥(这个私钥只有你知道,因为它采用的是端到端加密架构)以及对应的以太坊地址,供你在 100 多个 dApp 中使用。

以太坊地址生成过程

以太坊地址生成过程如下:

1、生成 256 位随机数作为私钥。

2、将私钥转化为 secp256k1 非压缩格式的公钥,即 512 位的公钥。

3、使用散列算法 Keccak256 计算公钥的哈希值,转化为十六进制字符串。

4、取十六进制字符串的后 40 个字母,开头加上 0x 作为地址。
 

以太坊地址生成实例

生成以太坊地址过程实例数据:

私钥:1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20

公钥:04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d

地址:0xabcd68033A72978C1084E2d44D1Fa06DdC4A2d57
 

生成随机数作为私钥

生成 256 位随机数:

>>> import random
>>> r = random.randint(0, 2**256)
>>> r
14098500174935566811277058424286341448580475958153633347646702637404947635488
>>> r.to_bytes(32, byteorder='big').hex()
'1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20'

私钥生成公钥

以太坊使用的椭圆曲线算法为 secp256k1,从私钥生成对应的公钥有两种方法:比特币工具 bx 和 secp256k1-py 包。

使用 bx 工具生成公钥

Mac 用户可以使用 brew 安装 bx 工具:

$ brew install bx

以 1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20 作为私钥,然后使用 bx 工具将私钥转化为 secp256k1 的非压缩格式公钥:

$ bx ec-to-public 1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20 -u
04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d

使用 secp256k1-py 包生成公钥

使用 pip 安装:

$ pip install secp256k1

之后将私钥转化为公钥:

>>> import secp256k1
>>> private_key = '1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20'
>>> private_key = bytes.fromhex(private_key)
>>> privkey = secp256k1.PrivateKey(private_key)
>>> privkey.pubkey.serialize(compressed=False).hex()
'04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d'

计算公钥哈希值

要使用 keccak256 哈希算法,可以使用 PyCryptodome 工具,使用 pip 进行安装:

$ pip install pycryptodome

公钥开头去除 04,将剩余部分转化为字节串并使用 keccak256 算法进行哈希:

>>> from Crypto.Hash import keccak
>>> keccak_hash = keccak.new(digest_bits=256)
>>> public_key = '04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d'[2:]
>>> public_key = bytes.fromhex(public_key)
>>> keccak_hash.update(public_key)
<Crypto.Hash.keccak.Keccak_Hash object at 0x102960588>
>>> keccak_hash.hexdigest()
'39c0eb3b26d4838930b1f34babcd68033a72978c1084e2d44d1fa06ddc4a2d57'

得到地址

取哈希值十六进制字符串后 40 个字母,开头加上 0x 生成最终的以太坊地址:

>>> '0x' + '39c0eb3b26d4838930b1f34babcd68033a72978c1084e2d44d1fa06ddc4a2d57'[-40:]
'0xabcd68033a72978c1084e2d44d1fa06ddc4a2d57'

以太坊地址生成 Python3 实现

使用 Python3 实现以太坊地址生成:

import secp256k1
from Crypto.Hash import keccak

def get_eth_addr(private_key_str=None):
    if private_key_str is None:
        private_key = secp256k1.PrivateKey()
        private_key_str = private_key.serialize()
    else:
        private_key_bytes = bytes.fromhex(private_key_str)
        private_key = secp256k1.PrivateKey(private_key_bytes)
    public_key_bytes = private_key.pubkey.serialize(compressed=False)
    public_key_str = public_key_bytes.hex()
    keccak_hash = keccak.new(digest_bits=256)
    keccak_hash.update(public_key_bytes[1:])
    h = keccak_hash.hexdigest()
    address = '0x' + h[-40:]
    return {
        "private_key": private_key_str,
        "public_key": public_key_str,
        "address": address
    }

参考资料

以太坊在线地址生成工具:可以作为以太坊靓号地址生成工具,代码开源:https://github.com/bokub/vanity-eth

https://pycryptodome.readthedocs.io/en/latest/src/hash/keccak.html:Keccak python 工具。

https://github.com/ctz/keccak:Python2 环境下使用的 Keccak,此为源代码,需要自己 clone 在本地使用。

https://github.com/ludbb/secp256k1-py:secp256k1 的 Python 库。

以上就是以太坊地址是怎么来的 以太坊地址生成过程的详细内容,更多关于以太坊地址知识分享的资料请关注脚本之家其它相关文章!

声明:文章内容不代表本站观点及立场,不构成本平台任何投资建议。本文内容仅供参考,风险自担!

你可能感兴趣的文章

币圈快讯

  • 全球年度交易额突破3万亿美元,并购银行家相信特朗普上台的明年会更好

    2024-12-18 01:59
    并购银行家在2024年重新站稳脚跟,如今正在观望唐纳德·特朗普第二个任期是会推动还是阻碍刚刚起步的复苏。数据显示,随着各央行开始降息,全球交易额今年已增长16%至3.1万亿美元。“2025年的大好形势基本已经板上钉钉,”驻纽约的巴克莱美洲并购业务主管DanGrabos表示,“美国大选已经过去,市场普遍乐观地认为我们将处于一个利好增长、监管放松的环境。我认为我们将继续看到各种类型的交易——从超过100亿美元的重大交易到中等规模的活动。”
  • 彭博分析师:预计明年将出现一波加密ETF,XRP、SOL或在LTC和HBARETF之后

    2024-12-18 01:58
    彭博高级ETF分析师EricBalchunas在X平台表示:“我们预计明年将出现一波加密货币ETF,尽管不会一下子全部出现。首先出现的可能是BTCETH组合ETF,然后可能是莱特币(因为它是BTC的分叉,即商品),然后是HBAR(因为没有被标记为证券),随后是XRP、Solana(在未决诉讼中被标记为证券)”。
  • 美国众议院议长:”特朗普效应”已经显现,期待其第二个任期及即将到来的好消息

    2024-12-18 01:28
    美国众议院议长约翰逊表示,"特朗普效应"已经显现。软银将在未来四年内投资1000亿美元,为美国创造10万个新的就业机会,标志着又一个积极信号。我们期待特朗普的第二个任期及即将到来的好消息。
  • 港媒:华强北比特币矿机价格上涨,买家多来自俄罗斯、美国与加拿大

    2024-12-18 01:05
    ChainCatcher消息,受到比特币暴涨的推动,深圳华强北售卖的矿机价格也是水涨船高。一些商家的蚂蚁矿机价格上涨了数成,一位商家表示,蚂蚁矿机S21335T格是每台5,600美元,折合人民币4.07万元,较去年的2.8万元人民币涨了三成。比特大陆官网显示473T的S21XP水冷矿机折合7.39万元人民币,但是已经售罄。 据悉,今年以来尤其是近几个月以来,来自俄罗斯、埃塞俄比亚、美国和加拿大的客户很多,有的是进口数百台新机,有的甚至交易上千台,都是在香港交货付运。(香港文汇报)
  • 顶级交易员Eugene:重新做多SOL、WIF、BONK

    2024-12-18 01:02
    ChainCatcher消息,头部交易员EugeneNgAhSio在X平台发文展示其合约仓位,涉及币种为SOL、WIF、BONK。根据其图片显示,EugeneNgAhSio做多相关代币,永续合约倍数为两倍。
  • 查看更多