主页 > imtoken钱包地址转账查询 > 比特币开发主题(使用高级密钥和地址调用数字货币)

比特币开发主题(使用高级密钥和地址调用数字货币)

imtoken钱包地址转账查询 2024-01-26 05:15:30

高级密钥和地址

在以下部分中,我们将看到高级形式的密钥和地址,例如加密私钥、脚本和多重签名地址、虚地址和纸钱包。

4.5.1 个加密私钥(BIP0038)

私钥必须保密。私钥的机密性要求在实践中很难实现,因为这一要求与同样重要的安全对象的可用性不一致。当您需要存储备份以避免丢失您的私钥时,您会发现很难维护您的私钥的隐私。使用密码加密私钥的钱包可能更安全一些,但该钱包也需要备份。例如,有时用户需要将密钥从一个钱包转移到另一个钱包,因为他们想要升级或重新安装他们的钱包软件。私钥备份可能还需要存储在纸上(请参阅“4.5.4 纸钱包”一节)或外部存储介质,例如 USB 闪存驱动器。但是如果备份文件被盗或丢失怎么办?这些相互矛盾的安全目标导致了 BIP0038 的引入,这是一种可移植、方便且被许多不同钱包和数字货币客户理解的加密私钥标准。

BIP0038 提出了一个通用标准,使用密码短语加密私钥并使用 Base58Check 对加密后的私钥进行编码,以便加密后的私钥可以安全地存储在备份介质上,在钱包之间安全传输,将密钥的安全性保存在任何可能暴露的情况。该加密标准使用由 NIST 制定的 AES,广泛用于商业和军事应用中的数据加密。

BIP0038的加密方案是:输入一个数字货币私钥,通常用WIF编码,前缀为base58chek字符串的“5”。此外,BIP0038 加密方案需要长密码作为密码,通常由多个单词或复杂的字母数字字符串组成。 BIP0038加密方案的结果是经过base58check编码的加密私钥,前缀为6P。如果您看到一个以 6P 开头的密钥,则表示该密钥已加密,需要密码才能将密钥转换(解码)回可在任何钱包中使用的 WIT 格式的私钥(前缀为 5) . 许多钱包应用程序现在可以识别 BIP0038 加密的私钥,并要求用户提供密码来解码和导入密钥。第三方应用程序,例如非常有用的基于浏览器的位地址,可以与密钥一起使用来解码 BIP00038 .

使用 BIP0038 加密的密钥最常见的用例是纸质钱包 - 将私钥备份在一张纸上。只要用户选择强密码,BIP0038加密的私钥纸钱包就非常安全,是一种很棒的离线数字货币存储方式(也称为“冷存储”)。

在 bitaddress.org 上测试表 4-10 中的加密密钥,看看如何获​​得输入密码的加密密钥。

表4-10 BIP0038加密私钥示例

私钥 (WIF) 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

密码 MyTestPassphrase

加密的私钥(BIP0038)6PRTHL6mWa48xSopbU1cKrVjpKbBZxcLRRCdctLJ3z5yxE87MobKoXdTsJ

4.5.2 P2SH(Pay-to-Script Hash)和多重签名地址

众所周知,传统数字货币地址以数字1开头,由公钥衍生而来,而公钥又由私钥衍生而来。虽然任何人都可以将数字货币发送到以 1 开头的地址,但数字货币必须经过相应的私钥签名并使用公钥进行哈希处理后才能使用。

以数字 3 开头的数字货币地址是 P2SH 地址,有时被错误地称为多重签名或多重签名地址。他们将数字货币交易的受益人指定为哈希脚本,而不是公钥的所有者。此功能由 BIP0016 于 2012 年 1 月推出,目前已被广泛采用,因为 BIP0016 提供了向地址本身添加功能的机会。与将资金发送到传统数字货币以 1 开头的地址(也称为 P2PKH)的交易不同,当资金发送到以 3 开头的地址时,不仅需要公钥的哈希值,还需要私钥签名。业主证书。在创建地址时,脚本中定义了这些要求,并且所有输入到地址的内容都被这些要求阻止。

从交易脚本创建 P2SH 地址,该脚本定义了谁可以使用交易输出。 (这在第 132 页的“P2SH(Pay-to-Script-Hash)”一节中有详细介绍。)对 P2SH 地址进行编码涉及使用用于创建数字货币地址的双重哈希函数,并且只能用于在脚本而不是公钥中:

脚本哈希 = RIPEMD160(SHA256(script))

脚本hash的结果是Base58Check编码的前缀为5的版本,编码后得到3开头的编码地址。 P2SH 地址的一个例子是 32M8ednmuyZ2zVbes4puqe44NZumgG92sM。

P2SH 不一定是多重签名交易。虽然 P2SH 地址通常代表多重签名,但其他类型的交易脚本也是可能的。

4.5.2.1个多重签名地址和P2SH

目前,P2SH 功能最常见的实现是多签名地址脚本。顾名思义,底层脚本需要多个签名来证明所有权,然后才能使用资金。数字货币的多重签名特性被设计为需要从总共 N 个密钥中获得 M 个签名(也称为“阈值”),称为 M-of-N 多重签名,其中 M 等于或小于 N。例如,第一章提到的咖啡店老板 Bob 使用多重签名地址,需要 1-2 个签名,一个属于他的密钥和一个属于他的同伴的密钥,以确保其中一方可以通过交易锁输出到该地址进行签名。这类似于传统银行中的“联名账户”,其中任何一方都可以通过一个签名进行消费。或者 Gopesh,他是 Bob 聘请的一名网页设计师,负责创建一个网站,该网站可能需要一个 2-3 多重签名地址用于他的业务,以确保除非至少有两个业务合作伙伴签署协议,否则不会花费任何资金。

我们将在第 5 章探讨如何使用 P2SH 地址创建交易来花费资金。

4.5.3个数字货币虚名地址

虚地址包含人类可读信息的有效数字货币地址。例如,1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33 包含 Base-58 字母 love。需要生成虚地址并针对数十亿个候选私钥进行测试,直到私钥可以生成具有所需模式的数字货币地址。虽然有一些优化的虚荣生成算法,但该方法必须涉及随机选择私钥、生成公钥、生成数字货币地址,并检查它是否匹配所需的虚荣模式,重复数十亿次,直到找到匹配项.

一旦找到与所需模式匹配的虚地址,所有者就可以像使用任何其他地址一样使用来自该虚地址的私钥。虚荣地址并不比其他地址更安全。它们依赖与其他地址相同的 ECC 和 SHA。您无法比任何其他地址更容易获得具有虚荣图案的私钥。

在第 1 章中,我们介绍了在菲律宾工作的儿童慈善机构主管 Eugenia。让我们假设 Eugenia 组织了一个数字货币筹款活动一个比特币对应一个密钥吗,并希望使用虚拟数字货币地址宣布筹款活动。 Eugenia 将从 1Kids 开始创建一个化妆地址,以促进儿童的慈善筹款活动。让我们看看这个虚荣地址是如何创建的,以及这个虚荣地址对 Eugenia 慈善筹款的安全意味着什么。

4.5.3.1 生成虚地址

我们必须意识到,使用 Base58 字母表中的简单符号来表示数字货币地址是非常重要的。搜索以“1kids”开头的模式将找到从 1Kids111111111111111111111111111 到 1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 的地址。在这些以“1kid”开头的地址范围内,大约有 58 个到第 29 个地址。表 4-11 显示了这些带有“1kids”前缀的地址。

表4-11“1Kids”号码范围

来自1Kids11111111111111111111111111111

To1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

我们将前缀“1Kids”视为一个数字,我们可以看到这个前缀在数字货币地址中出现的频率。一台没有任何特殊硬件的普通台式计算机每秒可以发现大约 100,000 个密钥。

表4-12 虚号(1KidsCharity)出现频率及生成所需时间

长度地址前缀概率平均生成时间

11K1/58<1​​ms

21Ki1/3,36450ms

31Kid 1/(195*103)<2 秒

41个孩子 1/(11*106)1min

51KidsC 1/(656*106)1 小时

61KidsCh 1/(38*109)2 天

71KidsCha 1/(2.2*1012)3-4月

81KidsChar 1/(128*1012)13–18

91KidsChari 1/(7*1015)800 年

101KidsCharit1/(400*1015)46,000 年

111KidsCharity1/(23*1018)250万年

如您所见一个比特币对应一个密钥吗,Eugenia 不会很快创建以“1KidsCharity”开头的虚荣地址,即使她同时运行着数千台计算机。每增加一个字符,计算难度就会增加 58 倍。超过 7 个字符的搜索模式通常需要找到专门的硬件,例如具有多个图形处理单元 (GPU) 的定制桌面级设备。那些通常无法继续在加密货币挖矿中赚钱的钻机被重新分配以寻找虚荣地址。使用 GPU 系统搜索虚数比使用通用 CPU 快许多数量级。

另一种查找虚地址的方法是将工作外包给矿池中的虚矿工,例如虚矿池。矿池是一项服务,它允许那些 GPU 硬件通过为他人寻找虚荣地址来赚取数字货币。对于小额账单,Eugenia 可以外包搜索模式以查找 7 个字符的虚荣地址的工作,并在数小时内而不是数月内获得结果,而使用单个 CPU。

生成虚地址是一个蛮力过程:尝试随机密钥,检查生成的地址是否与所需的模式匹配,然后重复该过程,直到找到为止。示例 4-8 是一个使用 C++ 程序查找虚地址的虚荣矿工示例。此示例使用我们在第 56 页的“其他替代客户端、库、工具包”部分介绍的 libbitcoin 库。

示例 4-8 虚数挖掘程序

#include // 我们要搜索的字符串 const std::string search = "1kid";// 生成随机密钥。 A random 32 bytes.bc::ec_secret random_secret(std::default_random_engine& engine);//从EC secret.std::string bitcoin_address(const bc::ec_secret& secret)中提取比特币地址;//不区分大小写的比较search string.bool match_found(const std::string& address);int main() { std::random_device random; std::default_random_engine 引擎(随机()); // 连续循环... while (true) { // 生成随机密钥。 bc::ec_secret 秘密 = random_secret(engine); // 获取地址。 std::string 地址 = bitcoin_address(secret); // 它是否匹配我们的搜索字符串? (1kid) if (match_found(address)) { // 成功! std::cout