...
shawn | 普通炒幣者
【介紹】【区块链】一文看懂区块链:一步一步发明比特币(2) HOT
shawn | 普通炒幣者 0 61 2019-04-24 16:38:32
0 61
2019-04-24 16:38:32

比特币技术

到这里,已经发明了比特币,解决了去中心化的信任这一难题。只对比特币和区块链是什么这个问题感兴趣的读者,可以停在这里了,希望大家可以在我的叙述中解决一些困惑!鞠躬!

针对比特币的一些实现的内在细节,继续在探索和学习的道路上披荆斩棘。新技术,新点子,要拥抱它,使用它,判断它,必须先追根究底了解它

我们知道区块链中记载的核心内容,对于比特币(加密货币)来说就是转账记录。但是,一个概念真正落地成大众可以用的服务,有很多技术上,协议上的细节。接下里的部分主要探讨一些比特币具体实现方面的细节,如网络节点构成,比特币的计算难度系数,比特币总量的由来,比特币一笔交易发生的内部细节等

比特币网络节点的构成

比特币网络是一种点对点的数字现金系统(P2P),网络节点中每台机器都彼此对等。P2P网络不存在任何服务端、层级关系或者中心化服务。




詳細介紹見:

       ⇝【知識】P2P网络与区块链




节点类型与分工

全功能节点

一个全功能节点包含上述4个模块【钱包Wallet】【矿工Miner】【完整区块链full Block-chain database】【网络路由节点Network routing】

  • 【网络路由节点】使得节点具有参与验证并传播交易与区块信息,发现监听并维持点对点的链接的能力
  • 【完整区块链】具有此模块的节点被称为:全节点。它能够独自自主的校验所有交易,不需要任何其他信息。
  • 【钱包】比特币的所有权是通过数字密钥、比特币地址和数字签名来确定的,数字密钥实际上并不是存储在网络中,而是由用户生成并存储在一个文件或简单的数据库中,称为钱包。有些节点仅仅保留区块链的一部分,通过一种”简易支付验证“(SPV Simplified Payment Verification)的方法来完成交易
  • 【矿工】挖矿节点以相互竞争的方式创造新的区块。有一些挖矿节点也是全节点,可以独立挖矿;还有一些参与矿池挖矿的节点是轻量级节点,必须依赖矿池服务器维护全节点进行工作

拥有全部四个模块被称之为核心客户端(Bitcoin Core),除了这些主要节点类型外,还有一些服务器及节点运行其他协议,如特殊矿池挖矿协议、轻量级客户端访问协议。

下表为扩展比特币网络的不同节点类型



扩展比特币网络

要在全世界的网络中完成整个的交易,下图描述了一个扩展比特币网络,它包含了多重类型的节点、网关服务器、边缘路由器、钱包客户端以及它们互相连接所需要的各类协议,比特币互相连接的接口一般使用8333端口

可以参看这个文章了解Stratum协议,Stratum协议详解

扩展比特币网络扩展比特币网络




詳細介紹見:

       ⇝【知識】什麼是節點?

       ⇝【知識】【硬塞科技字典】什麼是區塊鏈的節點?比特幣有幾個節點?






如何控制区块产生速度恒定

难度系数

我们在发明比特币的过程已经详细说明了工作量证明寻找一个特殊数字使得SHA256函数的输出字符串的前n位是零

对于每一种不同的加密货币来说,都有一个值需要在建立货币的时候时候被定义,即每一个新区块在当前全网算力的条件被发现的【平均时间】,这也是难度系数的由来

比特币10分钟;以太坊15秒;瑞波币3.5秒;莱特币2.5分钟

抛开代码算法层面来说,实现方法就是通过找前n位是0的方法。从概率角度来说,n值越大,意味找到这个这个数的解范围越小。

随着需求0的数目一个一个增加,需要的计算时间将会程指数增长

那么肯定会问,这个难度值如何动态调整?由谁调整?

难度调整方式

难度的调整实在每个完整节点中自动发生的。如果网络发现区块产生速率比10分钟要快时会增加难度。如果发现比10分钟慢时则降低难度。

例如比特币中的是这样定义的:每2016个区块后计算生成它们花费的时长,比上20160(14天)调整一次。有人可能会问,如果在这十四天内计算能力暴涨怎么办,其实这个10分钟的区块新建间隔的规定也只是一个估计要求,真实情况下,这个时间会偏离10分钟这个设定值很多,但是这种偏差并不会对整个区块链的运行产生影响

但是有人会问,这个过程是靠脚本(代码)来实现的,还是自己手动调整的呢?答案是,本地挖矿节点根据自己看到的链上信息自己调整。

问题又来了,为何我不自己降低难度,让自己更加容易新建区块呢?其实,因为链上所有节点确认新的区块(只有确认了你才能得到回报)是按照最长链并且计算难度最大来判断的,你如果用很小的难度新加的区块,是肯定跑不赢全网的其他矿工的

比特币总量的由来

我们已经知道,矿工没新建一个区块就可以得到一定数量的比特币作为奖励,最开始,一个区块可以得到50BTC的奖励,之后每210000个区块,奖励减半,直到2140年,所有的比特币将会发放完毕,可以得到公式
Total=210000×(50+25+12.5+…)=20999999980≈2100万Total=210000×(50+25+12.5+…)=20999999980≈2100万
而这个规则不同的竞争币种都可以自由设置。但是因为交易费的存在,挖矿的人还是会有收益,否则无法建立新的区块,那么整个比特币网络就瘫痪了

比特币的交易处理能力

现在比特币区块链的区块信息

我现在直接从BLOCKCHAIN上,在我写下这句话的时候,最新的区块是情况

区块高度存在时间交易数量交易额创建人(矿池)大小(KB)重量(kWU)
4868833分钟212625992.38BTC.TOP999.343917.54
48688223分钟242233926.89BTCC Pool1034.393996.58
48688151分钟3584480.22BTC.TOP191.92718.14
48688053分钟3523770.26BTC.TOP197.27715.72

其中的重量是指的实际存储的大小,这个值和交易协议有关,其实可以忽略。非常幸运的是,这几个区块放佛是专门为讲解这一节而出现的,这可能是天意吧

另外插一句,你会发现平均区块建立间隔时间,的确和10分钟这个设计值差距很大吧

区块容量

比特币区块链从被第一次部署时,或者说源代码中已经规定,区块容量是1M。最初设计成1M的原因一方面,防止DOS攻击。另一方面,当年中本聪在创建区块链的时候的容量是32M,但是他通过一个说明为”Clear up“这样毫不起眼的Commit把区块容量改成了1M,为防止区块链体积增长过快,为区块容量这个问题添加了些神秘色彩。好吧,我承认,中本聪就已经非常具有神秘色彩了,是在神秘色彩上添上了些故事

截止2018年4月1号,完整区块链大小已经有约151GB的大小了

上表中,可以观察到,1M的容量意味着比特币最大的处理交易数量在约2400(486882区块1034.39的大小很接近了),从代码及技术文档来看,一个区块的最大处理交易数量在2700笔,意味着在一定程度上区块利用率可以超过100%。下面再给出一张时间和每秒交易数量的关系图表(交互表格点击链接)

每秒比特币交易数量每秒比特币交易数量

【蓝色圆圈的大小】代表的是比特币内存池(mempool)的大小(交易在等待矿工处理之前都会暂时存在这里)直观来说,就是圆越大,在等待的交易数量越多
【纵坐标】是每秒交易数量(对数变换后)
【横坐标】是时间

一句话总结,这是一个拥堵的网络,重负不堪。

再来看一张比特币交易费和区块使用率之间的关系图(交互表格可以点击链接)

Bitcoin Fees VS BlockSizeBitcoin Fees VS BlockSize

【蓝色的圈大小】是Mempool的大小,直观来说,就是圆越大,在等待的交易数量越多
【横坐标】是区块容量的使用情况
【纵坐标】是每一个区块的可以得到的交易费用,单位是BTC,注意这里是一个区块被新建时候所有交易费之和(大约2400交易的所有交易费加起来)

手续费随区块使用率开始增长,甚至出现了10BTC一个区块2400笔交易的情况,意味着挖到这个区块的人通过交易费得到的回报接近了本身建立区块的回报。另,之所以可能有人看到最大交易是2700笔,应该和这个区块链大小为最大值的110%有关,从设计角度上来说,是一种缓冲

有一个结论是,扩容后,因为每一个区块的交易承载量增加,矿工的交易费收入肯定会减少。因为,通过上表可以发现,只有当区块使用程度接近95%时候,交易费才有明显的增长

再看一张用户执行交易需要等待的时长和区块使用比例间关系的图表(交互图表点击链接)

Bitcoin Median Confirmation Time VS BloacksizeBitcoin Median Confirmation Time VS Bloacksize

【蓝色的圈大小】是Mempool的大小,直观来说,就是圆越大,在等待的交易数量越多
【横坐标】是区块容量的使用情况
【纵坐标】是用户平均需要等待的时间,单位是分钟。

通过上面三张表我们可以知道,矿工的计算力是整个区块链信用的基石(记住贪婪=信任),所以对矿工的激励不能少,而对于用户来说,当然希望自己的交易越快速完成越好。

对于矿工来说,区块使用率超过95%是一个很好的信号,那意味着可以拿到更多的奖励。奖励太低,在区块建立奖励越来越少的情况下,安全性(信任)就慢慢的得不到保障。这么说来,这也就变成了一个Trade-off博弈过程

分析下来,类似门罗币(menero)实现的根据网络负载来动态调整区块容量的设计似乎很合理

比特币扩容之争

这是一场复杂的博弈斗争,使用隔离见证增长区块容量,并出现了比特币现金这个新的币种。

如果想要了解这里面的很多技术,英文是必须过硬的,因为比特币代码开源,可以随意fork,只要英文功底过硬,阅读白皮书,文档等,这些不同技术的处理方法都是能够学到的

比特币的一笔交易过程中到底发生了什么

我们可以确认的是,每一笔都将记录在大账本中,那么我们需要研究的内容,就是区块中交易内容内的具体数据结构

交易结构

每一个交易块包含的内容如下表所示

大小字段描述
4 bytes版本明确这笔交易参照的规则
1 - 9 bytes输入数量输入值的数量
不定输入一个或多个交易输入
1 - 9 bytes输出数量输出值的数量
不定输出一个或多个交易输出
4 bytes时钟时间UNIX时间戳或区块号

最后这个值是解锁时间,定义了能被加到区块链里的最早交易时间。大多是时候设为0,表示立马执行

一笔比特币交易是一个含有输入值输出值数据结构。该数据结构包含了将一笔资金从初始点(输入值)转移至目标地址(输出值)的代码信息。比特币交易的输入值和输出值与账号或者身份信息无关。可以把它理解为一种被特定秘密信息锁定的一定数量的比特币。只有拥有者或者知道这个秘密信息的人可以解锁

交易的输入和输出

比特币交易的基本单位是未经使用的一个交易输出,简称UTXO(unspent transaction outputs)

可以把UTXO类比为我们使用的人民币1,5,10,20,50,100的面值,对于UTXO来说,它的面值可以是一”聪“的任意倍数(1BTC等于一亿聪)但是这个有着任意面值的”人民币“不能随意打开,还被加上一道类似红包支付口令的密码,只有拥有这个密码的人才可以使用这个UTXO,UTXO包含,币值+一段代码(锁,只有有钥匙的人才能打开)

被交易消耗的UTXO被称为交易输入,由交易创建的UTXO被称为交易输出

交易输出

不同面值的UTXO是由交易输出来提供的。你可以想象你需要购买一个3.1BTC的物品,你并不能从你的钱包中找到几个UTXO来得到3.1BTC,但是你刚好拥有一个4BTC的UTXO,你使用这个UTXO作为付款,那么你需要自己手动构建一个0.9的UTXO返还给你自己

一个交易输出包含两个部分

  • 一定量的比特币。被命名为“聪”(satoshis)
  • 一个锁定脚本。给这个UTXO上锁,保证只有收款人地址的私钥才可以打开

交易输入

每个交易输入是在构造的一笔交易(使用UTXO),比如你需要支付0.015BTC,钱包会寻找一个0.01BTC和0.005BTC的UTXO来组成这一笔交易。交易输入中还会包含一个解锁脚本,这是一个签名,可以类比成支付宝红包密码的口令

交易费

交易费 = 求和(所有输入) - 求和(所有输出)

这里有一个比较有意思的地方,就是因为找零的输出UTXO是交易的发起这自己构建的,如果很不幸,你忘记了自己构建找零的UTXO,那么这些多余的BTC就会变成矿工的劳务费

例如,我需要和小明进行交易,需要购买一个商品,花费0.8BTC,为了确保这笔交易能被更快的处理(添加到大账本上),我要在其中添加一笔交易费,假设0.01BTC(忽略人傻钱多),那就意味着这笔交易会需要我从钱包中找到几个UTXO能组成0.81BTC。但如果我的钱包内找不出这样的UTXO,只有一个1BTC的UTXO可用,那么我就需要构建一个0.19BTC的UTXO作为找零回到自己的钱包

交易费只和交易字段使用的字节大小有关,与参与交易的比特币币值无关。UTXO是有尺寸的,比如某人想支付一笔很大的BTC交易,但是他的钱包中有很多小尺寸的UTXO,如果加入了很多个UTXO,就意味着他的交易会变复杂,存储空间需求多。当然,很多钱包会提供这方面的优化功能,保证你的交易使用的字段大小最优化

解锁和锁定脚本

在实际实现的时候,这个“支付宝红包口令”被称为脚本,是一种基于逆波兰表示法的基于堆栈的执行语言。具体细节感兴趣的读者可以去比特币的Github研究代码。关于脚本有很多细节上的定义和实现方法,这里限于篇幅不展开描述了

矿工费和优先级

我们知道,每一笔交易都是广播到区块链上,由矿工决定是不是加入到新区块上的。那么这里就会涉及到一个问题,谁的交易的优先级更高,是先来后到?还是谁给前多谁就能加入到新区块中?

区块容量一节中,有一张图表直观的展示了现在网络中一笔交易的等待时间,其中最长的,也就是30分钟,如果你不是一个超级急性子,很多时候还是可以接受的(毕竟跨国转账1-2个工作日)

优先级 = 输入值块龄 * 输出值块龄 / 交易总长度

一个交易想成为“较高优先级”,需满足条件:优先值大于57600000,等价于1个BTC,年龄为1天,交易的大小为250字节

区块中前50KB的字节是保留给“较高优先级”的,其实这一机制也保证了一笔交易不会等待时间无现长。但是我们要知道,内存池(存放待处理交易的位置)中的交易,如果在没有处理后消失,所以钱包必须拥有不断重新广播未被处理交易的功能

创币交易 - Coinbase

每一个新建立的区块,都会有新的比特币作为奖励被产生,这个交易是一个特殊交易,被称为创币交易(Coinbase奖励)

创币交易中不存在解锁脚本(也叫ScriptSig字段),被Coinbase的数据取代,长度最小2字节,最大100字节,除了开始的几个自己以外,矿工可以任意使用Coinbase的其他部分。比如创世区块中,Coinbase的输入中的字段是:The Times 03/Jan/2009 Chancellor on brink of second bailout for banks,是泰晤士日报当天的头版文章标题:财政大臣将再次对银行施以援手。

Merkle树

每个区块中的所有交易,都是用Merkle树来表示的。换句话说,交易的存储数据结构是,Merkle树

什么是Merkle树

Merkle树是一种哈希二叉树,它可以用来进行快速查找和检验大规模数据完整性。对于比特币网络来说,使用Merkle树来存储交易信息的目的是为了高效的查找和校验某笔交易的信息是否存在

当N个数据元素经过加密(使用两次SHA256算法,也称double-SHA256),至多计算 2log2(N)2log2(N) 次就能检查出任意某元素是否在树中

构造Merkle树

假设我们有A B C D四笔交易字段,首先需要把这四个数据Hash化。然后把这些哈细化的数据通过串联相邻叶子节点的哈希值然后哈希化。基本过程如下图所示

Merkle树的构造过程Merkle树的构造过程

叶子节点必须是偶数(平衡树),如果遇到奇数的情况,把最后一个节点自身复制一个,凑偶

Merkle树的效率

下表显示了证明区块中存在某笔交易所需转化为Merkle路径的数据量

交易数量区块的近似大小路径大小(哈希数量)路径大小(字节)
164KB4个哈希128 bytes
512128KB9个哈希288 bytes
2048512KB11个哈希352 bytes
6553516MB16个哈希512 bytes

可以发现,即使区块容量达到16MB规模,为证明交易存在的Merkle路径长度增长也极其缓慢(幂指数增长取对数变为线性增长)

Merkle应用 - 简单支付验证节点(SPV)

我们知道,每当一笔新的交易产生的时候,我们必须验证这笔交易是否真的存在,在SPV节点中,不保存区块链,仅仅保存区块头。使用认证路径或者Merkle路径来验证交易是否存在于区块中

例如,一个SPV节点需要处理一笔支付,它需要验证这笔交易在某个区块中是否存在,才能决定是不是把这笔交易添加到这个区块中,那么它只需要接收少于1KB大小的,有关区块头和Merkle路径的信息,比接收完整区块(大约1MB)大小少了1千倍。简单来说,可以想象,Merkle树类似一个数组(这也是哈希表的最简单表示),下标是区块字段,下标对应数组存储的内容是这笔交易是否存在的值(True or False)

区块链(比特币)与金融

BitInfoChart是我个人觉得最好的加密货币信息网站!可以添加到收藏夹

因为比特币具有价值,那就必须谈到它和金融的关系。

限于篇幅(太长了太可怕了,一个博客写2万字莫不是有病),这部分另起一篇:链接(直接点不会打开新标签),如果对ICO和金融方面感兴趣的读者欢迎移步讨论

竞争币和其他技术创新

所谓竞争币当然是利用区块链技术为即使,仿照比特币的基本协议架构进行的创新后的新币种,或者是新的区块链实现模式。这篇文章围绕什么是区块链展开,这部分的内容请移步(持续更新)如何评估竞争币的价值与新技术创新(直接点不会打开新标签)

其中谈到了工作量证明的其他替代手段;到底什么是智能合约;以太坊开发技术栈等

总结

感谢您看到这里,写这篇文章的目的一方面也是回答区块链(比特币)到底是什么这个困扰了自己很久的问题,另一方面,也是因为最近区块链技术非常火,需要一些接地气的科普文

比如最近最新的消息称一家保险公司,使用区块链技术来赔偿航班晚点2小时,基于以太坊智能合约第一款落地应用。

如果你已经对区块链的实现原理有了初步的认知,就明白这些应用利用了区块链的分布式特点。说到底,并没有贪婪=信任工作量证明核心,只是一种基于云的新型运用,也很有想法,但是和比特币之类就没什么关系了(当然,这是我的个人看法,最近区块链方面的有很多突破性技术,比如侧链,闪电网络等等,太多的新概念,新名词,新技术,对此,也只能不断学习)。

但你只需牢记,贪婪=信任,以太坊也是利用以太币这个媒介来实现了合约价值,中本聪用人内核的贪婪来给陌生人之间加上了信任的纽带,这个代价是永远不会变的。换句话说,如何抵抗共识攻击和安全漏洞是一个永远不会消失的议题。

一句话来说,万变不离其宗,道生一,一生二,二生三,三生万物。中本聪给了道,是个妙人,但是万物依旧有无穷可能。信任作为一个人类社会一直以来的重要问题(痛点),为了解决它,出现了权威机构进行信任背书(中心化)。建立信任,一定要付出代价,天底下没有免费的午餐,最终这些技术都会回归于一个投入产出的博弈过程(Trade-off),梳理主干,抓住要点,才能游刃有余!





               

上一篇:【介紹】【区块链】一文看懂区块链:一步一步发明比特币(1)


下一篇:【介紹】【区块链】现代区块链与新技术(1)



文章來源:https://charlesliuyx.github.io/2017/09/24/%E4%B8%80%E6%96%87%E5%BC%84%E6%87%82%E5%8C%BA%E5%9D%97%E9%93%BE-%E4%BB%A5%E6%AF%94%E7%89%B9%E5%B8%81%E4%B8%BA%E4%BE%8B/#%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E8%AE%B0%E8%B4%A6%EF%BC%88%E5%8E%BB%E4%B8%AD%E5%BF%83%E5%8C%96%EF%BC%89













分享: 

 0則回覆

您需要登入後才可以發文和回覆
登入 | 立即註冊
還沒有人回覆,趕快來搶沙發

您需要登入後才可以發文和回覆
登入 | 立即註冊