精通区块链编程:加密货币原理、方法和应用开发(原书第2版)
安德烈亚斯·M.安东波罗斯
53个笔记
◆ 第1章 比特币介绍
>> 比特币协议还规定每4年新发行比特币的数量减半,并将所有发行的比特币总数限制在2100万以内
>> 比特币这四个创新包括:
·一个去中心化的点对点网络(比特币协议)
·一本公开的交易总账(区块链)
·一套可独立校验交易和发行货币的规则(共识规则)
·一种通过全球去中心化对有效的区块链达成共识的机制(工作量证明算法)
>> 任何人接受数字货币时都有三个基本问题:
1.我怎么确定这笔钱是真实的,而不是伪造的?
2.我怎么确定这笔数字货币只能花费一次(也称为“双重支付”或者“双花”问题)?
3.我怎么确定没有人能够声称这笔钱属于他们而不是我的?
◆ 1.2 比特币历史
>> 关键的创新是使用分布式计算系统(称为“工作量证明”算法)每10分钟进行一次全球性的“选举”,从而让分布式网络达成关于已经发生交易状态的共识。这优雅地解决了双重支付的问题,也就是避免一个货币单位可以花费两次。
◆ 2.2 比特币交易
>> 一笔交易是告知全网这部分比特币的持有者已授权把它转给新的持有者
◆ 2.2.1 交易输入和输出
>> “消费”指的是签署一笔交易,将比特币的价值从之前的交易转移给一个比特币地址代表的新的持有者。
◆ 2.2.2 交易链
>> 她给Bob咖啡屋的新交易引用之前的交易作为输入,产生新的输出来支付一杯咖啡并获得找零。交易形成了一条链条,在链条上,最近交易的输入对应之前交易的输出。
◆ 2.2.3 找零
>> 找零地址并不一定要和输入地址相同,出于隐私的考虑,它通常是来自所有者钱包的一个新地址。
◆ 2.3.2 创建交易输出
>> 本质上说,Alice的钱包将她的金额分成了两笔支付:一笔给Bob,一笔返回给她自己。她可以在之后的交易里使用(消费)这笔找零输出。
◆ 2.4 比特币挖矿
>> 挖矿在比特币系统中起着两个作用:
·挖矿节点通过参考比特币的共识规则检验所有交易。因此挖矿通过拒绝无效或者不正常的交易为比特币交易提供安全保证。
·挖矿在构建区块时会创造新的比特币,这与中央银行印发新的纸币很类似。每个区块创造的比特币数量是有限的并按照随着时间减少的固定发行规则。
◆ 2.5 在区块中挖掘交易
>> 新的交易持续地从钱包和其他应用中流入网络。当它们被比特币网络的节点看到时,便会被加入每个节点维护的未验证交易的临时池子。当矿工打包新块时,它们从这个临时池子中将选择未验证交易加入新区块,然后尝试使用工作量证明算法来证明这个新块的有效性。
>> 每个在包括Alice交易的区块之上被挖掘出来的区块被看作Alice交易的一个额外确认。因为区块一个叠一个,逆转交易的难度将指数级增加,从而让它变得更加被网络信任。
>> 通常来说,任何有6个或以上确认的区块可以被看作是不可逆的,因为如果要作废和重新计算6个区块所需要的计算量是巨大的。
◆ 4.1 简介
>> 比特币的所有权是通过数字密钥、比特币地址和数字签名建立起来的。数字密钥实际上并不存储在网络中,而是由用户创建,并且存储在一个叫作钱包的文件或者简单的数据库中。
>> 大多数比特币交易都需要一个有效的数字签名才能被存储到区块链上。只有有效的密钥才能产生有效的数字签名,因此任何人只要拥有密钥副本就拥有了对该账户的比特币控制权。
>> 并非所有比特币地址都代表公钥;它们也可以代表其他受益者,如脚本
◆ 4.1.1 公钥密码学和加密货币
>> 支付比特币时,比特币的当前所有者需要在交易中展示其公钥和签名(每次交易的签名都不同,但均从同一个私钥创建)。比特币网络中的所有人都可以对所提交的公钥和签名进行验证,来确认该交易是否有效,即确认支付者在转账时对所交易的比特币拥有所有权。
>> 可以从私钥计算公钥,所以只存储私钥也是可以的。
◆ 4.4.3 靓号地址
>> Eugenia付出的努力(或者靓号矿池付出的)迫使攻击者不得不生成更长的靓号样式。
◆ 第5章 钱包
>> “钱包”一词在比特币中有多重含义。
广义上讲,钱包是一个应用程序,为用户提供交互界面。钱包控制用户访问权限,管理私钥和地址,跟踪余额以及创建和签名交易。
狭义上讲,从程序员的角度来看,“钱包”是指用于存储和管理用户私钥的数据结构。
◆ 5.1 钱包技术概述
>> 钱包只包含密钥。比特币被记录在比特币网络的区块链中
>> 第一种类型是非确定性钱包(nondeterministic wallet),其中每个私钥都是从随机数独立生成的,密钥彼此之间无关联。
>> 第二种类型是确定性钱包(deterministic wallet),其中所有的私钥都是从一个主私钥派生出来,这个主私钥即为种子(seed)。
◆ 6.3 交易的输出和输入
>> 从包含输入与输出的交易链角度来看,有一个特殊交易,被称为“币基交易”(Coinbase Transaction),它是每个区块中的第一笔交易,这笔交易由“获胜”矿工设置,创建全新比特币并支付给该矿工作为采矿奖励。币基交易并不消费UTXO,相反,它有一种称为“coinbase”的特殊类型的输入。这也就是为什么比特币可以在挖矿过程中被创造出来
◆ 6.3.3 交易费
>> 交易费作为矿工打包(挖矿)一笔交易到下一个区块中的一种激励;同时作为一种抑制因素,通过对每一笔交易收取小额费用来防止对系统的滥用。成功挖到某区块的矿工将得到该区内包含的交易费,并将该区块添加至区块链中。
交易费是以千字节为单位计算的,而不是比特币交易的金额。总体而言,交易费是由比特币网络中的市场行为决定。矿工会依据许多不同的标准(包括费用)对交易进行优先级排序,甚至可能在某些特定情况下免费处理交易。但大多数情况下,交易费影响处理优先级
◆ 6.3.4 把交易费加到交易中
>> 如果你在消耗了一个20比特币的UTXO来完成1比特币的付款,在交易中你必须包含一笔19比特币的找零回到你的钱包。否则,那剩下的19比特币会被当作交易费,并将由挖出你交易的矿工收走。
>> 更高的交易费不是因为Eugenia要付的钱很多,而是因为她的交易很复杂导致数据量大——交易费与交易的比特币价值无关的。
◆ 6.4 交易脚本和脚本语言
>> 当一笔比特币交易被验证时,每一个输入中的解锁脚本将与其对应的锁定脚本一起执行,以确定这笔交易是否满足支付条件。
脚本是一种非常简单的语言,功能被设计的比较有限,可在很多硬件上运行,如简单的嵌入式设备也可以运行。它只能做很少的操作,并且不能完成许多现代编程语言能够做的事情。但用于验证可编程货币,这是一个深思熟虑的安全设计。
◆ 6.4.1 非图灵完备性
>> 没有循环或复杂流程控制能力。这使得脚本语言是非图灵完备的,这意味着脚本复杂性和执行次数都是有限的。脚本不是通用语言,这些限制确保了这些语言不能用于创建无限循环或其他形式的“逻辑炸弹”,这种逻辑炸弹可能嵌入事务中,从而导致对比特币网络的拒绝服务攻击。
◆ 6.5 数字签名(ECDSA)
>> 数字签名在比特币中有三种用途。第一,签名证明私钥的所有者,即资金所有者,已经授权支出这些资金。第二,授权证明是不可否认的(不可否认性)。第三,签名证明交易(或交易的特定部分)在签名之后没有也不能被任何人修改。
◆ 8.2 节点类型和角色
>> 一个比特币节点是一个功能集合:路由、区块链数据库、挖矿和钱包服务
◆ 8.9 Bloom过滤器
>> Bloom过滤器通过允许一个SPV节点指定一个针对交易的搜索模式。这个模式能够根据精度或者隐私的考虑被调节来实现这个功能。一个更特指的bloom过滤器会产出准确的结果,但是代价就是暴露了SPV节点关注的是什么模式,从而暴露了用户钱包所拥有的地址。一个更笼统的bloom过滤器会针对更多的交易产出更多的数据,很多都是和这个节点无关的,但是这样允许节点维护更好的隐私性。
◆ 第9章 区块链
>> “父区块散列值”字段储存在区块头里面,因此会影响区块本身的散列值。如果父区块的身份标识发生变化,子区块的身份标识也会跟着变化。当父区块有任何改动时,父区块的散列值会发生变化。这将使子区块的“父区块散列值”字段发生改变,从而将使得子区块的散列值发生改变。而子区块的散列值发生改变将使孙区块的“父区块散列值”字段发生改变,因此又会改变孙区块的散列值,以此类推。这种级联效应可以确保一旦一个区块在其之后有许多后代,它就不能在不强制重新计算所有后续区块的情况下进行更改。由于重新计算需要大量的算力(需要耗费大量的能源),长链块的存在使得区块链的纵深历史变得不可篡改,这是比特币安全性的一个关键特征。
◆ 9.3 区块头
>> 区块头包含三组区块元数据。首先,有一组引用父区块散列值的数据,这组元数据用于将该区块与区块链中前一区块相连接。第二组元数据,即难度、时间戳和随机数,与挖矿竞争相关,详见第10章。第三块元数据是默克尔树根(merkle tree root),一种数据结构,用于有效地汇总块中的所有交易。
◆ 9.7 默克尔树
>> 默克尔树,也称为哈希二叉树,是一种用于有效地汇总和验证大型数据集完整性的数据结构。默克尔树是包含密码哈希的二叉树。
◆ 第10章 挖矿和共识
>> 挖矿过程中会创建新币,但是挖矿不是最终目的,更多的是一种激励手段。挖矿是一种去中心化的交易清算机制,通过这种机制,交易得到验证和清算。挖矿是使得比特币与众不同的发明,它实现去中心化的安全机制,是P2P数字货币的基础。
◆ 10.2 去中心化共识
>> 比特币的去中心化共识由所有网络节点的4种独立过程相互作用而产生:
·每个全节点依据规范清单对每个交易进行独立验证。
·通过完成工作量证明算法的验算,挖矿节点将交易记录独立打包进新区块。
·每个节点独立对新区块进行校验并组装进区块链。
·每个节点对区块链进行独立选择,在工作量证明机制下选择累计工作量最大的区块链。
◆ 10.5.1 创币交易
>> 区块中的第一笔交易是一笔特殊交易,称为创币交易(coinbase transaction)
>> 与常规交易不同,创币交易没有输入,不消耗UTXO。它只包含一个被称作“创币”的输入,用来创建新的比特币。创币交易有一个输出,支付到这个矿工的比特币地址。
◆ 10.7 挖掘区块
>> 简单来说,挖矿就是不断修改区块头中的参数,并计算区块头的散列值,直到其散列值与目标难度相匹配的过程。
◆ 10.7.3 重定目标实现调整难度
>> 难度的调整是由最近2016个区块的花费时长与20,160分钟(即以标准10分钟一个区块的产生周期所花费的时长)比较得出的。难度是根据实际时长与期望时长的比值进行相应调整的(或变难或变易)。
◆ 10.8 成功挖出区块
>> 当挖矿节点收到并验证了这个新区块后,它们会放弃对这个相同高度区块的计算,将Jing的区块作为父区块,立即开始计算区块链中下一个区块。矿工们在Jing新发现的区块之上构建新区块,这实际上是使用自己的挖矿算力进行投票,支持Jing的区块以及被该区块扩展的区块链。
◆ 10.10 区块链的组装与选择
>> 只要所有的节点选择最大累计工作量链,整个比特币网络最终会收敛到一致的状态。区块链版本的临时差异会导致分叉,随着更多的区块添加到了某个分叉中,这个问题便会迎刃而解。
>> 比特币将区块间隔设计为10分钟,是在更快速的交易确认(交易结算)和更低的分叉概率间做出的妥协。
◆ 10.12 共识攻击
>> 想象这么一个场景,一群矿工控制了整个比特币网络51%的算力,他们联合起来打算攻击整个比特币系统。由于这群矿工可以生成绝大多数的区块,他们就可以通过故意制造区块链分叉来实现“双重支付”或者通过拒绝服务的方式来阻止特定的交易或者攻击特定的钱包地址。区块链分叉/双重支付攻击指的是攻击者通过从指定区块之前的区块开始分叉,导致其后的已经确认的区块无效,然后重新收敛这些区块到一个替代的区块链。有了充足算力的保证,一个攻击者可以一次性篡改最近的6个或者更多的区块,从而使得这些区块包含的本应无法篡改的交易无效。
◆ 10.13.5 软分叉
>> 软分叉是对共识规则的向前兼容的升级,允许未升级的客户端程序继续在新的共识规则下工作。
◆ 11.1 安全原则
>> 在一个像信用卡系统这样的传统支付网络中,支付是终端开放的,因为它包含了用户的个人标识(信用卡号)。在初次支付之后,任何可以访问该标识的人都可以从所有者那里反复“抽取”资金。这样,支付网络必须通过加密对端到端进行安全保护,并且必须确保没有窃听者或者中间人能够危害到支付通信,无论是传输过程中还是被保存后(休息时)。如果一个坏人获得了系统访问权限,他可以危害到当前的交易和支付令牌,并用它们来创建新的交易。更糟糕的是,当客户数据被泄露,客户的个人身份信息被暴露给身份窃贼,必须采取行动来防止失窃账户被用于欺诈。
比特币则截然不同。一笔比特币交易仅仅授权一个特定的值到一个特定的接收方,并且不能够被伪造或者修改。它没有泄露任何像当事人身份的隐私信息,也不能被用于授权额外的支付。因此,一个比特币支付网络不需要被加密或者防止窃听。实际上,你可以通过开放的公共频道(像不安全的WiFi或者蓝牙)广播比特币交易,同时不会降低安全性。
◆ 11.1.1 安全地开发比特币系统
>> 如果你想要利用比特币的安全性,你需要保证你始终在比特币的安全模型内。简单地说,不要从用户那里拿走对密钥的控制,也不要把交易放到链下。
◆ 11.2 用户安全最佳实践
>> 比特币也创造了提升电脑安全的动机。之前电脑被入侵的风险是模糊而间接的,比特币让这些风险清晰明了。
◆ 12.2 基础模块(要素)
>> 比特币交易是原子性的。它们要么是有效并且经过确认的(被打包挖矿过),要么不是。不存在确认交易的一部分,交易也不存在中间状态。在任何时间点,交易要么被打包挖矿,要么没有被打包挖矿。
◆ 12.4 染色币
>> 染色币是指利用比特币交易来记录除比特币之外的外部资产以及外部资产的创建、所有权确认和转让的这类技术
◆ 附录A 比特币白皮书
>> 最长的链条不仅将作为被观察到的事件序列的证明,而且被看作是来自CPU计算能力最大的池。只要大多数的CPU计算能力都没有打算合作起来对全网进行攻击,那么诚实的节点将会生成最长的、超过攻击者的链条。
>> 激励系统也有助于鼓励节点保持诚实。如果有一个贪婪的攻击者能够调集比所有诚实节点加起来还要多的CPU计算力,那么他就面临一个选择:要么将其用于诚实工作产生新的电子货币,或者将其用于进行二次支付攻击。他会发现,按照规则行事、诚实工作是更有利可图的。因为该等规则使得他能够拥有更多的电子货币,而不是破坏这个系统使得其自身财富的有效性受损。