区块链入门——比特币科普

区块链入门——比特币科普

大家好,又见面了,我是全栈君。

“分久必合,合久必分”

什么是区块链

区块链(block chain)狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构。广义来讲是用分布式数据库识别、传播和记载信息的智能化对等网络, 也称为价值互联网。

区块链的核心价值在于去中心化,这也是区块链技术最根本最重要的性质。 互联网从设计初始其实就是去中心化的,网络架构的原始设计中并没有中心服务器的概念,MAC地址、ip路由、传输层报文等等对于每个网络节点都是对等的,每个人都可以以相同的权益浏览和共享文件。然而现在,我们的互联网可以说是重度中心化,绝大多数的信息来源都依赖于各大公司的服务器。某个爆款话题的出现、局部天气原因导致的传输故障都会导致服务器出现问题。服务器一旦挂掉,就会影响很多的用户,这也是中心化显而易见的弊端。

而去中心化带来的好处就是没有权利中心,节点之间是对等的,每个节点都享有相等的权益,没有欺骗,公平公正公开。那么运作在这样一个性质的系统就可能受到更多人的青睐。

然而这只是理想情况,因为网络本身的性质就是不可信的,存在着信息盗取、恶意篡改等问题。如何解决在去中心化不可靠的网络上保持各节点信息同步,并且不可篡改,使各节点按照相同的规则维持系统的良好运转的问题,比特币这一应用带来了开创性的解决方案。

比特币

如果对于不了解区块链的人来说,比特币的名气似乎要大一些,毕竟大家都见证了币圈的疯狂。事实上,比特币和区块链的概念同时诞生与2008年,随着一位化名为中本聪的人(也有消息说是团队)在比特币白皮书:一种点对点的电子现金系统中提出。区块链是比特币应用的底层技术,比特币是基于区块链技术的加密数字货币。接下来用不涉及技术(技术实现可能和直观认知有出入)的角度说明一下比特币大致的工作形态。

记账

相信每个人都不同程度上的记过账,可能是如下形式:

  • 买火车票 300元
  • 和朋友看电影 40元
  • 买几个橘子? 10元

类似这样的记账方式称为单式记账,只记录了单方面的资金流向,平时我们记账用这种形式就够了,形式不会有太大变化。因为对我们个人来说,并不需要关心资金流向了哪里,只需要知道自己剁了多少手╮(╯_╰)╭。

而对于一种货币系统来说,就要从整个系统角度来出发,当产生一笔资金流的时候,必定会有输入和输出,拿买橘子为例,个人的账户里可以记录减10元,而水果店老板的账户可以记录加10元,这种同时记录资金的输入和输出的记账方式称为复式记账。复试记账更多的是从整个系统的角度出发,类似物质守恒的观念。

五个人的游戏

有了上文的概念,现在我们假设A手里有50个金币,他发明了一种游戏,于是他又召集了四个小伙伴,每个人分了10个金币。说明了游戏规则:

  • 每个人可以任意把手中的金币转账给另一个人,并要把此条信息迅速告知其他人,同时每个听到消息的人要记录在一张草稿纸上,并且也要继续告知给其他人。每个人只能产生从自己的手中转账的信息。
  • 每个人在记录听到的转账信息的同时,在努力的求解一道难题,最先算出这道难题的人要把最近获得的转账信息完整的记录到A4纸上,并且马上向他人宣布这张记录信息的A4纸以及难题的答案,经过验证正确以后,他可以无条件的获得12.5个金币(凭空产生)。
  • 当每个人收到其他人传来经过验证正确的A4纸的时候,要把这个A4纸放到文件夹中,连接到上一个A4纸后面,永久的保存,以便日后查询。同时抓紧时间和其他人竞争求解下一道难题,争取把最近的新信息记录到A4纸上并保存在文件夹中,获得金币

规则一看有点复杂,让我们举例说明。

开始的时候每个人有10个金币。

名字 A B C D E
余额 10 10 10 10 10

假设不一会就产生了一系列的转账记录T1:

转账 额度
A –> B 3
C –> E 2
B –> D 1
D –> A 1
D –> E 2

与此同时大家都在求解某一题目,例如此时C得到了正确答案,并把T1记录和求解答案同时告知其他人,其他的小伙伴都验证正确之后,每个人就把这份T1记录放在自己的文件夹中,永久保存。

按照之前的规则,C此时应该得到12.5个金币。事实上,在C发布T1记录的时候,会将此记录中加一条特殊的转账信息:
"?--> C 12.5"
因为每个人记录的时候并不会记录是谁算出了结果,所以需要这一条"无输入"的特殊记录
复制代码

此时每个人的余额应该是这样:

名字 A B C D E
余额 8 12 20.5 8 14

于是开始新一轮的转账交易,以此类推。事实上,比特币的主体工作形态就是这样。

对游戏的疑问

  • 如果A传播假的转账信息怎么办? 比如A–>B 10000,其实A并没有这么多金币。

    因为每个人都掌握着所有的记录,所以可以不依靠别人很轻松的查询出A的余额,一旦接收无效的交易,直接被pass掉。不会继续传播(如果此游戏是依靠中心账本或者第三方记录机构,就有可能篡改中心账本发生此问题)

  • 如果有人私自篡改自己文件夹中的历史记录怎么办? 例如把自己的余额改写。

    这个就是掩耳盗铃了,更改自己的记录并没有用,每个人都保存着自己的记录。

  • 如果B更改A4纸上的转账信息怎么办? 比如凭空制造A–>B 10,而且A确实满足此条件。

    产生此条交易需要获得A的许可,B不能产生此条信息。

  • 既然B不能产生别人的转账信息,但他可以操作自己的转账信息,比如把B–>A 10的这条已经产生信息撤销掉,从而使自己的余额增加?

    这个问题还是有可能发生的,下面详细的分析一下这个问题:

    其实每张A4纸都记录了上一张A4纸的标记,来说明这张A4纸连接到哪一张的后面。在这个游戏中,其实每个人都不需要信任其他人,因为游戏规则的设定,只要每个人对规则达成共识,就可以自动的避免一些恶意行为的产生。

    事实上在接收到符合规则的A4纸的时候,无论有没有其它和这张A4纸指向同一张纸的A4纸,都将其连接到所指向的A4纸上。例如已经存在如下记录:

    ```
    T1 ← T2 ← T3   (图1)
    ```  
    复制代码

    此时又接受到一张符合规则的A4纸T3’,它也指向T2。这时候依然要把它保存起来。

    ```
    T1 ← T2 ← T3  (图2)
          ↑
          T3'
    ```
    复制代码

    这是为什么呢?

    因为有可能存在T3和T3’都是正确的。这是因为有其中两个人同时求出了问题的解并告知其他人,对第三个人来说这两个解都是正确的,所以都要保存起来,等待下一个的A4纸的接收。接下来假如接收到了T4,它指向T3。那么就将其自动连接到T3后面。

    T1 ← T2 ← T3 ← T4 (图3)
          ↑
          T3' 复制代码

    每个人在计算新问题时,都按照自己最长的分支去延伸,这个共识是很重要的。也就是说自己在计算时,要基于T4计算而不是T3’。同时也承认最长的分支上的数据。

    此时,B产生了一个坏想法。基于上图说明:假设B在T3账单中付给了A 5个金币买了一本书(图1),而自己又制造了一份数据T3’,里面把这条给A付款的信息抹去,并重新发布T3’,并故意使其链接到T2并发布。其他人收到消息后把T3’作为侧链链接到T2上(图2),此时B又算出了T4,使其指向T3’,又发布了出去,其他人收到了T4后,经过验证链接到T3’上。变成了下图(图4):

    T1 ← T2 ← T3  (图4)
          ↑
          T3' ↑ T4 复制代码

    因为每个人都按照最长的分支去延伸,所以此时无恶意的人会计算下一个T5是链接到T4上,这样原本的T3中的交易就丢失了。所以没人会记得B给A付了5个金币,这样B白白赚到了一本书。

    其实,满足上述条件的场景不是很容易发生。可能你也发现了,B必须要和其他所有人去比求解问题的速度,一旦别人(无恶意的)产生的新账单T4比B快,它会链接到T3,这样B的目的就没有办法达成。

    然而当你的算力大于全系统的一半时,理论上来说这种攻击就一定会成功,因为你比别人算的都快,有权利发表新的账单记录。也就是说,假如B联合了其它五个小伙伴共同实施这个行为的话,就会达到目的。上述的攻击被称作51%攻击。

  • 假如又有人想参与进来怎么做?

    直接参与即可,假如没有金币,就可以求解问题发布结果赚取金币;也可以私下交易让其他人先转账给他。新加入的人不影响整个游戏的运作。

比特币运作原理

让我们把刚才的游戏和比特币对应上:

  • 每个人 —— 网络节点
  • 金币 —— 比特币
  • 每张记录交易信息的A4纸 —— 区块
  • 连接状态下的A4纸链 —— 区块链
  • 求解问题的过程 —— 挖矿
  • 记录产生分歧 —— 分叉

这样就相对好理解了。

每一个运行着完整比特币客户端的都是一个比特币节点,节点可以产生交易、传播交易、进行挖矿来赚取比特币。它们不需要信任彼此,只要它们保持着相同的共识规则,整个系统可以良好的抵御恶意节点的攻击。

随着比特币的第一个创始区块的诞生,整个比特币系统也随之开始运转。比特币规定刚开始时的货币发行量是每个区块50个比特币,之后大约每4年减半,现在(2018)已经是每个区块产生12.5个比特币了,因此货币的总发行量是一定的,大约2100万个比特币。

每一个新区块在网络上被发出,节点验证后就会把此区块链接到自己所保存的区块链上,没有中心服务器,没有权威机构,每个节点都拥有相同的权利,同时区块链也具有不可更改的特性。

挖矿的行为其实就是使得哈希运算的结果小于特定值,只能反复的计算,没有任何捷径。每一个节点都力求争取这份”矿工费”。

区块链分叉分为硬分叉和软分叉两种,硬分叉指的是主链和侧链的共识机制不同,分别延伸两条链,永远分歧下去,这是硬分叉。硬分叉造成的后果是使得每条链的算力下降,造成对系统的负面影响。而软分叉指的是暂时分叉,之后会侧链重新会合并到主链上来,一般用于比特币系统的版本升级,毕竟这是一个去中心化的系统,不能强制每个节点都升级,同时还要保证系统的良好运作,兼容旧版本,所以说”共识”软件的开发也是一门学问。


至此从非技术角度已经把比特币的运作原理描述的差不多了,从技术角度出发可以拓展很多东西,比如为什么系统能抵御恶意节点的攻击?为什么它能在不信任的网络上运转?挖矿到底是求解什么问题?每个节点是怎么连接起来的?如何证明金币是我本人而不是伪造的?(事实上在比特币系统中中没有余额这个概念)这些日后我会从技术角度说明一下,算是自己对区块链的总结。

最后可能会问:为啥这个数字货币这么值钱? emmmmmmm…. 为什么一张纸做成了钞票以后就是钱了呢?因为人们相信它有那个价值呀。

转载于:https://juejin.im/post/5a58e268518825734978db79

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/107761.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • onedrive个人版免费扩容_onedrive会员

    onedrive个人版免费扩容_onedrive会员这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Mar

  • 快速排序算法——C/C++

    快速排序算法——C/C++快速排序1、算法思想快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。2、实现原理2.1、设置两个变量low、high,排序开始时:low=0,high=size-1。2.2、整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面…

  • document.getElementById详解

    document.getElementById详解注意:document.getElementById("")得到的是一个对象,用alert显示得到的是“object”,而不是具体的值,它有value和length等属性,加上.value得到的才是具体的值! 参考资料:1.document.getElementById的用法和DHTML.CHM的下载地址http://blog.sin…

  • CBOW全称_skip的形式

    CBOW全称_skip的形式skip-gram结构是利用中间词预测邻近词cbow模型是利用上下文词预测中间词一、CBOW1、CBOW之所以叫连续词袋模型,是因为在每个窗口内它也不考虑词序信息,因为它是直接把上下文的词向量相加了,自然就损失了词序信息。CBOW抛弃了词序信息,指的就是在每个窗口内部上下文直接相加而没有考虑词序。2、CBOW过程简单介绍如下(实际算法会用到哈夫曼编码等降维技巧,这里仅以理解为目的简介基本原理):输入为C个V维的vector。其中C为上下文窗口的大小,V为原始编码空间的规模。例如,

  • sudoers修改_ubuntu sudoers 文件修改「建议收藏」

    sudoers修改_ubuntu sudoers 文件修改「建议收藏」自己作死,没有用visudo修改/etc/sudoers文件,结果导致sudoers文件出错,sudo无法使用。在网上找了一圈才搞好,哎!首先,不要慌,重启电脑,切换到recovery模式:###########开机后长按shift键,进入选择启动的界面光标移动到advance模式(14.04是第二排的)按enter进入后,选择recoverymode切换到rootroot@use…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号