比特币、区块链读书笔记1《精通比特币》第一部分
《精通比特币》作者:Andreas M.Antonopoulos。
本书下载地址:http://zhibimo.com/books/wang-miao/mastering-bitcoin
翻译:薄荷凉幼;陈萌琦;陈姝吉;程鹏;程西园;达文西;吉鸿帆;李丹;李润熙;李凌豪;李昕阳;刘畅;吕新浩;马峰;牛东晓;秦彤;邱頔;邱蒙;戎如香;史磊;汪海波;王宏钢;辛颖;杨兵;尹文东;余龙;张林;张琦张大嫂;张亚超;张泽铭;赵冬帅;赵
余;YANG YANG。
备注:建议阅读原版书。本读书笔记只是摘录书中的重要概念。帮助理解比特币原理。
读书笔记内容:
作者为比特币企业家、学者。开授数字货币学。
作者第一次偶遇比特币是在2011年年中。
比特币不单单是一种数字货币,还是一种给货币及其他很多东西提供基础的信任网络。即去中心化的信任网络。
比特币网络是一个高度复杂的去中心化的可信网络,能够支撑无数财务流程。
本书示例是基于类Unix操作系统(例如Linux或Mac OSX)的命令行,用Python、C++编程语言来说明。全部代码均可在Github主代码库中的code子目录获得。
第1章介绍
1.1什么是比特币?
比特币是一个基于数字货币生态系统而形成的概念与技术的集合。
比特币便捷、安全、无国界。
比特币隐匿于发送者和接受者间价值传递的交易中。比特币用户拥有能够使他们在比特币网络中证明自己交易权的密钥,解密后可使用比特币,也可以将它购买、出售,以及与其他币种进行兑换。
密钥匙使用比特币的唯一先决条件。
比特币是一个分布式的点对点网络系统。
在比特币网络中的任何参与者都是潜在的旷工,用他们的电脑算力来验证和记录交易。每隔10分钟,有人能够验证过去10分钟发生的交易,作为回报,将会获得崭新的比特币。
比特币协议包括了内置算法,该算法可以调节网络中的挖矿功能。旷工必须完成的任务——在比特币网络中成功地记录一个区块交易——的难度是在动态调整的,因此,无论何时有多少旷工(多少cpu)在挖矿,通常每10分钟就会有人成功。
新比特币开采出的每四年,这项协议也会减半开采速率,并限制比特币的开采总量为一个固定值:2100万枚。流通的比特币数量将会在2140年达到2100万枚。由于比特币的发行率是递减的,长期来看,比特币是一种通货紧缩的货币。
比特币本身也是协议,是一种网络,是一种分布计算革新的代名词。比特币通货仅是这种创新的首位应用。
比特币代表了数十年的密码学和分布式系统的颠覆之作,这是一个独特而强大的组合,汇集了四个关键的创新点。比特币由这些构成:
一个去中心化的点对点网络(比特币协议);
一个公共的交易账簿(区块链);
一个去中心化的数学的和确定性的货币发行(分布式挖矿);
一个去中心化的交易验证系统(交易脚本)。
1.2比特币发展史
2008年,中本聪在一篇名为《比特币:一个点对点的电子现金系统》的论文中首先提出了比特币。
一个去中心化的电子现金系统。关键的创新是利用分布式计算机系统(称为“工作量证明”算法)每隔10分钟进行一次的全网“选拔”,能够使去中心化的网络同步交易记录。这个能优雅的解决双重支付问题,即一个单一的货币单位可以使用两次。
比特币于2009年启动。分布式计算,为比特币提供了成倍增长的安全性和韧性,现在超过了世界超级电脑的联合处理能力。
比特币系统依赖于完全透明的数学原理。
一个分布式计算问题的解决方案,中本聪的此项发明,对“拜占庭将军”问题也是一个可行的解决方案,这是一个在分布式计算中未曾解决的问题。
中本聪的解决方案是使用工作量证明的概在没有中央信任机构下达成共识,这代表了分布式计算的科学突破,并已经超越了货币广泛的适用性。它可以用来达成去中心化的网络共识来公正选举、彩票、资产登记,以及数字化公证等等。
1.3比特币的应用、用户和他们的故事。
比特币是一项技术,但它所传递的货币从实质上来说,是一种人与人之间价值交换的基础语言。
1.4入门
加入比特币网络并开始使用通货,所有用户需要做的就是下载应用程序或使用在线应用程序。
比特币客户端的三种主要形式是:
完整客户端。一个完整客户端,或称“全节点”,是存储所有比特币交易的整个交易历史(由每一个用户完成的每一笔交易,曾经所有的每一笔)的客户端,管理用户的钱包,并可以在比特币网络上直接开始交易。
轻量客户端。一个轻量客户端存储用户的钱包,但需要依赖第三方服务器才能进行比特币交易,才能接入比特币网络。轻量级客户端不保存所有交易的完整副本,因此必须新来第三方的服务器来获取交易确认。
在线客户端。在线客户端通过网页浏览器在第三方服务器上访问好储存该用户的钱包。
移动客户端。智能手机的移动客户端。
比特币客户端的选择,取决于用户想要管理资金的书目。一个完整的客户端将为用户提供最高级的管理和对立性。这样钱包的备份和安全责任就转移到了用户身上。另一种选择是在线客户端,气设置和使用是最简单的,但在线客户端的取舍还在于需衡量第三方介入的风险,因为安全性和控制权是由用户和网页服务商所共同承担的。如果一个在线钱包服务遭受了损失,就像已发生的那样,用户们可能会失去所有的资金。反过来看,如果用户的一个完整客户端没有进行适当的备份,他们可能会因为电脑的操作失误而丢失他们的资金。
Bitcoin.org
比特币钱包必须由一个密码或密令来保护。有许多试图破解弱密码的潜在威胁,所以要注意谨慎设置一个不会被轻易破解的密码。密码应使用大小写字母、数字和符号的组合,避免出现生日、球队名字等个人信息。避免使用任何能在字典里轻易找到的词语,不管这个词语是什么语言的。如果条件允许,可以利用密码生成器生成一个完全随机的12位以上的密码。请记住:比特币是一种随时能被转移到世界其他任何地方的货币。如果不加以妥善保管,会很容易被偷走。
你可以任意地创建新的比特币地址,这些地址都会成功地将资金转入你的钱包。钱包是多个地址和解锁资金秘钥的简单集合。每笔交易你都可以使用不同的地址,这有利于提高隐私的安全性。用户可创建地址的数量几乎不受限制。
购买比特币:
Bitstamp
Coinbase
Bitcoin charts是提供价格索引的站点,一个包括数十家货币交易所其他市场数据的站点,在这里你可以找到更完整的数据。
利用localbitcoins.com这样的分类服务网站来寻找你所在地区的卖家。
一旦比特币地址接受了一笔交易,就会变成全网所知的地址之一,你就可以在公开账簿中查询余额了。
比特币地址没什么特别机密的。公布自己的地址,不用担心账户安全。
Bitcoin average是一个提供每个币种的交易量加权平均价格的简单视图网站。
Zeroblock是一个免费的安卓和ios应用程序,可以显示不同交易所的比特币价格。
Bitcoin wishdom。市场数据索引服务站。
比特币账簿——一个不断膨胀的文件记录,记载了每一笔曾发生过的比特币交易——是公开的,意味着她可以查看所有曾经使用该地址的记录,可以查看是否有人朝这个账户发送了比特币。你只要在blockchain.com网站搜索框中,输入她自己的地址,就可以知晓了。网页会显示出该地址所有的交易记录。
第2章比特币的原理
2.1交易、区块、挖矿和区块链
在比特币中,信任是由比特币系统中不同参与者之间交互达成的一种自然属性。
区块链是一个分布式的公共账簿,包含所有发生在比特币系统中的交易。
区块链数据查询网站就是一个比特币的搜索引擎,你可以搜索比特币的地址、交易和区块,以及可以看他们之间的关系和资金流动。
常见的区块链数据查询网站包括:
Blockchain.info
Bitcoin block explorer
Insight
Blockr block reader
以上每一个查询网站都有搜索功能,可以通过地址,交易哈希值或区块号,搜索到在比特币网络和区块链中对应的等价数据。
比特币系统由用户(用户通过密钥控制钱包)、交易(每一笔交易都会被广播到整个比特币网络)和矿工(通过竞争计算生成在每个节点达成共识的区块链,区块链是一个分布式的公共权威账簿,包含了比特币网络发生的所有的交易)组成。
2.2比特币交易
2.3交易的构建
2.4比特币挖矿
挖矿在比特币系统中起着两个作用:
挖矿在构建区块时会创造新的比特币。每个区块创造的比特币数量是固定的,随时间会渐渐减少。
挖矿创建信任。挖矿确保只有在包含交易的区块上贡献了足够的计算量后,这些交易才能确认。区块越多,花费的计算量越大,意味着更多的信任。描述挖矿的一个好方法是将之类比为一个巨大的多人数独谜题游戏。一旦有人发现正解之后,这个数独游戏会自动调整困难度以使游戏每次需要大约10分钟解决。
比特币中的“谜题”是基于哈希加密算法的,其展现了相似的特性:非对称地,它解起来困难而验证很容易,并且它的困难度可以调整。
工作量证明算法指的用sha256加密算法不断地对区块头和一个随机数字进行哈希计算,直到出现一个和预设值相匹配的解。
第一个找到这个解的旷工会赢得这局竞赛并会将此区块发布到区块链中。
2.5区块中的挖矿交易记录
网络中产生的一笔交易直到成为整个比特币大账簿——区块链的一部分时才会被确认有效。平均每10分钟,矿工会将自上一个区块以来发生的所有交易生成一个新的区块。
当矿工构建一个新区块时,会将这些交易从这个交易池中拿出来放到这个新区块中,然后通过尝试解决一个非常困难的问题(也叫工作量证明)以证明这个新区块的合法性。
如果矿工找到了使得新区块有效的解法,他就会得到这笔报酬,因为这个新区块被加入到了总区块链中,他添加的这笔报酬交易也会变成可消费的。
按惯例来说,一个区块获得六次以上“证明”时就被认为是不可撤销的了,因为要撤销和重建六个区块需要巨量的计算。
2.6消费这笔交易
第3章比特币客户端
3.1比特币核心:参考实现
3.2通过命令行使用比特币核心的JSON-RPC API接口
UTXO:未花费的交易输出
3.3其他替代客户端、资料库、工具包
C++、java、GO语言、Python。
第4章密钥、地址、钱包
4.1简介
比特币的所有权是通过数字密钥、比特币地址和数字签名来确立的。数字密钥实际上并不是存储在网络中,而是由用户生成并存储在一个文件或简单的数据库中,成为钱包。
存储在用户钱包中的数字密钥完全独立于比特币协议,可由用户的钱包软件生成并管理,而无需区块链或网络连接。密钥实现了比特币去中心化信任和控制、所有权认证和基于密码学证明的安全模型。
每笔比特币交易都需要一个有效的签名才会被存储在区块链。只有有效的数字密钥才能产生有效的数字签名,因此拥有比特币的密钥副本就拥有了该账户的比特币控制权。秘钥是成对出现的,由一个私钥和一个公钥所组成。比特币的用户很少会直接看到数字秘钥。一般情况下,它们被存储在钱包文件内,由比特币钱包软件进行管理。
在比特币交易的支付环节,收件人的公钥是通过其数字指纹表示的,称为比特币地址。
密钥的特殊用途:生成签名、证明所有权以及创造比特币靓号地址和纸钱包。
4.1.1公钥加密和加密货币
比特币是使用椭圆曲线乘法作为其公钥加密的基础算法。
在比特币系统中,我们用公钥加密创建一个密钥对,用于控制比特币的获取。密钥对包括一个私钥,和由其衍生出的唯一的公钥。公钥用于接受比特币,而私钥用于比特币支付时的交易签名。
公钥和私钥之间的数学关系,使得私钥可用于生成特定信息的签名。此签名可以在不泄露私钥的同时对公钥进行验证。
支付比特币时,比特币的当前所有者需要在交易中提交其公钥和签名(每次交易的签名都不同,但均从同一个私钥生成)。比特币网络中的所有人都可以通过所提交的公钥和签名进行验证,并确认该交易是否有效,即确认支付者在该时刻对所交易的比特币拥有所有权。
大多数比特币钱包工具为了方便会将私钥和公钥以密钥对的形式存储在一起。然而,公钥可以由私钥计算得到,所以只存储私钥也是可以的。
4.1.2私钥和公钥
一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。私钥(k)是一个数字,通常是随机选出的。有了私钥,我们就可以使用椭圆曲线乘法这个单向加密函数产生一个公钥(K)。有了公钥(K),我们就可以使用一个单向加密哈希函数生成比特币地址(A)。在本节中,我们将从生成私钥开始,讲述如何使用椭圆曲线运算将私钥生成公钥,并最终由公钥生成比特币地址。私钥、公钥和比特币地址之间的关系如下图所示。
4.1.3 私钥
私钥就是一个随机选出的数字而已。一个比特币地址中的所有资金的控制取决于相应私钥的所有权和控制权。在比特币交易中,私钥用于生成支付比特币所必需的签名以证明资金的所有权。私钥必须始终保持机密,因为一旦被泄露给第三方,相当于该私钥保护之下的比特币也拱手相让了。私钥还必须进行备份,以防意外丢失,因为私钥一旦丢失就难以复原,其保护的比特币也将永远丢失。
比特币私钥只是一个数字。你可以用硬币、铅笔和纸来随机生成你的私钥:掷硬币 256 次,用纸和笔记录正反面并转换为 0 和 1,随机得到的 256 位二进制数字可作为比特币钱包的私钥。该私钥可进一步生成公钥。
从一个随机数生成私钥
生成密钥的第一步也是最重要的一步,是要找到足够安全的熵源,即随机性来源。生成一个比特币私钥在本质上与“在 1 到 2256 之 间选一个数字”无异。只要选取的结果是不可预测或不可重复的,那么选取数字的具体方法并不重要。比特币软件使用操作系统底层的随机数生成器来产生 256 位 的熵(随机性)。通常情况下,操作系统随机数生成器由人工的随机源进行初始化,也可能需要通过几秒钟内不停晃动鼠标等方式进行初始化。
4.1.4 公钥
通过椭圆曲线乘法可以从私钥计算得到公钥,这是不可逆转的过程:K = k *G 。其中 k 是私钥,G 是被称为生成点的常数点,而 K 是所得公钥。其反向运算,被称为“寻找离散对数”——已知公钥 K 来求出私钥 k——是非常困难的,就像去试验所有可能的 k 值,即暴力搜索。
4.1.5 椭圆曲线密码学解释
椭圆曲线加密法是一种基于离散对数问题的非对称(或公钥)加密法,可以用对椭圆曲线上的点进行加法或乘法运算来表达。
4.1.6 生成公钥
以一个随机生成的私钥 k 为起点,我们将其与曲线上已定义的 生成点 G 相乘以获得曲线上的另一点,也就是相应的公钥 K。生成点是 secp256k1 标准的一部分,比特币密钥的生成点都是相同的:{K = k * G}
其中 k 是私钥,G 是生成点,在该曲线上所得的点 K 是公钥。因为所有比特币用户的生成点是相同的,一个私钥 k 乘以 G 将得到相同的公钥 K。k 和 K 之间的关系是固定的,但只能单向运算,即从 k 得到 K。这就是可以把比特币地址(K的衍生)与任何人共享而不会泄露私钥(k)的原因。
因为其中的数学运算是单向的,所以私钥可以转换为公钥,但公钥不能转换回私钥。为实现椭圆曲线乘法,我们以之前产生的私钥 k 和与生成点 G 相乘得到公钥 K。
大多数比特币程序使用 OpenSSL 加密库进行椭圆曲线计算。例如,调用 EC_POINT_mul() 函数,可计算得到公钥。
4.2 比特币地址
比特币地址是一个由数字和字母组成的字符串,可以与任何想给你比特币的人分享。由公钥(一个同样由数字和字母组成的字符串)生成的比特币地址以数字“1”开头。下面是一个比特币地址的例子:1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
在交易中,比特币地址通常以收款方出现。如果把比特币交易比作一张支票,比特币地址就是收款人,也就是我们要写入收款人一栏的内容。
由公钥生成比特币地址。
比特币地址可由公钥经过单向的加密哈希算法得到。哈希算法是一种单向函数,接收任意长度的输入产生指纹摘要。加密哈希函数在比特币中被广泛使用:比特币地址、脚本地址以及在挖矿中的工作量证明算法。由公钥生成比特币地址时使用的算法是 Secure Hash Algorithm (SHA)和 the RACE IntegrityPrimitives Evaluation Message Digest (RIPEMD),特别是 SHA256 和RIPEMD160。
以公钥 K 为输入,计算其 SHA256 哈希值,并以此结果计算 RIPEMD160 哈希值,得到一个长度为 160 比特(20 字节)的数字:A = RIPEMD160(SHA256(K))
公式中,K 是公钥,A 是生成的比特币地址。
比特币地址与公钥不同。比特币地址是由公钥经过单向的哈希函数生成的。
通常用户见到的比特币地址是经过“Base58Check”编码的,这种编码使用 了 58 个字符(一种Base58 数字系统)和校验码,提高了可读性、避免歧义并有效防止了在地址转录和输入中产生的错误。
4.2.1 Base58 和 Base58Check 编码
4.2.2 密钥的格式
公钥和私钥的都可以有多种编码格式。一个密钥被不同的格式编码后,虽然结果看起来可能不同,但是密钥所编码数字并没有改变。这些不同的编码格式主要是用来方便人们无误地使用和识别密钥。
私钥的格式
私钥可以以许多不同的格式表示,所有这些都对应于相同的 256 位的数字。
这些表示法都是用来表示相同的数字、相同的私钥的不同方法。虽然编码后的字
符串看起来不同,但不同的格式彼此之间可以很容易地相互转换。
公钥的格式
公钥也可以用多种不同格式来表示, 最重要的是它们分为非压缩格式或压缩格式公钥这两种形式。
我们从前文可知,公钥是在椭圆曲线上的一个点,由一对坐标(x,y)组成。公钥通常表示为前缀 04 紧接着两个 256 比特的数字。其中一个 256 比特 数字是公钥的 x 坐标,另一个 256 比特数字是 y 坐标。前缀 04 是用来区分非压缩格式公钥,压缩格式公钥是以 02 或者 03 开头。
压缩格式公钥
引入压缩格式公钥是为了减少比特币交易的字节数,从而可以节省那些运行区块链数据库的节点磁盘空间。大部分比特币交易包含了公钥,用于验证用户的凭据和支付比特币。每个公钥有 520 比特(包括前缀,x 坐标,y 坐标)。如果每个区块有数百个交易,每天有成千上万的交易发生,区块链里就会被写入大量的数据。
一个公钥是一个椭圆曲线上的点(x, y)。而椭圆曲线实际是一个数学方程,曲线上的点实际是该方程的一个解。因此,如果我们知道了公钥的 x 坐标,就可以通过解方程 y2mod p = (x3 + 7) mod p得到 y 坐标。这种方案可以让我们只存储公钥的 x 坐标,略去 y 坐标,从而将公钥的大小和存储空间减少了 256 比特。每个交易所需要的字节数减少了近一半,随着时间推移,就大大节省了很多数据传输和存储。
未压缩格式公钥使用 04 作为前缀, 而压缩格式公钥是以 02 或 03 作为前缀。需要这两种不同前缀的原因是:因为椭圆曲线加密的公式的左边是 y2 ,也就是说 y 的解是来自于一个平方根,可能是正值也可能是负值。更形象地说,y 坐标可能在 x 坐标轴的上面或者下面。从图 4-2 的椭圆曲线图中可以看出,曲线是对称的,从 x 轴看就像对称的镜子两面。因此,如果我们略去 y 坐标,就必须储存 y 的符号(正值或者负值)。换句话说,对于给定的 x 值,我们需要知道 y值 在 x 轴的上面还是下面,因为它们代表椭圆曲线上不同的点,即不同的公钥。当我们在素数 p 阶的有限域上使用二进制算术计算椭圆曲线的时候,y 坐标可能是奇数 或者偶数,分别对应前面所讲的 y 值的正负符号。因此,为了区分 y 坐标的两种可能值,我们在生成压缩格式公钥时,如果 y 是偶数,则使用 02 作为前缀;如果 y 是奇数,则使用 03 作为前缀。这样就可以根据公钥中给定的 x 值,正确推导出对应的 y 坐标,从而将公钥解压缩为在椭圆曲线上的完整的点坐标。
一个私钥可以生成两种不同格式的公钥——压缩格式和非压缩格式,而这两种格式的公钥可以生成两个不同的比特币地址。 但是,这两个不同的比特币地址的私钥是一样的。
私钥是非压缩的,也不能被压缩。“压缩的私钥”实际上只是表示“用于生成压缩格式公钥的私钥”,而“非压缩格式私钥”用来表明“用于生成非压缩格式公钥的私钥”。为避免更多误解,应该只可以说导出 格式是“WIF 压缩格式”或者“WIF”,而不能说这个私钥是“压
缩”的。
“压缩格式私钥”是一个不当用词!私钥不是压缩的。WIF 压缩格式的私钥只是用来表明他们只能被生成压缩的公钥和对应的比特币地址。 相反地,“WIF 压 缩”编码的私钥还多出一个字节,因为这种私钥多了后缀“01”。该后缀是用来区分“非压缩格式”私钥和“压缩格式”私钥。
4.3 用 Python 实现密钥和比特币地址
4.4 比特币钱包
钱包是私钥的容器,通常通过有序文件或者简单的数据库实现。另外一种制作私钥的途径是 确定性密钥生成。在这里你可以用原先的私钥,通过单向哈希函数来生成每一个新的私钥,并将新生成的密钥按顺序连接。只要你可以重新创建这个序列,你只需要第一个私钥(称作种子、主私钥)来生成它们。在本节中,我们将会检查不同的私钥生成方法及其钱包结构。
比特币钱包只包含私钥而不是比特币。每一个用户有一个包含多个私钥的钱包。钱包中包含成对的私钥和公钥。用户用这些私钥来签名交易,从而证明它们拥有交易的输出(也就是其中的比特币)。比特币是以交易输出的形式来储存在区块链中(通常记为 vout 或 txout)。
4.4.1 非确定性( 随机) 钱包
在最早的一批比特币客户端中,钱包只是随机生成的私钥集合。这种类型的钱包被称作零型非确定钱包。
这种钱包现在正在被确定性钱包替换,因为它们难以管理、备份以及导入。随机钥匙的缺
点就是如果你生成很多,你必须保存它们所有的副本。
4.4.2 确定性( 种子) 钱包
确定性,或者“种子”钱包包含通过使用单项离散方程而可从公共的种子生成的私钥。种子是随机生成的数字。这个数字也含有比如索引号码或者可生成私钥的“链码”。
在确定性钱包中,种子足够收回所有的已经产生的私钥,所以只用在初始创建时的一个简单备份就足以搞定。并且种子也足够让钱包输入或者输出。这就很容易允许使用者的私钥在钱包之间轻松转移输入。
4.4.3 助记码词汇
助记码词汇是英文单词序列代表(编码)用作种子对应所确定性钱包的随机数。单词的序列足以重新创建种子,并且从种子那里重新创造钱包以及所有私钥。在首次创建钱包时,带有助记码的,运行确定性钱包的钱包的应用程序将会向使用者展示一个 12 至 24 个词的顺序。单词的顺序就是钱包的备份。它也可以被用来恢复以及重新创造应用程序相同或者兼容的钱包的钥匙。助记码代码可以让使用者复制钱包更容易一些,因为它们相比较随机数字顺序来说,可以很容易地被读出来并且正确抄写。
4.4.4 分层确定性钱包( BIP0032/BIP0044)
确定性钱包被开发成更容易从单个“种子”中生成许多关键的钥匙。最高级的来自确定性钱包的形是通过 BIP0032 标准生成的 the hierarchical deterministic wallet or HD wallet defined。分层确定性钱包包含从数结构所生成的钥匙。这种母钥匙可以生成子钥匙的序列。这些子钥匙又可以衍生出孙钥匙,以此无穷类推。这个树结构表 如下图所示。
创建主密钥以及 HD 钱包地主链代码的过程如下图所示。
私有子密钥的衍生
分层确定性钱包使用 CKD(child key derivation)方程去从母密钥衍生出子密钥。
子密钥衍生方程是基于单项哈希方程。这个方程结合了:
• 一个母私钥或者公共钥匙(ECDSA 未压缩键)
• 一个叫做链码(256 bits)的种子
• 一个索引号(32 bits)
链码是用来给这个过程引入看似的随机数据的,使得索引不能充分衍生其他的子密钥。因此,有了子密钥并不能让它发现自己的相似子密钥,除非你已经有了链码。最初的链码种子(在密码树的根部)是用随机数据构成的,随后链码从各自的母链码中衍生出来。
这三个项目相结合并散列可以生成子密钥,如下。
4.5 高级密钥和地址
在以下部分中,我们将看到高级形式的密钥和地址,诸如加密私钥、脚本和多重签名地址,靓号地址,和纸钱包。
4.5.1 加密私钥( BIP0038)
私钥必须保密。私钥的机密性需求事实情况是,在实践中相当难以实现,因为该需求与同样重要的安全对象可用性相互矛盾。当你需要为了避免私钥丢失而存储备份时,会发现维护私钥私密性是一件相当困难的事情。通过密码加密内有私钥的钱包可能要安全一点,但那个钱包也需要备份。有时,例如用户因为要升级或重装钱包软件,而需要把密钥从一个钱包转移到另一个。私钥备份也可能需要存储在纸张上或者外部存储介质里,比如 U 盘。但如果一旦备份文件失窃或丢失呢?这些矛盾的安全目标推进了便携、方便、可以被众多不同钱包和比特币客户端理解的加密私钥标准 BIP0038 的出台。
4.5.2 P2SH (Pay-to-Script Hash)和多重签名地址
正如我们所知,传统的比特币地址从数字 1 开头,来源于公钥,而公钥来源于私钥。虽然任何人都可以将比特币发送到一个 1 开头的地址,但比特币只能在通过相应的私钥签名和公钥哈希值后才能消费。
以数字 3 开头的比特币地址是 P2SH 地址,有时被错误的称谓多重签名或多重签名地址。 他们指定比特币交易中受益人作为哈希的脚本,而不是公钥的所有者。
4.5.2.1 多重签名地址和 P2SH
目前,P2SH 函数最常见的实现是用于多重签名地址脚本。顾名思义,底层脚本需要多个签名来证明所有权,此后才能消费资金。设计比特币多重签名特性是需要从总共 N 个密钥中需要 M 个签名(也被称为“阈值”),被称为 M-的-N 的多签名,其中 M 是等于或小于 N。
4.5.3 比特币靓号地址
靓号地址包含了可读信息的有效比特币地址。例如,
1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33 就是包含了 Base-58 字母 love的。靓号地址需要生成并通过数十亿的候选私钥测试,直到一个私钥能生成具有所需图案的比特币地址。虽然有一些优化过的靓号生成算法,该方法必须涉及随机上选择一个私钥,生成公钥,再生成比特币地址,并检查是否与所要的靓号图案相匹配,重复数十亿次,直到找到一个匹配。
4.5.3.1 生成靓号地址
我们必须认识到使用来自 Base58 字母表中简单符号来代表比特币地址是非常重要的。
4.5.3.2 靓号地址安全性
靓号地址既可以增加、也可以削弱安全措施,它们着实是一把双刃剑。用于改善安全性时,一个独特的地址使对手难以使用他们自己的地址替代你的地址,以欺骗你的顾客支付他们的账单。不幸的是,靓号地址也可能使得任何人都能创建一个类似于随机地址的地址,甚至另一个靓号地址,从而欺骗你的客户。
4.5.4 纸钱包
纸钱包是打印在纸张上的比特币私钥。有时纸钱包为了方面起见也包括对应的比特币地址,但这并非是必要的。因为地址可以从私钥中导出。纸钱包是一个非常有效简历备份或者线下比特币存储方式,也是被称为“冷钱包”。作为备份机制,一个纸钱包可以提供安全性,以防在电脑硬盘损坏、失窃或意外删除的情况下造成密钥的的丢失。作为一个冷存储的机制,如果纸钱包密钥在线下生成并永久不在电脑系统中存储,他们在应对黑客攻击,键盘记录器,或其他在线电脑欺骗更有安全性。
纸钱包有许多不同的形状,大小,和外观设计,但非常基本的原则是一个密钥和一个地址打印在纸张上。
WOW NICE I LIKE IT
Upvoted. I'll be resteeming this now :)
Thank you.