zoukankan      html  css  js  c++  java
  • 区块链技术到底是什么鬼(二)

    本文技术要点:

                 a8bcf5ff4a540ee7c9a9d64c400a1462f6bd0401


    本文转载自 知乎 作者 玲珑邪僧 原文链接

    最近在研究区块链和比特币的相关技术,看到这道题就想着写点东西供大家参考。如果哪里有说的不对的地方还希望前辈们多多指教。

    前方多图多图多图!

    通俗一点地说,区块链是一个收录所有历史交易的总帐,每个区块中包含若干笔交易记录。如果说区块链是账本,那么区块就是账本的每一页。交易的细节都被记录在一个网络里任何人都可以看得到的公开账簿上。区块就是很多交易数据的集合,它被标记上时间戳和之前一个区块的独特标记。有效的区块获得全网络的共识认可以后会被追加到主区块链中。区块链是有包含交易信息的区块从后向前有序链接起来的数据结构。

                 e3b1155f0689bf867c09a0e7c1d44f96ac807859

    在这里,我用比特币相关知识举个栗子解释一下。

    在比特币领域中,存在“矿工”这样一个概念。矿工是指通过不断重复哈希运算来产生工作量的各个网络节点。(每个节点都是路由,区块链数据库,挖矿,钱包服务的功能集合)矿工们需要竞争完成一种基于加密哈希算法的数学难题,答案存在于新的区块中,谁优先解出这个答案,谁就能在p2p网络中广播声明自己已经获得这个区块,其他的矿工就会意识到在这局里已经输了,就会立马开始下一个区块的挖掘工作。每个矿工在他的区块中都有一笔特殊的交易,他们会将新生成的比特币(当前每块25个比特币,2016年也就是今年减半)作为报酬,然后支付到自己的比特币地址中。一旦这个区块被认可被验证,也就是被添加到区块链中,他的这笔报酬就可以变为可用可消费的状态。

    在比特币体系中,平均每十分钟就可以发现一个新的区块, 在完全去中心化的比特币网络中(即不受任何第三方控制),每个完整节点中独立自动发生难度调整,让新区块的产出速率维持在平均每十分钟一个。

    一个block产生的产生时间=难度值x2的32次方/hashrate

    • (hashrate是每秒运算的hash数量)
    • 难度值difficulty=最大目标值/当前目标值

    我来拟人化地解释一下。

    单身汪们要找女票,国民岳母说我有好多女儿,这样吧我给你们出点题目,解出一个就给其中一个姑娘的微信号。单身汪们疯狂竞争,想破脑袋去解题。只要其中一只汪解出一道题,就立马得意洋洋地昭告天下,示威全部单身汪,这个姑娘是我的啦,你们放弃吧。其他单身汪们即使不服也没有办法,惆怅懊恼也不是个事儿啊,还是麻溜地立马去解下一道题目吧。这只喜赢姑娘的幸运小汪被岳母认可后还能得到25个货币单位的彩礼,简直人生赢家。岳母会通过解题的速率去调整题目的难度,有时候吧,出的太难了,好久没小伙子有能力来上门提亲,她一寻思,这可不行,这女儿不能砸手里啊,得把题目难度降一点。有时候难度太简单,不到10个时间单位就嫁出去一个,这更不行,赶紧使用难度提升技能。对了今年就是2016年,岳母的礼金还会减半。。。
    。。不闹了。。回到正题。。

    上面所描述的其实就是“挖矿”的概念,所谓挖到矿就是要猜到一个nonce值让该区块的摘要值小于一个会根据难度而线性调整的目标值,这也是所谓的工作量证明。简单一点说,就是重复计算去块头额哈希值,不断地改变参数,直到与哈希值匹配的一个过程。当节点创建一个候选区块的时候,那矿工就准备开始进行挖矿。矿机开始超高速运行SHA256算法,这些硬件会通过USB链接到存在于电脑上的挖矿节点上,然后挖矿节点会将区块头信息传给这些硬件,让他们进行非常高频的nonce测试。

    当一项交易被区块收录的时候,可以被认为是一次确认。在此区块之后每产生一个区块,此项的交易数就再加一。当确认数目到达六次以上的时候,通常就能认为此项交易比较安全并且不可逆转。那么现在,这笔交易已经在比特币网络上传播开,但只有通过验证且加到一个区块中的时候,这笔交易才能成为区块链的一部分。

    新的交易不断地涌入比特币网络,当节点们看这些交易的时候,会将这些交易临时放到自己各自维护的一个临时的交易池中,当矿工创建出一个区块以后,便可以把这些交易从交易池中拿出放到这个新区块中,然后通过解决一个难度很大的问题去证明这个区块的合法性。

    下图是我在http://blockchain.info网站上随机截取的一个区块。

                 07dc076d416585ee82cd03dd483cc8761730c839

    一般来说,个体矿工自己一个人独立进行挖矿在这样一个竞争的大环境中是几乎没有可以盈利的可能的。因为他们的算力让他们很难靠一己之力可以挖到区块去平衡他所付出的硬件设备费用及相关的电力费用。所以在这样的时候,他们会选择加入矿池。众多矿工组合成矿池,汇聚大家的算力,然后一起分享奖励。所以不出意外的话最后一行中间那个大的绿箭头后面的一串字符就是一个矿池的地址而非个人矿工的,该矿池获得了25个比特币的奖励,多的后面的零头是参与挖矿所得的矿工费。

    现在我们点开那个收币地址,看一下里面的信息。

                 8fd0baf5ad2934c8e1dd4cb0387a62def1083fa6

    蓝色框的31confirmation就是说明这条交易已经被验证31次,当数目达到120次时,就证明这条交易成立。

    你也可以打开终端,运行

    $curl https://blockchain.info/unspent?active=1CK6KHY6MHgYvmRQ4PAafKYDrg1ejbH1cE

    也可以进行查询,像这样:

                 1705ceb2aa6b55fcee71fbc0c1810d3f963d33ec

    小彩蛋——我们可以认识一下比特币领域的创世区块。

                 165a9cd94426b01eacf330c20b8a1a13aef8b3e9

    右边是比特币创始人中本聪留下的一句话。“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks” 这句话正是泰晤士报当天的头版文章标题。

    我们回到区块链。上面我提到过,每个区块头都会进行SHA256哈希加密,生成一个哈希值,通过这个值,我们可以在区块链中识别出特定区块,并且每个区块头都还包含它的父区块的哈希值。

                 d03ca29b03a705d1d2fa74ae9c0e7ceac6343dde

    (图片来自《精通比特币》)

    每一个子区块都只有一个父区块,但一个父区块可以暂时拥有很多子区块,这种情况被称为区块链分叉。这种只有当不同的矿工在同一时刻发现不同的区块时才会发生。这时解决的方法就是,每一个节点总是选择并尝试延长拥有最大工作量证明(最长或者最大难度)的区块链。

    举个例子:

                 593d64d7446843c2a3a8e84b0cd878acd5342a64

    (图片来自《精通比特币》)

    我们现在有一个区块链-蓝

                 e5f00fb553520c04fcb9efaa16f4830d6a1fc455

    (图片来自《精通比特币》,可爱的小姑娘来自我)

    位于X地区的矿工与位于Y地区的矿工同时发现了两个区块。

    我们假设:

    • 矿工熊猫君A发现区块-红,
    • 矿工兔子君B发现区块-绿。

    当熊猫君A,兔子君B节点分别在比特币网络广播的时候,部分节点会先收到熊猫君A的广播,部分会先收到兔子君B的广播,然后分为两派阵营的节点会分别开始以他们接收到的区块作为父区块,进行深一步的挖矿活动。(这里节点的地理意义指的是网络拓扑上的位置,而非真实的地理位置。)

                 eef3c0012aea8237ee2acbeae243f407ccfbd609

    (图片来自《精通比特币》,可爱的小姑娘来自我)

    就在大家如火如荼地紧张解题的关键时刻,一个接收到兔子君B所广播的节点的兔子君C,优先发现了下一个区块-粉,也就是说绿色阵营的小兔子们的区块链可以进行下一步延伸,就会比红色阵营的小熊猫们的长度长,红色阵营小熊猫遗憾出局。这样的话分叉问题就得到了解决。

                 ee6b6aa528157783d237a9f154e4e81c800ad2e7

    (图片来自《精通比特币》,可爱的小姑娘来自我)

    这里我们需要提到一个名词,“共识攻击”。一个很著名的场景就是“51%攻击”。如果一群矿工拥有了全网51%的算力,那么只要他们联合起来就可以打击整个比特币网络。他们可以认为地去制造一个分叉的区块链实现双重支付,拿我们上文的例子举例,攻击者在区块-红中进行过了交易,结果他强行制造出区块-绿,并且区块-绿中将原本的交易替换成另一笔交易(把原本应该给卖家的钱打入自己同伙的钱包中),然后在区块绿的基础上再计算一个区块-粉,这样包含伪造的区块的区块链就比包含真实交易的区块红高出一个高度,此时,包含双重支付的恶意区块链将取代真实区块链,从而实现诈骗。51%的概念并不是说攻击者需要全网51%的算力才能进行攻击,理论上来说不到51%也是可以实现攻击的,我们只是说拥有超过51%的算力的攻击几乎我们就可以判定它一定会成功。

    上面都是在比特币场景下进行的论述

    那么在哪些领域里也会用到区块链技术呢?

    1. 银行业:作为一种数字化,安全防干扰的帐户,区块链实现了银行业的核心功能:即价值的安全储存和转移中心。也就是说,在将来的几年内,一波基于区块链技术的公司或将影响到银行业。
    2. 支付和转账:区块链技术能够避开繁杂的系统,在付款人和收款人之间创造更直接的付款流程,不管是境内转账还是跨境转账,这种方式都有着低价、迅速的特点,而且无需中间手续费。
    3. 网络安全:虽然区块链的系统是公开的,但其核验、发送等数据交流过程却采用了先进的加密技术。这种技术不仅确保了数据的正确来源,也确保了数据在中间过程不被人拦截。如果区块链技术的应用更为广泛,那么其遭受黑客袭击的概率也可能会下降,因此人们认为区块链系统要比传统系统更为稳妥。区块链系统之所以能降低传统网络安全风险,一大原因就是它解除了对中间人的需求。
    4. 选举:大家的投票“绝不可能被我们——即程序员,学校管理员或学生修改、删除。”
    5. 智能合同:智能合同实际上是在另一个物体的行动上发挥功能的电脑程序。和普通电脑程序一样,智能合同也是一种“如果-然后”功能,但区块链技术实现了这些“合同”的自动填写,无需人工介入。这种合同最终可能会取代法律行业的核心业务,即在商业和民事领域起草和管理合同的业务。
    6. 股票交易:许多年来,各个公司都在想方设法简化股票的购买、销售和交易过程,新兴的区块链技术创企认为他们能够超越以往,实现整个流程的自动化,提高安全性和效率。

    (参考来自区块链技术源于比特币 现在却要改变这12个行业)

    有国内互联网金融长期观察者说,“区块链目前的情况类似于TCP/IP(1969年出现的技术,30年后应用才全面盛开)或者HTML刚出来的时候找不到落地的应用,除了比特币外,缺乏杀手级应用,比特币只是区块链1.0,而智能合约是2.0,区块链的较高应用是对应到物联网,做到实时信用确权。”

    我个人认为区块链技术是很有前景的领域,值得有兴趣的各位学习研究。

    区块链被真正广泛运用还有一段很长的路要走,大家要做的,就是积累技术等待成熟时机的出现。

  • 相关阅读:
    Blob隐藏真实路径
    Vue原理笔记3
    Vue原理笔记2
    Vue双向绑定原理
    Vue原理笔记1
    MVC、MVP、MVVM
    Go语言学习之-带分割符的文件转excel
    IBMMQ之工具类
    IBMMQ之取发文件
    JAVA之我的公共部分测试调用
  • 原文地址:https://www.cnblogs.com/jzxx/p/7150956.html
Copyright © 2011-2022 走看看