虚拟货币钱包源码搭建
在第一次课完成课程和区块链历史和发展的介绍之后,本次课开始,Navid老师将给大家详细讲解区块链技术架构之六层模型
下方为第二次公开课视频实录,暂停、快进、倒退都没问题,继续往下拉还有文字版,时间有限的朋友可以快速预览哦!
▼
好的,大家好,我是北风网的区块链讲师Navid,今天开始我们的第二次讲课,首先简单的回顾一下昨天的授课内容。上次课我们简单的对课程做了介绍,然后就是讲了一些区块链的历史和发展,以及我们学习区块链的一些重点。今天咱们在这个基础上开始讲这次课程中最最重要的一个内容,区块链的六层模型。
昨天一些听课同学我已经加了微信了,大家的一些问题我也昨天晚上就回了,没加的同学可以加一下,对于昨天同学们问的问题,我总结了一下:
第一点就是怎么去学习区块链这个技术,大家很多人都是第一次接触有些疑惑,有些担心,我也做一些回答。我这里也再说一下,展开一下,区块链其实说简单也不简单,因为学的东西比较多,它跟学一般的语言、技术,可能不太一样,有些时候学习曲线也是蛮陡,这是事实。但是只要我们沉下心来,耐心地学,耐心听我讲,把基础知识都打扎实了,这样我觉得这个东西还是不难学的。而且我个人觉得还是真蛮有意思,特别是有一些编程的经验的同学学这个东西现在还是蛮合适的。我觉得对你不管是工资上,还是对自己的思维,以及对你将来的发展方向上都是一个非常好学习内容。
第二个呢就是大家也提到了一些区块链的资料,这个我在最后一页PPT是有的。这里有一些书籍我先先给大家讲一下,因为昨天很多听课的同学都讲到了这个问题,就是说刚开始学习看哪些书或资料对学习有帮助,这里我列出了这这么六条资料。其实我对学习资料的个人观点是这样的,书不在于多,而在于精。大家如果说对区块链一点概念都没有的话,我建议按照我这个资料的顺序一个个看,这个资料还是有一定的逻辑关系在里面。
首先就是我昨天介绍了中本村的比特币白皮书(《Peer-to-Peer Electronic Cash System》Satoshi),这是第一,我认为这个是最应该看的。
第二个是《精通比特币》(《精通比特币》 Andreas Mantonopoulos
http://book.8btc.com/books/1/master_bitcoin/_book/),这也是一个国外人写的非常经典关于比特币、区块链概念最基本的介绍,主要集中在比特币上面,比特币可以说是最成功最经典的一个区块链应用,值得我们去好好看一看,我记得那是好像是英文版,中文版也有的,而且电子版还都是免费的,大家如果有兴趣可以找下中文版。
第三个《区块链——新经济蓝图》(Melaneie Swan
https://www.amazon.com/Blockchain-Blueprint-Economy-Melanie-Swan/dp/1491920491),这个就是比较宏观的一个角度,大家看完前两本书之后对技术有一定了解,再看一些宏观的资料。
然后四(《区块链 2.0》 陈刚 谭磊
http://www.cnki.com.cn/Article/CJFDTotal-IGXN201608041.htm)和五(《区块链技术指南》邹均 曹寅 刘天喜http://product.dangdang.com/24147347.html)呢主要是国内几位高手写的一个关于区块链方面的书籍,内容包括一些概念以及以太坊和Hyperledger一些应用,虽然说例子不是很多,但是我觉得学起来入门还是没问题的,有些东西讲的也挺深入的,大家可以去看一下。
最后在前面这些资料都看完了前提下,大家可以去看一些各类些平台发表的一些白皮书,比如说那个以太坊的白皮书,还有个各种网上最新的一些白皮书,当然了也可以看看他们的企业官网、源码,这些都是可以去看。
这是我的一些关于相关资料的一些介绍。下一页是微信公众号,大家有兴趣的话可以加一些区块链相关的微信公众号,这些微信公众号里面可能有一些最新信息、动态,甚至可能有些好的资料介绍也会在里面,大家可以去加一下。(万向区块链实验室\渡鸦区块链\区块链铅笔Blockchain\巴比特资讯)
关于上次课的回顾和答疑,我就先到这里,现在我们开始今天的内容。
今天要讲的内容,我已经说了不止一次,非常非常重要,我一定沉下心来慢慢讲,大家也沉下心来慢慢听,在听的过程中可能有些东西还不理解,这个没关系,因为我讲完这个后续马上会讲一个例子,讲完这个例子之后,我的PPT里面还有至少四五十页专门介绍我现在讲的东西。但是呢你得有印象、有概念,然后呢慢慢会越来越细,越来越多,其实学技术就这样,你先从简单的理解再慢慢的深入再深入,最后到源码,或者深入到客户,可以自己就把你的想法直接跟客户沟通,这其实这就是你知识应用的部分。
现在我把上次课讲到的数据层这部分简单讲一下,再展开一下,前面讲了区块链大的外部结构,现在说一下,区块内部的结构,
它是包括两部分,第一个部分是区块头,第二部分是区块体,应用叫body。然后区块头里面又包括几部分,第一部分:previous hash,头里面所有东西指向上一个区块所有数据的hash值。当然区块头里面还有很多细小结构,比如版本号呀,这些咱们就不说了,重点咱们说一个数据结构,一个叫nonce,这个就是挖矿时的需要的随机数,等会我在举例子时会详细讲到,先标上颜色,这个很关键。然后呢还有一个是merkle root,可以理解是所有交易记录的hash值,这个我在后面讲到梅克数的时候,会详细的讲,大家现在有个概念和印象,就是说有一个地方记录了所有的交易记录,一个总的hash值,它叫做merkle root。
区块体就比较简单了,最重要的一个tx就是交易记录。交易记录的值对应merkle root,所以说我们可以这么画。可以理解成去块头的一个指针,指向了去块体。这就是区块里面可以分为的这两大部分。
第二个层次通讯层,也叫做网络层。网络层就相对比较单纯一点,它主要是通过P2P协议,类似于迅雷、BT,这些东西什么特点?这个特点其实很简单,就是上传数据的同时下载数据。那这样有什么好处呢?好处就是在区块链系统里面,随着节点的数量越多,那么它上升效率就越高,下载的效率也越高,这个跟中心化也不一样,中心化的话你如果是连接数越多,会对网络的带宽是一个很大的要求,导致网络可能就越来越慢。这个传统就抛掉了是吧?而区块链网络系统现在恰恰相反,只要参与的人越多,它的速度就越快。
下面呢,应该说是上一层哈,就是共识层。共识的概念大家可以理解成区块产生的规则。这个共识啊 我碰到很多人,特别是有些刚刚接触区块链的人,认为所谓的共识,就是比如说你买东西,我十块钱买了你东西,然后呢我们就达成共识,我愿意付十块钱,你愿意把十块钱东西给我,这叫共识。其实这不是区块链共识啊!区块链共识只是指区块产生和数据写入区块的规则。主流的有pow(Proof of Work),根据工作量证明,还有pos和dpos这部分算法后面会给大家详细解释。在这里我们用POW举例子,POW因为是最常用,包括现在的比特币、以太坊他也是在用。可能过一段时间,像以太坊白皮书,能够看到它分成四个阶段,其中一个阶段就是说把POW的共识算法切换到POS算法,可能是在2020年。还有一些像pfbt、sfbt、kafka,后面三个呢主要是联盟链或者私有链经常用的共识算法,kafaka呢严格来说,其实它算不共识算法,它只不过是一个消息通讯机制,算不到,只是他也是跟数据产生和传送有关系。
多说一句啊,现在区块链上有两个流派,一个就是所谓的币圈,一个说是链圈,币圈主要是比特币、以太坊的支持者,因为他们手上有币,而且这些平台都发币。币圈的人就有些看不起链圈,认为他们没有遵守比特币或者以太坊这些主流区块链的规范。而链圈的人呢当然就更看不起币圈,都认为他们都是炒币的骗子,认为他们自己的这个区块链才是真正的区块链技术,所以把他们自己叫做链圈。我个人观点是这样,这个争论其实意义不大,因为各种区块链技术它都有它自己的长处,当然也有自己的短处,咱们学技术的,研究技术,要去取长补短,以学习的眼光去看一些东西,不要总是太偏激,偏向于一种技术或者一种观点,我们应该去多学习。所以说从原理上去掌握这些东西,很多东西理解起来就很方便。
然后下面第四个层次是什么?第四个层次是激励层。其实就是像比特币、以太坊,他会给参与者(挖矿者)一些挖矿的几率。除了挖矿之外,还有一个交易费。这个后面我在例子上会详细讲,激励层对公有链特别重要,它是保持这个链能够健康发展的基础。但私有链和联盟练就不一定需要激励层,因为他们企业做这个系统,它自身带有一定的目的,他不会让人随便的来参加这个系统。所以一般就很少有激励层。
第五个是是合约层,合约层的概念就是运行在区块链上的程序。最典型的就是像以太坊提出的关于智能合约的概念。细分可以分为两种,一种是图灵完备,一种是非图灵完备。
这个蛮难理解的,定义是说可以计算一切可计算的,称为图灵完备。举个简单的例子,大家都写过程序,比如说for循环,递归,while,如果说是包含这些语法,基本上它肯定是图灵完备的,为什么?因为包括这些语法的话,它一般能够实现无限循环,他就可能具有图灵完备的能力。为什么这么说?其实图灵完备其实指的是什么?指的是计算一切可计算,什么叫一切可计算的?它是一个科学计算的一个概念,科学计算里面它有一些积分、求导,这些是需要不断的逼近,做无限循环,才能出来答案,才能达到科学精度的要求。它会做一些不停迭代的计算这样一个过程,这个我们把它定义成图灵完备。相反有些东西呢就是做不了这个功能,只能跑几次,或者语法上不能做到这一点的,称为非图灵完备。
图灵完备的典型代表就是以太坊的智能合约。非图灵完备的代表就是比特币的脚本,比特币其实也是可以编程的,比如说比特币的多签名支付,这些都是可以编程的,但这个东西它是不能够去进行无限循环的,但是以太坊是支持的,虽然也不是很强,但是它理论上是支持的,所以它叫做图灵完备的。
但图灵完备就一定好吗?这个其实也不一定,科学这东西总是辩证的,对吧?你看起来功能强了,功能强大,潜在的漏洞也就多了,像以太坊有好几次分叉,都是跟它本身智能合约的复杂性还是有关系的。同时像那种图灵完备的话,它能够不停的迭代的话,有可能会对以太坊整个网络产生非常大的压力。所以以太坊为了解决这个问题,提出了一个guess的概念,你要跑可以,但是你要消耗guess,也就是你要消耗以太币,如果你不停的循环那么你肯定会以太币归零,就只能停下。这样一方面以太币消耗的途径,另一方面也是为保证自己网络安全。
第六层是应用层,指的是运行在区块链系统的程序, 这个和合约层有什么不一样呢,一个是直接运行在区块链上的,一个是在区块链系统上的。这有点不一样,打个比方,比如说你调用区块链系统上的,包括智能合约上面的一个接口,咱们叫做这个区块链的一个应用层,然后你直接去调用某个区块的某个数据,或者在某个区块上写数据,那就是智能合约,可以说是应用层调合约层,合约层再调区块链一些底层的数据,就是这么一个逻辑关系。
然后应用层现在最典型的现在有两种,一种是钱包,谈到钱包我再多说一句,比如说你在火币网上下载一个钱包,这个就不能算是区块链上的一个应用,因为火币网下载钱包,本质上你连着火币网的服务器,它不是区块链的东西,可能火币网再去调区块链,所以说不能算是分布式获取区块链的钱包。因为你是经过了中心化的一个系统,所以经常听说什么交易所被盗,这就是中心化的系统出现问题,并不是区块链本身的问题。但是有一种情况,它是直接连的区块链系统,比如说imtoken,这个大家可能没用过,也可以下载去用一下,这个是区块链钱包。这两个钱包是不一样的,打个比方,你用火币网钱包的话,如果火币网倒掉了,或者被政府关停了,那你的数字货币可能都没有了。但是你如果用imtoken的话,它直接在区块链系统上,只要这个系统还在,那钱包的虚拟货币永远在这里。还有就是如果说是一些黑客的话,肯定会用区块链钱包,它不会用货币网钱包。因为在火币网要注册登记的,很多人不愿意把自己的信息透露给啊中信机构,他就选择那种分布式钱包,保证密闭性。
还有一个区块浏览器,区块浏览器就是记录区块链的一些状态,比如产生区块号、各种参数、交易记录,都是通过区块浏览器可以看到的。这就是另外一个区块链应用的例子。当然有些区块浏览器数据来自某个中心化的服务器都有可能,或者是中性化服务器进行了一些缓存,这个可能也不一定完全区块链化,大家稍微了解一下。
好了,说了这些概念,可能很多同学有些疑惑或者有些晕,大概听明白了,但是不知道为什么要讲这么多这么细的东西。这个没关系,下面大家就知道了,为什么要讲这些,我会举实际上的案例来把六层数据的关系弄清楚。
用户A向用户B转一个比特币,这个是一个简单的动作,一个交易记录。通过这个交易来详细地讲区块链里面发生的故事。
我们先做一个背景介绍,用户A他本身有十个比特币,然后用户B ,有五个比特币,然后呢还有个矿工C,他有一百个比特币。那矿工和普通用户有什么区别?矿工他除了当普通用户之外,他还能挖矿,这里面有一个挖矿的概念。可能很多朋友都对挖矿很不理解,什么叫挖矿?挖矿是怎么进行的?这个我在这里给大家着重解释一下。
挖矿其实用一句话来说,它是为了计算系统要求的一个hash值,这里面就是有两点,一个是“计算”,还有一个是“系统要求的hash值”。好,先说计算,那计算它是怎么计算的?一般情况下用哈希算法,然后呢它这里的输入(Input)-nouce,这个nouce会不停地增加递增。然后这个函数-sha256,当然各种的区块可能有些略微的差别。然后输出就是结果(Output)-sha256(nouce),这就是计算的过程。然后是系统要求的hash,什么叫系统要求?也就是说在系统中,他会要求参与的各个节点去计算一个hash。打个比方,系统要求用函数-sha256计算前面是五个是零的一个hash值,算出来我就认为你挖到矿,就给你12.5个比特币,就是这么一个逻辑。然后呢计算过程是怎么样? 首先打个比方,初始nouce是100,那么我通过哈希函数sha256算出来,但是可能只有三个0。大家知道这个哈希值这个是非常非常随机的,它前面几个零这随机数嘛谁都说不准,然后第一次可能算的时候运气不好,前面只有三个0,那还得继续算。第二次nouce变成101,第一次是系统提供给你的,大家都是一样的,后面的话就是根据你的算力,你算得越快计算的次数就越多。打个比方,你算一百零二一百零三,我这是个简化的过程,实际上可能比这个要复杂点,但是大概原理是这样,可能算到1万次的时候,或者10万次,其实上没这么少,那么100万几百万的时候出现了一个满足我要求的,那时候人家系统就会给你12.5的比特币,这就是挖矿的过程。然后呢大家可能在想,这样是不是对大家都公平的,对吧?因为什么?因为每台机子他初始值当时是一样的,你算的越快的人,意味着你尝试的机会越多。如果两台计算机一台快一台慢,我快的人可能已经算到了,慢的人可能还没算到,那他就没有办法获得系统给的奖励。这个挖矿的一个简单理解。
然后系统里还有个节点,节点的概念是:参与区块链系统计算的计算机,假设有节点(计算机)JA、JB、JC,JA是用户UA在用,JB是用户UB在用,JC是矿工KC在用,JC的性能可能要好很多,当然还有其他很多节点在参与计算。 然后这里先说数据层,UA给UB转了1个比特币,这个我们称为tx(交易记录),然后通过网络层数据广播,将tx发给JB,JB再发给JC,再通过共识层决定tx是否写入区块链中,这里共识层是一套算法验证机制,只有符合她它验证机制,符合它的一个逻辑原理,才能够写入区块链。比如时间戳有没有问题啊等等,我记得比特币就十几个还是几十个,看过源码,有几十个非常多的一个计算。然后呢我这里再画一个区块,比如说是100号区块,那么它把这个tx交易记录写入到这个区块中,通过验证之后写入。
到这里,一个简单的交易算是完成了,但是这样的系统确实有一个非常致命的问题,是什么?因为你交易只是A和B之间的,那跟我C有没有关系,跟我D、F跟其他任何人有什么关系,我凭什么给你传播,凭什么给你做验证是吧?凭什么我也参与到这个共识里面去对吧?毕竟人类都不是活雷锋,对吧?大家肯定是有利益才去做这件事,所以区块链在设计的时候就设计了一个激励层。在挖矿的同时,参与tx交易记录的验证,假如矿工运气足够好,能力足够强,他挖到了框,系统给他12.5个比特币,这个比特币呢就会写在区块的第一条交易记录里面,我们把它叫做coinbase。这又是一个比特币区块链中的一个概念,什么意思呢?就是说区块链系统里面所有的币都来自于挖矿。
交易只会有币的流转,但是它不会产生新的币,新的币只有挖矿才能产生。但是这里又有一个问题,比特币它的量是一定的,大家都知道大概是两千一百万枚,那既然这样总有一天会挖光,挖完,那么这个时候系统拿什么来激励呢?这时候比特币设计者又考虑另外一个激励措施,叫做交易费。比如A给B转一个比特币,B收到的肯定不是一个比特币,而是0.999个,会减掉一些交易费,而这个交易费给谁了呢?还是给矿工。这样有一天矿挖完了,大家还是有热情去参与。
这样系统就相对于比较完整,这里讲了四层,数据层、网络层、共识层、激励层以及整个交易的关系。不知大家有没有理解,如果这个没理解也没关系,课后我把这个发给大家,大家再去自己去理解、琢磨一遍。这里边确实不单单是计算机方面的知识,还有设计者对人性的理解,这个是非常牛的。让各种矿工参与到系统里面,给予一定激励,我觉得是这个系统中最牛、最吸引人的地方。
做一个系统,不是说为了做系统来做一个系统,而是让更多的人去用,用的人还自愿去维护这个系统,不需要任何第三方中心化的系统去维护,这个是非常非常了不起的一个事情。而且经过这么多年的实践证明,没有一个可以攻破,这个就是我觉这个系统最有魅力的地方。
今天的内容就是这些,下节课我在这个基础上,讲一些更深的概念,帮助大家去理解,后面几节课我会在PPT里面把每一层再细化讲,然后再通过例子或者代码等形式来给大家加深理解。本来还有很多东西要讲,比如挖矿账户怎么管理,比特币区块链系统账户怎么管理,还有他们的一些数据怎么验证,还有一些原理、阐述的公式,这个以后都要逐步去讲。
希望这节课对大家有帮助。
谢谢大家!
区块链课程持续进行中
搜索公众号“北风网”并关注
即可免费试听