以太坊地址是怎么来的?_币世界+以太坊爱好者

2021-03-29 09:11 栏目:行业动态 来源:网络整理 查看()

导入私钥后,下一步是创建公钥。作者: Jose Aguinaga

翻译校对:敏敏阿健

使用私钥作为原材料

正如我在本系列的第一篇文章《私钥是什么》中提到的,生成私钥的过程取决于伪随机数生成器(PRNG)和足够的熵。私钥最重要的是它是从1到2-1中随机选择的整数。该范围内的任何数字都可以用作私钥。

以太坊地址是怎么来的?_币世界+以太坊爱好者

现在我们已经初步学习了私钥背后的数学知识,可以自己生成一个有效的私钥。)。我们不妨把私钥生成过程想象成一个长度为78位(可能的组合数正好等于2-1)的水平数字密码锁,然后我们把这个密码锁分成3行,每行26位。你可以把PRNG函数想象成随机打乱数字和数字组合的东西:首先,每个数字是0,然后从每个数字中随机选择一个特定的数字。假设我们使用PRNG函数生成无序的数字组合,并得到以下三行数字:

(1) 04406941321102621719184878;

(2) 43014596507006094171646853;

(3) 06780198554267270848908554;

以太坊地址是怎么来的?_币世界+以太坊爱好者

-浏览器使用网络加密应用编程接口(提供加密原语,如加密值(32)或等效的32字节缓冲区)作为PRNG。这个PRNG使用你的计算机熵源作为随机种子来产生随机数。生成随机数时,请使用电子熵源,因为有研究表明人类不善于选择随机数(人自己选择的数字有模式,不能满足伪随机要求)-

恭喜!你现在是私钥的所有者。44069413211026217191848784301459607009417164685306780198542084848908的密钥。

我们可以用这个私钥生成一个比特币或以太网地址,或者任何1到2-1的区块链地址作为私钥范围。

要基于这个私钥生成一个Ethereum地址,我们需要使用椭圆曲线点乘算法(需要一篇专门的文章来说明)。所以为了简单,我们就交给电脑处理。为此,我们需要把这个私钥“告诉”计算机。问题是计算机不能处理十进制形式的信息,它只能理解二进制代码。目前我们只有十进制数字形式的私钥。因此,我们必须首先将这个私钥从十进制数转换成计算机可以理解的位(也翻译成“位”或“位”)和字节(一个字节等于8位)。

位和字节

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

根据上下文,多位可以表示字符(例如,使用ASCII编码时,字母A的定义是01100001)或数字(01100001也可以表示十进制数字97)。十进制整数转化为二进制形式时,转化为以2为基础的幂之和,其中各幂的指数递增。比如我们通常以十进制形式计数,十进制数是以10为基础的乘幂之和。所以在使用二进制时,n次方2以内的整数可以用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位二进制数时,我们可以表示的最大数字是22 2 2 2 2 2 2 2,即255的整数。我们可以看到,要表示2 n以内的数字,我们需要n位。由此可以推断,我们需要256位或32字节(256/8)来表示我们的私钥。

以太坊地址是怎么来的?_币世界+以太坊爱好者

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

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

44069413211026217191848784301459650700609417164685306780198554267270848908554

转换为十六进制形式:

616 e 6769652 e6a 7a 706572657 a 616775696 e 6167612 e 6574682 e6b 696 e6b 0d 0a

看到十六进制私钥中多余的字母a,b,c,d,e了吗?看到这些字母,就很容易看出这个数字是十六进制的。

从私钥到公钥

现在,我们可以告诉我们的计算机这个十六进制私钥。我们可以通过使用JavaScript等编程语言轻松导入这个十六进制的私钥,这样就可以用于后续的乘法运算。在下面的代码中,之前获得的十六进制数作为私钥导入(“sk”是secret_key的缩写,是密码学中的标准符号)。这个十六进制数以16为基础。

以太坊地址是怎么来的?_币世界+以太坊爱好者

-通过使用BigNumber库,我们可以确保在转换过程中不会丢失小数。这些数字通常用指数表示(例如4.406941321102622e 76),如果直接解析成十六进制,会失去精度。如果不使用BigNumber库,我们得到的十六进制私钥将变成616 e 6769652 e6c 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

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

以太坊地址是怎么来的?_币世界+以太坊爱好者

-x和y是用椭圆曲线上的点乘以我们的私钥(sk)得到的。虽然在任何一个区块链,私钥都可以作为一个地址的唯一生成器,但是邰方特别使用椭圆曲线secp256k1来生成公钥;所以私钥签名操作也和这条曲线有关——

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

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

以太坊地址是怎么来的?_币世界+以太坊爱好者

-以太网地址设计为20字节。有人认为删除一些字节(具体是12个字节)可能会造成冲突,导致两个私钥产生相同的Ethereum地址。但到目前为止,这还没有发生-

你的私人钱包

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

在本系列的下一篇(也是最后一篇)文章中,我们将介绍如何使用私钥来创建和广播事务、签名消息,以及这些签名如何影响以太网生态系统。

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发