作者:Jose aguinaga
翻译:闵敏健
使用私钥作为原材料
正如我在本系列的第一篇文章中所解释的,“什么是私钥?”生成私钥的过程依赖于伪随机数发生器(PRNG)和足够的熵。私钥最重要的一点是0到1的范围。此范围内的任何数字都可以用作私钥。
既然我们已经学会了私钥背后的数学,我们就可以自己生成一个有效的私钥了。我们不妨将私钥生成过程想象成一个78位的水平数字组合锁(可能的组合数正好等于2͇⁶-1),然后我们将密码锁分成三行,每行26位。你可以把PRNG函数看作是随机置乱数字,置乱数字的组合:首先,每一位都是0,然后在每一位上随机选择一个特定的数字。假设我们使用PRNG函数生成一个无序的数字组合,得到以下三行数字:
(1) 04406941321102621719184878;
(2) 43014596507006094171646853;
(3) 06780198554267270848908554;
-浏览器使用web加密API(由加密.GetRandomValue(32)或等效的32字节缓冲区)。这个PRNG使用计算机的熵源作为随机种子来生成随机数。在产生随机数时,我们必须使用电子熵源,因为有研究表明人类不善于选择随机数(人类选择的数字有模式,不能满足伪随机的要求)-
祝贺 你!您现在是私钥的所有者。
我们可以使用此私钥来生成比特币或以太坊地址,或者生成私钥范围为1到2⁵⁶-1的任何区块链的地址。
要根据私钥生成以太坊地址,需要使用椭圆曲线点乘算法。所以,为了简单起见,我们将把它留给计算机。为此,我们需要“告诉”计算机私钥。问题是计算机不处理十进制形式的信息,它们只理解二进制代码。目前,我们的私钥只有十进制形式。因此,我们首先需要将私钥从十进制形式转换为计算机可理解的位和字节。
位元及字节组
在我们继续下一步之前,我们需要知道什么是位和字节。任何数字设备只能理解由0和1组成的信息,通常称为位。位是一个“二进制数”,也就是说,一个只由1和0表示的数。尽管我们的智能手机和电脑可以显示汉字和图片,也可以播放歌曲,但它们最终还是用来表示和处理信息的比特。比特越多,信息就越多,但归根结底,它不过是一堆零和一。
根据上下文,多个位可以表示字符(例如,当使用ASCII编码时,字母A被定义为011001)或数字(011001也可以用于表示十进制97)。当十进制整数转换成二进制形式时,它被转换成以2为基的幂和,其中每一个幂的指数都增加。例如,我们通常用十进制计算,十进制是以10为基数的幂和。因此,当使用二进制时,我们可以使用n位来表示和存储2次方以内的整数。
-8位视频游戏所能表达的**十进制数是255,因为它们使用的CPU最多只能执行8位运算系统数意味着多少个整数,即相互转换的计算规则-
虽然我们可以用二进制形式来表示任何数字,但二进制形式太“麻烦”。为了表示97,我们需要8个二进制数字。二进制数易于计算机处理,但不便于人类阅读。因此,计算机通常使用十六进制而不是二进制来表示数据:位置数字系统使用16作为基数来表示数字。一个十六进制数可以表示四个二进制数。我们可以用十六进制数61来表示二进制数011001或十进制数97,后者比二进制数少6位。十六进制数使用ABCDEF表示10到15,通常用于减少数据量。
私钥有多少位?
回到私钥,我们知道私钥的范围是1到2?͇⁶ – 1. 我们如何用比特来表达它?你需要多少比特?如上所述,当将十进制整数转换为二进制形式时,它被转换为基于2的幂和。当使用8位二进制数时,我们能表示的**数是2⁷+2⁶+2⁵+2⁴+2?+ 2? +2 KUL+2⁰,即整数255。我们可以看到,要表示2^n以内的数字,我们需要n位。可以推断,我们需要256位或32字节(256/8)来表示私钥。
-十六进制数据表示法的目的是减少表示数字所需的位数。然而,计算机仍然只能使用二进制来处理数据-
如果我们同意需要使用32字节来表示[1,2⁵⁶-1]范围内的私钥,那么在十六进制形式中,我们需要64个数字来表示私钥。现在,我们可以传输原始私钥
44069413211026217191848784301459650700609417164685306780198554267270848908554
转换为十六进制格式:
616E6769652E676652E6A706572657A616775696E6167612E6574682E6C696E6B0D0A
你看到十六进制私钥中额外的字母a、B、C、D和E了吗?看到这些字母,我们很容易就知道数字是十六进制的。
从私钥到公钥
现在,我们可以告诉我们的计算机十六进制私钥。我们可以很容易地在编程语言(如JavaScript)中导入十六进制私钥,以便以后乘法。在下面的代码中,前面的十六进制数作为私钥导入(“SK”是secret) key的缩写是密码学中的标准符号。这个十六进制数是以16为基础的。
-通过使用BigNumber库,我们可以确保在转换过程中不会丢失小数。这些数字通常表示为指数(例如,4.406941321102622e+76),如果我们将它们直接解析为十六进制,我们将失去精度。如果我们不使用BigNumber库,我们得到的十六进制私钥将是616e67652e6c60000000000000000000-
导入私钥之后,下一步是创建公钥。您可能还记得,我们在第一篇文章中提到,在获取以太坊地址之前,需要通过私钥生成公钥。根据以太坊黄皮书,公钥的生成过程遵循标准的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中使用。
在本系列的下一篇(也是**一篇)文章中,我们将向您展示如何使用私钥来创建和广播事务、签名消息,以及这些签名对以太坊生态系统的影响。
文章标题:以太坊的地址是怎么来的?
文章链接:https://www.btchangqing.cn/220627.html
更新时间:2021年03月28日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。