比特币与区块链的大众科普文

后传

不少朋友看了本文后,有一些不理解的地方,为了保持原文,我把问题解释以及勘误附在了最后。若是尚未看过本文,请跳过这一节。若是看过了本文,就直接跳到本文最后的”问题解释“那一节。这个”后传“很有C语言if-goto的味道...程序员

前言

本文相对稍微长一点。
        近日不知道为何,区块链从新又火了起来,自2013年结识这个概念到如今已经4年了,最近因为你们都在聊这个,我也就想参与进来,然而我发现这是一个很难学习的东西,我一直不明白为何就没有人能把区块链的技术讲明白,无论是各类博客文章,书籍以及知乎上那种带有抑扬顿挫感的装逼文,目的都好似在说区块链技术多么牛逼,多么难,而做者本身学会了,从而印证做者多么牛逼,多么牛。这些资料看完以后,不少人都会以为这彻底就是一个新的领域嘛...搞IT的看不懂,搞金融的看不懂,社会评论人也只是知道个大体思想...
        后来我仔细思考了这个问题,区块链技术难吗?其实不难,我发现区块链里面全部的组成元素都是现有的东西,在《 技术的本质/》一书中,做者提到组合现有的技术会出现多么使人惊奇的事情,确实是这样,区块链就是这么一件使人惊奇的事情。那为何区块链以及构建于其上的比特币看起来如此的晦涩?Why?
        答案很简单,无论什么东西,哪怕再简单的东西,只要一跟互联网联系起来,基本上90%以上的人就以为是是高科技了,若是再跟非对称加解密,哈希技术联系起来,这些人中有一半要望而却步了(区块链技术使用了密码学这种让人膜拜的学科...),而后,金融,金融,金融,这又是跟金融关联的,又有一半的人退出,现在难道不是金融和IT最火爆吗?最火爆的难道不是门槛最高吗(谁这么告诉你的??)?最后,关于比特币,区块链的好资料是有的,但都是国外的,国外的东西都是英文的,剩余人中又有一半英语很差以为beyond their ablity了...最后的最后,即使你的英语不错,前提是你能Google么?你能Youtube吗?好了,最后不剩几我的了。总结来说,想快速理解比特币区块链的技术原理,你须要IT,金融,英语,翻一座伟大的墙,又是跨界又是重体力活,这就是它不易理解的缘由。

        我终于想写一篇关于比特币区块链的文章了,今天生病请假休息,跟老婆(日语文学硕士,不懂金融,不懂IT,但也不是一点也不懂,稍微懂一点)讲讲比特币,个人原则是,只要她能听明白,我就写出来,因而拿着本子画了几个图,讲了几句,而后老婆居然懂了!个人讲法比较特殊,我没说什么哈希函数,ECC之类的东西,我敢说一说那个我估计就讲不下去了,我用指纹,带锁的存钱罐来代替这类概念,没想到还挺成功。如下是我讲课的手稿拍摄图:算法



本文主要是把给老婆讲比特币的内容写出来。但愿对别人也能有所帮助。在我看来,比特币仅仅须要三大构件便可,包括一个基础构件即P2P网络,另外两个核心构件包括一张交易网和一条区块链,我不会在文中一开始就扯这两个概念,而是慢慢引入,至于基础构件P2P网络,我甚至通篇没提到。

首先明确要解决的问题

首先咱们看一下基于货币的交易过程(相对于以物易物来说)须要哪些必需要作的事情:

1.交易是否可行

这个问题就是在问,交易前,你有没有足够的钱来进行此次交易,即必需要保证你有钱。

2.如何证实交易是有效的

这个问题就是在问,交易后,如何防止这笔钱再进行另外一笔交易,即必需要保证钱花完了就没了。

基于纸币的交易可行性

咱们先从纸币交易开始讨论,而后再看下银行转帐,最后切入到电子货币的交易。
        在咱们平常的纸币交易中,这两个问题几乎不是问题,由于纸币是物理的,且不可伪造,它拿在你手里就是你的,交给别人那就不是你的了,所谓的一手交钱,一手交货就是这个道理。固然,搞IT的人较真儿成本很是低,就说什么纸币也是能够伪造的,但面对这种挑战和质疑我不想搭理他们,只想问一下,你制造一张一元钱的纸币试试??我放话,你能一分钟内制造一张一元的纸币且不被防伪措施认出来,我一次性给你1万元真纸币,币种为人民币。
        对于银行转帐而言,好比你在ATM机上转帐,没有任何物理物品的交易,只是在按键上按捺一些数字,好像问题变得很难。可是因为有了银行这个机构,问题彷佛也能很容易解决。当你要给李明转帐1000元的时候,这个消息会发送到银行,银行会查你的帐户里面是否有1000元的余额,而后查询李明这个帐户是否存在,若是一切经过,银行会在转帐前锁定你的帐户,这意味着在转帐完毕前你不能用这个帐户进行任何交易,而后将钱转入李明的帐户,最终在解除锁定前,你的帐户中会少1000元,而李明的帐户中会多1000元,这个过程很是容易理解。
        如今进入电子货币的时代!
-------------------------

电子货币状况下如何证实你有足够的钱交易

全部的电子货币交易在网络上只是一系列数字的传输而已。如今问题来了,在数字信息能够随意复制的前提下,如何来证实你有足够的钱能够用来交易?
        让咱们回归本源。来在网络上模拟一下纸币的交易。
        当咱们用纸币来交易的时候,其实咱们无心中构建了一个交易网。考虑到从ATM取款,支付宝,微信支付会让事情变得复杂,我假设工厂,公司都是以现钞来发工资,全部的交易所有是现钞进行,那么对于每个人而言,当你花钱的时候,你手里的钞票必然是另一我的给你的,而不是你凭空制造的!你没有能力凭空让钞票产生,这一点很是重要(不要相信程序员眼中那无所不能的技术,好比3D打印什么的,太书生气。直接点说吧,印假钞对于咱们99.99%的平民而言,几乎是不可能的!)。
        那么即使你买个鱼缸和牛肉,交易也会像下面的样子造成一张网:




这实则就是一张网啊。之因此咱们平时不会注意这张网的存在彻底是由于钞票拿在本身的手里而后交到别人手里,一张钞票在本身手里,你可能会担忧别人会抢走它,由于钞票是匿名的,谁占有它就是谁的,因此会有抢劫的,也所以国家会立法把抢劫定为重罪。若是咱们忽略央行,忽略国家,那么这张交易网就是彻底理想的交易网。假设货币的总量
是固定的,而且咱们历来不把钱存入银行,也历来不从银行贷款,仅仅是用纸币来交易,那么就不会有通货膨胀,也不会有次贷危机...咱们不须要银行为咱们保有余额,咱们只须要知道本身可否进行当前的一笔交易就好了。
        若是不考虑抢劫,不考虑国家的干预,那么以上这张网就是完美的!没有什么人或者机构能够彻底控制这张网,这张网会天然伸缩,其形状和伸缩速率彻底取决于供求关系。好的,咱们如今要在互联网上重建这张网!用电子货币代替纸币。
-------------------------
先看下这张网有什么特色呢?
0.货币的总量是必定的(我已经假设能够忽略央行滥印钞票);
1.对于花钱的人,每一笔花出去的钱都要有一个肯定的来源;
2.对于收钱的人,任何发给本身的钱均可以无条件接收;
3.若是你的一笔钱花出去了,就不能再次花出去。

以上的两个特色能够把每一次的交易结果抽象成一个交易单,以下图所示:




很是清晰的一个交易过程。在物理世界中,纸币是一个物理实体,不可复制,不可伪造,在谁手里就是谁的,这很容易理解,自从有了交换以来,咱们的世界也一直都是这么运行的,问题是,在基于数字技术的互联网虚拟世界中,如何构造这张交易网?!
-------------------------
首先来看看这张网是什么样子的?




-------------------------
请注意,这张网是全部人一块儿构建的,涉及到参与电子货币交易的每个人,这个和纸币交易网是彻底同样的,在纸币交易中,因为纸币的物理属性,这张网是惟一的,在数字世界,咱们又如何来保证这张网的惟一性呢?这貌似是不可能的,然而试想若是每一次交易都让全部的人都知道,最终你们是否可以创建共识呢?而这种共识的输出就是这张惟一的网。固然,若是有个别的人不接纳某笔交易,那也无所谓,只要大多数人产生共识能继续相信这张共同的网能够继续膨胀下去便可继续交易下去。
        每当发生一笔交易,所有全部的人都会被通知到,所以若是你”凭空造出了一些货币“,那么几乎全部人都不会承认,所以你的这笔交易便不会被归入到交易网中,这种欺骗以下图所示:




若是你透支本身当前拥有的可用货币,那么别人也不会承认,这笔交易也不会被归入到网中,以下图:




其实,你把比特币当作互联网上的”纸币“便可,为了消除数字信息可复制性带来的影响,须要用全网的共识来替代物理属性的真实。在数字网络中,你本身复制一份信息是没人知道的,可是全网的信息总量是必定的,若是你复制一份信息,虽然没人知道究竟是谁复制的,可是能够知道的是,确实多了一份信息,这就是达成全网共识的重要性。

        问题到此貌似所有解决了!只要全部人达成共识,那你的任何行为都不可抵赖,就这么简单。在电子货币领域,所谓的共识就是一张几乎全部人都承认的交易网络,你们都承认它,那它就是可信赖的。

电子货币交易的不可抵赖性

在宏观上,我已经展现了这张交易网是什么样子的。可是在细节上,一我的到底应该怎样付款给另外一我的的呢?怎么证实付款者就是其本人呢?
        若是人们能够用笔在每笔交易上签署个我的签名或者按一个本身的拇指纹的话,问题就能够解决。事实上,在电子货币领域,问题就是这么解决的!
        接下来咱们看下若是A付给B一些钱,怎么证实这些钱就是A付给B的,而不是A'付给B的。
        感谢数学,感谢有了非对称加密技术!这项技术理解起来很是简单(虽然它的数学过程会很是复杂),即你有一对密钥,一个是私钥,不管什么时候何地都只有你本身保有,另外一个是公钥,能够公开给全世界。这对密钥的特色是:
设Pub为公钥,Pri为私钥,一段消息M用Pub加密后有且只有用Pri能够解密到M,反过来也同样,有且只有用Pri加密后用Pub能够解密。
用户A能够把本身的公钥PubA公开给全世界,当其要付款给B时,用本身的私钥给付款消息进行加密(术语叫作签名),而后B收到消息后,用A的PubA对消息进行解密(术语叫作验签),便可以证明是否付款消息来自A:




这就解决了谁是付款人以及确认收款人的问题。
        到此为止,从宏观到细节,咱们都有了大体的轮廓,看起来问题真的所有解决了。
        可是咱们真的把全部的问题都考虑到了吗?
        试想下面的一个场景,我要向温州皮鞋厂买一双皮鞋,我付钱给了皮鞋厂老板,他很快收到了个人电子货币,然而同时我又把同一笔钱付给了西装厂老板,间隔一段时间后,我才将这两笔交易通知给全部人,而此时两位老板均已经收到了个人电子货币并分别寄来了皮鞋和西装,然而随后当你们均收到了个人两笔交易单,来自同一笔钱,那么究竟是买西装有效仍是买皮鞋有效呢?无论哪一个有效,总之,皮鞋厂老板和西装厂老板总有一个要损失。这就是问题。这是一个交易发生和交易核对的时间差问题。
        问题就是,怎样才能证实一个交易已经生效?
-------------------------

一笔钱花屡次的问题如何解决(双花问题)

到此处为止,我一直努力尝试用非技术的话来阐述一个很技术的话题,为了让技术人员看到这里不以为我在扯淡,我这里插一句,区块链的设计很是相似Linux内核中两阶段可睡眠的RCU锁的设计,二者整体思想是彻底一致的。RCU中最终Update的时机就是全部进入Copy前的Reader所有撤出的时机,采用两个阶段的递减计数器,靠计数器变为0来触发阶段性Update任务的提交确认,这个正和区块链靠把交易单囊入区块来提交确认是一致的。
        回到交易确认问题。在时间的流逝方向上,构建了一个接着一个的区块,每个区块囊括了一些交易单,全部被区块囊括的交易单便被认为是有效的交易。而没有被区块囊括的交易单怎被认为是暂时没法确认的交易单,须要继续等待其被区块囊括:




在上图中,交易单a-i均已经被区块囊括,所以这些交易单是能够100%被信任的,然而交易单j-p则是游离的交易单,没有被区块囊括,因此它们是未被确认的,全部的交易者必须等待本身的交易单包括在区块中,才能够认为这笔交易是安全的,不然即可能出现前面说的西装皮鞋的事情。如今的问题是,区块是如何生成并囊括交易单的呢?为何被区块囊括的交易单就必定是有效的呢?区块到底有何神秘之处呢?
        上图中任何节点均可以建立区块并链入链表中,节点A能够,节点B能够,节点Q也能够,问题是谁有这个能力。若是你们都有这个能力轻易生成区块,那么问题就成了到底信任谁的问题,彷佛这里成了一个圈,问题是不可解的,可是因为区块的巧妙构造,让这个问题的解法变得十分耐人询问。
        咱们看一下区块的结构:




能够看到,处处都是指纹。提及指纹,能够想到的是,它有认证的功能,有保证信息完整性的功能,由于每一个消息体的指纹几乎是惟一的,哪怕消息有微小的变化,其指纹就会发生变化,这意味着只要囊括进区块的交易单,是不容更改的,由于稍微改一点,指纹就会不一致,就会被查出来,这个想法很是好。如今来看,区块中的各个指纹是怎么生成的。
        当一个节点要试图产生一个区块并链入区块链的时候,它要作的是:
1.取出当前区块链尾端的最后一个区块的指纹,保存为M1;
2.抓取一批还没有被确认的未囊入区块中的交易单;
3.计算这些交易单的指纹,算出一个总的指纹保存为M2;
4.取出那个固定的指纹,保存为M3;
5.求解那个待填充的数字N,使得(M1,M2,M3,N)的指纹为M2。

是否是很容易呢?这个问题对于文科生来说彷佛太简单不过了,但是对于程序员来说,当看到第5步的时候,就爆炸了。换个说法来给文科生解释,即给定一个指纹,让你找出那我的是谁。这彷佛也不难啊,警察不每天在干这个吗?是的,警察每天干这个,但他们除了采集你的指纹以外还会登记你的身份证,住址等信息并关联起来啊。若是全世界人每一个人仅仅留下本身的一个指纹而后走人,如今有一个指纹,问它是哪一个人的,请问有什么好的办法能够快速定位?事实上,没有好办法,除非一个一我的去比对,固然,咱们排除掉地理位置因素,姑且认为每一个人天天都去一趟月球,而后这个指纹是在月球发现的吧。
        生成一个区块,也要解这么一个难题,除非你有强大的电脑而且有钱交电费作这种无聊的事情,不然仍是不要往本身身上揽这种活儿的好啊。若是你真的有兴趣作这个工做,那么你的电脑将不停地下面的工做:
fingerprint(M1,M2,M3,0)等于M3吗?哦,不等于!
fingerprint(M1,M2,M3,1)等于M3吗?哦,不等于!
fingerprint(M1,M2,M3,2)等于M3吗?哦,不等于!
fingerprint(M1,M2,M3,3)等于M3吗?哦,不等于!
fingerprint(M1,M2,M3,4)等于M3吗?哦,不等于!
fingerprint(M1,M2,M3,5)等于M3吗?哦,不等于!
fingerprint(M1,M2,M3,6)等于M3吗?哦,不等于!
....
fingerprint(M1,M2,M3,852042125687985453212)等于M3吗?哈哈,等于!!!

这多多少少有些运气因素在里面,事实上也是,就像买彩票同样,你能够将这活儿当作赌博,有时会天降大运,然而实际上更多时候,这就是一个蛮力活儿,所谓的重体力劳动!虽然体力的消耗再也不是人力了,而变成CPU了...只要你算出那个数字N,把N填入你构造的区块N的占位符那个位置,就能够把区块挂入到当前区块链的尾部并通知全部人你又确认了一组交易单了!!是的,确认又一组交易单成交,这就是作这件事情的意义。但这个意义重大,若是交易没法确认,就不免会出现西装皮鞋的问题,整个系统就是不可用的,要想让系统变得可用,就须要这种彻底的确认机制。
        前面说过,这是一件十分消耗CPU体力又十分无聊的活儿,谁会去干?!答案是每一个人都想干,由于会有收益!
        看看《闯关东》了解一下淘金就会知道,淘金这绝对是一件重体力活,开山,涉水,细筛...然而回报颇丰,由于你挖取的货币啊!因此说对于电子货币而言,当你完成了一个区块的生成以后,会获得一笔电子货币,你叫比特币也行,叫什么都行,反正就是你们都承认,可流通的,上面图中交易单里可转帐使用的货币了。能够把整个未确认的交易单看做是矿上,你生成区块的过程就是在淘金,在挖矿。如今你应该已经知道什么叫传说中的挖矿了。
-------------------------

区块链技术如何避免攻击

有了这个区块链机制,咱们再来看一笔钱买了皮鞋又想买西装的问题:

1.同一个矿工一个批次抓取了皮鞋西装两个交易单

假设某个挖矿成功的矿工一把同时抓取了买皮鞋和买西装的交易单,那么它在验证后抓取的那个单子时,姑且认为是皮鞋单子吧,它会看到这笔钱已经买过西装了,故会把皮鞋交易单做废:




2.在不一样的批次被相同的矿工抓取两个交易单

这个状况更好理解,后一个批次抓取的那个会做废,理由同上。

3.同一个批次不一样的矿工同时解决了指纹难题,一个抓取了皮鞋交易单另外一个抓取了西装交易单

这个问题有点棘手了,在不一样的地方看,区块链彷佛是不一样的,假设两面矿工分别为A和B,那么A和B两个矿工看到的区块链分别是下面的样子:




究竟是西装仍是皮鞋??4号区块后面到底该是a区块仍是b区块呢?这确实难以抉择,而且A和B均会通知全部人本身的区块链是对的,在大多数的其它节点,你们会收到这样子的区块链:




懵圈了不是?发生这种状况,不要急着抉择皮鞋 OR 西装,而是继续等待下一个区块的生成,无论是哪一个矿工,下一个区块生成后它不是连接到a,就是连接到b,连接到哪一个,那么就以哪一个为准并把另外一个区块已经囊括的交易单子释放,假设矿工C生成的区块c连接到了a,那么区块b将会废掉,同时西装交易单也会被从新释放到未确认交易单中,这样当它下次被某个矿工抓取到时,能够直接验证失败取消交易并做废:




若是刚好又有两个矿工c和d同时完成区块的生成呢?好比c看到的是a,d看到的是b呢?好吧,这种状况确实几率极低,但也不是不可能,发生这种状况就再等呗,直到两条子链长度分出胜负为止!最终的收敛是必定的。

4.买皮鞋西装的坏人本身改区块链

刚才说过,区块链在发生分叉时以最长的那个子链为准,那么攻击者是否是能够本身构造长子链呢?理论上是能够的,全部计算机能完成的工做,都是step by step,咱们来看下构造这个玩意儿的具体步骤,稍微改一下场景,贪心者再也不同时买皮鞋和西装了,而是分两次,第一次,他先买了皮鞋,同时本身默默构造一条更长的子链,待皮鞋老板发货后将这条子链通知出去,把钱退给本身,取消皮鞋老板收到的钱,而后再用一样的策略买西装。先看下构造好后的效果:




看上图,这是可行的,咱们把区块放大,看看构造这个长链的具体工做:
1.针对X1,解决上面提到的那个fingerprint难题;
2.针对X2,解决上面提到的那个fingerprint难题;
3.针对X3,解决上面提到的那个fingerprint难题;
...

取决于攻击者想构造多长的链,就要解决多少次fingerprint难题,鉴于一次解题的成本,浪费大量的电费,时间,为了一双皮鞋,值得吗??攻击者能作的仅仅是把买东西的钱退给本身,他几乎不能修改别人的交易单,由于全部的修改操做必须通知全部人,若是改了别人的交易单,别人是不会承认的,毕竟没人想给攻击者转帐汇钱,这意味着,即使仅仅是想不花钱穿皮鞋,攻击者也必须默默进行上述N次的fingerprint难题求解,由于一旦他把X1通知出去了,皮鞋厂老板知道了也就不会发货了吧...
        也许你会以为,有这么麻烦吗?难道不能仅仅修改攻击者到皮鞋老板的交易单就成了吗?将收款人改为本身不就行了吗?其实否则,咱们看下图:




无论怎样,为了构造子链,花费大力气去计算若干个fingerprint难题是必不可少的,取决于你要构造的子链有多长!
        所以,为了一双皮鞋或者西装,这样作是不值得的,若是是为了一座房子,可能值得,可是在你雄厚的计算资本以后,不是还有法律的吗?
        到此为止,我把攻击者的攻击场景也描述了,结论就是,攻击者只能攻击本身的交易,即使如此也要消耗巨资电力,这里没有算法的问题,由于没有任何算法能够快速解决那个fingerprint难题,若是出现了这样的算法,那意味着必须出新的难题,总之,就是要让解题的成本大于攻击的收益。
-------------------------
咱们知道,银行里没有警察,没有军队,只有几名保安,并且这些保安还真不必定很能打,可是为何没有人抢银行,由于抢银行成本过高,是重罪!政府会追查到永远的,而且会面临被击毙,20年以上徒刑,无期徒刑,死刑等使人恐怖的结局,因此没人抢银行。若是说少数的那些抢银行的彻底是受制于冲动的话,那么攻击区块链就只能纯粹靠蛮力成本了,固然这里面有运气因素,若是你真的连续5次第一次猜就解开了fingerprint难题,那么你就能够不花钱穿一双温州皮鞋,但想穿第二双就很难!区块链里连保安都没有!哪怕你冲动了又能如何呢?

比特币区块链总结

以上讨论的电子货币就是比特币,这是一种特殊的电子货币,和以往的电子货币彻底不一样。区块链是比特币的底层技术。根据本文最开始绪论,我说比特币最核心的就是三大构件,P2P网络,一张交易网,一条区块链,在整个比特币系统持续运转的过程当中,发生着下面的事情:持续性的挖矿行为促使一个个交易子网持续性的归入到某个区块,该区块接入到区块链中。该过程以下图所示:




--------------------------------
其实区块链技术还能够构建更多好玩的东西,好比目前我正在设计的一个日志系统,另外,在物流,资源调配等领域中也能够使用区块链这种底层技术。上文中,我根本就没有提到P2P网络,加解密算法等,这些都是底层具体的实现技术,与思想无关。
        在继续讨论我对比特币区块链的形而上见解前,我想大体列一个有关比特币的技术提纲,指示比特币使用的底层技术,可是,仍然不会细讲。

1.P2P网络

我前文一直提到把交易单通知给你们,怎么通知的呢?就是使用P2P技术。咱们比较熟悉的电驴,迅雷下载使用的就是P2P下载,这种下载的风格是,文件切成小的片断,每一个主机上只存一份,而后每一个主机同时上传和下载。具体的思路请看个人《 为何P2P模式下载的人越多速度越快,为何P2P伤害机械硬盘》。
        在比特币的场景下,咱们知道有两条链,一条是交易链,一条是区块链,多条交易链造成一张完整的交易网,这张交易网维护着货币的属主信息,而区块链则维护者交易的有效性信息,无论是交易网仍是区块链,都必须让全网都承认才能达成共识,造成信任。所以这张交易网和这条区块链就是经过P2P网络广播到全网的每个节点的,理想状况下,每个节点都会有这张交易网和这条区块链。但实际实施中,并不是如此理想,老是有一些优化,这里就再也不赘述了。

2.非对称算法与比特币钱包

非对称算法的发明绝对是一个创举,这里再也不赘述这类算法的细节。对于比特币场景而言,因为每个人均可以随意生成一对密钥,其中公钥的意义让其十分适合作钱包的地址,举个例子来说,公钥就至关于一个存钱罐,而私钥则至关于打开存钱罐的那个钥匙,谁均可以往存钱罐里放钱,可是只有本身能够把里面的钱取出来。
        比特币使用的非对称算法是ECC算法,这个算法相比RSA而言,一样的加密强度所须要的密钥长度要短不少,ECC单位安全强度很高,这特别适合内存受限的嵌入式环境。

3.哈希算法,摘要算法

这个要说的是,就在前段时间2月23日,Google公布了一例SHA-1碰撞的实例,若是这个实例发生在比特币当前的交易网或者区块链中,将会有多少利用的方案呢?

4.比特币的匿名性

因为在比特币环境中,对于收钱的人,任何发给本身的钱均可以无条件接收,那么只须要随时生成新的公私钥对,而后公开公钥做为钱包收钱便可,这样就使得交易轨迹很难被追踪了,这也在必定程度上保证了匿名性,就像你使用的是人民币同样。可是比特币也好,人民币也罢,都不是真正彻底匿名的。对于比特币而言,意思是说,你能够随时随地建立本身新的钱包来收钱。

5.若是构建数学难题

计算的结果集必须是一个均匀的分布,只有这样要想获得特定的答案,就必需要一个数字一个数字的猜。这就意味着没有投机取巧的方案,除了遍历,没有什么算法能够利用。所以,一个逆哈希的过程将会是一个合适的难题,前提是哈希函数必定要好,哈希结果分布必定要均匀。

6.比特币的生成

首先有一个初始的创世区块确认了一笔从天而降的初试交易额,而后由这笔钱开始交易,其他全部的新产生的比特币均产生于挖矿。相似于物理世界的淘金,比特币挖矿也有挖完了的时候,按照设计,每过4年挖矿所得就会减半,这样最终确定会把比特矿挖空,此时世界上的比特币总量就是2100万个!这个和黄金特别类似。金矿在地球上的黄金储备量是一个定值,因此说黄金的总量必定有一个上限,黄金自己不会通货膨胀,引起通货膨胀的是与其直接挂钩的美钞,关键看1美圆怎么定义,是一美圆的含金量为0.888671克黄金呢?仍是说一美圆的含金量为1.888671克黄金,这对世界的影响绝对不一样,这就是不雷顿森林体系的弊端。看看比特币的状况,虽然比特币自己的数量是固定的,可是它的基本单位却能够几乎无限向下分割的,好比即使总量只有1个比特币,仍是能够用0.0000000000001做为比特币的基本单位来主导支付,关键看名字怎么叫了。所以我以为,说比特币是一种紧缩货币是不正确的,该出问题的时候仍是会出问题。
        实际上,世界上根本就没有真正正确的金融体系。
        如今说一下当比特矿挖完了后,新的比特币再也不产生,矿工们靠什么激励继续去解那些fingerprint难题,很简单,靠交易手续费。若是还想让比特币系统继续运转下去,那就在交易的时候付给别人足够的手续费,这样别人才会解决fingerprint难题从而帮你将你的交易囊入区块造成共识。

7.如何确保比特币交易绝对安全

没有绝对的安全!囊入越新的区块的交易越不安全,由于攻击者须要解决的fingerprint难题越少,到底等待几个区块才确认交易完成是合适的呢?并没有定论,简单点说就是交易的金额越大,越值得你多花点时间来等待更多的区块被挂入区块链以保证安全。

8.区块链技术和PKI有何本质区别

这是温州老板问的,区块链不就是解决认证,完整性,不可抵赖这种问题的吗?PKI体系不是已经很成熟了吗?然而并非这样。PKI须要一个信任中心,而区块链彻底靠技术解决了本应该须要人介入的问题。我反问,要是根CA里工做的人都是坏人或者别人策反了怎么办呢?它签发的证书还能够相信吗?即使不是根CA,随便一级的CA被策反,它下面的各级CA签发的证书均将失去信任。然而区块链是一种共识机制,相似议会的投票,除非你动员半数以上的议员一块儿搞事儿,否则仅靠你本身,就算你把总统绑架了也不行,由于总统说了也不算。以上就是个人回答。此时王姐姐表示区块链网络中若是大多数是坏人,就能发动所谓的51%攻击,而这种动员,在中印等国家很是容易,每人每家一台电脑,组成全国性的集群,这个运算能力怎么样?一块儿干点什么不是很容易吗?上面一声令下便可。是吗?
        个人回答比较短,我说这样作没有意义,等于说同归于尽,区块链上的比特币将再也不被信任,体系将会完全被摧毁,谁也没收益,相反你们都会有损失。

        其实这就是为何51%攻击迟迟不会发生的缘由吧...安全

9.挖矿能力的集中

本初,每一个几点用CPU共享均等的挖矿能力,逐渐,挖矿能力开始拉开差距,从CPU挖矿到GPU,FPGA,再到专业的ASIC芯片,在利益的驱使下,本应该平摊的挖矿能力逐渐集中化。这是否跟社会主义贫富分化是一个道理呢?微信


10.如何快速验证交易单的数据完整性

其实,区块中的比特币的交易单哈希并非叠加在一块儿计算的,而是组织成了一棵树,叫作Merkle树,它的结构很是简单:网络



这么作的目的在于能够快速进行完整性校验操做。校验从根部开始进行,按照二叉树的时间复杂度O(logn)进行,最终的校验失败会把出问题的交易单范围局限在某个子树上。在空间利用上,因为每个节点实际上并不须要传输整个交易网和整个区块链,这种只校验HASH的方式也会减小数据的传输量,特别适合广播频繁的比特币P2P网络。
函数

我对比特币的态度

注意,我对比特币的态度并不意味着我对区块链的态度与之相同。
        我在2012年末的时候首次据说了比特币,说来惭愧,当时所在的公司主导业务是PKI以及加解密,而比特币的技术细节里用到了那么多的此类技术,我居然到2012年末才首次据说...
        不过到了2013年,当同事们都在热议比特币的时候,我对它的反感也就油然而生了,由于我是一个超级不喜欢炒做的人,只要当前人们在热炒什么,我就讨厌什么,等到此概念的第二波风潮到来的时候,我再试着观察一下,再决定本身究竟是讨厌,仍是喜欢。
        如今,比特币已经运行了7年有余,我试着改变一下4年前对它的厌恶,我试着喜欢它...说实话,此次我真的挺喜欢比特币的,否则我也不会写这篇文章。其实早在2013年的时候,我就知道了比特币区块链的原理,但那时我并不想去写一个我及其厌恶的东西,因此直到本文以前,我几乎没有提到过比特币的概念。一样重量的另外两个热炒的概念是AI和SDN,AI就由于去年那场围棋,掀起了一股风潮,就连一贯思惟独立的罗振宇在跨年演讲中也不得不折服于AI那巨大的煽动力,说得好像《机械公敌》里场景立刻就到来了似的...对于SDN,我也是持消极的态度,虽说理念上很不错,但真的能撼动思科,华为,HP这些巨头厂商的垄断地位吗?是的,到时候你是用到了控制器,用到了专业的傻瓜式转发交换机,然而你会发现,这些设备上贴的仍是那两个中指(Cisco)或者那朵老菊花(华为)...
        比特币的创举在哪儿?在去中心化!然而中心化真的有那么糟糕吗?我我的认为,比特币的去中心理想虽然好,但很难实现。
        其实,对于人类文明而言,中心化是一个收敛的趋势,你看看那些比特币矿池,不都是违背了去中心化的初衷了吗?虽然按照博弈理论,矿池的算力老是会无限趋近但不会超过50%,但即使达到全网算力的30%,也就有了足够的话语权和控制权,事实上,人们广泛须要一个核心。去中心化就跟仇富心理同样,表示的并非一种理想,更多的是一种抗争。这不,在比特币区块链去中心化的同时,那一边的SDN不是正在搞中心化控制器吗?拼命搞北向,南向接口,东西向接口却发展乏力,这正是在走向中心化。懵圈儿了不是?
        在任何领域,都不存在去中心化的例子,人类历史10万年,经历了一个又一个从一个中心到另外一个中心的平移或者转换,但历来都没有去中心。
        我来用世界历史和地缘政治来讲一个观点,如下的文字来自于我对日本留学读博士的弟弟的一则朋友圈评论。
        欧洲中心论和华夷秩序都是某种中心主义,其背后都有经济基础,欧洲中心论的欧洲是交换中心,事实上欧洲是在大航海以后抢了伊斯兰交换中心的地位,而华夷秩序的经济基础则是在于中国做为分配中心在起做用。如今来看伊斯兰问题,其实他们也是但愿作交换中心,去跟西方抢夺曾经本属于他们的东西。中东地区几千年来都是南亚,中西亚,北非,欧洲的交换中心,在几千年来里,地理中心每每就是交换中心然而美洲归入交换体系后,地理上的中心必然西移到欧洲,这个区域东到新疆,西到夏威夷,若是你仔细观察一下ISIS本身YY的地图,其实很容易看出,它们想要的地方就是重新疆到东欧以及北非,南亚,中亚,西亚这片历史上的交换网络。东亚东南亚因为地理隔绝造成了另外一种秩序,就是华夷秩序,这个区域相对小,内部彼此不是那么易接近,民族相对单一,且气候类型少,不易造成交换网络....然而即使没有交换中心,也并不意味着这些区域就是老死不相往来或者绝对平等共产的,这里会造成另外一种中心,即分配中心,这个在网络上叫作星形拓扑,古罗马王政和共和国交替的那个年代,对于意大利半岛上军事同盟的改组就是将平等共产的星环状拓扑改为了纯星形拓扑,罗马共和国曾经也是一个意大利半岛的分配中心。【后面的与本文无关,但仍是引入:无论是哪一种中心,现在当这个具有分配中心的东亚东南亚子网归入整个交换网络的时候,其效率上的优点便逐步体现,是为文化熏陶,或者叫作癌细胞扩散也能够。照这么说,中国搞很差真能崛起,虽然我一点都不但愿事情会这样】
        虽然我说的并不必定对,但至少也算能自圆其说了,个人观点是无论以那种方式去了中心,最终都仍是会收敛出一个新的中心。
        比特币区块链的另外一个问题在于资源的浪费,不只仅是PoW这种挖矿资源,还有更多的存储资源,带宽资源,目前一个区块要10分钟产生,且随着交易量的愈来愈多,对效率的要求愈来愈高,P2P网络的广播开销,存储开销,挖矿开销将会快速增加,最终的效果就是二氧化碳的排放,有报道说,一比特币等于1.6吨的二氧化碳,这么作的目的仅仅是为了一种所谓的去中心理想,而这种理想如我前文所述还很难实现,这么作到底值得吗?其实,我却是以为各类的政府和央行有点多虑了,打压一个新生事物是不对的,若是能利用其自身的缺点任其衰微,至少也能在道德上站立妥当吧。若是这么说的话,中本聪大可大摇大摆走到前台,像乔布斯那样在发布会上出尽风头,没必要担忧扰乱金融秩序而被逮捕或者招来杀身之祸了。
        无论怎样,比特币以及其底层的区块链技术,在技术思想层面上绝对是一种创举,但并不意味着必定就能够短期内取代各国法订货币成为通货,利用相同的思想,你们倒不如想象一下区块链技术还能用在什么其它的方向。
        不过在否认比特币对传统金融系统的颠覆以前,须要给它点时间,就像飞机刚刚上天时曾摔死过制造者同样,任何新的东西刚出来的时候,老是有能让人诟病的星星点点,可是事情老是会过去的,如今坐飞机基本成了身份的象征,不再用怕摔死了。近些天,无人驾驶汽车也是接连出事故,但这并不意味着无人驾驶技术就要被否认,它也一样处在一个刚刚起步的位置,我想等用不了多久,当你看到居然有人在开车时,你也会不由惊讶,居然还要有人开这辆车...由于迟早你也会习惯曾经新鲜被人诟病最终却取得胜利的事物的。想一想咱们的父母对智能手机的态度...

后记

已通过午夜了,本文通过将近四个小时奋笔疾书连同画图,终于写完了!其中确定有语言不通顺的地方和逻辑上的错乱,也不免的,毕竟没有打草稿和提纲,一鼓作气的东西,瑕疵确定是有的,但至少是”我纯手工制做“的东西吧。

        在写这篇文章以前,我在纠结是写成一篇大众科普呢仍是写成一篇技术科普。最终我决定写成大众科普,因此我通篇几乎没有列那些技术术语,可是,对于做文者而言,这种文章更是难写。写到ECC,RSA那一节的时候,我长吁一口气,有种释放的感受,憋死我了,总算能够写点本身懂的了,但意识到本文的初衷,立刻就打住了,不能扯技术,不能扯细节。还好,一直到本文结束,我恪守了文章开始时的承诺。学习

...
夜难眠,也不免。区块链


问题解释

1.在比特币网络里到底什么是钱?

首先看现实中什么是钱。现实中拿在你手上的真钞才是钱,至于股票,存在银行的钱,家里的黄金,你肚里的诗书,知识产权,房屋...这些都不是钱,这些只是有价值的可兑换成钱的东西,能够用来投资,但不能够直接流通(若是当事双方你情我愿,白送都有可能,好比送给小三一套房产之类的),即使是股票,交易的时候也要看当日当时的价格,以能够流通的货币做计价,而对于POS刷卡而言,它实际上扣除的也是你的货币计价,至关于替你完成了取真钞给你,你把真钞给对方,对方把真钞存银行这个过程。因此说,本文中所谓的钱就是能够立刻流通的真钞票,就是纸币或者硬币。
        那么看比特币网络中对应的钱是什么。这个还要从比特币交易网中去寻找。钱是什么呢?钱就是交易网中不被任何交易单引用的交易单上的”所得金额“:
大数据



至于说那些已经被引用的交易单,都是曾经花钱的记录,而不是真钱:
微信支付




花钱的过程就是交易单中”所得金额“被引用的过程。
        问题解决了。

2.怎么确认钱的归属?

每一张交易单上都会卡上两个戳,一个是收钱者的公钥,另外一个是付钱者的签名,代表这笔钱是谁付的,两个戳是纠缠在一块儿的,就像邮戳同样,会卡在邮票和信纸之间。比特币的公钥表明了钱包,而私钥指示谁付的钱以及谁能够花这笔新收到的钱:




3.修改一张交易单很难吗?

不难,很简单。可是修改了以后的交易单不会被确认。为何呢?由于确认交易单的过程是一个”挖矿“的过程,正文里讲过这有多么严格。

4.既然每一笔交易都完整记录,是否是反洗钱很容易呢?

是的!虽然记录每一笔交易只是在虚拟的数字世界里达成共识的一种手段,可是无心中为追查洗钱线索提供了便利,在物理世界,若是你拿用真钞进行洗钱犯罪,是很难被追踪的,可是大额的真钞又没有,只能经过银行,因此...        可是要知道,比特币世界里,交易是准匿名的,公钥表明你的钱包,也便是存钱罐,公私钥对能够离线生成密钥对,很容易就从新搞一个存钱罐,这种特性让追踪变得困难。可是因为交易单是完备的,除非这些钱永远不花出去(这就失去了钱的意义),不然经过大数据分析,仍是能够追踪到蛛丝马迹的。