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

昕阳小编 113 0

2022以太坊地址是怎么来的 以太坊地址生成过程-第1张图片-昕阳网

以太坊地址是怎么来的

以私钥为原料生成私钥的过程

取决于伪随机数发生器(PRNG)和足够的熵。私钥最重要的是从1到22?在-1范围内随机选择的整数。这个范围内的任何数字都可以用作私钥。

2022以太坊地址是怎么来的 以太坊地址生成过程-第2张图片-昕阳网

现在我们已经初步学习了私钥背后的数学知识,可以自己生成一个有效的私钥(译者注:出于教育目的,可以按照作者的思路,但不建议自己生成。)。让我们把私钥生成过程想象成一个长度为78位的水平数字密码锁(可能的组合数正好等于22?-1),那么我们把这个密码锁分成3行,每行26位。你可以把PRNG函数想象成随机排列数字并创建数字组合的东西:起初,每一位都是0,然后在每一位上随机选择一个特定的数字。假设我们用PRNG函数生成乱序数,得到如下三行数:

(1)0440694132102621719184878;

(2)43014596507006094171646853;

(3)06780198554267270848908554;

2022以太坊地址是怎么来的 以太坊地址生成过程-第3张图片-昕阳网

-浏览器使用Web Cryptography API(提供Crypto.getRandomValues(32)等加密原语,或等效的32字节缓冲区)作为PRNG。这个PRNG使用你的计算机熵源作为随机种子来生成随机数。生成随机数时,请务必使用电子熵源,因为有研究表明,人类并不擅长选择随机数(人们自己选择的数是有模式的,达不到伪随机要求)-

恭喜!现在你是私钥

440694132110262171918487843014596507060941716685308019854270848908554的所有者。

我们可以用这个私钥生成一个比特币或者以太坊地址,或者1到22之间的任何东西?-1是具有私钥范围的区块链的地址。

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

位和字节

在进行下一步之前,我们需要知道什么是位和字节。任何数字设备只能理解由0和1组成的信息,通常称为bit。比特是“二进制数”,即只用1和0表示的数。虽然我们的智能手机和电脑可以显示汉字和图片,也可以播放歌曲,但都是比特来表示和处理这些信息。比特越多,信息量越大,但归根结底无非是一堆0和1。

根据上下文的不同,多个位可以表示字符(例如,使用ASCII编码时,字母A的定义为01100001)或数字(01100001也可用于表示十进制数97)。当十进制整数被转换为二进制形式时,它被转换为基于2的幂的和,其中每个幂的指数增加。例如,我们通常以十进制形式计算数字,这是以10为基数的幂的和。因此,在使用二进制时,我们可以用n位来表示和存储2的n次方以内的整数。

2022以太坊地址是怎么来的 以太坊地址生成过程-第4张图片-昕阳网

-8位视频游戏机所能表示的最大十进制数是255,因为它们所使用的中央处理器(CPU)最多只能进行8位运算(译者注:上图左侧解释了为什么n位可以表示2的n次方以内的数——因为它的数组合有2的n次方的可能性;右图演示了一个二进制数表示多大的整数,也就是相互转换的计算规则——

虽然我们可以用二进制形式来表示任何数,但是二进制形式太“繁琐”了。为了表示97,我们需要8个二进制数字。二进制数字易于计算机处理,但不便于人类阅读。因此,计算机通常用十六进制而不是二进制来表示数据:位号系统以16为基数来表示数字。一位数的十六进制数可以代表四位数的二进制数。我们可以用十六进制数61来表示二进制数01100001或者比二进制数少6位的十进制数97。十六进制数用ABCDEF来表示10到15,通常用来减少数据。

私钥有多少位?

回到私钥,我们知道私钥的范围是1到22?-1。我们如何用比特来表示它?需要多少位?如上所述,当十进制整数被转换成二进制形式时,它们被转换成以2为基数的幂和。使用8位二进制数时,我们能表示的最大数是2?2?2?2?23 22 21 2?也就是整数255。我们可以看到,要表达2 n以内的数,需要n位。可以推断出,我们需要256位或32字节(256/8)来表示我们的私钥。

2022以太坊地址是怎么来的 以太坊地址生成过程-第5张图片-昕阳网-十六进制数据表示法旨在减少表示数字所需的位数。但是,计算机只能用二进制来处理数据-

如果我们同意需要用32个字节来表示我们在[1,22?-1],那么在十六进制形式中,我们需要64个数字来表示私钥。现在我们可以把原来的私钥[X][X]4406941321102621719184878430145965070060941716468530678019854267270848908554[X][X]转换成十六进制形式:[X][X]66e 6769652 e6a 6 A 706572657 A 667777看到这些字母,我们很容易判断出这个数是十六进制的。

从私钥到公钥

现在,我们可以把这个十六进制私钥告诉我们的计算机了。我们可以使用JavaScript之类的编程语言很容易地导入这个十六进制的私钥,这样它就可以用于后续的乘法运算。在接下来的代码中,将之前获得的十六进制数作为私钥导入(“sk”是secret_key的缩写,是密码学中的标准记法)。这个十六进制数以16为基础。

-通过使用BigNumber库,我们可以确保在转换过程中不会丢失任何小数。这些数通常用指数表示(例如4.40694132102622E76),如果直接解析成十六进制,就会失去精度。如果不使用BigNumber库,我们得到的十六进制私钥就会变成

616 e 6769652 e 6 c 000000000000000000000-

导入私钥后,下一步就是创建公钥。您可能还记得,我们在第一篇文章中提到过,在获取以太坊地址之前,我们需要通过私钥生成公钥。根据以太坊黄皮书,公钥生成过程遵循标准的ECDSA公钥生成算法,其中我们将私钥乘以生成点得到一个坐标,坐标的x值和y值拼在一起就是公钥。我们的公钥(密码学中记为“pk”)可以用来生成我们的以太坊地址。[X] [X] [X] [X]-X和Y是椭圆曲线上的点乘以我们的私钥(sk)得到的。 虽然在任何区块链中私钥都可以作为一个地址的唯一生成器,但是邰方特别使用椭圆曲线secp256k1来生成公钥;所以私钥的签名操作也和这条曲线上述文章内容就是——

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

给定一个私钥,以太坊地址A就是ECDSA公钥对应的Keccak哈希值最右边的160位。2022以太坊地址是怎么来的 以太坊地址生成过程-第6张图片-昕阳网

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

-以太坊地址设计为20字节。有人认为删除一些字节(具体来说是12个字节)可能会造成碰撞,导致两个私钥产生相同的以太坊地址。然而到目前为止,这种情况从未发生过——

你的个人专属钱包

2022以太坊地址是怎么来的 以太坊地址生成过程-第7张图片-昕阳网正如你所看到的,仅仅一个数字(虽然很长)就可以生成一个以太坊地址来存储各种资产:从代表虚拟的猫、磁带、袜子、门票的NFT,到具有增值潜力的密码资产等。你的以太坊地址是公开的,和你的家庭地址一样,但是只能用钥匙打开。如果你不想自己处理所有这些过程,你可以在Portis上注册一个帐户。Portis会自动为你创建一个私钥(这个私钥只有你自己知道,因为它采用了端到端的加密架构)和对应的以太坊地址,供你在100多个dApp中使用。

以太坊地址生成流程

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

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

2。将私钥转换成secp256k1未压缩格式的公钥,即512位公钥。

3。使用哈希算法Keccak256计算公钥的哈希值,并将其转换为十六进制字符串。

4。取十六进制字符串的最后40个字母,并在开头添加0x作为地址。2022以太坊地址是怎么来的 以太坊地址生成过程-第8张图片-昕阳网以太坊地址生成示例

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

私钥:1 F2 b 77 E3 a 450120692912 c 94b 204540 ad 4404386 b 10 c 615786 a 7 efaa 065d 20

公钥:04 DFA 13518 ff 965498743 F3 a 01439 DD 86 BC 34 ff 969 c 7 a 3 f 04300hex()' 1 f2b 77 E3 a4 b 50120692912 c94b 204540 ad 4404386 b 10 c 615786 a 7 efaa 065d 20 '

私钥生成公钥

以太坊使用的椭圆曲线算法是secp256k1,由私钥生成。

使用bx(bx)工具生成公钥

Mac用户可以使用布鲁尔安装bx(bx)工具:

$ brew安装bx

以一个f2b 77 E3 a 4b 501206292912 c 94b 204540 a 44404386 b 10 c 615786 a 7个EFA 065d 20作为私钥,然后使用bx(bx)工具将私钥转化为第256k条的非压缩格式公钥:

$ bx欧共体对公众1a 4b 501206292912 c 94 b 204540 ad 44404386 b10c 615786 a 7 EFA 065 d20-u04 DFA 13518 ff 96549743 F3 a 01439 DD 34 ff 9969 C7 a 3f 0430 bbf 88657344252953 c 9884 af 784 EB 67使用secp 256 k1 py包生成公钥

使用点走吧安装:

$ pip安装秒256 k1

之后将私钥转化为公钥:

导入sec 256 k1 private _ key=' 1f2b 77 e3a 4b 501206292912 c 94b 204540 ad 44404386 b110c 615786 a 7 EFA 065d 20 ' private _ key=字节fromhex(private _ key)私钥=sec 256 k1 . private _ key privatkey。pubkey。序列化(compressed=false).hex()' 04 DFA 13518 ff 96549743 F3 a 01439 DD 86 BC 34 ff 9969 C7 a3 f 0430 bbf 886573452953 c 9884 af 787 B2 cadd 45 f92 dff 2 b81 e 21 cfdf 98873 e 492 e 5 FDC 07 e 9 EB 67 ca 74d

计算公钥哈希值

要使用keccak256战斗机哈希算法,可以使用加密模式(加密模式)工具,使用点走吧进行安装:

$ pip安装pycrypt方法

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

来自加密。散列导入keccak _ hash=keccak。new(digest _ bits=256)public _ key=' 04 DFA 13518 ff 96549743 F3 a 01439 DD 86 BC 34 ff 9969 C7 a3 f 0430 bbf 886573452953 c 9884 af 787 B2 cadd 45 f92 dff 2 b81 e 21 cfdf 98873 e 492 e 5 FDC 07 e 9 EB 67 ca 74 de[2> public_key = bytes.fromhex(public_key)>>> keccak_hash.update(public_key)>>> keccak_hash.hexdigest()'39c0eb3b26d4838930b1f34babcd68033a72978c1084e2d44d1fa06ddc4a2d57'

得到地址

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

>>> '0x'2022尚力财经小编 + '39c0eb3b26d4838930b1f34babcd68033a72978c1084e2d44d1fa06ddc4a2d57'[-40:]'0xabcd68033a72978c1084e2d44d1fa06ddc4a2d57'

以太坊地址生成 Python3 实现

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

import secp256k1from Crypto.Hash import keccakdef 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 = 2022尚力财经小编 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 库。

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

标签: do 2022

抱歉,评论功能暂时关闭!

微信号已复制,请打开微信添加咨询详情!