区块链技术(一)01 林威

快链邦学院

覆盖区块链各个领域的百余位导师,深入浅出、科学系统的区块链领域课程内容,助你充分利用碎片时间进行学习。

【主讲人】

林威

深圳高层次人才

哈工大博士及博士后

腾讯企鹅智家物联网顾问

在物联网、人工智能、区块链领域

有多年技术积累及研发经验

快链邦联合创始人

区块链优质资源

快速连接中

【链课堂|区块链技术——最具影响力的区块链应用:比特币(1) - 林威】

点击边框调出视频工具条

【链课堂文字实录】

大家知道现在的区块链技术是非常火热的一个领域,那么对于区块链领域来说,最著名的最早的一个应用就是比特币。所以今天我们希望通过对比特币原理的一个介绍,让大家对区块链技术有一个本质上的了解。那在比特币的了解基础上,我们对其他链的一些应用,也会有一些更深刻的认识。

我们今天主要是针对比特币这个应用,跟大家去分享一些比特币以及区块链的一些基本原理和底层技术。主要的内容包括以下方面:首先是比特币的基本原理,还有是矿机矿厂矿池,以及我们平时做比特币转账交易的时候,必不可少的一个工具就是比特币的钱包。除了比特币以外,另外还有其他的一些像后续生成得很多新的一些数字货币,比方说以太坊等等一些山寨币和竞争币,我们也会跟大家去做一些主要的货币的分享。最后我们讲一下数字货币我们如何去交易?那么在哪些场合去进行数字货币交易?

首先我们看一下比特币的一些基本原理。

那么什么是比特币?比特币它本身我们知道是一个去中心化的一个交易系统,那么在去中心化的情况下如何去记账,这是一个问题。这个除了一个去中心化记账的问题以外,还有一些主要的问题我们需要解决,首先是如何验证交易的真实性,无法篡改和伪造,如何防止有人去超支,比方说他钱不够,怎么去防止它超支,他的这个账户里的余额。最后比方说是如何防止这个账本的不一样不一致,那么这些都是实现一个去中心化的一个交易系统必不可少的一些问题,那么我们这里边会讲比特币是如何解决的。最后我们讲一下比特币的一个底层的数据的结构,也就是区块链。那么什么是区块?区块是怎么产生的?那么了解了这些之后,其实很多其他的一些数字货币系统,或者说区块链的应用,都是基于相同的这种技术架构来实现的。

首先我们看一下什么是比特币。

比特币是在2008年的时候,中本聪写了一篇论文,叫做去中心化的点对点电子交易系统。在这个系统里边,我们不需要有银行的存在的。那在一个没有银行的情况下,我们如何去完成一个货币的转账或者交易?我们首先看一下比特币的定义。在比特币的这个中本聪的论文里边,他把比特币定义成一种货币,是一种完全电子化的货币,不由政府发行账号和交易,也不受银行的监管。那么当然了,比特币到底是不是一个货币,现在还有很大的争议,我们先抛开这个争议不管,我们先主要看一下比特币的原理。

中本聪在设计比特币的时候,是把这个比特币当做是一个货币来进行设计的。同时比特币在整个交易系统里边实际是一个记账的符号,那么整个底层的一个区块链,实际上是一个就是我们说交易系统的账本,而且是一个分布式的账本。

因为比特币系统是一个无中心的系统,那么比特币有四个特点。

首先是去中心,就是无中心化;其次是匿名,我们可以知道每个比特币的地址,但是我们不知道地址的拥有人是谁,他不像银行的银行账户,我们知道这个银行账户的这个姓名,他的账户的这个身份证号等等这些信息,在比特币系统里面,我们不知道每个人他拥有的这个地址,或者说我们不知道地址的拥有者是谁;第三点就是说它是一个跨国的一个交易系统,任何国家的人都可以跨国界进行一个比特币的一个交易和转账;最后是一个他的底层的数据的存储系统,也就是区块链这个技术是保证它是不可篡改的。

那么在比特币的这样一个支付转账的过程中,是不需要有一个中心的存在,也就是说跟银行是不一样的,它不需要有银行这样的机构存在,这一点是怎么做到的呢?首先我们看一下银行的作用。

在我们网上进行交易的时候,我们可以放心的支付,因为我们知道银行它会被每一笔交易支付进行记账,比如说我给别人一笔钱,我的账户上一定会减少,别人的账户上会增加,所以我们可以去放心的转账。所以银行的作用,有专业术语叫结算或者清算。结算和清算,本质上就是一个记账,记账也会验证交易的过程。

那么我们可以设想一下,如果没有这个银行的话,要怎么去记账?如何去验证交易?我们可以通过生活中的一个例子跟大家去解释这个问题。

比方说有四个朋友,张三李四刘大王二他们之间会经常打麻将,每一局比输赢,都会有一点金钱上往来,但是每一次都让大家去掏钱、让大家去转账很麻烦,所以大家决定记一个账本。在这个公共账本上,记每一局我们输给谁,输给谁多少钱。并且大家达成了一个共识规定:如果说每一局谁输了,就在这个账本上写一条记录,说我张三这局输给李四多少多少钱;另外就是每个人在上面都可以记账,但是只能记录自己付给别人钱,不能说别人要把钱付给自己,他不能凭空捏造别人要输给他钱,这是大家的一个约定。那么问题来了,这个账本怎么管?

有一个办法是找一个大家都信得过的人,信得过的人,让他去保管这个账本。这是什么解决方案?这就是一个中心化的解决方案,这个跟银行的做法是一样的。那么但是账本放在一个地方,大家不方便查询。另外就是存放账本这个人,大家信不信得过?他会不会在这个账本上去去伪造或者篡改?我们如果是这些人找不到一个大家都信得过的人怎么样?怎么办?

那么这就有了另一种解决办法,就是无中心记账的办法。就是每个人都持有一份这个我们账本的拷贝,每个人只能在自己拷贝上添加,比方说我自己输给别人的多少钱,同时大家如果要添加自己的纪录的时候,还要通知给所有人,让所有人都在自己那份拷贝上去把这个记录更新一下。这个就是一个无中心的管理账本的方法。

那么无中心这种记账系统它其实有很多问题需要解决。

首先第一个就是我们如何去验证每一笔交易记录都是真实有效的,会不会有人去伪造交易记录凭空捏造。比方说别人写了我欠谁10块钱,他写成了20块钱或者30块钱。第二点就是如何防止有人欠钱太多,他还不上,或者说叫防止有人超支。第三点,就是如果我们如何确保所有人的账本是一样的,交易记录还有它内容以及它交易记录这个时间顺序、先后顺序也都是一样的,怎么去保证所有人账本的副本是一样的?这几点都是这个无中心记账这样一个系统要实现无中心记账需要解决的问题。

那么比特币系统就有效地解决了这几个问题。下面我们来说一下比特币系统它是如何解决这个无中心记账的问题的。比特币系统基于一个叫做加密数字货币的系统,它的底层实际原理是来自于数学当中的密码学,所以我们要解释清楚这个比特币系统到底是怎么样去实现这个无中心记账。我们先看一下,了解一下他的数学基础。

这里边有三个数学的概念,大家需要了解一下。首先第一个就是数字签名,Digital Signature,第二个是密码哈希函数,第三个是这个叫工作量证明。那么数字签名是和我们在平时在支票上手写签名是非常类似的,比方说我们要在支票上签上自己的签名表示什么?表示我们知道或者并且认可这样一笔交易、一笔付款,而且其他人几乎不可能伪造我们自己的签名,除非有这种比方说笔迹伪造的高手可能会伪造这样的签名,但是这种可能性是非常小的。

那么大家可能会问了,那么笔迹因为是只能是自己去签出来这个笔迹,那么其他数字签名这个不就是一串数据吗?大家知道这个电脑上啃出10Q币就可以把这个数字签名一串数据复制了,那么我的这个数字签名怎么去防止别人去伪造或者复制?这就跟数字签名的特点有关系了。

数字签名有一个特点,就是它虽然看上去是一串随机的比特,一般长度是256倍,但是它是跟信息有关的,就是说你被签名的信息,有关信息改变一点点,你的签名就会完全不同。那么我们说一下数字签名怎么去生成?

数字签名是由一个叫做密钥的东西生成的,在比特币系统里边它给每一个地址,或者大家理解是每一个人它会分配一个公钥私钥。这个公钥是可以向别人公开的,但是私钥只能自己拥有,不能向别人公开。这个私钥也叫做secret key密钥。那么我们刚才说到数字签名就是由这个密钥生成的。这个密钥只能是自己知道,所以别人如果不知道你的私钥或者说密钥的情况下,它是没办法生成你的数字签名的。

生成数字签名的这个这个工具叫做这个签名函数。

它的生成签名需要两方面的信息:一个是我要签名的信息本身,比方说我的交易记录,我付给谁多少钱,这是信息。第二个就是这个签名人的私钥,我要对我自己付给别人的这笔转账我要进行一个确认,所以我要签上我的自己,用我自己的私钥签上这个数字签名。那么生成签名这个函数它是没有你操作的。那比方说我知道了这个人的签名知道的信息,我可不可以反推他的私钥呢?不能反推,这个数学上它已经确保了这个签名函数的特点,它是没有你操作的,也就是说我们不知道私钥的情况下是无法给出一段信息,一个正确的签名的。所以只能本人给出这个签名,也就是说签名几乎是不可伪造的。

那么数字签名的这个正是因为有这样的特点,所以它是被用来做所有的交易记录的这个有效性证明,因为私钥可以确保只有你给出那个签名。

另外信息可以改变这个签名信息,哪怕是改了一点点,这个签名就会完全不一样。比方说刚才举的这个例子,我把10块钱改成20块钱,这个信息变化了,这个签名就不一样了,签名就不一样了,所以原来这个人签的签名你就不能把它复制过来,最后只有签名的交易记录才是有效的。当其他人收到了这样一笔带有签名信息的这个交易记录的情况下,我们怎么知道这个签名是真实的?就是如何验证的问题,如何验证你的签名是正确的。那么跟签名函数相对应,还有一个配套函数,用来验证签名是否正确的。

配套函数就是把信息、生成签名以及本人向全世界公开的公钥这三个信息加到一起,经过这个配套函数的计算,可以得到一个结果,可能是真或者是假,也就是true or false。如果是真的话那就证明这个签名是正确的,是真实的,和这个信息是能对的上的;如果是假的话那就说明这个签名可能是伪造的,这个交易记录将不被认可。因为交易信息有这样的一个签名的要求,所以签名几乎是不可伪造的。

所以我们如果是想要篡改一条交易记录的话,就必须让这个签名跟信息必须要对的上。那伪造签名,我们刚才说到了这个签名函数是不可逆的,也就是说伪造签名的唯一一个策略怎么办?就是我们拿到这个签名,拿到信息之后,我们就随机的去猜测。因为这个签名有256种256倍,也就是有2^256这样一种可能性。

要通过枚举法去试出来,这个用户的真实签名是什么样的,这个无异于是大海捞针。但是在量子计算机时代到来以后,有可能这个计算是可以被破解的。但是现在来说还是几乎是不可能去篡改这个交易信息的,通过伪造签名的方式是篡改不了的。再一点就是说大家会想,你的签名和信息是对应关系,对不对?我把你的信息和签名同时复制下来,这样可不可以?这样不就也能对的上吗?

那么为了防止这个问题,我们要求每一条记录前面有一个这个序号,交易序号。这个序号也作为这个整个的交易记录的信息的一部分,也就是交易信息一部分。那这样的话我复制了这条交易记录,它的序号肯定是不一样的,所以之前那个签名是不能直接拿来用的。这就是我们说交易记录是不可复制不可篡改的,所以我们现在已经解决了整个这个比特币交易系统里边记账记录的交易记录的可信问题。

接下来的一个问题,就是如何防止有人去超支。

比方说这个人他的这个账户余额其实钱不够,他只有十块钱,他在这个账本上记着我付给谁20块钱,那相当于是超支了。那他怎么防止这种情况出现?这种情况也叫做双花攻击,也就是说我把一块钱可以当做两块钱来花。跟传统银行不一样的一点,传统银行这个每一个人的账户是有余额的,我们知道它余额是多少钱,但是比特币的这个账本上它没有余额,它只有每一条交易记录,我付给谁谁谁多少钱,或者别人付给我多少钱,那么如何确保这个人有支付能力?那比特币系统的解决办法就是,我要知道这一个人这个账户的历史记录,我要知道他所有的历史记录,从第一条记录开始,把所有的交易记录放在一起,我能知道这个人到底有没有超支。

也就是说我们要验证一笔记录,必须了解这个人之前的这种付款记录或者是收款记录,这就是比特币的这个解决办法。那么对于要记账的这个人来说,在比特币系统上就是矿工需要做这件事。矿工去做这件事,就是验证每一条这个交易记录,他是不是有可付款的能力。

最后一个问题就是如何确保记账不出错,那么这个问题实际就在于,关键在于这个记账权的选择和决定。

大家知道比特币是一个无中心的一个系统,每个人保存一份账本。如果让大家的账本保持一致,首先有两点,一个是交易记录的内容必须是一致的,第二点就是交易记录的这个记录顺序,这是一致的。那解决办法就是我们每个人在转账的时候,他想把这个记录向全世界广播,大家收到以后在自己的账本记下来。

这里边有个问题,就是网络这个时延是非常不稳定的,有的人离得近,它可能收到的会快一点,离得远就收到的慢一点,但是交易记录可能并不是由我们这个收到消息的时间顺序来决定的。如果大家收到的消息同一条消息的顺序不一样,这样可能记账就会出问题。所以这里边就遇到了一个非常经典的一个数学问题,叫做拜占庭将军问题。

那么当时拜占庭帝国,我们知道国土非常辽阔,为了防御外族的入侵,他们每一支军队也是分隔很远,但是它每支军队的将军之间呢通过邮差信差来传递消息。当战争的时候,如果我们决定去攻打某一个敌人,那这些将军必须要达成一致的共识来决定是否有这个赢的机会才去攻打。如果我们发现,这些将军决定我们出去贸然出击的话,可能会失败,那么大家就不会出去,他们会选择防守。但是在军队中有可能会存在一些叛徒,这叛徒它会传递这种虚假消息,然后会导致整个军队产生错误的决定从而导致失败。那么剩下的忠诚的将军是如何在不受叛徒的影响下去达成一致?这个就是一个拜占庭问题的出现,其实就是一个点对点通信的一个问题。点对点通信,而且是在一个消息有可能会丢失的环境下,在这上面去传递信息,如何去达成一致性。

最早提出这个问题的这个阿莱莱斯里兰博士,他当时就解决了这样一个问题。他说如果叛徒的数量不超过整个将军数量的1/3的情况下,是可以达成命令上一致的。那么在这种环境下,就是在互联网环境下,其实跟刚才描述的这个拜占庭将军问题是非常类似的。这个无中心记账系统里边也存在可能存在这种恶意的攻击者,也可能会有伪造的信息,或者说由于网络不稳定导致信息的这个比方说传输的一个延误,或者是传输的一个错误等等。

那么比特币解决办法,就是它要求所有的人都要遵从同样的协议,也或者说也可以认为是一种共识机制。基于这个协议,我们来决定是否要把一笔记录去记账,或者说如何确定这个交易记录的交易顺序。

——END——

☆ 快链邦区块链成长社群 ☆

无法进群可扫描客服二维码进群

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180722A0J8RH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券