| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 区块链 -> 精通比特币(一)比特币的原理、比特币客户端、密钥地址钱包 -> 正文阅读 |
|
[区块链]精通比特币(一)比特币的原理、比特币客户端、密钥地址钱包 |
比特币的原理一、比特币交易交易是将钱从交易输入移至输出。输入是指钱币的来源,通常是之前 一笔交易的输出。交易的输出则是通过关联一个密钥的方式将钱赋予一个 新的所有者。目的密钥被称为是安全锁(Encumbrance)。这样就给资 金强加了一个要求:有签名才能在以后的交易中赎回资金。一笔交易的输 - 27 - 二、常见的交易形式形式一最常见的交易形式是从一个地址到另一个地址的简单支付,这种交易也常常 包含给支付者的“找零”。一般交易有一个输入和两个输出 形式二集合多个输入到一个输出。这 相当于现实生活中将很多硬币和纸币零钱兑换为一个大额面钞。像这样的交易有 时由钱包应用产生来清理许多在支付过程收到的小数额的找零。 形式三一个输入分配给多个输 出,即多个接收者的交易。这类交易有时被商业实体用作分配资金, 例如给多个雇员发工资的情形 三、交易的构建比特币交易建立和签名时不用连接比特币网络。 只有在执行交易时才需要将交易发送到网络 获取正确的输入查找 Alice 的比特币地址所有的未消费的输出 在单个未消费的输出中有足够的比特币支付一杯咖啡。假如不够的话,Alice 的钱包应用就不得不搜寻一些小的未消费输出,像是 从一个存钱罐里找硬币一样,直到找到足够支付咖啡的数量 UTXO(未花费的交易输出) 创建交易输出Alice 的钱包将她的金额分成了两个支付:一个给 Bob,一个给自己。她可以在 以后的交易里消费这笔零钱输出。 四、比特币挖矿这个交易现在在比特币网络上传播开来。但只有被一个称为挖矿的过程验证 且加到一个区块中之后,这个交易才会成为这个共享账簿(区块链)的一部分 挖矿在比特币系统中起着两个作用: 将挖矿类比为一个巨大的多人数独谜题游戏。一旦有人发现正解之后,这个数 独游戏会自动调整困难度以使游戏每次需要大约 10 分钟解决。 五、区块中的挖矿交易记录网络中产生的一笔交易直到成为整个比特币大账簿——区块链的一部分时 才会被确认有效 Alice 的交易被网络拿到后放进未验证交易池中。因为包含足够的交易费, 它被 Jing 的矿池放到了生成的新区块中。大约在 Alice 的钱包第一次将这个交 易发送出来五分钟后,Jing 的 ASIC 矿机发现了新区块的正解并将之发布为第 277,316 号区块,包含 419 个其它交易。Jing 的 ASIC 矿机将这个新区块发布 到网络上后,其它矿机就会验证它,并投身到构建新区块的竞赛中。 几分钟后,第 277,317 号新区块诞生在另一个挖矿节点中。因为这个新区块是 基于包含 Alice 交易的第 277,316 号区块的,在这个区块的基础上增加了更多的 计算,因此就加强了这些交易的可信度。包含 Alice 交易的区块对这个交易来说 算一次"证明"。基于这个区块每产生一个新区块,对这个交易来说就会增加了一 次"证明"。当区块一个个堆上来时,这个交易变得指数级地越来越难被推翻,因 此它在网络中得到更多信任。 六、消费这笔交易既然 Alice 的这笔交易已经成为区块的一部分被嵌入到了区块链中,它就成 为了整个分布式比特币账簿的一部分并对所有比特币客户端应用可见。每个比特 币客户端都能独立地验证这笔交易是有效且可消费的。全索引客户端可以追钱款 的来源。 比特币客户端我们用 createrawtransaction 命令去建立一笔交易。我们将交易的收入(50 已 确认未支出的 mBTC)和两笔交易的输出(送往新地址的比特币和从原先账户找 回的零钱)作为 createrawtransaction 的参数 我们的交易“消耗了”从我们已确认的交易中未花费的输出,然后将 它变成两笔输出,一个是走向了新地址的 25mBTC,另一个是从原来地址返回 的 24.5mBTC 零钱。这之间 0.5mBTC 的差额作为交易费,以奖励挖出包含我们 这笔交易区块的矿工 我们使用 signrawtransaction 命令去签名交易。它需要原 始十六进制的字符串作为参数。 签名后,交易中的收入包含了 scritSig,一串证明钱包地址 1hvz…所有权的数字签 名,同时移除了支出上的障碍,然后我们可以对钱包中的钱进行消费。签名可以 让这笔交易被比特币交易网络中的任何节点验证,使他们变得可靠。 一笔交易的三个步骤: 其他替代客户端、资料库、工具包除了参考客户端(bitcoind),还可以使用其他的客户端和资料库去连接比 特币网络和数据结构。这些工具都由一系列的编程语言执行,用他们各自的语言 为比特币程序提供原生的交互。 其他的执行方式包括: 密钥、地址、钱包一、密钥密钥是成对出现的,由一个私钥和一个公钥所组成。公钥就像 银行的帐号,而私钥就像控制账户的 PIN 码或支票的签名。比特币的用户很少会直接看到数字密钥。一般情况下,它们被存储在钱包文件内,由比特币钱包软件进行管理 收件人的公钥是通过其数字指纹表示的,称为比 特币地址,就像支票上的支付对象的名字(即“收款方”)。一般情况下,比特 币 地址由一个公钥生成并对应于这个公钥。然而,并非所有比特币地址都是公钥 在比特币系统中,我们用公钥加密创建一个密钥对,用于控制比特币的获取。密 钥对包括一个私钥,和由其衍生出的唯一的公钥。公钥用于接收比特币,而私钥 用于比特币支付时的交易签名。 一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公 钥。私钥(k)是一个数字,通常是随机选出的。有了私钥,我们就可以使用椭 圆 曲线乘法这个单向加密函数产生一个公钥(K)。有了公钥(K),我们就可 以使用一个单向加密哈希函数生成比特币地址(A)
钱包导入格式(WIF,Wallet Import Format) 椭圆曲线密码学解释椭圆曲线加密法是一种基于离散对数问题的非对称(或公钥)加密法,可以 用对椭圆曲线上的点进行加法或乘法运算来表达 二、地址比特币地址是一个由数字和字母组成的字符串,可以与任何想给你比特币的 人分享。由公钥(一个同样由数字和字母组成的字符串)生成的比特币地址以数 字“1”开头。 比特币地址可由公钥经过单向的加密哈希算法得到。哈希算法是一种单向函 数,接收任意长度的输入产生指纹摘要。加密哈希函数在比特币中被广泛使用: 比 特币地址、脚本地址以及在挖矿中的工作量证明算法。由公钥生成比特币地 址时使用的算法是 Secure Hash Algorithm (SHA)和 the RACE Integrity Primitives Evaluation Message Digest (RIPEMD),特别是 SHA256 和 RIPEMD160 通常用户见到的比特币地址是经过“Base58Check”编码的,这种编码使用 了 58 个字符(一种 Base58 数字系统)和校验码,提高了可读性、避免歧义并有效防止了在地址转 录和输入中产生的错误 Base58 和 Base58Check 编码Base58 是一种基于文本的 二进制编码格式,用在比特币和其它的加密货币中。这种编码格式不仅实现了数据压缩,保持了易读性,还具有错误诊断功能。 比特币的 Base58 字母表 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxy z Base58Check 编码:一种 Base58 格式的、有版本的、经过校验的 格式,可以明确的对比特币数据编码的编码格式,在比特币中,大多数需 要向用户展示的数据都使用 Base58Check 编码,可以实现数据压缩,易 读而且有错误检验。
压缩格式公钥 引入压缩格式公钥是为了减少比特币交易的字节数,从而可以节省那些运行 区块链数据库的节点磁盘空间。大部分比特币交易包含了公钥,用于验证用户的 凭据和支付比特币 未压缩格式公钥使用 04 作为前缀,而压缩格式公钥是以 02 或 03 作为前缀 完全不同的比特币地址。 为了解决这个问题,当私钥从钱包中被导出时,较新的比特币客户端将使用一种 不同的钱包导入格式(Wallet Import Format)。这种新的钱包导入格式可以 用来表明该私钥已经被用来生成压缩的公钥,同时生成的比特币地址也是基于该 压缩的公钥。这个方案可以解决导入私 钥来自于老钱包还是新钱包的问题,同 时也解决了通过公钥生成的比特币地址是来自于压缩格式公钥还是非压缩格式 公钥的问题 压缩格式私钥实际上“压缩格式私钥”是一种名称上的误导,因为当一个私钥被使用 WIF 压缩格式导出时,不但没有压缩,而且比“非压缩格式”私钥长出一个字节。这 个多出来的一个字节是私钥被加了后缀 01,用以表明该私钥是来自于一个较新 的钱包,只能被用来生成压缩的公钥。私钥是非压缩的,也不能被压缩。“压缩 的私 钥”实际上只是表示“用于生成压缩格式公钥的私钥”,而“非压缩格式 私钥”用来表明“用于生成非压缩格式公钥的私钥”。为避免更多误解,应该只 可以说导出 格式是“WIF 压缩格式”或者“WIF”,而不能说这个私钥是“压 缩”的。 “WIF 压 缩”编码的私钥还多出一个字节,因为这种私钥多了后 缀“01”。该后缀是用来区分“非压缩格式”私钥和“压缩格式”私钥。
三、钱包BIP0039 定义助记码和种子的创建过程如下:
分层确定性钱包(BIP0032/BIP0044)如果你想安装运行一个比特币钱包,你需要建造一个符合 BIP0032 和 BIP0044 标准的 HD 钱包。 HD 钱包提供了随机(不确定性)钥匙有两个主要的优势。第一,树状结构 可以被用来表达额外的组织含义。比如当一个特定分支的子密钥被用来接收交易 收 入并且有另一个分支的子密钥用来负责支付花费。不同分支的密钥都可以被 HD 钱包的第二个好处就是它可以允许让使用者去建立一个公共密钥的序列 而不需要访问相对应的私钥。这可允许 HD 钱包在不安全的服务器中使用或者在 每笔交易中发行不同的公共钥匙。公共钥匙不需要被预先加载或者提前衍生,但 是在服务器中不具有可用来支付的私钥 HD 钱包密钥识别符(路径)HD 钱包中的密钥是用“路径”命名的,且每个级别之间用斜杠(/)字符来 表示(见表 4-8)。由主私钥衍生出的私钥起始以“m”打头。因此,第一个母 密钥生成的子私钥是 m/0。第一个公共钥匙是 M/0。第一个子密钥的子密钥就 是 m/0/1,以此类推。 密钥的“祖先”是从右向左读,直到你达到了衍生出的它的主密钥。举个例 子,标识符 m/x/y/z 描述的是子密钥 m/x/y 的第 z 个子密钥。而子密钥 m/x/y 又是 m/x 的第 y 个子密钥。m/x 又是 m 的第 x 个子密钥 加密私钥(BIP0038)私钥必须保密。私钥的机密性需求事实情况是,在实践中相当难以实现,因 为该需求与同样重要的安全对象可用性相互矛盾。当你需要为了避免私钥丢失而 存储备份时,会发现维护私钥私密性是一件相当困难的事情。通过密码加密内有 私钥的钱包可能要安全一点,但那个钱包也需要备份。有时,例如用户因为要升 级或重装钱包软件,而需要把密钥从一个钱包转移到另一个。私钥备份也可能需 要存储在纸张上(参见“4.5.4 纸钱包”一节)或者外部存储介质里,比如 U 盘。 但如果一旦备份文件失窃或丢失呢?这些矛盾的安全目标推进了便携、方便、可 以被众多不同钱包和比特币客户端理解的加密私钥标准 BIP0038 的出台。 BIP0038 提出了一个通用标准,使用一个口令加密私钥并使用 Base58Check 对 加密的私钥进行编码,这样加密的私钥就可以安全地保存在备份介质里,安全地 P2SH (Pay-to-Script Hash)和多重签名地址以数字 3 开头的比特币地址是 P2SH 地址,有时被错误的称谓多重签名或多重 签名地址 目前,P2SH 函数最常见的实现是用于多重签名地址脚本。顾名思义,底层 脚本需要多个签名来证明所有权,此后才能消费资金。设计比特币多重签名特性 是需要从总共 N 个密钥中需要 M 个签名(也被称为“阈值”),被称为 M-的 -N 的多签名,其中 M 是等于或小于 N。例如,第一章中提到的咖啡店主鲍勃使 用多重签名地址需要 1-2 签名,一个是属于他的密钥和一个属于他同伴的密钥, 以确保其中一方可以签署度过一个事务锁定输出到这个地址。这类似于传统的银 行中的一个“联合账户”,其中任何一方配偶可以凭借单一签名消费。或 Gopesh, Bob 雇佣的网页设计师创立一个网站,可能为他的业务需要一个 2-3 的多签名 地址,确保没有资金会被花费除非至少两个业务合作伙伴签署这笔交易。 我们将会在第五章节探索如何使用 P2SH 地址创建事务用来消费资金 比特币靓号地址靓号地址包含了可读信息的有效比特币地址。例如, 1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33 就是包含了 Base-58 字母 love 的。靓号地址需要生成并通过数十亿的候选私钥测试,直到一个私钥能生成具有 所需图案的比特币地址。虽然有一些优化过的靓号生成算法,该方法必须涉及随 机上选择一个私钥,生成公钥,再生成比特币地址,并检查是否与所要的靓号图 案相匹配,重复数十亿次,直到找到一个匹配。 一旦找到一个匹配所要图案的靓号地址,来自这个靓号地址的私钥可以和其 他地址相同的方式被拥有者消费比特币。靓号地址不比其他地址具有更多安全性。它们依靠和其他地址相同的 ECC 和 SHA。你无法比任何别的地址更容易的 获得一个靓号图案开头的私钥 生成靓号地址我们必须认识到使用来自 Base58 字母表中简单符号来代表比特币地址是非 常重要的。搜索“1kids”开头的图案我们会发现从 1Kids11111111111111111111111111111 到 1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzz 的地址。这些以“1kid”开头的地址范 围中大约有 58 的 29 次方地址。表 4-11 显示了这些有“1kids”前缀的地址。 表 4-11 “1Kids”靓号的范围 From1Kids11111111111111111111111111111 To 1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzz 我们把“1Kids”这个前缀当作数字,我们可以看看比特币地址中这个前缀出现 的频率。如果是一台普通性能的桌面电脑,没有任何特殊的硬件,可以每秒发现 大约 10 万个密钥。表 4-12 靓号的出现的频率(1KidsCharity)以及生成所需时间 长度地址前缀 概率 平均生成时间 1 1K 1/58 < 1 毫秒
纸钱包纸钱包是打印在纸张上的比特币私钥。有时纸钱包为了方面起见也包括对应 的比特币地址,但这并非是必要的。因为地址可以从私钥中导出。纸钱包是一个 非常有效简历备份或者线下比特币存储方式,也是被称为“冷钱包”。作为备份 机制,一个纸钱包可以提供安全性,以防在电脑硬盘损坏、失窃或意外删除的情 况下造成密钥的的丢失。作为一个冷存储的机制,如果纸钱包密钥在线下生成并 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 19:39:12- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |