《精通比特币》摘记
阅读对象 :《精通比特币》主要面向程序员。本书将会告诉你加密货币的原理、使用方法,以及如何开发与之相关的软件。
经典必读,随着时间和参与深度的不同,每一次的阅读都是认知的升级!
- 英文版本 https://github.com/bitcoinbook/bitcoinbook
- 中文版本 http://book.8btc.com/books/6/masterbitcoin2cn/_book/
一、大自然中的社群组织结构
- “切叶蚁”,在蚁群中不存在中央集权体制或领导。
- 群落中数百万成员所展现的高度智能且复杂的行为是社会网络中的个体互动这一性质的凸显。
- 大自然向我们证明,去中心化体制具有弹性并能创造出意想不到的复杂性和难以想象的精妙,而不需要中央集权体制、 等级制度或复杂的组织结构。
- 去中心化 ,可理解为去中介化。
比特币网络正是这样一个高度复杂的去中心化的可信网络,能够支撑无数财务流程。
像蚁群一样,比特币的弹性网络是一个由众多遵循简单准则的简单节点所组成的弹性网络,这些简单的 节点准则聚合在一起可以完成惊人的事情,而不需要任何中枢协调。
二、基础概念
比特币
“比特币”既可以指这种虚拟货币单位,也指比特币网络或者网络节点使用的比特币软件。
区块
一个区块就是若干交易数据的集合,它会被标记上时间戳和之前一个区块的独特标记。区块头经过哈希运算后会生成一份工作量证明,从而验证区块中的交易。有效的区块经过全网络的共识后会被追加到主区块链中。
确认
当一项交易被区块收录时,我们可以说它有一次确认。矿工们在此区块之后每再产生一个区块,此项交易的确认数就再 加一。当确认数达到六及以上时,通常认为这笔交易比较安全并难以逆转。
难度
整个网络会通过调整“难度”这个变量来控制生成工作量证明所需要的计算力。
矿工
矿工指通过不断重复哈希运算来产生工作量证明的各网络节点。
网络
比特币网络是一个由若干节点组成的用以广播交易信息和数据区块的P2P网络。
工作量证明
工作量证明指通过有效计算得到的一小块数据。具体到比特币,矿工必须要在满足全网目标难度的情况下求解SHA256 算法。
奖励
每一个新区块中都有一定量新创造的比特币用来奖励算出工作量证明的矿工。现阶段每一区块有25比特币的奖励。
特点
-
它具有快捷、安全、无国界的特性。
-
拥有密钥是使用比特币的唯一条件,这让控制权完全掌握在每个人手中.
-
比特币是一个分布式的点对点网络系统。因此没有“中央”服务器,也没有中央发行机构。
-
本质上,挖矿把央行的货币发行和结算功能进行分布式,用全球化的算力竞争来取代对中央发行机构的需求。
-
比特币协议还规定,每四年新币的开采量减半,从长期来看,比特币是一种通货紧缩货币。
-
作为一个开发者,我看比特币之于货币就像看到当年的互联网,一个通过分布式计算来传播价值和保障数字资产所有权的网络
-
加密数字签名能够使一个用户签署一项能够提供其资产所有权证明的 数字资产或数字交易
-
比特币正是这样的系统,设计完全去中心化,不被任何中央政权或中央点控 制,这样的货币系统是不会遭受攻击,也不会变得腐败。
比特币钱包
比特币钱包只包含私钥而不是比特币。每一个用户有一个包含多个私钥的钱包。钱包中包含成对的私钥和公钥。
用户用这些私钥来签名交易,从而证明它们拥有交易的输出(也就是其中的比特币)。比特币是以交易输出的形式来储存在区块链中(通常记为vout或txout)。
数字密钥
-
比特币的所有权是通过数字密钥、比特币地址和数字签名来确立的
-
只有有效的数字密钥才能产生有效的数字签名。
-
私钥的格式:私钥可以以许多不同的格式表示,所有这些都对应于相同的256位的数字。
-
素数幂和椭圆曲线乘法,这些数学函数都是不可逆的,就是说很容易向一个方向计算,但不可以向相反方向倒推。
-
比特币正是使用椭圆曲线乘法作为其公钥加密的基础算法。
-
私钥->椭圆曲线相乘->公钥->哈希函数(单向)->比特币地址。
-
E52CED330AC530EDCC32C8FFC6A526AEDD
比特币私钥空间的大小是2256,这是一个非常大的数字。用十进制表示的话,大约是1077,而可见宇宙被估计只含有1080个原子。 -
椭圆曲线加密法是一种基于离散对数问题的非对称(或公钥)加密法,可以用对椭圆曲线上的点进行加法或乘法运算来表达。
比特币地址
- 比特币地址是一个由数字和字母组成的字符串,可以与任何想给你比特币的人分享。由公钥(一个同样由数字和字母组成的字符串)生成的比特币地址以数字“1”开头。
- 比特币地址可由公钥经过单向的加密哈希算法得到。哈希算法是一种单向函数,接收任意长度的输入产生指纹摘要。加密哈希函数在比特币中被广泛使用:比特币地址、脚本地址以及在挖矿中的工作量证明算法。
- Base58Check格式的比特币地址
助记码词汇
- 助记码词汇是英文单词序列代表(编码)用作种子对应所确定性钱包的随机数。单词的序列足以重新创建种子,并且从种子那里重新创造钱包以及所有私钥。
- 确定性,或者“种子”钱包包含通过使用单项离散方程而可从公共的种子生成的私钥。
三、比特币代表数十年的密码学和分布式系统的巅峰之作
汇集了四个关键的创新 点,比特币由这些构成:
- 一个去中心化的点对点网络(比特币协议)
- 一个公共的交易账簿(区块链)
- 一个去中心化的数学的和确定性的货币发行(分布式挖矿)
- 一个去中心化的交易验证系统(交易脚本)
比特币系统依赖于完全透明的数学原理它已经蔓延到了分布式计算、经济学、计量经济学领域。
- 中本聪的此项发明,对“拜占庭将军”问题也是一个可行的解决方案,这是一个在分布式计算中未曾解决的问题
简单来说,这个问题包括了试图通过在一个不可靠、具有潜在威胁的网络中,通过信息交流来达成一个行动协议 共识。中本聪的解决方案是使用工作量证明的概念在没有中央信任机构下达成共识,这代表了分布式计算的科学 突破,并已经超越了货币广泛的适用性。它可以用来达成去中心化的网络共识来公正选举、彩票、资产登记,以 及数字化公证等等。
四、比特币挖矿
- 挖矿在比特币系统中起着两个作用:
- 挖矿在构建区块时会创造新的比特币,和一个中央银行印发新的纸币很类似。每个区块创造的比特币数量是固定的,随时间会渐渐减少。
- 挖矿创建信任。挖矿确保只有在包含交易的区块上贡献了足够的计算量后,这些交易才被确认。区块越多,花费的计算量越大,意味着更多的信任。
- 而比特币中的 "谜题" 是基于哈希加密算法的,其展现了相似的特性:非对称地,它解起来困难而验证很容易,并且它的困难度可以调整。
区块中的挖矿交易记录
-
平均每10分钟,矿工会将自上一个区块以来发生的所有交易生成一个新的区块。新交易不断地从用户钱包和应用流入比特币网络。
-
交易被加进新区块时,以交易费用高的优先以及其它的一些规则进行排序。
-
随着时间变长,这个区块链的高度也随之增长,每个区块和整个链的计算复杂度也随之增加。
五、 比特币交易简介
比特币客户端的三种主要形式
- 完整客户端
- 轻量级客户端
- 在线客户端
比特币客户端的选择,取决于用户想要管理资金的数目。
客户端钱包
- 钱包是多个地址和解锁资金密钥的简单集合
- 每笔交易你都可以使用不同的地址,这有利于提高 隐私的安全性。用户可创建地址的数量几乎不受限制。
- 出售某种产品或服务来换取比特币。如果你是个程序员,可以出售你的编程技能
- 新创建的比特币钱包地址,需要发生一笔交易,才能成为在众多的比特币地址之一。一旦该地址接受了一笔交易,就会变成全网所知的地址之一,然后就能查询到可用余额了。
比特币交易的理解
- 简单来说,每一笔交易包含一个或多个“输入”,输入是针对一个比特币账号的负债。
- 这笔交易的另一面,有一个或多个“输出”,被当成信用点数记入到比特币账户中。这些输入和输出的总额(负债和信 用)不需要相等
- 交易是将钱从交易输入移至输出。输入是指钱币的来源,通常是之前一笔交易的输出。交易的输出则是通过关联 一个密钥的方式将钱赋予一个新的所有者。目的密钥被称为是安全锁(Encumbrance)。这样就给资金强加了一 个要求:有签名才能在以后的交易中赎回资金。一笔交易的输出可以被当做另一笔新交易的输入,这样随着钱从 一个地址被移动到另一个地址的同时形成了一条所有权链。
常见的交易形式
- 最常见的交易形式是从一个地址到另一个地址的简单支付,这种交易也常常包含给支付者的“找零”。一般交易有一个输 入和两个输出。
- 集合多个输入到一个输出的模式。像这样的交易有时由钱包应用产生来清理许多在支付过程收到的小数额的找零。
- 在比特币账簿中常见的交易形式是将一个输入分配给多个输出,这类交易有时被商业实体用作分配资金,例如给多个雇员发工资的情形。
交易的构建
- 交易的建立和签名可以离线操作,不用连接比特币网络。
- 交易的广播才需要处于联网状态,只有在执行交易时才需要将交易发送到网络。
获取正确的输入
- 大多数钱包应用维护着一个含有用钱包自己密钥锁定
的“未消费交易输出”小型数据库。 - 完整客户端含有整个区块链中所有交易的所有未消费输出副本。
- 完整客户端占太大的硬盘空间,所以大多数钱包使用轻量级的客户端,只保存用户自己的未消费输出。
将交易放到总账簿中
- 交易必须要被传送到比特币网络中以成为分布式账簿(区块链)的一部分
交易的传送
-
比特币网络是由参与的比特币客户端联接几个其他比特币客户端组成的P2P网络。比特币网络的目的是将交易和区块传播给所有参与者
-
任何比特币网络节点(其它客户端)收到一个之前没见过的有效交易时会立刻将它转发给联接到自身的其它节点。
-
一个对比特币交易的常见误解是它们必须要等10分钟后被确认加进一个新区块,或等60分钟以得到六次确认后才是有效的。虽然这些确认可以确保交易已被整个网络接受,但对于像一杯咖啡这样的小额商品来说就没有必要等待那么长时间了。一个商家可以免确认来接受比特币小额支付。
-
交易ID在交易确认之前并不权威。区块链中找不到交易哈希值并不意味着此笔交易没有进行。这被称作“交易延展性”,因为交易哈希值在区块确认之前是可以更改的。在确认之后txid是不变且权威的。
-
createrawtransaction 命令产生了一个原始十六进制字符串,其中编码了这笔交易的诸多细节。decoderawtransaction 命令来解码这个字符串。
六、比特币交易详解
比特币交易是比特币系统中最重要的部分。根据比特币系统的设计原理,系统中任何其他的部分都是为了确保比特币交易可以被生成、能在比特币网络中得以传播和通过验证,并最终添加入全球比特币交易总账簿(比特币区块链)。
比特币交易的本质是数据结构,这些数据结构中含有比特币交易参与者价值转移的相关信息。比特币区块链是全球复式记账总账簿,每个比特币交易都是在比特币区块链上的一个公开记录。在这一章,我们将会剖析比特币交易的多种形式、所包含的信息、如何被创建、如何被验证以及如何成为所有比特币交易永久记录的一部分。
三大过程:
- 交易创建
- 交易签名
- 交易广播提交
创建比特币交易
- 比特币交易可以被任何人在线上或线下创建,即便创建这笔交易的人不是这个账户的授权签字人。
- 比如,一个负责应付账款的柜员在处理应付票据时可能会需要CEO签名。相似地,这个负责应付账款的柜员可以创建比特币交易,然后让CEO对它进行数字签名,从而使之有效。
- 是比特币交易指定以往的一笔交易作为其资金来源,而不是一个特定账户。
广播交易至比特币网络
-
比特币网络是一个点对点网络,这意味着每一个比特币节点都连接到一些其他的比特币节点(这些其他的节点是在启动点对点协议时被发现的)。整个比特币网络形成了一个松散地连接、且没有固定拓扑或任何结构的“蛛网”——这使得所有节点的地位都是同等的。
-
交易是经过签名且不含任何机密信息、私钥或密码
-
因为比特币将金钱变成了一种数据结构,所以在本质上是不可能阻止任何人创建并执行比特币交易的。
交易的输出和输入
-
比特币交易的基本单位是未经使用的一个交易输出,简称UTXO
- UTXO是不能再分割、被所有者锁住或记录于区块链中的并被整个网络识别成货币单位的一定量的比特币货币。
- 一个用户的比特币会被当作UTXO分散到数百个交易和数百个区块中。实际上,并不存在储存比特币地址或账户余额的地点,只有被所有者锁住的、分散的UTXO。
- “一个用户的比特币余额”,这个概念是一个通过比特币钱包应用创建的派生之物。比特币钱包通过扫描区块链并聚合所有属于该用户的UTXO来计算该用户的余额。
- 在比特币的世界里既没有账户,也没有余额,只有分散到区块链里的UTXO。
- Coinbase交易,每个区块中的首个交易。
交易費
-
交易费可当作是为了包含(挖矿)一笔交易到下一个区块中的一种鼓励,也可当作是对于欺诈交易和任何种类的系统滥用,在每一笔交易上通过征收一笔小成本的税而造成的一种妨碍。交易费被挖出这个区块的矿工得到,并且记录在这个交易的区块链中。
-
交易费被作为输入减输出的余量,交易费 = 求和(所有输入) - 求和(所有输出)。
把交易费加到交易中
-
交易的数据结构没有交易费的字段。相反地,交易费通过所有输入的总和,以及所有输出的总和之间的差来表示。从所有输入中扣掉所有输出之后的多余的量会被矿工收集走。
-
举例来说,如果你消耗了一个20比特币的UTXO来完成1比特币的付款,你必须包含一笔19比特币的找零回到你的钱包。否则,那剩下的19比特币会被当作交易费,并且会被挖出你的交易到一个区块中的矿工收走。尽管你会受到高优先级的处理,并且让一个矿工喜出望外,但这很可能不是你想要的。
-
Eugenia的钱包应用会通过测量交易的大小,乘以每千字节需要的交易费,来计算适当的交易费。 交易費高不是因爲交易金額大,而是因爲交易的字節數多。
交易链条和孤立交易
- 当一条交易链被整个网络传送时,他们并不能总是按照相同的顺序到达目的地。
- 子交易在父交易之前到达
- 没有父交易的交易池被称作孤立交易池
- 一旦接收到了父交易,所有与这个父交易创建的UTXO有关的孤块会从池中释放出来,递归地重新验证,然后整条交易链就会被交易池包括进去,并等待着被区块所挖走
七、比特币网络
节点类型及分工
- 每个比特币节点都是路由、区块链数据库、挖矿、钱包服务的功能集合。
- 一个全节点(full node)包含四個功能:錢包、礦工、完成區塊鏈、网络路由节点。
- 1、SPV 简易支付验证节点(轻量级节点),没有完整区块链的拷贝。越来越多的用户钱包是spv节点,尤其是运行于在智能手机等资源有限设备上的比特币钱包应用上。
- 2、挖矿节点:运行在特殊硬件设备上的工作量证明(PROOF OF WORK) 算法,以相互竞争的方式创建新区块。
- 3、核心客户端 : 在比特币P2P网络中,包含钱包、矿工、完整区块链数据库、网络路由节点。
- 4、完整区块链节点:在比特币p2p网络中,包含完整区块链以及网络路由节点。
- 5、独立矿工
网络发现
- 当新的网络节点启动后,为了能够参与协同运作,它必须发现网络中的其他比特币节点。新的网络节点必须发现至少一个网络中存在的节点并建立连接。
- 节点通常采用TCP协议、使用8333端口
- “种子节点(seed nodes)”:新节点是如何发现网络中的对等节点的呢?虽然比特币网络中没有特殊节点,但是客户端会维持一个列表,那里列出了那些长期稳定运行的节点。
- 新节点并不一定需要与种子节点建立连接,
但连接到种子节点的好处是可以通过种子节点来快速发现网络中的其他节点。
-新接入的节点可以向它的相邻节点发送getaddr消息,要求它们返回其已知对等节点的IP地址列表,通过这种方式,节点可以找到需连接到
的对等节点,并向网络发布它的消息以便其他节点查找。
交换“库存清单”
- 同步区块链的过程从发送version消息开始,这是因为该消息中含有的BestHeight字段标示了一个节点当前的区块链高度(区块数量
- 从发送 getblocks消息开始,收到一个inv响应,接着开始下载缺失的区块库存清单和区块广播协议。
简易支付验证 (SPV)节点
-
SPV节点只需下载区块头,而不用下载包含在每个区块中的交易信息
-
简易支付验证是通过参考交易在区块链中的深度,而不是高度,来验证它们
-
一个拥有完整区块链的节点会构造一条验证链,这条链是由沿着区块链按时间倒序一直追溯到创世区块的数千区块及交易组成
-
一个SPV节点会验证所有区块的链(但不是所有的交易),并且把区块链和有关交易链接起来