加载中 ...

比特币技术前瞻

2019-01-06 12:11 编辑:btc268.com 来源:区块链资讯

前言

  前一篇《区块链初识》里我们已经了解到区块链是一个人人可参与记账的账本。这篇文章开始,我们就以比特币为例研究区块链的运作过程。笔者认为,研究一项技术的使用,最好的办法就是先找个应用此技术的一款产品或者项目研究研究,之后再去考虑针对技术本身的使用。所以,这里就拿经典的比特币为例开始区块链的征程。本文在这里先介绍几个和比特币运作相关的概念,也就是比特币都用到了哪些技术。

  截止到目前为止,笔者认为比特币系统的实现主要用到了这么几个方面的技术:数据结构、密码学、P2P网络、分布式共识。当然也有很多其他细枝末叶的东西,不过不太会影响对于比特币整体运作原理的理解。下面,我们就先探讨探讨都用到上述几个概念中的哪些方面。

密码学SHA256


  比特币系统中,反复用到(区块内部的组织结构、区块之间的连接、挖矿等都用到)的一个技术点就是求哈希值。所以,我们先探讨什么是哈希。

  SHA,Secure Hash Algorithm,安全散列算法。这个安全散列算法是把一个数字消息(一个文本、一个文件或者一段话等都可)映射成一段固定长度的字符串(专业点的话应该叫消息摘要)。那么,好端端的东西,为啥麻麻烦烦的要映射成固定长度的字符串呢?我们应该遇到过这么一种情况,去官网下载某些软件的时候,下载链接附近就有这个文件对应的SHA256(或者其他长度的)的值。这个值放在这的作用就是让我们下载完毕后检验我们下载的软件是否是完整的(是否被篡改过或者是否有丢失的什么信息等)。那么怎么检验呢?很简单,计算下载文件的SHA256(看看提供的是啥,这里只是举例)的值,如果和官方提供的一样,那就放心大胆的使用。

  比特币中使用的是SHA256,这个256是256位,也就是32字节长度。这个SHA256有这么几个特性要注意,对于后面理解比特币细节方面有点帮助:

特点一:不可逆。就是说知道一个哈希值是没有办法知道原始的值。当然也有办法,那就是暴力破解,但是实践上是不可能的,仅仅理论上有那么一点可能。暴力破解就是能穷举所有的情况,因为SHA256的长度总共就256位(比特位,0或者1)是吧,如果能穷举2^256种情况,那么随便你破解,因为你已经知道这2^256的情况都是怎么来的。但是穷举2的256次方还不如老老实实睡上一觉来得实在,这个比把脑子里的钱转到银行卡还难千万倍,想都别想。

特点二:抵抗碰撞(collision resistance)。就是说,对不同的数字消息分别求哈希,得到的哈希值是不可能相等的。用数学表达式就是:x≠y,那么H(x)≠H(y),这里的H(x)、H(y)指的是计算哈希后的值。如果读者能找出那么两个不相等的值,但是求解SHA256后得到的结果是一样的,赶紧拿诺贝尔奖去吧。不过做到这一点也有理论上的可能,还是上述的暴力破解。

特点三:这个特点笔者有点词穷,不知道用一个词该怎么描述。是这么一种情况:SHA256的结果是256位是吧,现在要求你找到这么一个值x,这个值经过SHA256的哈希计算后要求哈希值的前20位都是0,也就是得到的结果要求是这样的:00000000000000000000**···**,前20位都是0,后面的236位随意。所以这个特点就是:要想找到这么一个x,除了不停的换x来计算H(x)外别无他法。其实这个不停的换以及计算的过程就是挖矿。


非对称秘钥加密


  比特币是一种加密货币,既然有加密二字,那么不可避免的用到了加密算法,不过不要误解,比特币里面进行交易都是可见的,只不过这里用到了非对称密钥加密的另外一个特性而已,下面我们探讨下。

  说到非对称加密(asymmetric cryptography),那么不得不提对称加密(symmetric cryptography)。网络上通信的双方如果要想不被第三方窃取到消息,最直接的办法就是将通信的消息统统加密即可(加密后的消息即使被窃取了,也不知道发的是什么)。最开始的时候就使用的是对称密钥加密的。就是通信双方进行加密、解密的密钥(encryption key)都是一样的,就像对称的意思。这看起来好像并没有什么问题了,但是通信的双方怎么传递密钥呢?如果传递的密钥被窃取了,那后续即使用密钥加密也还是和明文传输一个样了。这时候非对称密钥加密就来了。

  非对称秘钥加密,字面意思就是加密、解密的密钥不对称,也就是加密用一个key(公钥,public key),解密用另外一个key(私钥,private key)。过程是这样的:A向B发送加密的信息要用B的公钥加密,B收到密文后用B的私钥解密。如果B要向A发送消息,需要用A的公钥加密,A收到密文后用A的私钥解密。这里要注意:公钥是可以人尽皆知的,世界上的任何人都可以知道你的公钥,但是私钥要自己保管,万万不可丢了。这里要注意,并不是有了非对称加密,对称加密就不用了。非对称加密的效率还是比对称加密效率慢,一般情况下都是先用非对称加密来传递通信双方后续要进行加密的密钥,然后用对称加密来加密通信,可以参考https连接的建立过程,这里不做详细探讨。

  比特币的世界里用到的是非对称加密的另外一个功能:签名与验签。签名指的是A用自己的私钥来加密信息,然后将密文发送给B。验签指的是B用A的公钥对密文进行解密,如果解密后的内容是正确的,那就说明这个内容的确是A发送的,因为只有A有自己的密钥。这里要注意:仅仅根据私钥加密的密文是没法通过公钥推算出私钥的,所以私钥放在自己手里是很安全的。比特币的世界里如果私钥丢了怎么办?答:没办法,你的币也只就没了。还要注意一点:私钥加密的信息不是用来相互通信的,加密了也没用,因为公钥是公开的,知道公钥的人都可解密,所以私钥不具备加密通信的功能,私钥只能用来签名。验签是对方已经知道明文(原文)的前提下,然后用你的公钥来解密经过你私钥加密的密文,如果解密后能和已知的明文丝毫无差,就说明的确是你发送的,这就解决了所谓的怎么证明你是你(前段时间兴起的问题,怎么证明你是你。当然如果私钥丢了,还是没办法证明你是你)的难题。

  第一篇里有个问题可以解决了,就是比特币里面的交易人人都可以看到,那么比特币是怎么保证隐私(匿名性)的呢?答:地址。地址是什么?答:公钥的哈希值。所以,比特币的世界里能标识身份的就是这个地址。虽然这个地址是公开的,这个地址涉及的交易也是公开的,但是没有人知道这个地址到底是谁的。当然也有例外,比如打算公开你的地址用来接收其他人的比特币。但是每个人都可以有很多个地址对吧(因为我可以生成多对公私钥,每一对中的公钥都可生成地址),所以现实世界里的你在比特币的世界里是匿名的(并不是绝对的,还是可以有迹可循的,后续会探讨)。这里做个不太恰当的比喻,比特币的地址相当于银行卡号,私钥相当于银行卡密码。

数据结构

  区块链是一条类似于链表的链,但比特币里的这条链是由哈希指针连接起来的,再者区块内部的交易数据(区块包含区块头和区块体,区块体存放的是交易记录,一条条的交易记录就是这里所说的交易数据。具体区块是什么样子,我们后续再深入探讨)是由一种叫做merkle tree的数据结构组织起来的。下面我们探讨这两个概念。

哈希指针


  比特币中连接区块用的链是哈希指针。哈希指针,简言之就是哈希 指针,它起的作用就是哈希验证 指向“地址”。我们就看看是怎么哈希验证和指向“地址”的。

  首先哈希验证好理解,就是本区块(区块是一个由诸多属性组成的结构体,我们后续探讨)的结构体中有个属性叫hashPrevBlock,这个属性存放的就是上一个区块(更确切的讲应该是上一个区块头的哈希值,细节方面我们后续讨论)的哈希值。如果每个区块都用这个哈希指针指向前一个区块(第一个区块叫创世区块,这个有点特别,我们后续文章继续讨论,笔者准备放在区块的部分讨论),那么所有的区块就形成了一条链。这个哈希值有什么作用呢?答:验证区块的完整性。也就是说,如果本区块前面的任意一个区块里面的内容被篡改的话,那么被篡改的那个区块的哈希值就变了,这会导致下一块的哈希值也得变,以此类推下下块哈希值也得变,那也不用说了,往后都变了,所以,这就让造假账无所逃避。

  下面我们再探讨指向“地址”的功能,这里的地址加了引号,是因为这个地址不是计算机内存的地址,更有点像是区块在比特币这条链上的位置。也就是说,不要把哈希指针中的这个指针理解错了,常规的指针是指向内存中某一元素的首地址,但是比特币这条区块组成的链在各个节点(每台计算机)中的内存地址是不一样的,但无论怎么样,链上的每个区块相对于其他区块的位置是不变的(这是由哈希指针决定的)。我们用这个图示(图片来源于google搜索)来加深理解:

  


merkle tree


  现在再来看看这个merkle tree,这个概念笔者也是第一次接触。不过二叉树应该都知道,比特币使用的merkle树就是一棵二叉树,但merkle树本身而言可以是个多叉树。下面通过一张图片(图片来自维基百科)看看merkle树的结构:

  

  图示中的L1、L2、L3、L4对应到比特币的数据区块里面就是一笔笔的交易(并不是图中的Data Blocks,确切的讲应该是transactions),这棵树是这样形成的:先对L1、L2、L3、L4求hash得到Hash0-0、Hash0-1、Hash1-0、Hash1-1;然后再对Hash0-0、Hash0-1求解哈希也就是H(0-0,0-1)得到Hash0,对Hash1-0、Hash1-1求解哈希也就是H(1-0,1-1)得到Hash1;最后对Hash0、Hash1求哈希也就是H(0,1)得到图中的Top Hash。

  所以,将merkle数和哈希指针结合在一起就是如下图所示(图片来自Google搜索,这里只是简化,还有其他字段后续讨论):

  

  这里仅仅是探讨这个概念,至于比特币为什么要用merkle树,笔者打算放在探讨区块详细内容的时候一起(读者不妨先想一想,用了这种树状结构有啥好处或者为什么不直接把所有的交易放在一起哈希而要多此一举的组装成树)。

P2P网络

  P2P网络,peer-to-peer network,对等网络。这是一种在对等之间分配任务的分布式应用框架,比特币里参与记账的人(专业术语叫做矿工)都可以看做这里的一个peer。这个P2P技术应该都是用过,一些个下载软件(迅雷等)都使用这种网络技术。对等网络是一种网络结构的思想,在P2P结构中,每一个节点(peer)大都同时具有信息消费者、信息提供者和信息通讯等三方面的功能。从计算模式上来说,P2P打破了传统的Client/Server (C/S)模式,在网络中的每个节点的地位都是对等的。每个节点既充当服务器,为其他节点提供服务,同时也享用其他节点提供的服务。简单的说,P2P就是直接将人们联系起来,让人们通过互联网直接交互。P2P使得网络上的沟通变得容易、更直接共享和交互,真正地消除中间商。就拿迅雷下载来说:如果不仅仅能从中央服务器获取到资源,也能从其他邻近的接点获取到的话,这个下载速度是很快的。

  不过比特币(包括以太坊)都实现了自己的P2P网络技术,因为参与记账的人如何同步区块、新加入的节点去哪加载以前的区块、以及节点之间的通信协议等这些问题都是要考虑的。不过这里先不探讨这些细节,在后面的文章里会集中分析这个P2P网络的实现。

分布式共识

  分布式系统应该都有所了解,这种系统一个比较基础、重要的地方就是如何保持各个节点数据的一致性问题。对于分布式系统而言,笔者了解的不多,仅限于用过相关的分布式一致性的软件,比如ETCd和zookeeper之类的,像etcd中的raft协议、zookeeper的paxos协议也仅限于理解一点,这里就不多做赘述了。

  比特币里面要想让世界各地的参与记账的节点按照规矩办事可不是一件很简单的事,即使是现在的比特币的这条链理论上也是存在风险的(真正实践起来也并不是特别复杂,笔者个人认为只是搞得鸡飞蛋打没啥意义),所以,在面临如此多的节点(挖矿的人是越来越多,从挖矿难度就可以看出)下比特币设计的时候更多的掺杂了一些利益方面的博弈。比如,该奖励哪个记账的节点呢?比特币里采用了经典的POW(proof of work,工作量证明)共识机制。很简单,谁先算到了目标哈希值谁就是该奖励的节点。怎么算还记得吗?上面我们提到的,就是不停地尝试哈希函数的输入(比特币里面就是不停的更换nonce,后面会探讨,这里只是了解概念)来计算SHA256的结果。至于更多的细节方面我们在后续文章会继续探讨。

总结

  本文简单介绍了几个比特币中使用的几种技术包括:哈希算法、非对称密钥加密、哈希指针、merkle tree、p2p网络、POW共识算法,这里仅仅是对概念有个大体的了解,具体的实现细节笔者打算放在专门的文章中探讨。笔者理解有误的地方下方请留言。

转载自比特币新闻网(www.btc268.com),提供比特币行情走势分析与数字货币投资炒币最新消息。

原文标题:比特币技术前瞻

原文地址:http://www.btc268.com/qkl/zs/3974.html

本文来源:区块链资讯编辑:btc268.com

本文仅代表作者个人观点,与本网站立场无关。

本网站转载信息目的在于传递更多信息。请读者仅作参考,投资有风险,入市须谨慎!

'); })();