Overview
前言
快速术语检索
第1章 介绍
第2章 比特币的原理
第3章 比特币客户端
第4章 密钥、地址、钱包
第4章 高级密钥和地址
第5章 交易
第6章 比特币网络
第7章 区块链
第8章 挖矿与共识
第8章 区块链分叉、矿池、共识攻击
第9章 竞争币、竞争块链和应用程序
第10章 比特币安全
附录 比特币改进协议
Overview
记录一下个人关于这本书的阅读,
<精通比特币 第一版>/
前言
- 大自然向我们证明,去中心化体制具有弹性并能创造出意想不到的复杂性和难以想象的精妙,而不需要中央集权体制、等级制度或复杂的组织结构。
快速术语检索
- 地址/比特币地址(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串字符和数字组成,以阿拉伯数字“1”开头。就像别人向你的
email地址
发送电子邮件一样,他可以通过你的比特币地址向你发送比特币。 - 区块,一个区块就是若干交易数据的集合,它会被标记上时间戳和之前一个区块的独特标记。区块头经过哈希运算后会生成一份工作量证明,从而验证区块中的交易。有效的区块经过全网络的共识后会被追加到主区块链中
- 区块链,区块链是一串通过验证的区块,当中的每一个区块都与上一个相连,一直连到创世区块
- 确认,当一项交易被区块收录时,我们可以说它有一次确认。矿工们在此区块之后每再产生一个区块,此项交易的确认数就再加一。当确认数达到六及以上时,通常认为这笔交易比较安全并难以逆转
钱包,钱包指保存比特币地址和私钥的软件,可以用它来接受、发送、储存你的比特币
第1章 介绍
比特币代表了数十年的密码学和分布式系统的巅峰之作,这是一个独特而强大的组合,汇集了四个关键的创新点。比特币由这些构成,
- 一个去中心化的点对点网络(比特币协议)
- 一个公共的交易账簿(区块链)
- 一个去中心化的数学的和确定性的货币发行(分布式挖矿)
- 一个去中心化的交易验证系统(交易脚本)
第3章 比特币客户端
创世区块于2009-01-04 02:15:05(GMT+8)
client 命令
bitcoin code 比特币核心代码,
- getinfo:显示关于比特币网络节点、钱包、区块链数据库状态的基础信息
- encryptwallet:用自定义密码`加密`比特币钱包
- walletpassphrase:用自定义密码和锁定倒计时来`解密`钱包
- backupwallet:备份钱包
- importwallet:加载钱包(需先解密钱包)
- dumpwallet:打印钱包信息
- getnewaddress:为钱包新建一个地址/公钥(一个钱包可以包含很多地址?)
- getreceivedbyaddress:该地址已经接收到的比特币数额
- listtransactions:整个钱包所接收到的交易,得到交易哈希值txid
- getaddressesbyaccount:列出整个钱包的所有地址
- getbalance:显示所有确认过的交易后的总余额
- dumpprivkey:将私钥以Base58校验和编码格式显示
- base58check-decode:私钥从B58C编码到十六进制Hex编码
- base58check-encode:Hex到B58C
- gettransaction:通过txid获取一笔交易简要
- getrawtransaction:通过txid获取一个`原始十六进制字符串`
- decoderawtransaction:解码raw transcation成json形式
- getblock:查找区块的信息
- getblockhash:通过区块高度来检索一个区块(创世区块高度为0)
- listunspent:查看钱包中余额
- gettxout:查看未花费的输出的详细细节
- createrawtransaction:建立一笔交易,并产生了一个`原始十六进制字符串`
- signrawtransaction:对一笔交易进行签名(需先解密钱包),并产生了一个`原始十六进制字符串`
- sendrawtransaction:发布交易到比特币网络,并返回txid
第4章 密钥、地址、钱包
- 钱包是私钥的容器
- 比特币的所有权是通过数字密钥、比特币地址和数字签名来确立的
- 每笔比特币交易都需要一个有效的签名才会被存储在区块链。只有有效的数字密钥才能产生有效的数字签名,因此拥有比特币的密钥副本就拥有了该帐户的比特币控制权
- 私钥256bit,公钥520bit
- 钱包是私钥的容器,可以包含多个私钥-公钥对。用户用这些私钥来签名交易,从而证明它们拥有交易的输出(也就是其中的比特币)。比特币是以交易输出的形式来储存在区块链中(通常记为vout或txout)
- 私钥就类似于银行账户密码;地址就类似于银行账号
- 钱包是我们用来生产私钥和地址、管理私钥和地址、接收和发送比特币的工具
- 比特币私钥是什么?备份dat后钱包里所有的钱都备份起来了吗?
第5章 交易
- 比特币网络被设计为能
高效
且灵活
地传递交易和区块至所有节点的模式,因而比特币网络能抵御入侵。为了避免垃圾信息的滥发、拒绝服务攻击或其他针对比特币系统的恶意攻击,每一个节点在传播每一笔交易之前均进行独立验证。 一个异常交易所能到达的节点不会超过一个 - UTXO,Unspent Transaction Output, 表示未花费的输出,即余额
- 交易费可当作是为了包含(挖矿)一笔交易到下一个区块中的一种鼓励,也可当作是对于欺诈交易和任何种类的系统滥用,在每一笔交易上通过征收一笔小成本的税而造成的一种妨碍
- 在孤立池中保留孤块的机制保证了其他合法的交易不会只是因为父交易被耽误了而被抛弃,类似于java线程池queue
- 比特币交易脚本语言,也称为脚本,并不是一种通用语言,施加的这些限制确保该语言不被用于创造无限循环或其它类型的逻辑炸弹,这样的炸弹可以植入在一笔交易中,通过引起拒绝服务的方式攻击比特币网络。受限制的语言能防止交易激活机制被人当作薄弱环节而加以利用
- 比特币网络上的大多数交易都是P2PKH交易,此类交易都含有一个锁定脚本,该脚本由公钥哈希实现阻止输出功能,公钥哈希即为广为人知的比特币地址。由P2PKH脚本锁定的输出可以通过键入公钥和由相应私钥创设的数字签名得以解锁
- P2SH(Pay-to-Script-Hash),向含该哈希的组合脚本支付(520byte)取代了之前的向该5个多重签名脚本支付(20byte),即通过SHA256来实现
降维
- 将比特币锁定在一个未来不能被花费的P2SH中。因为比特币网络本身会接受这一P2SH,即便它与无效的赎回脚本所对应(因为该赎回脚本哈希没有对其所表征的脚本给出指令),存放比特币到未来
第6章 比特币网络
- 比特币采用了基于国际互联网(Internet)的P2P(peer-to-peer)网络架构。P2P是指位于同一网络中的每台计算机都彼此对等,各个节点共同提供网络服务,不存在任何特殊节点。每个网络节点以“扁平(flat)”的拓扑结构相互连通。在P2P网络中不存在任何服务端(server)、中央化的服务、以及层级结构
- 扩展比特币网络(extended bitcoin network)指代所有包含比特币P2P协议、矿池挖矿协议、Stratum协议以及其他连接比特币系统组件相关协议的整体网络结构
- 尽管比特币P2P网络中的各个节点相互对等,但是根据所提供的功能不同,各节点可能具有不同的分工。每个比特币节点都是路由、区块链数据库、挖矿、钱包服务的功能集合
- 全节点,保存有一份完整的、最新的区块链拷贝。能够独立自主地校验所有交易,而不需借由任何外部参照
- 轻量级节点/SPV节点,只保留了区块链的一部分,它们通过一种名为“简易支付验证(SPV)”的方式来完成交易验证
- 挖矿节点,通过运行在特殊硬件设备上的工作量证明算法(proof-of-work),以相互竞争的方式创建新的区块
- 用户钱包节点,可以是全节点或SPV节点
- 其他类型节点
- 全节点通过检查整个链中在它之下的数千个区块来保证这个UTXO没有被支付,从而验证交易
- SPV节点通过检查在其上面的区块将它压在下面的深度来验证交易
- Bloom filter被用来过滤SPV节点从对等节点里收到的交易信息,增加私密性
第7章 区块链
- 区块链是由包含交易信息的区块从后向前有序链接起来的数据结构
- 瀑布效应,把区块链想象成地质构造中的地质层或者是冰川岩芯,在区块链里,最近的几个区块可能会由于区块链分叉所引发的重新计算而被修改。最新的六个区块就像几英寸深的表土层。但是,超过这六块后,区块在区块链中的位置越深,被改变的可能性就越小
- 区块是一种被包含在公开账簿(区块链)里的聚合了交易信息的容器数据结构
- 区块头,80byte
- 引用父区块哈希值的数据,区块与区块链中前一区块(父区块)相连接
- 元数据,即难度、时间戳和nonce,与挖矿竞争相关
- merkle树根,一种用来有效地总结区块中所有交易的数据结构
- 区块主体,一长串交易,每个区块至少包含超过500个交易,平均每个交易至少是250byte
- 区块头,80byte
- 无论区块中有一个交易或者有十万个交易,Merkle根总会把所有交易归纳为32byte
- 一个节点能够通过生成一条仅有4个32byte哈希值长度(总128byte)的Merkle路径,来证明区块中存在一笔交易K
- SPV节点会收到区块头(用于关联交易与区块、区块和区块链,证明交易存在于区块链)和Merkle路径(一条连接目标交易与Merkle根的路径,节点使用该路径找到与该交易相关的区块,进而验证对应区块中该交易的有无)
第8章 挖矿与共识
比特币发行总量计算
初始条件,
- 每10分钟产生一个区块
- 初始的块奖励为50BTC
计算结论,
- 每10分钟产生一个区块,210000个区块大约生产的时间是差不多4年的时间(4 * 365 * 24 * 60 / 10 = 210240)
- 初始的块奖励为50BTC,所有区块的奖励从50到25再到12.5逐渐递减,所以一共是 50 + 25 + 12.5 + 6.25 + 3.125 ... = 100的奖励
- 210000 * 50 + 210000 * 25 + 210000 * 12.5 +……= 21万 * 50 * 2 = 2100万
- 1 聪(Satoshi) = 0.00000001 BTC(1亿倍)
- 总2100万个BTC,初始50BTC奖励,然后每一个周期折半,即50/(2^n) = 1聪,得n = 32.22。一个周期4年,得32.22 * 4之后比特币矿就会挖完,不再有新BTC奖励,2009 + 32.22 * 4 = 2137.88 ≈ 2140年,届时新区块的挖掘不再包含比特币奖励,矿工的收益全部来自交易费
- 区块链并不是由一个中心机构创造的,它是由比特币网络中的所有节点各自独立竞争完成的。换句话说比特币网络中的所有节点,依靠着节点间的不稳定的网络连接所传输的信息,最终得出同样的结果并维护了同一个公共总帐
- 中本聪的主要发明就是这种去中心化的自发共识机制。这种自发,是指没有经过明确选举或者没有固定达成的共识的时间(paxos? zookeeper?)
- 如果交易费用太低以至于无法进入一个空的区块,交易将被拒绝
- 在收到交易后,,每一个节点都会在全网广播前对这些交易进行校验,并以接收时的相应顺序,为有效的新交易建立一个池(交易池)
- 挖矿机从比特币网络收到了区块277,315。这个区块的到来标志着终结了产出区块277,315竞赛,与此同时也是产出区块277,316竞赛的开始
- 挖矿节点会检查内存池中的全部交易,并移除刚刚到来的277,315区块中出现过的交易记录,确保任何留在内存池中的交易都是未确认的,等待被记录到新区块中
- 挖矿节点立刻构建一个新的空区块,做为区块277,316(未全网传播)的候选区块。称作候选区块是因为它还没有包含有效的工作量证明,不是一个有效的区块,而只有在矿工成功找到一个工作量证明解之后,这个区块才生效
- 在区块被填满后,内存池中的剩余交易会成为下一个区块的候选交易。因为这些交易还留在内存池中,所以随着新的区块被加到链上,这些交易输入时所引用UTXO的深度(即交易“块龄”)也会随着变大。由于交易的优先值取决于它交易输入的“块龄”,所以这个交易的优先值也就随之增长了。最后,一个零矿工费交易的优先值就有可能会满足高优先级的门槛,被免费地打包进区块(交易确认时长换交易费)
- 寻找一个比特币区块需要整个网络花费10分钟来处理,每发现2,016个区块时会根据前2,016个区块完成的时间对难度进行调整
- 挖矿节点创建一个候选区块,矿机上有成千上万个集成电路可以超高速地并行运行SHA256算法。这些定制的硬件通过USB连接到挖矿节点上,将277,316区块头信息传送给这些硬件,让它们以每秒亿万次的速度进行nonce测试。在对区块277,316的挖矿工作开始大概11分钟后,这些硬件里的其中一个求得了解并发回挖矿节点。当把这个结果放进区块头时,nonce 4,215,469,401 就会产生一个区块哈希值:0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569 < 0000000000000003A30C00000000000000000000000000000000000000000000(目标难度)。挖矿节点立刻将这个区块发给它的所有相邻节点。这些节点在接收并验证这个新区块后,也会继续传播此区块。当这个新区块在网络中扩散时,每个节点都会将它作为区块277,316加到自身节点的区块链副本中。当挖矿节点收到并验证了这个新区块后,它们会放弃之前对构建这个相同高度区块的计算,并立即开始计算区块链中下一个区块的工作(弱矿机算一次,强矿机算一万次,算力越强,越快逼近目标nonce。nonce∈[0, N],有些从0开始,有些从N/2开始,可以并行。有没有argument说从N/2开始自增/自减更容易hash到小于目标难度?引入矿池)
- 校验新区块
- 区块头的哈希值小于目标难度(确认包含足够的工作量证明)
- 第一个交易(且只有第一个)是coinbase交易
- 区块时间戳早于验证时刻未来两个小时(允许时间错误)
- 每一个节点总是选择并尝试延长代表累计了最大工作量证明的区块链,也就是最长的或最大累计难度的链
- 带有短链的节点接纳了新的更长的链,被迫改变了原有对区块链的观点,这就叫做链的重新共识(一个新区块的诞生又工作量证明,其归入主链过程如果出现分叉,则还依赖于基于这个新区块进行下一轮新区快挖掘的速度)
- 比特币将区块间隔设计为10分钟,是在更快速的交易确认和更低的分叉概率间作出的妥协
- 矿工连接到矿池服务器使用一个采矿协议比如Stratum (STM)或者 GetBlockTemplate (GBT)
- P2Pool通过将矿池服务器的功能去中心化,实现一个并行的类似区块链的系统,名叫份额链
- 比起用一个矿池服务器记录矿工的份额和奖励,份额链允许所有矿工通过类似比特币区块链系统的去中心化的共识机制跟踪所有份额(低难度区块链)
- 共识攻击也不会影响用户的私钥以及椭圆曲线签名加密算法(ECDSA)。共识攻击也不能从其他的钱包那里偷到比特币、不签名地支付比特币、重新分配比特币、改变过去的交易或者改变比特币持有纪录。共识攻击能够造成的唯一影响是影响最近的区块(最多10个)并且通过拒绝服务来影响未来区块的生成
- 双重支付,支付者A的BTC在支付给B后,B确认了并发货,然后A发起共识攻击(双重支付),该交易被无效化,而A支付到C钱包地址的交易被算有效(所以要等至少6个区块确认后才算放心发货)
- 拒绝交易,拒绝对某个特定的比特币地址提供服务,攻击者可以故意分叉,然后重新产生区块,并且把想忽略的交易从这个区块中移除
第9章 竞争币、竞争块链和应用程序
- 比特币是20多年的分布式系统和货币研究的结果,是一项具有革命性的新技术:一种基于工作量证明的去中心化的一致性机制。这项比特币的核心发明引领了一场包括货币体系、金融服务、经济学、分布式系统、投票系统、联合监管和合同体系在内的创新浪潮(:))
- 竞争币 alt coin,Litecoin, Dogecoin等
- 竞争块链 alt chains,Ethereum
- 除了比特币系统使用的基于工作量证明的一致性机制这种协议以外,还有基于资源证明或发布证明的一些试验性协议。后续将探讨以Maidsafe和Twister为代表的这类协议
- 有一些比特币的竞争者,比如Ripple等,也提供电子货币(BTC是固定且挖矿得来,再流通,稀缺性)和交易网络,但并没有像比特币一样使用分布式账簿或者一致性机制
- 元币的第一个实现利用了大量的 hack 技巧把元数据添加到比特币块链中,比如使用比特币地址编码数据,或者利用空白的交易字段存放新协议层增加的这些元数据。自从交易脚本操作码问世之后,元币得以直接将信息存放在块链之中(将重要信息存储单向存储在区块链,类似于把东西hash后放入保险柜)
- 染色币,协议将特定比特币指定其代表另一种资产(这个比特币代表了卢浮宫里某件珍藏,且可以被交易)
- 比特币BTC与比特币现金BCH
- 比特币的一致性机制建立在基于SHA256算法的工作量证明之上。第一款引入scrypt算法作为一致性机制的竞争币是为了便于CPU挖矿,避免ASIC矿机可能导致的算力集中化的问题
- 比特币的工作量证明机制只有一个目的:维护比特币系统的安全。跟维护一个传统货币系统比起来,挖矿的成本并不高。然而,某些批评者认为挖矿这一行为是一种浪费。新一代的加密货币试图解决这个争议。多目的挖矿算法就是为了解决工作量证明导致的“浪费”问题而出现的。多目的挖矿在为货币系统的安全加入额外需求的同时,也为该系统的供需关系加入了额外的变量
- CryptoNote,一种提供了电子货币基础的匿名性的参考实现
- Bitmessage是一个实现了去中心化安全消息服务的比特币竞争币区块链
- 以太坊是一种图灵完备的平台,基于区块链账簿,用于合约的处理和执行。它不是比特币的一个克隆,而是完完全全独立的一种设计和实现,以太坊区块链记录的东西叫做合约
- BTC图灵非完备语言 vs Ethereum图灵完备语言
- 在以前,很多人类活动都需要一个中心化的机构或组织来实现权威或可信控制点的功能。现在,这些都可以去中心化了。区块链和共识系统的发明,还会显著降低大型系统在组织及协调上的花销,同时也将消除权力攫取、腐败及管制俘获的可趁之机
第10章 比特币安全
- 你可以像备份其他文件一样,备份含有密钥的比特币钱包。它可以被复制成很多份,放到不同的地方保存起来,甚至能打印到纸上进行实体备份
- 比特币网络的安全性是基于工作量证明而非访问控制
- 一笔比特币交易只授权向指定接收方发送一个指定数额,并且不能被修改或伪造。它不会透露任何个人信息,例如当事人的身份,也不能用于权限外的支付
- 冷存储系统是在一个离线系统(一个从来没有连接过互联网的系统)上生成密钥,并离线存储到纸上或者 U 盘等电子媒介
- 硬件钱包将成为比特币储存的主要方式