作者: Jose Aguinaga

翻译&校对: 闵敏 & 阿剑

私钥为原材料

正如我在本系列榜首篇文章《私钥是什么》中所述,生成私钥的进程依赖于伪随机数生成器(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 中运用。

在本系列下一篇(也是最终一篇)文章中,咱们将介绍如何运用私钥来创立并播送买卖、签署消息,以及这些签名在以太坊生态中有什么影响。

视野开拓

错过列车只有在你追赶它时才是痛苦的!同样,不能达到别人对你期望的成功,只有在它也是你所追求的东西时才是痛苦的。 我有时惊异于为什么人们会因为一顿不好吃的饭、一杯冷咖啡、一次社交挫折或粗鲁的接待而伤心一天或者感到愤怒。回忆一下,我在第八章讨论过人们难过看到自己生活中发生的事件的真实概率。我们很容易忘记我们活着本身就是极大的运气,一个可能性微小的事件,一个极大的偶然。 想象一下一个10亿倍于地球的行星边上的一粒尘埃。这粒尘埃就代表你出生的概率,庞大的行星则代表相反的概率。所以不要再为小事烦恼了。不要再像一个忘恩负义者,得到一座城堡,还要介意浴室里的霉菌。不要再检查别人赠与你的马匹的牙齿,请记住,你就是黑天鹅。-《The Black Swa》

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注