美文网首页
关于比特币、区块链

关于比特币、区块链

作者: 秋刀鱼Oo | 来源:发表于2018-08-01 20:57 被阅读0次

    首先要搞清一个问题:比特币是区块链,但是区块链并不是比特币

    什么是区块链

    区块链本质上是一个去中心化的分布式账本数据库,它包含以下三个特征:

    1,区块链是一个放在非安全环境中的分布式数据库(系统)。

    2,区块链采用密码学的方法来保证已有数据不可能被篡改。

    3,区块链采用共识算法来对于新增数据达成共识。

    具有以上三个性质的系统,就是区块链。

    什么是比特币

    比特币是基于区块链技术实现的一种数字货币,其本身是一串使用密码学相关联所产生的数据块,每一个数据块中包含了多次比特币网络交易有效确认的信息。

    在了解比特币之前我们先来了解一下一下几个信息

    1、加密货币

    我们常说的比特币,是加密货币(Cryptocurrency)的一种,而加密货币实现去中心化的最关键的技术是区块链

    有些地方可能把加密货币又称为数字货币(或称电子货币),但实际上,加密货币是数字货币的子集,同为子集的还有虚拟货币(如Q币),加密货币的称谓要更加专业

    加密货币一定具有下列三个特点

    1.去中心的清算

    2.分布式的记账

    3.离散化的支付

    为了实现这些特点,需要使用到区块链技术。这里的区块链技术是一个很广义的范畴,它包含了密码学,算法等很多不同的内容,其中最精彩的点子,可算是工作量证明 = 共识了,而比特币采用的也正是这一点。

    既然我们提到区块链的本质是一个去中心化的分布式账本数据库,那我们就先来了解一下什么是中心化吧

    中心化

    假如我们在网上购买一本书,那么它会经历以下历程:

    第一步,你下单并把钱打给支付宝;

    第二步,支付宝收款后通知卖家可以发货了;

    第三步,卖家收到支付宝通知之后给你发货;

    第四步,你收到书之后,觉得满意,在支付宝上选择确认收货;

    第五步,支付宝收到通知,把款项打给卖家。流程结束。

    你会发现,虽然你是在跟卖家做交易,但是,所有的关键流程都是在跟支付宝打交道。这样的好处在于:万一哪个环节出问题,卖家和买家都可以通过支付宝寻求帮助,让支付宝做出仲裁。这就是一个最简单的基于中心化思维构建的交易模型,它的价值显著,就是建立权威,通过权威背书来获得多方的信任,同时依赖权威方背后的资本和技术实力确保数据的可靠安全。

    假如说,支付宝程序发生重大BUG,导致一段时间内的转账记录全部丢失,或者更彻底一点,支付宝的服务器被炸了。而我刚刚转出去的100元找谁说理去,这个时候,你就成了刀殂上的鱼肉;支付宝有良心,会勉为其难承认你刚刚转账的事实,但他不承认你也没辙,因为确实连他自己也不知道这笔转账是否真实存在。

    上述就是中心化最大的弊端——过分依赖中心和权威,也就意味着逐渐丧失自己的话语权。

    去中心化

    那么去中心化的形态是什么样子呢?还是拿刚才那个例子继续,我们构建一个极简的去中心化的交易系统,看看我们是如何在网络上从不认识的卖家手里买到一本书的。

    第一步,你下单并把钱打给卖家;

    第二步,你将这条转账信息记录在自己账本上;

    第三步,你将这条转账信息广播出去;

    第四步,卖家和支付宝在收到你的转账信息之后,在他们自己的账本上分别记录;

    第五步,卖家发货,同时将发货的事实记录在自己的账本上;

    第六步,卖家把这条事实记录广播出去;

    第七步,你和支付宝收到这条事实记录,在自己的账本上分别记录;

    第八步,你收到书籍。至此,交易流程走完。

    刚才“人为刀俎我为鱼肉”的情况在这个体系下就比较难发生,因为所有人的账本上都有着完全一样的交易记录,支付宝的账本服务器坏了,对不起卖家的账本还存在,我的账本还存在;这些都是这笔交易真实发生的铁证。

    当然,在这套极简的交易系统中,你已经发现了诸多漏洞和不理解,比如说三方当中有一个是坏人,他故意记录了对他更有利的转账信息怎么办;又比如说消息在传递过程中被黑客篡改了怎么办等等等等。那我们就来看看比特币是怎么解决这类问题的吧。

    如何实现分布记账(去中心化)

    为了去中心化,我们可以反其道而行之:每个用户保存账本,分布记账。用户产生一笔交易就将这笔交易广播到到网络上所有的节点上,这样不就完美的去中心化了?如图:

    但是问题来了,如何让所有人都同意这个新账本?如何保持这些账本同步?有一笔交易发生时,如何让其他人都听到并相信这一笔交易呢?

    比特币解决的思路是:哪个账本的计算工作量大,就信任哪个账本。换个角度来说是【让交易欺诈和账本不一的情形的计算力成本高到不能接受甚至完全不可行】

    1、密码学:哈希函数

    哈希函数,输入可以是任意信息或者文件,输出是固定长度的比特串。例如256bit的1/0串,这个输出叫做这个信息的“哈希值”或者“摘要”(digest)。SHA256就是一个哈希函数

    密码哈希函数有几个特点

    特点是输入值稍微变化后,结果就会有很大的不同,完全无法预测不同输入间的规律

    逆向计算不可行,只能使用试错法(穷举法),解空间 2的256次方

    在每一个账本后添加一个特殊数字,对整个列表使用SHA256,我们要求这个特殊数字可以使得输出值的开头有30个零(关于如何确定0的个数问题,在后面部分有详细的说明)

    根据之前说过SHA256的性质:输入变化输出不可预测,找到这个特殊数字唯一的办法就是穷举。换言之,你很容易就证明了他们进行了海量的计算。而这个特殊数字就叫做工作量证明(proof of work)

    这就意味着,所有的工作量证明就对应了交易列表(账本 Ledger),如果你修改了一个交易,哪怕只是其中一个字符,就会完全改变哈希值,就得重做工作量证明,直观动图如下

    修改后的重新计算

    2、区块链 - 信任与共识的基石

    每一个小账本被称为区块,每一个不同的区块链协议(产生不同的加密货币)都会规定每一个区块的大小(最初比特币为1M)

    账本组成区块,区块构成链表,区块的头包含前一块的哈希值,这就是区块链


    区块链的诞生

    如此一来,任何人就不能随意修改其中的内容,或者交换顺序。如果你这么做,意味着你需要重新计算所有的特殊数字


    修改任何部分都以为着重新计算

    规定,允许世界上的每一个人建造区块。每一个新建区块的人(找到了这个特殊数字 - SHA256值有30个零)都能获得奖励,对于新建区块的这部分人(矿工)来说

    没有发送者信息,不需要签名

    每一个新区块都会给整个币种增加新的虚拟(加密)货币

    新建区块的过程又被称为“挖矿”:需要大量工作量并且可以向整个经济体注入新的货币

    挖矿的工作是:接受交易信息,建造区块,把区块广播出去,然后得到新的钱作为奖励

    对每个矿工来说,每个区块就像一个小彩票,所有人都在拼命快速猜数字,直到有一个幸运儿找到了一个特殊数字使得整个区块的哈希值开头有许多个零,就能得到奖励。我记得有一个知乎答主给了一个形象的比喻,区块链就像一个拥有貌美如花女儿(区块)的国王,有很多的青年翘首以盼,而国王的方法是出了一道很难得题目让所有的青年计算(学习改变人生),谁算的快(在计算哈希值过程也可能是运气好)就能抱得美人归

    对于想用这个系统来收付款的用户来说,他们不需要收听所有的交易,而只要收听矿工们广播出来的区块,然后更新到自己保存的区块链中就可以了

    3、51%算力-共识攻击

    这里有一个小漏洞,因为网络的延迟或者有人在篡改区块链等因素,你作为一个收听网络广播的用户,如果同时接受到两条不同的区块链怎么办?其中的交易信息发生了冲突

    注:区块链本身就是最终的大账本,发生交易的唯一方法就是把你的交易加入到大账本上。具体来说,就是让矿工把你的交易记录加入它新挖到的区块中,并把这个区块链接到区块链上。链表的纽带,当然就是工作量证明

    对于上面的问题,用户的解决方案也比较简单:即,只保留最长的且难度系数最高的,也就是包含的工作量最大的那一条


    用户保留最长的区块链

    这里有一个Trick,即所谓信任工作量最大不仅仅是出【一道难题】,还通过等待多个区块的产生引入世界上所有矿工之间的博弈(吃瓜群众,坐看大戏,谁厉害我选谁,你们尽管斗)

    如何更新本地区块链

    其中的原因是,你可以假设Alice希望篡改一个交易信息,那么就意味着Alice需要不断的通过计算维护这个区块链了。也就是说每一次有新的区块链产生,Alice都需要不断的抢到这个彩票,理论上来说,他至少必须拥有全网51%以上的算力才能做到这一点,更多的,随着用户等待区块的增加,这个难度,幂次上升,在7-8个区块链产生后,概率上来讲,就是绝对信任


    无穷大的篡改成本

    此时

    比特币用数字签名保证了不能伪造交易记录

    区块链及工作量证明保证了不能篡改其中的信息

    这两点,就完成了:证明区块链的每一条交易记录都是可信的这一终极目标

    那么,我们如何才能在这个系统下骗人呢?

    如果你想篡改一笔不存在的交易记录,那么你必须比所有人都算的快,赢得这个彩票,但所有用户会继续收听其他矿工的广播,所以为了让所有用户继续相信这个伪造的区块,你必须投入自己所有的工作量,不断给篡改后的区块链分叉增添新的区块

    记住:根据协议,所有用户会一直信任他所知道的最长的链

    是的,你持续的竞争过世界上所有的矿工的概率或者说代价,实在太大了,得不偿失(其实法律也是一样的道理,它强制给违法的人给予惩罚,让违法者付出他们不能承受的代价了保证公平和社会稳定运行)

    注意,作为一个用户,你不能立马相信你所听到的最新区块,而是应该等待多几个区块被创建过后,再确认这的确是世界所有人都在使用的区块链(比特币的原则中,等待6个区块,才确认)

    比特币网络节点的构成

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

    节点类型与分工

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

    【网络路由节点】使得节点具有参与验证并传播交易与区块信息,发现监听并维持点对点的链接的能力

    【完整区块链】具有此模块的节点被称为:全节点。它能够独自自主的校验所有交易,不需要任何其他信息。

    【钱包】比特币的所有权是通过数字密钥、比特币地址和数字签名来确定的,数字密钥实际上并不是存储在网络中,而是由用户生成并存储在一个文件或简单的数据库中,称为钱包。有些节点仅仅保留区块链的一部分,通过一种”简易支付验证“(SPV Simplified Payment Verification)的方法来完成交易

    【矿工】挖矿节点以相互竞争的方式创造新的区块。有一些挖矿节点也是全节点,可以独立挖矿;还有一些参与矿池挖矿的节点是轻量级节点,必须依赖矿池服务器维护全节点进行工作

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

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

    扩展比特币网络

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

    可以参考这里查看,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万

    而这个规则不同的竞争币种都可以自由设置。但是因为交易费的存在,挖矿的人还是会有收益,否则无法建立新的区块,那么整个比特币网络就瘫痪了

    比特币的交易处理能力

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

    其实我们会发现平均区块建立间隔时间,和10分钟这个设计值差距很大

    区块容量

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

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

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

    【纵坐标】是每秒交易数量(对数变换后)

    【横坐标】是时间

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

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

    【蓝色的圈大小】是Mempool的大小,直观来说,就是圆越大,在等待的交易数量越多

    【横坐标】是区块容量的使用情况

    【纵坐标】是每一个区块的可以得到的交易费用,单位是BTC,注意这里是一个区块被新建时候所有交易费之和(大约2400交易的所有交易费加起来)

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

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

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

    【蓝色的圈大小】是Mempool的大小,直观来说,就是圆越大,在等待的交易数量越多

    【横坐标】是区块容量的使用情况

    【纵坐标】是用户平均需要等待的时间,单位是分钟。

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

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

    比特币扩容之争

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

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

    交易结构

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

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

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

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

    可以把UTXO类比为我们使用的人民币1,5,10,20,50,100的面值,对于UTXO来说,它的面值可以是一”聪“的任意倍数(1BTC等于一亿聪)但是这个有着任意面值的”人民币“不能随意打开,还被加上一道类似红包支付口令的密码,只有拥有这个密码的人才可以使用这个UTXO,UTXO包含,币值+一段代码(锁,只有有钥匙的人才能打开)。在实际实现的时候,这个被称为脚本,是一种基于逆波兰表示法的基于堆栈的执行语言。具体细节可以去比特币的Github研究代码。关于脚本有很多细节上的定义和实现方法

    交易的输入和输出

    被交易消耗的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,就意味着他的交易会变复杂,存储空间需求多。当然,很多钱包会提供这方面的优化功能,保证你的交易使用的字段大小最优化

    矿工费和优先级

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

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

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

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

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

    创币交易 - Coinbase

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

    创币交易中不存在解锁脚本(也叫ScriptSig字段),被Coinbase的数据取代,长度最小2字节,最大100字节,除了开始的几个自己以外,矿工可以任意使用Coinbase的其他部分。

    竞争币和其他技术创新

    所谓竞争币当然是利用区块链技术为基石,仿照比特币的基本协议架构进行的创新后的新币种,或者是新的区块链实现模式。可以点击这里查看。

    区块链1.0—数字货币和支付行为组成。特征包括:以区块为单位的链状数据块结构;全网共享账本;非对称加密;源代码开源,主要具备的是去中心化的数字货币和支付平台的功能;目标是为了去中心化,比如比特币。

    区块链2.0—智能合约开发和应用。智能合约:区块链系统中的应用,是已编码的可自动运行的业务逻辑,通常有自己的代币和专用开发语言;DAPP,包含用户界面的应用,包括但不限于各种加密货币,如以太钱包;虚拟机,用于执行智能合约编译后的代码,虚拟机是图灵完备的。智能合约开始在区块链上应用,用机器合约指令代替人工操作,让一切变得更加透明,高效,没人有人为操作,干扰。比如以太坊上的艾希欧,就大大降低了融资成本。

    想了解比特币及其他加密货币原理的推荐这个视频

    关于知乎上比特币是什么?的优秀回答

    引用

    一文弄懂区块链

    如何简单用的介绍区块链

    相关文章

      网友评论

          本文标题:关于比特币、区块链

          本文链接:https://www.haomeiwen.com/subject/zimlmxtx.html