如何用比特币私钥创建以太坊地址?在区块链的钱包里,私钥可以生成公钥,但不可能从公钥中计算出私钥。用公钥加密的信息可以用私钥解密,用私钥签名的信息可以用公钥验证。验证通过后,可以证明信息确实是私钥持有人发布的。BTC例如,在这个过程中最重要的角色是" 椭圆曲线加密算法"。
有人认为 BTC 跟 ETH 是不同的链条,所以椭圆曲线不同,但事实上,两条链都使用相同的 secp256k1 曲线,所以获得公钥的方式完全相同。区别在于从公钥生成地址的过程。接下来,我们将介绍如何安全生成私钥,然后解释 ETH 如何从地址验证私钥生成的公钥。
私钥的规格
私钥必须是正数,必须小于 secp256k1 曲线阶 (secp256k1 的阶为FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141),每一点都可以由一组 256代表,需要提供这个曲线算法 32 字节的数据。
换句话说,BTC 及 ETH私钥是一组 32 字节字符串,但也可以是二进制字符串Base64字符串、WIF 密钥,助记码( mnemonic phrase ),十六进制字符串。
新手投币基础知识优势
生成安全的私钥
既然我们都知道他们使用相同的曲线,我们实际上可以使用 BTC 社区信任 bitaddress.org 生成我们的私钥(用 MEW 或 Metamask 也是一个不错的选择,至少他不能是一串暴露的私钥),但如果我们有良好的安全意识,我们甚至不应该使用浏览器生成重要的私钥 (你可以看到 Reddit 讨论),所以我们将使用 python设计一个更简单的 bitaddress。
了解 Bitaddress原理
Bitaddress 做了三件事。初始化字节数组,然后尝试从用户的计算机获得尽可能多的熵,根据用户的输入填满数组,最后生成私钥。
Bitaddress 用 256 字节的数组存储熵。这个数组是循环复制的,所以当数组第一次填充时,索引变为零,然后复制过程再次开始。
程序从 window.crypto 生成 256 字节数组。然后写一个时间戳来获得 4 字节的熵。之后,它获得了一些其他数据,包括屏幕大小、时间区域、浏览器扩展套件、区域等。获得另一个 6 字节。
初始化后,用户继续输入并重复初始字节。当移动光标时,程序将写入光标的位置。按下按钮时,程序将写入按钮的字符代码。
最后,bitaddress 使用累积熵生成私钥。bitaddress 用名为 ARC4 的 RNG算法。使用当前时间和收集的熵初始化ARC四、然后逐一获得字节,共取 32 次。
我们自己的种子池
从加密 开始RNG 在时间戳中写一些字节。__seed_int 以及__seed_byte两个函式将熵插入池中,而我们使用secrets产生我们的随机数。
输入填充种子池
在这里,我们先写一个时间戳,然后写入用户输入的字符串。
生成私钥
首先,使用我们的池生成 32 位数,并确保我们的私钥在范围内(1,CURVE_ORDER),然后,为了方便,我们将其转换为16进制并删除 0x 的部分。
生成ETH公钥
用椭圆曲线代替我们刚才的私钥,我们会得到 64 字节的整数,即两个 32 字节的整数,代表 连接到椭圆曲线上X 点和 Y 点。
校验和 (ERC-55)
比特币创建了创建了校准和校准,并在公钥哈希后获得回传值。如果不添加校准和,则无法获得有效地址。
但以太坊一开始并没有验证公钥完整性的机制。Vitalik Buterin 2016年引入校准机制,也就是 EIP-后来被钱包和交易中心采用。
将验证添加到以太坊钱包地址,以区分大小写
首先,获取地址Keccak-256 哈希值。需要注意的是,当地址传输到哈希函数时,不能有0x的部分。
第二,按顺序迭代初始地址的字节。如果哈希值是第 i 如果字节大于或等于 8,将是第 i 将地址的字符转换为大写,否则将其保留为小写。
最后,在回传字符串的开头加回0x。如果忽略大小写,验证和地址将与初始地址相同。但使用大写字母的地址可以检查地址是否有效。
这种验证有几个好处:
1. 向后兼容许多接受混合大小写的十六进制分析器,以后也可以轻松引入;
2. 40个字符保持长度;
3. 平均每个地址将有 15 验证位置。如果输入错误,随机生成的地址意外通过检查的净概率为0.0247%,虽然不如 4 字节的验证代码好,但比 好ICAP 提高了50倍左右;
总结
为以太坊创建钱包地址比比比特币简单得多。我们需要做的是把私钥扔到椭圆曲线上,然后把公钥扔到椭圆曲线上Keccak-最后,在哈希值后取 20 字节。