精通比特币
1. 术语:
内容
区块:
一个区块就是若干交易数据的集合,它会被标记上时间戳和之前一个区块的独特标记。区块头经过哈希运算后会生成一份工作量证明,从而验证区块中的交易。有效的区块经过全网络的共识后会被追加到主区块链中。 确认:
当一项交易被区块收录时,我们可以说它有一次确认。矿工们在此区块之后每再产生一个区块,此项交易的确认数就再加一。当确认数达到六及以上时,通常认为这笔交易比较安全并难以逆转。BIP
比特币改进提议 (Bitcoin Improvement Proposals 的缩写),指比特币社区成员所提交的一系列改进比特币的提议。例如,BIP0021是一项改进比特币统一资源标识符(URI)计划的提议。矿工:
矿工指通过不断重复哈希运算来产生工作量证明的各网络节点。工作量证明
工作量证明指通过有效计算得到的一小块数据。具体到比特币,矿工必须要在满足全网目标难度的情况下求解SHA256算法。交易:
简单地说,交易指把比特币从一个地址转到另一个地址。更准确地说,一笔“交易”指一个经过签名运算的,表达价值转移的数据结构。每一笔“交易”都经过比特币网络传输,由矿工节点收集并封包至区块中,永久保存在区块链某处。 钱包
钱包指保存比特币地址和私钥的软件,可以用它来接受、发送、储存你的比特币。
2.介绍
比特币概括:
1 比特币是完全虚拟的,它不但没有实体,本质上也没有一种虚拟物品代表比特币。比特币隐含在收发币的转账记录中。2 用户只要有证明其控制权的密钥,用密钥解锁,就可以发送比特币。3 密钥通常存储在计算机的数字钱包里。4 拥有密钥是使用比特币的唯一条件,这让控制权完全掌握在每个人手中。5 比特币是通过“挖矿”产生的;
挖矿就是验证比特币交易的同时,所有参与者竞赛来解决一个数学问题。任何参与者(比如运行一个完整协议栈的人)都可以做矿工,用他们的电脑算力来验证和记录交易。平均每10分钟就有人能验证过去这10分钟发生的交易,他将会获得新币作为工作回报。本质上: 挖矿把央行的货币发行和结算功能进行分布式,用全球化的算力竞争来取代对中央发行机构的需求。6 比特币系统包含调节挖矿难度的协议。
挖矿:在比特币网络中成功写入一个区块交易。难度是动态调整的,保证不管有多少矿工挖矿,平均每10分钟只有一个矿工成功。7 比特币协议还规定,每四年新币的开采量减半,同时限制比特币的最终开采总量为2,100万枚。8 比特币: 一个通过分布式计算来传播价值和保障数字资产所有权的网络。
3. 入门
加入比特币网络:
用户需要做的就是下载应用程序或使用在线应用程序。因为比特币是一个标准,也有许多运行比特币的客户端软件。还有一个标准客户端,也称为中本聪客户端;比特币客户端三种主要形式:
1 完整客户端
或称“全节点”,是存储所有比特币交易的整个交易历史的客户端,管理用户的钱包,并可以在比特币网络上直接开始交易。类似于一个独立的 电子邮件服务器, 因为它处理着协议的各个方面,而不依赖任何其他的服务器或第三方服务。2 轻量级客户端
需要依赖第三方服务器才能进行比特币交易,才能接入比特币网络。它不保存所有交易的完整副本,因此必须依赖第三方服务器来获取交易确认。类似于一个独立的电子邮件客户端,能够通过邮箱服务器来访问一个邮箱,因为它在网络交流中依赖于一个第三方服务器。3 在线客户端
通过网页浏览器在第三方服务器上访问和储存该用户的钱包。这类似于在线邮件,因为它完全依赖于第三方服务器。4 移动客户端
智能手机的移动客户端,既可以作完整客户端运行,也可作为轻量级客户端或在线客户端。一些移动客户端是与在线客户端或桌面客户端同步的,提供跨多个设备但有一个共同的资金源的多平台钱包。比特币钱包的使用:
1 比特币地址以数字1或3开头。类似于电子邮件地址。
例如:1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK。这些地址可以分享给其他的比特币的用户,然后就可以直接通过这些地址发送比特币到你的钱包里。不同于电邮地址的是,你可以任意地创建新的比特币地址,这些地址都能成功地将资金转到你的钱包。2 钱包是多个地址和解锁资金密钥的简单集合。3 每笔交易都可以使用不同的地址,这有利于提高隐私的安全性。4 用户可创建地址的数量几乎不受限制。获取比特币的途径
1 通过交易所购买,需要实名验证2 进行挖矿3 从私人处购买,可以线下采用现金购买。比特币账簿
一个不断膨胀的文件记录,记载了每一笔曾发生过的比特币交易, 是公开的,意味着她可以查看所有曾经使用该地址的记录,可以查看是否有人朝这个账户发送了比特币。交易
起初,Alice的地址会显示Joe发出这笔的交易为“未确认”,这意味着这笔交易已经被广播到网络,但是尚未列入比特币交易记录账簿,即区块链中。交易必须由一个矿工“开采”,交易是包括在区块中的。当新区块创建时,大约十分钟左右,该区域内的交易就会被全网接受为“已确认”,区块中的比特币也都能使用。交易可以立即被其他人看到,但只有当其被包含在新开采的区块中,才是“被信任的”。
4. 比特币的原理
交易查询
每一个查询网站都有搜索功能,可以通过地址,交易哈希值或区块号,搜索到在比特币网络和区块链中对应的等价数据。比特币系统的组成:
比特币系统由用户,交易,矿工组成;
用户: 通过密钥控制钱包;交易: 每一笔交易都会被广播到整个比特币网络;矿工: 通过竞争计算生成在每个节点达成共识的区块链,区块链是一个分布式的公共权威账簿,包含了比特币网络发生的所有的交易;
交易(3种模式):
1 最常见的交易形式是从一个地址到另一个地址的简单支付,这种交易也常常包含给支付者的“找零”。一般交易有一个输入和两个输出.2 另一种常见的交易形式是集合多个输入到一个输出的模式。
这相当于现实生活中将很多硬币和纸币零钱兑换为一个大额面钞。像这样的交易有时由钱包应用产生来清理许多在支付过程收到的小数额的找零。3 一种在比特币账簿中常见的交易形式是将一个输入分配给多个输出,即多个接收者的交易。这类交易有时被商业实体用作分配资金,例如给多个雇员发工资的情形。
交易的构建和输出
1 钱包应用知道如何选取合适的输入和输出以建立用户所希望的交易(即采取上述哪种交易方式,单输入还是多输入);2 只需要指定目标地址和金额,其余的细节钱包应用会在后台自动完成。3 重要的是: 钱包应用甚至可以在完全离线时建立交易。4 比特币交易建立和签名时不用连接比特币网络。只有在执行交易时才需要将交易发送到网络。5 当构建一笔交易时,交易的输入构建:
钱包会查找当前用户单个未消费的输出中是否有足够的费用来支付花费(单个输入); 如果不够,钱包应用就会去查找当前用户一些小的未消费支出(多个输入),类似于:从一个存钱罐中找硬币一样,直到找到足够支付花费的货币。 上述两种情况, 可能都会需要找回零钱,而这些找零也会是钱包所创建的交易的输出组成部分。6 构建交易的输出:
1 交易的输出会被创建成为一个包含这笔数额的脚本的形式;只能被引入这个脚本的一个解答后才能兑换。
因此 花钱的人会用需要当前 收钱人的签名来包装一个输出。2 交易可能还会包含第二个输出。找零输出。3 为了让这笔交易尽快地被网络处理,需要多付一笔交易费。
注意: 交易费不是明显的包含在交易中的,而是通过输入和输出的差值所隐含的。这个差值会就被矿工当作交易费放到区块的交易里,最终放进区块链帐薄中。将交易放入总账本中:
1 钱包创建一定字节大小的交易,包含了金额未来所需的全部信息。然后改交易需要被写入比特币的区块链上。2 交易的传送:
因为这个交易包含处理所需的所有信息, 所以交易被传送至比特币网络的来源也就无所谓了。3 交易的传播:
1 钱包应用可以发送新的交易给其它任意一个已联接到互联网的比特币客户端;2 任何比特币网络节点(其它客户端)收到一个之前没见过的有效交易时会立刻将它转发给联接到自身的其它节点。因此,这个交易迅速地从P2P网络中传播开来,几秒内就能到达大多数节点。比特币挖矿:
1 一个交易在比特币网络上传播开来。但只有被一个称为挖矿的过程验证且加到一个区块中之后,这个交易才会成为这个共享账簿(区块链)的一部分。2 挖矿在比特币系统中起着两个作用
1 挖矿在构建区块时会创造新的比特币, 同时每个区块创造的比特币数量是固定的,随时间会渐渐减少。2 挖矿创建信任。挖矿确保只有在包含交易的区块上贡献了足够的计算量后,这些交易才被确认。3 POW 工作量证明算法:
指的用SHA256加密算法不断地对区块头和一个随机数字进行哈希计算,直到出现一个和预设值相匹配的解。 4 这些交易被加进新区块时,以交易费用高的优先以及其它的一些规则进行排序。
矿工一旦从网络上收到一个新区块时,会意识到在这个区块上的解题竞赛已经输掉了,会马上开始下一个新区块的挖掘工作。它会立刻将一些交易和这个新区块的数字指纹放在一起开始构建下一个新区块,并开始给它计算工作量证明。5 每个矿工会在他的区块中包含一个特殊的交易,将新生成的比特币(当前每区块为25比特币)作为报酬支付到他自己的比特币地址。
因为这个新区块被加入到了总区块链中,所以他添加的这笔报酬交易也会变成可消费的。 参与矿池的矿工, 通过软件设置, 使得构建新区块时会将报酬地址设为矿池的地址。然后矿池根据各自上一轮贡献的工作量将所得的报酬分给 参与矿池挖矿的矿工。6 轻量级客户端通过确认一个交易在区块链中且在它后面有几个新区块来确认一个支付的合法性。这种方式叫做简易支付验证SPV.7 全索引客户端可以追钱款的来源,从第一次有比特币在区块里生成的那一刻开始,按交易与交易间的关系顺藤摸瓜,直到用户的交易地址。比特币客户端
比特币的交易是基于花费“输出”上的,即上一笔交易的支出,整个交易在地址之间转移所有权。我们的钱包现在收到了一笔向我们钱包地址发来的钱(输出)。一旦它被确定之后,那笔钱就属于我们了。
5. 秘钥,地址, 钱包
地址:
生成方式: 由公钥 –》 sha256(公钥) –》 RIPEMD160(上步结果) –》base58check(上步结果) === 比特币地址;示例: 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy; 长度为17个字节。
6. 比特币交易
交易:
比特币交易的本质是数据结构,这些数据结构中含有比特币交易参与者价值转移的相关信息。比特币交易指定以往的一笔交易作为其资金来源,而不是一个特定账户。本质上,一笔比特币交易只是300到400字节的数据.特币交易的输入值和输出值与账号或者身份信息无关。比特币网络
比特币网络被设计为能高效且灵活地传递交易和区块至所有节点的模式;因而比特币网络能抵御入侵。为了避免垃圾信息的滥发、拒绝服务攻击或其他针对比特币系统的恶意攻击,每一个节点在传播每一笔交易之前均进行独立验证。一个异常交易所能到达的节点不会超过一个。交易的锁定时间:
锁定时间定义了能被加到区块链里的最早的交易时间。被设置成0,用来表示立即执行。不是0并且小于5亿,就被视为区块高度,意指在这个指定的区块高度之前,该交易没有被包含在区块链里。锁定时间大于5亿,则它被当作是一个Unix纪元时间戳(从1970年1月1日以来的秒数),并且在这个指定时点之前,该交易没有被包含在区块链里。比特币交易的输入和输出
比特币交易的基本单位是未经使用的一个交易输出,简称UTXO。UTXO是不能再分割、被所有者锁住或记录于区块链中的并被整个网络识别成货币单位的一定量的比特币货币。当一个用户接收比特币时,金额被当作UTXO记录到区块链里。比特币网络监测着以百万为单位的所有可用的(未花费的)UTXO。实际上,并不存在储存比特币地址或账户余额的地点,只有被所有者锁住的、分散的UTXO。尽管UTXO可以是任意值,但只要它被创造出来了,就像不能被切成两半的硬币一样不可再分了。如果一个UTXO比一笔交易所需量大,它仍会被当作一个整体而消耗掉,但同时会在交易中生成零头。被交易消耗的UTXO被称为交易输入,由交易创建的UTXO被称为交易输出。给某人发送比特币实际上是创造新的UTXO,注册到那个人的地址,并且能被他用于新的支付。UTXO被每一个全节点比特币客户端在一个储存于内存中的数据库所追踪,该数据库也被称为“UTXO集”或者“UTXO池”。新的交易从UTXO集中消耗(支付)一个或多个输出。交易输出包含两部分:
一定量的比特币,被命名为“聪”,是最小的比特币单位; 一个锁定脚本,也被当作是“障碍”,提出支付输出所必须被满足的条件以“锁住”这笔总额。支付条件障碍
交易输出把用聪表示的一定数量的比特币 和 锁定脚本,关联到一起。在大多数情况下,锁定脚本会把输出锁在一个特定的比特币地址上,从而把一定数量的比特币的所有权转移到新的所有者上。交易输入
交易输入是指向UTXO的指针, 指向特定的UTXO,并被交易哈希和在区块链中记录UTXO的序列号作为参考。若想支付UTXO,一个交易的输入也需要包含一个解锁脚本,用来满足UTXO的支付条件。解锁脚本通常是一个签名,用来证明对于在锁定脚本中的比特币地址拥有所有权。比特币脚本
比特币的交易验证引擎依赖于两类脚本来验证比特币交易:一个锁定脚本和一个解锁脚本。
锁定脚本是一个放在一个输出值上的“障碍”,同时它明确了今后花费这笔输出的条件。解锁脚本是一个“解决”或满足被锁定脚本在一个输出上设定的花费条件的脚本,同时它将允许输出被消费。解锁脚本是每一笔比特币交易输出的一部分,而且往往含有一个被用户的比特币钱包(通过用户的私钥)生成的数字签名。每一个比特币客户端会通过同时执行锁定和解锁脚本来验证一笔交易。比特币的执行顺序
在当今的比特币世界中,这两个脚本是随着堆栈的传递被分别执行的
首先,使用堆栈执行引擎执行解锁脚本。如果解锁脚本在执行过程中未报错(没有悬空操作符);主堆栈(非其它堆栈)将被复制,然后脚本将被执行。如果采用从解锁脚本处复制而来的数据执行锁定脚本的结果为真,那么解锁脚本就成功地满足了锁定脚本所设置的条件。
6. 比特币网络
Stratum协议被应用于挖矿、以及轻量级或移动端比特币钱包之中。每个比特币节点都是路由、区块链数据库、挖矿、钱包服务的功能集合。一些节点保有一份完整的、最新的区块链拷贝,这样的节点被称为“全节点”。全节点能够独立自主地校验所有交易,而不需借由任何外部参照。还有一些节点只保留了区块链的一部分,它们通过一种名为“简易支付验证(SPV)”的方式来完成交易验证。这样的节点被称为“SPV节点”,又叫“轻量级节点”。挖矿节点通过运行在特殊硬件设备上的工作量证明(proof-of-work)算法,以相互竞争的方式创建新的区块。一些挖矿节点同时也是全节点,保有区块链的完整拷贝。网络发现:
节点通常采用TCP协议、使用8333端口与已知的对等节点建立连接。在建立连接时,该节点会通过发送一条包含基本认证内容的version消息开始“握手”通信过程。主要内容如下:
PROTOCOL_VERSION
:常量,定义了客户端所“说出”的比特币P2P协议所采用的版本(例如:70002) nLocalServices
一组该节点支持的本地服务列表,当前仅支持NODE_NETWORKnTime
当前时间addrYou
当前节点可见的远程节点的IP地址 addrMe
本地节点所发现的本机IP地址 subver
指示当前节点运行的软件类型的子版本号 BaseHeight
当前节点区块链的区块高度网络节点:
节点必须持续进行两项工作:
在失去已有连接时发现新节点,并在其他节点启动时为其提供帮助。节点启动时只需要一个连接,因为第一个节点可以将它引荐给它的对等节点,而这些节点又会进一步提供引荐。全节点
完整区块链节点保有完整的、最新的包含全部交易信息的比特币区块链拷贝,这样的节点可以独立地进行建立并校验区块链,从第一区块(创世区块)一直建立到网络中最新的区块。同步区块链的过程从发送version消息开始,这是因为该消息中含有的BestHeight字段标示了一个节点当前的区块链高度(区块数量)。简易支付验证 (SPV)节点
SPV客户端或轻量级客户端;
1 SPV节点只需下载区块头,而不用下载包含在每个区块中的交易信息。由此产生的不含交易信息的区块链,大小只有完整区块链的1/1000。2 SPV节点不能构建所有可用于消费的UTXO的全貌
这是由于它们并不知道网络上所有交易的完整信息。3 SPV节点验证交易时所使用的方法
需依赖对等节点“按需”提供区块链相关部分的局部视图。 4 简易支付验证是通过参考交易在区块链中的深度,而不是高度,来验证它们。 5 一个全节点要检查第300,000号区块中的某个交易,它会把从该区块开始一直回溯到创世区块的300,000个区块全部都链接起来,并建立一个完整的UTXO数据库,通过确认该UTXO是否还未被支付来证实交易的有效性。6 SPV节点则不能验证UTXO是否还未被支付。相反地,SPV节点会在该交易信息和它所在区块之间用merkle路径建立一条链接。然后SPV节点一直等待,直到序号从300,001到300,006的六个区块堆叠在该交易所在的区块之上,并通过确立交易的深度是在第300,006区块~第300,001区块之下来验证交易的有效性。7 总的来说,区别全节点与SPV节点的区别:
完整的区块链节点是通过检查整个链中在它之下的数千个区块来保证这个UTXO没有被支付,从而验证交易。而SPV节点是通过检查在其上面的区块将它压在下面的深度来验证交易。Bloom过滤器
Bloom过滤器是一个允许用户描述特定的关键词组合而不必精确表述的基于概率的过滤方法。它能让用户在有效搜索关键词的同时保护他们的隐私。在SPV节点里,这一方法被用来向对等节点发送交易信息查询请求,同时交易地址不会被暴露。交易池
比特币网络中几乎每个节点都会维护一份未确认交易的临时列表,被称为内存池或交易池。节点们利用这个池来追踪记录那些被网络所知晓、但还未被区块链所包含的交易。交易池和孤立交易池(如有实施)都是存储在本地内存中,并不是存储在永久性存储设备(如硬盘)里。更准确的说,它们是随网络传入的消息动态填充的。节点启动时,两个池都是空闲的;随着网络中新交易不断被接收,两个池逐渐被填充。有些比特币客户端的实现还维护一个UTXO数据库,也称UTXO池,是区块链中所有未支付交易输出的集合。UTXO池 与 交易池和孤立交易池的区别:
1 UTXO池不同于交易池和孤立交易池的地方在于,它在初始化时不为空,而是包含了数以百万计的未支付交易输出条目;2 UTXO池可能会被安置在本地内存,或者作为一个包含索引的数据库表安置在永久性存储设备中。3 交易池和孤立交易池代表的是单个节点的本地视角。取决于节点的启动时间或重启时间,不同节点的两池内容可能有很大差别4 相反地,UTXO池代表的是网络的突显共识,因此,不同节点间UTXO池的内容差别不大。5 此外,交易池和孤立交易池 只包含未确认交易,而UTXO池之只包含已确认交易。
7. 区块链
区块头是80字节,而平均每个交易至少是250字节,而且平均每个区块至少包含超过500个交易。因此,一个包含所有交易的完整区块比区块头的1000倍还要大。区块结构:
大小 字段 描述 4字节 区块大小 用字节表示的该字段之后的区块大小 80字节 区块头 组成区块头的几个字段 1-9 (可变整数) 交易计数器 交易的数量 可变的 交易 记录在区块里的交易信息区块头:
1 区块头由三组区块元数据组成。
1 首先是一组引用父区块哈希值的数据,这组元数据用于将该区块与区块链中前一区块相连接。2 第二组元数据,即难度、时间戳和nonce,与挖矿竞争相关,3 第三组元数据是merkle树根(一种用来有效地总结区块中所有交易的数据结构)2 区块头的结构
大小 字段 描述 4字节 版本 版本号,用于跟踪软件/协议的更新 32字节 父区块哈希值 引用区块链中父区块的哈希值 32字节 Merkle根 该区块中交易的merkle树根的哈希值 4字节 时间戳 该区块产生的近似时间(精确到秒的Unix时间戳) 4字节 难度目标 该区块工作量证明算法的难度目标 4字节 Nonce 用于工作量证明算法的计数器 Nonce、难度目标和时间戳会用于挖矿过程 __Nonce(不懂, 工作量证明算法的计数器)__ 3 区块主标识符是它的加密哈希值,一个通过SHA256算法对区块头进行二次哈希计算而得到的数字指纹。
区块哈希值可以唯一、明确地标识一个区块,并且任何节点通过简单地对区块头进行哈希计算都可以独立地获取该区块哈希值。区块哈希值实际上并不包含在区块的数据结构里,区块哈希值是当该区块从网络被接收时由每个节点计算出来的。4 区块可以通过两种方式被识别:区块哈希值或者区块高度。
区块高度也不是区块数据结构的一部分,它并不被存储在区块里。创世区块
因为创世区块被编入到比特币客户端软件里,所以每一个节点都始于至少包含一个区块的区块链,这能确保创世区块不会被改变。每个节点都把该区块作为区块链的首区块,从而构建了一个安全的、可信的区块链的根。
8. 挖矿与共识
挖矿是增加比特币货币供应的一个过程。挖矿同时还保护着比特币系统的安全,防止欺诈交易,避免“双重支付”。矿工完成一种基于加密哈希算法的数学难题,难题的答案包括在新区块中,作为矿工的计算工作量的证明,被称为“工作量证明”。挖矿是一种将结算所去中心化的过程,每个结算所对处理的交易进行验证和结算。挖矿保护了比特币系统的安全,并且实现了在没有中心机构的情况下,也能使整个比特币网络达成共识。UTXO的“块龄”是自该UTXO__被记录到区块链为止所经历过的区块数__,即这个UTXO在区块链中的深度。区块链的组装与选择
1 比特币去中心化的共识机制的最后一步是将区块集合至有最大工作量证明的链中。2 一旦一个节点验证了一个新的区块,它将尝试将新的区块连接到现存的区块链,将它们组装起来。3 节点维护三种区块:
1 第一种是连接到主链上的2 第二种是从主链上产生分支的(备用链)3 最后一种是在已知链中没有找到已知父区块的。
6. 比特币中使用的算法及其解释:
merkle树:sha256:RIPEMD160:Base58Check:
1 详细解释:
增加了错误校验码来检查数据在转录中出现的错误。校验码长4个字节,添加到需要编码的数据之后。校验码是从需要编码的数据的哈希值中得到的,所以可以用来检测并避免转录和输入中产生的错误。2 为了使用Base58Check编码格式对数据进行编码:
1 首先进行前缀添加
首先我们要对数据添加一个称作“版本字节”的前缀,这个前缀用来明确需要编码的数据的类型。例如:对比特币地址编码时,比特币地址的前缀是0(十六进制是0x00)而对私钥编码时前缀是128(十六进制是0x80)2 计算校验码
采用双哈希,对之前的结果(前缀和数据)运行两次SHA256哈希算法。checksum = SHA256(SHA256(prefix+data))取上步计算哈希结果的前4个字节作为校验码。校验码会添加到数据之后。3 结果的组成:
三部分组成:前缀、数据和校验码。4 地址:
生成方式: 由公钥 –》 sha256(公钥) –》 RIPEMD160(上步结果) –》base58check(上步结果) === 比特币地址;示例: 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy; 长度为17个字节。椭圆曲线算法:DER编码(签名使用的编码)
比特币的隔离见证(SegWit) SW:
采矿协议:
采矿协议比如Stratum (STM)或者 GetBlockTemplate (GBT)。STM和GBT协议都创建包含候选区块头模板的区块模板。矿池服务器通过聚集交易,添加coinbase交易(和额外的随机值空间),计算MERKLE根,并连接到上一个块hash来建立一个候选区块。这个候选区块的头部作为模板分发给每个矿工。矿工用这个区块模板在低于比特币网络的难度下采矿,并发送成功的结果返回矿池服务器赚取份额。