初学区块链

初学区块链原文引自http://www.sohu.com/a/224495010_358377初学区块链区块链解决了什么问题比特币的诞生比特币的转账比特币的制造:区块链与挖矿公钥私钥钱包比特币之间的关系比特币——账本而已比特币转账——签名认证:hash算法区块、hash、挖矿区块链的形成及小总结双花问题2140年后,记账没有奖励了,系统如何进行区块链技术引领未来区块链解决了什么问题我们从区块链…

大家好,又见面了,我是你们的朋友全栈君。

原文引自 http://www.sohu.com/a/224495010_358377

区块链解决了什么问题

我们从区块链提供的解决方案去学习区块链。

区块链使人们找到了一个低成本解决信任问题的方案。

为了体会区块链的魅力,我们可以了解最简单的区块链技术版本,就是号称区块链1.0的比特币。因为转账系统是最直接需要彼此不信任的个体之间解决信任问题的应用场景,了解了比特币,也就能一窥区块链在解决信任问题中的魅力,也就能理解未来可能落地的应用场景。

比特币的诞生

话说2008年,正值美国金融危机肆虐全球,美国央行疯狂印钞票,导致通货膨胀。

央行所拥有的这种发行纸币的权力,令互联网极客很不满,他们喜欢互联网这种去中心化的机构,于是乎,中本聪横空出世,一篇奇文诞生了比特币。

奇文名字叫:Bitcoin:A Peer-to-Peer Electronic Cash System,中文翻译成《比特币:一种对等的电子现金系统》。Peer就是对等的人,Peer-to-Peer即不经过任何中间实体,咱们直接对话、直接操作,此所谓P2P技术(对等计算)。简而言之,在 P2P技术中,网络中的参与者既是服务器(Server),又是客户(Client),既是资源提供者,又是资源获取者。我们中国习惯上将Peer-to-Peer 翻译成“点对点”。

对等的电子现金系统,其实就是一套支付体系,它的目的就是要去中心化。那我们看看中心和点对点有什么区别呢?我们现有的支付体系是中心化的,体现在两个方面:第一,货币政策是由各个国家中央银行规定的,这就导致了可能的货币滥发,中本聪想要建立一个没有中心机构、并且规则明确的货币供应方式;第二,现有的支付体系是中心化的,比如说在淘宝上购物,钱是打进支付宝的,当我们收货以后钱再由支付宝打入卖家账户。支付宝所扮演的就是中心化的机构,因为买家与卖家彼此的不信任,必须要一个中心化的机构来扮演信用中心,大家都与信任中心发生联系,陌生人的买卖就实现了,淘宝成功了。但是这样做有两个缺点:一是信任中心权力越来越大,如果马云异想天开、给自己的支付宝账户多添几个零,我们能知道吗?二是,这些信用中心是要收费的,我们要为这种信用提供费用。中本聪想要建立的支付体系,就是要克服上述这些弊病。

所以比特币网络最重要的特点就是:去中心化、公开透明,从技术上解决点对点的信任问题;并且将比特币的总量恒定在2100万枚,从而避免可能的通胀。

比特币的转账

去中心化,意味着陌生人之间的转账支付是直接进行的,没有第三方提供信用担保,中本聪就设计出来了。

比如Alice要向Bob转账,注意两人互相不认识,毫无信任感,那如何直接转账呢?

在我们目前的具有中心的网络下,Alice向Bob转账100元,银行收到Alice请求,并检查Alice账户余额,如果大于100,便减少100,同时Bob账户增加100余额。所有人的账户都是非公开的,权力掌握在中心机构手中。

但在本聪的设计中,在一个去中心化的网络中,每一个用户自己都有一个账本,这个账本记录了从第一枚比特币诞生以来的所有交易记录,Alice要向Bob转账5个btc,会在村口喊一句“Alice要转账5btc给Bob”,村口居民张三听到Alice的声音,掏出自己的小本子,检验了一下Alice的账户,发现Alice有5个btc,便写下Alice向Bob转账5个btc。同时也喊出“Alice要转账5btc给Bob”,这样村民一传十十传百,直到每个村民都把这笔交易记录在自己的账本上。这样,每一个村民的账本都是一样的,这就是所谓的去中心化账本。在去中心化的网络中,刚才说的各个村民就是体系中的各个节点。这个去中心化的体系中每个节点的账本都是一样的,所以它几乎不可能摧毁。传统网路中,如果银行体系被破坏了,那么大家的账目就混乱了。但是在比特币网络中,每个节点都明确的记录了本聪开比特币以来的所有账目,即使节点几乎都炸毁了,只要还剩一个节点、就可以还原出所有记录,除非瞬间摧毁整个互联网。

我们要记住,在去中心化网络中,所有人都是不可信任的,这是我们的前提,上述例子中,居民自发记账,有没有可能记错呢?当然可能,张三如果跟Alice有仇,给人家肆意篡改,到时候我们该相信哪个账本呢?在大家都不互相信任的体系如何做到这点呢?首先要做的是要先验证这条消息是不是Alice本人发出的,这里用的办法就是签名,Alice广播这条信息的时候要在信息下签个名,当然网络上要数字签名了,大家收到这个信息以后要对照一下字迹,发现确实是Alice发送的,就承认这条信息是真的,验证数字签名的算法叫椭圆曲线数字签名算法,是一种非对称加密算法。

什么叫非对称加密呢?那要先明白啥叫对称加密。在传统的对称加密过程中,比如我要传递一个秘密数字给佐尔格,加密方式就是给这个数字加上33。当然佐尔格要知道这个加密方式,当他看到写着223这个数字的纸条的时候,他就会用223减去33,等于190。这个190就是我想传递给佐尔格的数字。这种加密方式的关键在于、双方要实现约定加密方式,但如果事先无法约定怎么办,或者这种加密方式被敌方所窃取或者所破解了怎么办?这就是我们在很多谍战片里的情景,一旦密码本丢失,整套密码系统就完蛋了。

那么,有没有一种办法,即使对方知道了加密方式也破解不了信息?这个可以有,这就是非对称加密。

这个非对称加密要满足如下条件:有一个解密方式A与加密方式B,我要传递信息M,使用加密方式B进行运算,得到加密信息X=F(M,B),这个过程的好处在于,即使你知道我的加密方式B和加密后得到的信息X,你依然无法算出我的原始信息M,而原始信息M=F(X,A),即原始信息必须使用解密方式A算出。这里的A称为私钥,B称为公钥——意思就是私人密钥和公开密钥。

举一个非常简化的例子。你现在随便想一个三位数,但你别告诉我,因为怕被旁人听见,你加密后告诉我,你把你想好的这个三位数乘以91,然后告诉我最后三位就行了;然后呢?然后我就知道你想的那个三位数是多少了,办法很简单,就是我把你告诉我的最后三位再乘以11,所得到数字的最后三位就是你想的数字。

那我们试一下,假定你想好的数字是321,想把这个数字加密后告诉我,于是你用91乘以321,等于29211,然后你告诉我最后三位是211,随后我用211乘以11,得到数字2321,这个数字的最后三位不正是你想告诉我的321吗?哇塞,好神奇。

或许有朋友觉得,是不是碰巧了啊。你321这个数字太特殊了啊。Ok,我们再来一次。这回你想好的三位数是598,然后你乘以91,这个乘以91就是公钥;598乘以91=54418,其最后三位是418,所以你把418告诉了我。于是我拿出了我的私钥11,乘以418,得到了数字4598,其最后三位是598,不正是你真正想要给我传递的598吗?我乘以11就是解密的过程。此所谓:公钥加密、私钥解密。就算别人偷听到了你秘密告诉我的418、并且也知道这是经过公钥加密的——也就是乘以91了,但他只要不知道我的私钥、也就是不知道乘以11,那他看着418照样无法解密,只能看着418干瞪眼,无法破解出598这个真正信息。

这就是非对称加密的牛逼之处——“公钥加密,私钥破解”,而传统的对称加密就是加密和破解用的是同样的密钥,而非对称用的两套密钥——“公钥加密,私钥破解”。

此时此刻,估计有盆友觉得震惊了,为什么我一乘11,直接就解密了呢?因为91乘以11等于1001,任何三位数乘以1001的后三位就是三位数本身。

大家注意,刚才这个例子只是一个极其简单的非对称加密。人家比特币所用的非对称加密那是相当的复杂,叫什么椭圆曲线数字签名算法。我们在刚才的例子里面,我们只说了单向的公钥加密、私钥解密,比特币世界里的椭圆曲线算法更神奇,不但有公钥加密、私钥解密,还有私钥加密、公钥解密,私钥可以推出公钥,但公钥推不出私钥。有了这点公钥和私钥的概念,我们可以讲述一下比特币系统下Alice向Bob转账的过程。

你作为一个比特币的用户,自然会有一个钱包,这个钱包下面可以生成一大堆的地址和对应的密码,由用户自主选择一个,甚至每一笔交易都使用一个新的公钥(当然只能是收款),这样可以避免任何人对你的追查,如果你频繁使用一个公钥,这些交易记录大家还可以推出一些有限信息,比如频繁程度,额度大小等,可以对你的财富做一些推测,你的隐私会受到威胁。在比特币的世界里我们把钱包里的地址叫公钥,把对应的密码叫私钥。我们可以简单理解公钥就是我们银行卡账号,私钥就是银行卡密码。我们每一个人在比特币世界里可以有茫茫多的银行卡,而且每张银行卡并不与你本人任何身份信息绑定,这就是比特币的匿名性。任何人只要有这个私钥,也就是密码,就可以操纵对应银行卡,也就是公钥里的比特币。

现在Alice要向Bob转账5btc,Alice会把这条信息用自己的私钥加密并发送到Bob的地址,也就是Bob的公钥,其实就是Alice先使用Bob的公钥加密一层信息,把这条加密后的信息再使用Alice自己的私钥加密一层,这时信息已经被加密了两层,一层是Bob公钥,一层是Alice私钥。大家收到这条信息以后,会用Alice的公钥来验证加密信息是不是Alice发送的,其实就是用公钥解密了Alice这层信息,从而验证了这条信息确实来自于Alice,但是这条信息还使用了Bob的公钥加密,Bob再用自己的私钥对这条信息进行解密,也就是用自己的密码打开了银行账号,也就是用自己的私钥打开了自己的公钥。

理论上如果你找到了一个私钥,那么你就是可以操纵其余额的,因为私钥是可以推出对应的公钥的,然后你就可以像上述一样对这个地址的记录进行数字签名,相当于就掌握了这个地址。反过来说,如果你的私钥丢了,那这个地址上的整个钱也就消失了,你想申诉?申诉个nothing,整个比特币世界是去中心化的,就没有中心机构可以申诉。

早期有很多用户不知道其中厉害,还将私钥保存在电脑里,结果被黑客入侵,私钥被盗,其中的比特币就全没了。所以,千万不要把私钥存在联网的电脑。或许有人担心,既然私钥是随机生成的,那么有没有可能大家生成了相同的私钥呢?有可能,但这种可能性小到了只有零可以与其媲美,所以大家不用担心私钥重合的问题。

现在要谈另一个重要问题,就是如何验证广播信息的真实性。也就是Alice广播说她要给Bob转5个币,但有可能她在骗人,因为她只有3个币,怎么能给Bob转5个?对呀,如何确认Alice的话是真的呢?

如果要是有中心机构银行,那就好办了,就只要统计你的余额就好了;而比特币只储存交易记录,只验证这笔交易中涉及比特币的来源与去向,并不是对于你的余额进行检验。比如你要转账两枚比特币,这两枚的编号分别是1和2;系统并不关心你总共有多少枚比特币,而是检验编号1的比特币上次发送到了你的公钥,而且并没有再被发送出去,那这个比特币就可以被转账发送出去;编号2也同理,如果你只转账2btc,那么系统到此就判定结束了,如果你需要转账3枚,那么你就必须再援引一个btc的交易记录,我们说过,它记录了比特币诞生以来的所有交易记录,每一项资产和交易记录都是公开可查的!这就是公开透明的特点。别忘了,我们是与陌生人打交道,时时刻刻都是不信任。

事实上,Alice传达的信息中:我要给Bob转账5个btc。这5个btc都是有编号的,我们可以查这5个btc上一次是从哪里转到Alice这里的?这5个币有没有从Alice这里转走?如果都满足,那就表明Alice可以转走这5个币。所以比特币是一种去中心化的账本大家听出点意思了吧,比特币世界算你的余额,是算从你这个账户诞生开始每一笔收支,加减到现在你的正值,由于每一笔交易都是全网验证过的,每一笔交易的比特币都是有来龙去脉的,所以可以说它是相当安全的。当你在电脑上下载比特币客户端的时候,系统会一次性的下载所有交易记录,而且会验证一遍,一般需要一天一夜的时间,好麻烦啊;不过只要验证一次、就一劳永逸了。

比特币的制造:区块链与挖矿

想必现在大家都有一个问题?货币是各国央行发行的,而比特币是去中心化的,那谁来发行比特币呢?比特币是挖出来的,使劲在网络里挖,简称“挖矿”。到底啥是个挖矿呢?这里就必须要引入我们的主题概念——区块链。

在比特币的世界里,每时每刻,都会发生很多比类似Alice转账Bob的交易,把每十分钟内的交易记录打包在一起,就叫区块——block。把比特币一诞生就开始的所有交易记录都链接起来,也就是把这些区块连接起来,就构成了区块链——Block chain。

每十分钟的交易信息被打包记录,这就是一个区块;整个网络上的电脑都在抢夺这个区块的记账权利,谁抢到这个记账的权利,谁就可以获得这个区块创造出来的比特币。2009年,中本聪创造了第一个区块,被称为“创世区块”,其本人就获得了第一个区块奖励的50枚比特币,这也是比特币世界的第一笔交易记录,永远载入这个区块里。(每一枚比特币都是追根溯源有据可查的)。

所谓挖矿,就是抢夺记账权利,从而获得奖励,奖励就是比特币。为什么会有人不停的挖,因为比特币世界里每十分钟生成一个区块,哪个电脑抢到了记账权、构建了这个区块,哪个电脑就获得该区块的奖励,这就是挖矿。既然可以不停的挖,那比特币这种虚拟矿产就是“取之不尽用之不竭”的喽?NO,绝非如此,比特币的数量是有最高限额的——2100万枚比特币。所以比特币这种矿是越挖越少,中本聪设计的特别妙,就是每个区块的奖励每四年减半。我们刚说了,中本聪造出第一个区块的时候、获得50枚的奖励,四年后,就是到了2013年、奖励就减半了,2017年再次减半。所以当下每个区块的奖励是12.5枚比特币,等到了2140年比特币产量就将趋于0,从而将比特币的总量恒定在2100万枚。截止目前,网络世界已经创造出1500w枚比特币。

简而言之,挖矿就是抢夺生成区块的权利、抢夺记账的权力,也就是抢夺为全网服务的权力。一旦抢到这个权利,所奖励的比特币就写在得到的区块上,然后系统告知整个区块链的所有节点,获得全网确认后,这个区块便成为合法的新增区块,整个区块链又多了一个区块。

现在大家关心的是,既然那么多电脑都争夺记账权,那系统是如何决定谁来记账的呢?中本聪真的很本聪,他的设计是出一道很难的数学题,谁最先算出来,谁就创立了这个区块,谁就获得奖励。这个数学题就是hash算法。

公钥 私钥 钱包 比特币之间的关系

刚才说到比特币世界里的公钥和私钥。公钥就是地址,私钥是密码。公钥就是银行卡账号,私钥就是银行卡密码。所谓钱包就是一种电脑软件,它可以帮你生成一系列配套的私钥公钥,你可以随意选择一个公钥作为收款地址,并且使用配套的私钥继续使用它。比特币只有交易记录,所以你的每一个公钥上所谓的余额就是账本上显示的谁向这个地址转账了,私钥作为密码的作用就是可以援引这个公钥的交易记录并对其签名。一个公钥,如果没有私钥与之配套,那就不能对这个公钥进行签名,也就无法发送从这个公钥向外转账的交易记录了。

比特币的公钥是公开的,任何人都可以查看关于这个公钥的所有交易记录。也就可以知道这个公钥有多少“余额”;每一枚比特币原则上是可以跟随其交易记录一直向上追索的。不过这是这比较麻烦的,因为比特币的最小单位是10的-8次方。所以其来源可能会非常细小,但所有交易记录都摆在这里,谁想去追踪这些所有的细分的来源都没有问题。

比特币——账本而已

比特币——无影无形,我们可以将之想象一个账本,系统里每个节点都有的账本。这个账本记录了从创世到现在的转账记录而已,你的所谓财富其实就是每个条目一条一条的累计。账本的第一条是:创世区块,比特币系统转账给中本聪50btc。以后中本聪想要给别人转账,他就可以援引一下这条交易记录,证明自己接受过50个比特币,然后再写一条交易记录要把这个转给谁。明白了吗?整个比特币系统就是一个账本,没有任何实体支撑。

就好比小朋友之间拿一个本子写上Alice给Bob5枚可爱币,Bob给Alice玩一会游戏机。明天Bob又写上我付给Alice5枚可爱币,借她漫画书看一看。这中间没有任何所谓的可爱币,但是Alice和Bob煞有介事的写在账本上,而且二人都当真的时候,这可爱币就成真了。比如我们假设Bob账目上富裕5个可爱币,有一天Bob看上了同桌Tom的一根棒棒糖,但是Bob并没有现金支付。他就对Tom说,能不能把这根棒棒糖给我,我在小本子上给你记账5个可爱币。Tom说你有病吧?你拿个本子神叨叨的给我记录一下我就给你糖吃?Bob说,你别看这记一下,这条记录表明你就拥有了我的五个可爱币,你可以去找Alice借漫画游戏机,不信你去试试。Tom将信将疑的答应了,随后带着小本子去找Alice,在上面记录一条Tom转账5可爱币给Alice。Alice欣然同意,并借给Tom游戏机玩了一天。第二天Tom对Bob说,太神奇了!你这可爱币还有吗,能不能再跟我换一点?Bob呵呵一笑,这可爱币,看不见摸不着,就在这个帐本里。而且很遗憾,我并不能伪造,我收到的可爱币必须是别人写记录给我的!Tom小朋友并没有见到所谓的可爱币,但他似乎感受到了那个账本的魔力,好像真的就有像棒棒糖形状的可爱币藏在其中。

是的,比特币就有这个魔力,虽然只是个账本,但仿佛就是一枚一枚的金币。好了,大家现在应该已经理解了,比特币就是一个去中心化的记账,而且是公开透明的账本,任何随时都可以查账。

比特币转账——签名认证:hash算法

比特币是如何转账的呢?我们还是以Alice向Bob转账5个btc为例,Alice需要声明一下她要转账的这笔钱是哪来的,Alice可以胡乱声明吗?不行,因为她所声明的这些交易记录都会被检验,系统会自动对之进行核对,一旦发现有冲突就会拒绝这个声明。假设这5个btc分别来自两笔交易,张三转账2btc给Alice,李四转账3btc给Alice。然后Alice要写明,我将这5个btc转账给Bob。交易其实就算完成了。但是其它节点要对这个交易做两点验证:其一、这条信息是否Alice是所发,其二、Alice所声明的交易记录是否为真。后者比较容易,就是系统的自动核对。但前者如何进行?

具体流程是结合了第一集提到的的非对称加密和hash算法的。这个hash算法是只能验证不能求解,什么意思?我们举个简单的例子,体会一下hash算法的精神;比如根号17202这个数的后几位小数是9291430,系统只发送9291430这个数,有没有可能猜到是哪个数的开平方后的后几位小数呢?这就太难了。但也有办法,那就是穷举法,一个数一个数去尝试,说个最笨的方式,你就从1开始尝试,最后终于尝试到了17202,惊喜地发现,这位仁兄、的开根号、的后几位、就是9291430,然后你就很激动地告诉大家:这个数就是17202。大家一算果然是,你好牛啊,你是花魁啊!

咋样,这就是hash算法,它的加密规则是公开的,就是将原本的数字开根号取后几位小数,但你很难靠这几位小数推测出来原本的数字,唯一的方案就是暴力破解、穷举法,最终可以将原本的数字验证出来,这就叫hash算法。注意,刚才只是说的一个简单的例子,真正的hash肯定是很harsh的,是很复杂的,但都是这个气质。

现在我们把hash算法这个过程抽象为h,我们要加密的信息记为M1,则hash值为h(M1)。我们知道hash值是不能反推出来的,而且也不存在说另外一条信息M2,使得h(M2)=h(M1)。

Alice向Bob转账这个过程中,Alice要需要发送两部分内容:一是援引的之前的交易记录,二是此番Alice要向Bob转账的交易记录,此两者构成了Alice要向Bob发送的整体信息,我们将之记做M1,可以想象这些信息都已经数字化了,即便Alice和Bob这两个人也是以公钥或者说是地址来代替的,双方都是匿名的嘛;我们只是为了表达方便,才直接说成Alice和Bob,其实是Alice用她这个地址给Bob的那个地址转账。

如果Alice只发送这个整体信息M1,别人怎么确定就是Alice发送的呢?这一切必须要获得比特币世界所有人的认可啊。所以Alice在发送M1之前,还要对之签名。怎么签?签什么?那就是Alice要对整体信息M1 hash一下,你就可以简单地认为、对M1进行了开根号,然后得到最后三位是369,也就是h(M1)=369。然后我们以第一集所讲的91×11为例,Alice私钥为11,公钥为91。那么Alice就会把这个h(M1),也就是369乘上11的后三位059,连同信息本身发送出去。这就是Alice完成了数字签名。

Alice周围各个节点收到信息以后呢?首先使用Alice的公钥也就是91对这个059进行解密,也就是059×91=5369,取后三位还原出信息为369。然后再对Alice发送的原文信息M1进行hash,发现结果也为369,这不就验证成功了吗?这信息的确是Alice所发送的。

再略微展开一下,这里使用了跟Alice私钥配对的公钥,因为只有配对的公钥私钥才能解密,所以这个解密成功表明了确实是Alice发送的信息;其次,对Alice发送的原文进行了hash计算,发现也是369,也说明了Alice发送的信息没有被别人篡改。所以这些从哪里转来的又转到哪里去的信息确确实实是Alice发送的,然后大家再核对这些交易记录跟已有的账本是否冲突;如果不冲突,我们就确认了这条交易记录。即Alice的地址向Bob地址转账5btc这个记录有效。等到Bob想要花掉这5个btc时候,他就需要援引这条交易记录,同时对内容进行hash,再用这个公钥地址配对的私钥进行签名,同时发送信息,周而复始,妙不可言。

现在我要把刚才的验证过程再简单地梳理一下:ALICE在发送整体信息M1之前,先对M1进行了hash,发现结果是369,于是用私钥处理了369,也就是乘以11,将后三位059连同信息本身发送出去。这就是Alice完成了数字签名。Alice周围各个节点收到信息以后,先用Alice的公钥也就是91对这个059进行解密,即就是059×91=5369. 又发现将Alice原文信息M1进行hash,发现结果也是369,从而确认这天信息的确是ALICE发送的。你们说妙不妙,众妙之门,此门最妙。

区块、hash、挖矿

好了,明白了转账过程,我们要进一步讲解区块、区块链,只有这样我们才能真正明白“挖矿”的原理,了解比特币是如何创造出来的。

我们先前是这样简单描绘的:在比特币的世界里,每时每刻都会发生很多类似Alice转账Bob的交易,我们把每十分钟内的交易记录,就叫做区块。把比特币一诞生就开始的所有交易记录都链接起来,也就是把这些区块连接起来,就构成了区块链——Block chain。整个网络上的电脑都在抢夺新生区块的记账权利,谁抢到这个记账的权利,谁就可以获得这个区块创造出来的比特币。现在要对此深入解读。

我们可以这样想象,每一个区块就是一个块、一个方方的区块;每个区块都有自己的标记、也就是有自己ID。这个ID可不是随便定的,而是整个区块的hash值,也就是将这个区块的所有信息hash之后所得的那个数字,这个hash值是唯一的,并且与此区块绑定;

每个区块的第一层是上一个区块的hash值,表明这个区块排在上个区块后面,然后中间层是这一个区块的交易记录,底层是一个随机数。一到三层的内容会生成区块的hash值,即本区块的id。所谓挖矿,就是去猜底层的随机数,一旦才对了随机数,也就解出来这个区块的hash值。为什么呢?因为本区块的前两层信息是公开已知的,而只有底层随机数是不公开的,所以谁猜到了随机数,也就可以解出本层的hash值。

那这个随机数又是怎么猜的呢?是用暴傻方式猜的,又暴力又傻逼的方式,此所谓穷举暴力尝试法。就是各位矿工一个数字一个数字地试,直到有人到率先找到第一个符合这个规则的hash值。简单地说,就是新区块的hash值已被网络所确定,而矿工在不断计算、并核对,一旦哪位算对了,网络就给予确认,然后奖励他比特币。更确切地说,是网络事先定下了一个规则、一个公开的规则,比如说:要求这个hash值前面有15个0开头,哪个矿工率先找到第一个符合这个规则的随机数、就算猜出了这个hash值,他就会向全网广播“各位挖矿的labor们,你们不用算了,我算出来了,这个随机数是xx,这个hash值是xxx”,正在埋头苦干的矿工们一验算,发现这货算出来的hash值果然满足规则,嘴里嘟囔了一句shit,赶紧把这个hash值作为本区块的表示,并在这个区块的基础上继续计算下一个区块的hash值,心中默念:下回就该我抢先一次了。

由于hash值是这个区块的唯一标识,而且随意更改一点信息就会显著改变这个hash值,所以比特币世界的历史交易记录是不可能被篡改的。具体来说,每一个区块的hash值=上一个区块hash值 + 本区块的交易记录+本区块的随机数。如果我们篡改了交易记录,这个hash值就会改变,这就不被认证,就不允许了。所以一旦生成一个区块,其配套的hash值成为唯一标识,且不可更改。

估计很多朋友更关心区块底层的随机数,那到底起了一个什么作用。首先当然是让矿工去猜去计算、去暴力尝试,另外它还起到一个作用,就是去平衡算力,从而保证是平均每10分钟产生一个区块。如果矿工的设备变得先进了,引进了什么阿尔法狗呀、猫呀的都来了,那全网算力就提高了;那怎么办?很简单,就会增大随机数的难度,还是能平衡在每10分钟左右产生一个区块。比如,本来系统要求hash值前面有15个0开头,但如果算力上升,系统就要求寻找hash值开头必须有20个0,难度就陡然加大了;反正是不能让你上房揭瓦,好好挖矿,就是10分钟一个区块。

区块链的形成及小总结

我们从头梳理一下比特币的运行过程。2009年1月3日,中本聪创立了比特币系统,当时全网没有算力,只有他在挖矿,所以很顺利,它计算出了满足第一个区块hash条件的随机数,并计算出了此区块的hash值,同时得到这个区块的奖励,50个btc。

最初几个月,几乎没人来参与,渐渐地人一点点的变多,每个时刻开始有交易产生,随着全网算力的提升,系统要平衡hash值的计算难度,为了保证有人记录10min左右的交易记录,因为10分钟的交易记录不多不少刚刚好。如果hash值太简单,一秒钟就被人破解出来,所生成区块的交易记录就存储得太少;反之,如果计算难度太大,那每个区块需要打包的交易记录又太多,所以就要用合适随机数难度、将之平衡到十分钟一个区块。

现在,这个系统有一定的矿工维系这记账的责任,有一定的玩家有日常的交易需求,矿工们开始辛勤的挖矿即不断尝试每个区块的随机数直到尝试出来符合当前hash值规则所要求的hash值,当尝试出一个随机数并成功时,会马上向全网广播“我成功啦,我得到奖励了,兄弟们赶紧在我后头继续挖啊”,大家会将他公布的随机数进行验证,发现基于这个随机数所求得的hash值确实所要求的hash值规则,那大家就认可了,并这个区块的标题就定为这个hash值。基于这个hash值,大家再去奋力计算一个区块的hash值,如此go on and on,区块链就形成了。

区块链,它到底是怎么链在一起的呢?难道一个区块和一个区块之间真有一条链子吗?是这样的,区块就是每10min的交易记录,区块链就是区块连接起来的整体,这就记录了所有的交易信息,所以中本聪09年的那个区块叫创世区块。每个区块所包含的信息是:上一个区块hash值(表明连接关系) 本区块的hash值(id) 本区块交易记录 本区块随机值(用以调整本区块hash值难度)。

这下子大家明白了,区块之间为什么能链起来,就是因为每个区块都包含了上一个区块的hash值,那当然就链接了起来,仿佛区块在排队,一个跟着一个,谁也别插队。这也保证了,谁也无法篡改交易记录,因为一旦更改区块内容,会改变此区块hash值,导致链接关系发生混乱了,那就会被大家所发现。注意,hash值对初值极其敏感,随意修改一点点就会造成完全迥异的hash值,会产生混沌,发生蝴蝶效应。谁敢篡改,就会飞蝴蝶,蝴蝶一飞,系统发生大地震,谁人不知呢?

双花问题

这个漏洞就是双花,double spending,不是double flower。

既然有人在抢着记账、记好的账本又不能篡改,我们还可以验证每条消息的真伪,这似乎很完美了啊,但为何还有什么double spending呢?我们举例说明之。

比如我只有5个比特币,我先向老张转账5btc,同时再向老赵转账5btc。这就是双花,我把5个比特币化了两次。这就是所谓的双花问题,这是一种诈骗行为,如何预防?

正常情况下,一定是先有一条信息被大家打包,然后第二条信息由于与第一条信息冲突而无效。但是,我如果是同时双花的,也就是一边广播:我向老张转账5btc,与此同时又广播:我向老赵转账5btc。这样,就会有两个矿工分别打包了这两笔记录,这就叫做分叉,即同时有两个区块生成了。如果要真是如此,大家都去双花了,5个比特币能化两次5个比特币,岂不就乱套了,比特币系统成了骗子横行的世界了。

比特币的规则是只有最长的区块链得到确认,最长的区块链才会有挖矿奖励。所以正常大家都会切换到长链上挖矿而将短链废弃掉,这样就会有一笔交易作废了。所以一般转账之后比特币网络建议大家等到一个区块确认了,此时再发货就比较安全。

我们再以Alice给Bob转账来说明。假设Alice只有5个比特币,但她有两个地址,地址1和地址2,她先用地址1向Bob支付5个比特币去购买一杯咖啡,与此同时,Alice又用地址1给自己的地址2转账了这五个比特币,必须注意,一定是同时、非常的同时。如果Alice得逞了,她就等于白喝了一杯咖啡。她可以得逞吗?假设Alice是很强,她能让这两笔交易同时打包在两个区块,Bob看到一个区块确认了,就给发送咖啡了。这时候,Alice为了让Bob这笔转账失效,就必须让包含转账给自己地址那条交易记录的区块成为主链,那么她就要在那个区块后面不断的生成区块使这条链越来越长。Alice要实现双花,其实很不容易,她必须要实现双花所形成的两个链条都不废掉,一直要坚持到拿到Bob的咖啡为止。因为任何有一条区块链废了、就意味着双花也就不存在了。比如给自己转账的那条链失效了,那就意味这Alice真就正转账给Bob了。如果给Bob转账的那条链接废了,Bob没收到btc也就不会提供服务、不会给Alice发送咖啡。所以Alice策略应该是先让Bob那条链成为主链,这样Bob就发货了;Alice一看Bob发货,于是开始努力加长给自己转账的那条链,一旦链条长度超过了Bob那条链,给自己转账的就成了主链,从而废掉了Bob那条链,这意味着Bob的交易记录作废,也就是Bob最终没有拿到比特币。

Bob若想万无一失,就不能急着发货,要等到自己的链条足够长的时候才发货。一般来说再等上六个区块的形成,就已经很保险了。Alice想废掉已经又加长了六个区块的长链,就必须自己加长自己的短链,来超越那个长链。为什么非要自己加上呢?因为矿工都会在长链上挖矿,只有最长的区块链才能得到确认,才会有挖矿奖励。Alice要凭一己之力,让自己的短链超过长链,有肯能吗?nothing is impossible。双花is possible,但前提是Alice的计算能力强大无比,因为区块由谁所生成,决定于谁最先算出Hash值,也就是要决定于算力——计算的能力。

如果Alice掌握了全网51%的算力,那么她有51%的概率抢夺到下一个区块的记账权,当她在对自己有利的那个区块后继续生成区块的时候,她就会让Bob收不到那5个btc,这就是所谓的“51%攻击”。这似乎是可行的?但是,Bob听了我们的节目,他变聪明了,他不是等一个区块就发货,而是等了六个区块的确认才发货,因为已经生成了六个区块,那这一定是主链,关键是矿工也都相信这是主链,所以都会在这个链上继续挖矿来获得奖励。

Alice为了使Bob的这笔转账失效,她必须在对自己有利的那个链上连续生成区块而且赶上主链。与全网斗争抢夺记账权连续六次,如果算力一般这几乎不可能,如果算力超强倒是有可能实现。不过如果Alice只为了喝一杯咖啡就如此消耗巨额算力成本似乎不值得。可能发动双花攻击的原因是大额转账,但是我们可以发现,只要区块链越靠后,安全性越高,比如我等这个区块链确认了10次,那么想要追上主链就必须连续抢夺十次记账权,这个难度是几何级数上升的。一般而言六次就已经很安全了,所以比特币系统也认为一笔交易如果确认了六次就算有效了。由于每一个区块是十分钟生成,确认六个区块也就是一个小时,相比于普通几秒到账的银行转账,这个确实慢了好多。

我们对双花问题再说一遍。Alice先有目的的向网络两边散布两条交易记录(当然是网络拓扑结构的两边而不是地理结构的两边),当两个区块2与2a都形成了以后,Bob觉得交易记录被确认,开始发货,此时Alice为了让这条信息失效,必须在对自己转账的那个链上开始抢夺记账权力,每一个区块的生成必须基于上一个区块的hash值(回顾一下抢夺记账权力就是暴力尝试随机数算出复合规律的hash值),所以Alice就要连续抢夺若干次直到对她有利的这条链成为主链,使得向Bob转账的链条成为短链,所有短链上的交易信息返回待打包的池子,挖矿挖出的比特币也会返回,也就是吃进去的比特币再要吐出来。也就是说,一旦对Alice获得了coffee,然后又将对自己有利的链条长度、超过向Bob转账的链条,那么Bob所获得的5btc就会被收回,也即是这个交易记录作废了因为比特币规则只对最长链挖矿有奖励。

但是如果Bob等了六个区块后、依然处于长链状态,然后再发货就没有问题了,因为全网算力都会集中在长链,一旦长链至少有6个区块的领先,Alice再想要追赶这个长链、以便让这些交易记录作废就会非常非常难。即便Alice神通广大到掌握了全网51%的算力,抢夺记账权的几率就是51%,连续六次都成功的概率就是0.51^6=1.7%,这就是所谓51%攻击,如果仅仅掌握三成算力,那么这个概率就是0.07%了。

2140年后,记账没有奖励了,系统如何进行

反正是,双花这个漏洞可以通过交易的等待来阻止。但比特币系统似乎还有一个漏洞,就是到了2140年,比特币的总量已经到达了事先规定的上线——2100万枚,那么抢夺到记账权也没有比特币可以奖励了,那谁还会去记账呢?这个本聪早就想到了。到那时,比特币世界的每一笔交易就需要交一定的手续费,交给谁呢?交给了抢夺区块记账权的人。也就是说,挖矿从过去的获得比特币的奖励,变成了获取交易的手续费,所以照样有矿工去挖矿。

现在大家都清楚了,所谓比特币挖矿,实质就是中本聪巧妙地设计了一个激励机制,给维护这个去中心网络的人的奖励,同时也解决了货币如何分配的问题,因为每个人都有挖矿的权力,至少从理论上这是相对平等的说法,人人都有机会去挖矿,去获得比特币。

区块链技术引领未来

到现在为之我们基本讲述完了比特币的前世今生。不得不承认,比特币的技术构想很美,像一个没有强权,没有管制完全自由的新世界。尤其是去中心化的账本,资产公开透明可查的性质,吸引了大批人开始关注比特币的底层技术——区块链技术。在一个去中心化网络里,相互不信任的节点之间,谁能解决信任问题呢?区块链技术可以解决。

区块链技术就是我们运行比特币的这套系统,大家明白这种气质就好,就是一个资产公开透明可查的、匿名的、去中心化的记录,是一个无法作弊的网络运行协议。光听字面意思大家有点迷惑?又公开透明又匿名,这好矛盾啊!这里非常不矛盾,在区块链或比特币世界的玩家,每个人的身份是匿名的,你可以有多重身份、也就是有多个公钥、也就是有多个地址,这就很好地保障了你的匿名性,人家只知道你的地址,但根本不知道你是谁,你只有一个,但一个你可以有很多地址。你的匿名性虽然很好,但区块链的游戏规则却让你无法作假,你在其上的每笔交易都是公开透明的、无法作弊的。此所谓又匿名、有公开透明。这个公开透明和匿名共同保障了去中心化的信仰——freedom自由!一个完全没有压力、又公平的自由世界。

正因为如此,虽然很多业界人士不看好比特币、但非常看好区块链技术,各个国家央行纷纷成立区块链技术的研究所,华尔街的大银行也都开始涉足区块链技术的创业与投资项目,可以说是风头最盛的金融科技项目了。

中本聪发明的比特币系统其实就是发明了区块链技术,可以认为比特币是区块链技术的1.0版本,或者说支付系统非常适合区块链技术的应用。区块链的2.0版本是智能合约,电脑里的合约使用程序编写的,这种合约不能作假,执行明确。而传统合约一般需要第三方公正,而且自然语言存在模糊性,才有各种机构的司法解释和律师的必要,同时很难保证执行力度,很多官司赢了的人也很难得到履约。智能合约就很大程度解决了这个问题,规则清晰,强制执行,智能合约是一种图灵完备语言,它可以构建任何一套符号系统来规定任何一项合约,而且这项合约同比特币一样是存在于整个peer-to-peer网络里的,我们不需要谁来保证这个合约是否履约,也不用担心第三方机构出现问题。合约一旦签订就会像比特币一样全网公正,而且合约规定的资产都像比特币一样是可以追索来源与去向的,执行的机构则是冷冰冰的机器与电脑,规则明确。

比如你准备和隔壁老王赌球,老王发誓中国队进不了世界杯,如果进世界杯老王给你100万,没进世界杯你给老王一万。但是你害怕老王耍赖,为了进行赌局,很可能需要找一个第三方机构,两边都把钱打进第三方,由第三方托管,金融行业很多时候就是干这个中间人行业的。问题是中间人不是没有代价的,一方面,比如一百万的赌局,中间人抽1%就是一万块钱啊!或者中间人直接来个卷包会,带着赌资跑了。如果有智能合约,两边都将钱打入指定账户,然后电脑根据人民日报的信息来自动执行,两边都没有赖账的可能。同时这个合约就像比特币的交易信息一样,无法篡改,全网备份,无法销毁。

签订合约这件事有多重要呢?这太重要了,看看整个世界最挣钱的几个行业,律师,保险,银行等等,这些行业公司的大楼一般也都占据了最豪华的商业CBD,是什么让他们这么赚钱呢?信用!包括金融行业里的子行业——信托,其英文就是trust,很多时候都在干我们上述中间人的职能,人们把钱给保险公司本质上就是对这个保险公司的trust,这就是你对大机构信任所付出的溢价。如果智能合约普及开来,我们就无需为这种信任付费,我们买卖股票,存贷款,一纸合约不需要第三方发起,不需要监管机构解释、背书等等增信工作。我们只需要在peer-to-peer的网络里发起,只要有人愿意与你签订,那么这个合约就是有效的并且是清晰且可以被执行的。

大家想象,光在金融领域的信任就催生了这么富有的产业,那整个人类社会的信任问题拥有多大的市场?如果区块链技术能够解决这些信任问题,那人类社会将会发生多么巨大的改变,真是不敢想。

所以区块链技术最开始解决的是支付问题,随后的智能合约也即是2.0版本大家都能想到的就是未来应用在金融行业各个领域上,而且这个可以说是最接近落地的项目了。几乎金融行业所有需要中间人的信任问题,比如交易所,比如传统机构扮演的中间信用增级服务,都是可以被区块链技术取代的。比如我们熟悉的支付宝解决淘宝买卖服务,就是买家与卖家的互不信任转化为大家对支付宝这个中心机构的信任,商业银行很多中间业务比如信用证,都是在解决类似的问题,这些都几乎肯定会被区块链技术革命。

到了区块链技术的3.0版本,我们可以畅想一下所有需要解决彼此陌生互不信任的个体之间的信任问题的地方都可以使用区块链技术。

首先区块链技术的不可篡改,可以追查的特性,非常适合存在性证明。现实生活中我们经常会遇到房产证明,个人学历证明等等信息证明问题,区块链的不可篡改特性完美解决这个问题。每个人的身份标识一旦被全网公证,那么这个信息就是可以追查,可以证明的,目前这方面应用已经有不少创业项目了。

其次,政府可以用于投票,同样利用了匿名,不可篡改,全网公证的特点。澳大利亚政府正在落地这个项目。

最后,所有的去中心化系统,比如共享经济,如共享单车,共享租车,共享公寓等等,都是非常适合结合区块链技术的,对于每一样共享产品的历史信息都可查,很契合解决陌生人之间共享的信任问题。

其实,区块链这个底层技术未来到底能解决多少问题,是一个人类想象力的问题,我坚信,还是那句话,但凡涉及到解决彼此陌生互不信任的个体之间的信任问题的地方都可以使用区块链技术。

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

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

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

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

(0)


相关推荐

  • ThinkPHP3.2版本安全更新

    ThinkPHP3.2版本安全更新

    2021年10月18日
  • c socket

    c socket"1.socke分类""2.基本操作函数""3.c实现的网络聊天程序"套接字(socket)是一个抽象层,应用程序可以通过它发送或接

  • js Map对象的用法[通俗易懂]

    js Map对象的用法[通俗易懂]第一篇:Map:Map是一组键值对的结构,具有极快的查找速度。举个例子,假设要根据同学的名字查找对应的成绩,如果用Array实现,需要两个Array:varnames=[‘Michael’,’Bob’,’Tracy’];varscores=[95,75,85];给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应…

  • scrapy中ROBOTSTXT_OBEY = False,不遵守Robot协议文件的规则

    scrapy中ROBOTSTXT_OBEY = False,不遵守Robot协议文件的规则在scrapy中创建项目以后,在settings文件中有这样的一条默认开启的语句:setting文件中配置:#Obeyrobots.txtrules#默认是True,遵守robots.txt文件中的协议,遵守允许爬取的范围。#设置为False,是不遵守robo协议文件。。。ROBOTSTXT_OBEY=True观察代码可以发现,默认为True,就是要遵守rob…

  • Python中时间与时间戳之间的转换

    对于时间数据,如2016-05-0520:28:54,有时需要与时间戳进行相互的运算,此时就需要对两种形式进行转换,在Python中,转换时需要用到time模块,具体的操作有如下的几种:将时间转换为时间戳重新格式化时间时间戳转换为时间获取当前时间及将其转换成时间戳1、将时间转换成时间戳将如上的时间2016-05-0520:28:54转换成时间戳,具体的操作过程为:利用strptime

发表回复

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

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