区块链和比特币 第一篇

Posted by DeepNightTwo on February 5, 2017

前言

比特币出现已经好几年了。鉴于之前对比特币的”偏见”,认为这玩意就是投机,打心底里不认可这个玩意。如果你也是这么认为的。那么这篇文章值得一读。

因为区块链技术的热度持续上升,我直到最近几个月我也开始关心其背后的技术。粗略了解之后,我的结论是:

  • 这玩意确实”不靠谱”,但是也并非”一无是处”。它解决了现有技术无法/不容易解决的问题。即在完全彼此不信任、去中心化的情况下,如何建立可信的、不可更改的”交易”。这里的交易是泛指。
  • 其实真正了解了一下区块链技术和比特币之后,我更倾向认为这个技术很不错,虽然有其不足和”不靠谱”的地方,但是什么技术没有个不足呢。重要的是它能解决一个特定的问题。
  • 我还是不建议投资比特币。如果随便花点钱买点比特币玩玩还是可以的。

从哪儿说起

区块链技术和比特币技术中涉及的概念和技术相比之下都有点生僻。刚开始接触的时候容易感觉混乱。作为入门来说,按照如下的顺序学习会相对容易一点。

  • hash算法和非对称加密
  • 区块链和交易(transaction)初步了解
  • 工作量证明(Prove Of Work,aka pow)和挖矿
  • 比特币,比特币钱包和比特币交易
  • 区块链技术和交易的深入了解

按照这个顺序,本文将简单介绍第一,第二和第三步。

本文的目的还是know how。一些具体的细节可能并不精确,但是这不会影响读者理解整个系统是如何工作的,有那些关键点。

hash算法和非对称加密

hash技术应该不算陌生。区块链技术大量的使用了hash算法,比如防篡改,POW,内容摘要。当hash值是被人使用的时候(比如比特币钱包),还会对hash值做易读处理。过程类似于Base64,但是去除了其中的特殊字符。这样在多数环境下,鼠标双击即可选中整个hash字符串。

非对称加密也是一种广泛应用的技术。区块链技术用到的是椭圆曲线非对称加密算法(我数学不行没看懂)。这个非对称加密算法的安全级别比我们通常用的RSA要高,同时加解密计算量也大一点。还有一个特点是,它的私钥可以计算出公钥。所以只要有私钥就全都有了。

区块链和交易简介

记账式交易

一个交易的本质就是把一定数量的比特币从一个比特币钱包(一串由公钥生成的hash值)转到另一个钱包。比特币的交易并没有限制一个交易的参与人数。也就是说,我们平常意义上所说的一个交易,在比特币的交易中可以被压缩为一个交易实体。

举个例子来说,A1到A10要分别付钱给B1到B5。其中A1给B1一块钱,A2给B1两块钱,A3给B2三块钱以此类推。在平时所说的交易中,这就是10个交易。

但是在比特币的交易中,如果这10个交易发生的时间很接近,可以把这10个交易压缩为1个。压缩后的交易大致分为以下几部分

  • 付款方相关数据。这其实是付款方之前收到的钱的拿笔(或多笔)交易。也就是说,如果A1想付钱给B1,那肯定是因为A1有钱。A1有钱就是说之前有人给A1付过钱。别人付钱给A1的这个交易,就是A1给B1付钱的输入/证明/凭证。
  • 收款方相关数据。收款方的钱包地址以及金额等。

也就是说,在一个实际的比特币交易中,有一组付款者(实际是付款者收到钱的那笔交易)和一组收款者。

看到这里也许会有一个疑问。A1的收款交易是A1再付款给B1的凭证。那么怎么控制不让这个凭证被复用呢?如果A1再拿这个收款的交易付款给另外的人怎么办呢?

这个问题的解决办法是,对于付款者,一个收款交易只能用一次。如果没有用完,那就再转给自己。

还是拿上面的例子来说,A1要付一元钱给B1,那么这时候A1就要找到一个或者多个交易,在这些交易中,A1自己是收款者,而且收款的总额是不小于一元钱的。假设A1拿出了3个收款交易,其收款总额是一块二。既然一个首款交易只能用一次,那么多出来的这两毛钱怎么办呢?再转给自己呗。也就是说,A1即会出现在交易的收款方,也会出现在付款方。多出来的那两毛钱,就会再转给A1。这样,新的交易中,A1收到了两毛钱,这个交易就可以作为A1付款的输入。

经过上面的介绍,大家也就不难理解为什么比特币的交易叫做记账式交易。这不同于我们理解的balance或者account,比特币的交易纯粹是基于记账记录的。

将多笔交易压缩成一个交易,有益于交易数据的传输。毕竟比特币/区块链是一个去中心化的系统。所有的交易都要通过网络传送到挖矿机上。而且所有的矿机都要对交易和区块进行验证。

区块链(blockchain)

区块链可以认为是10分钟内的交易的集合。为什么是10分钟呢?这是比特币软件中控制的。怎么能控制在10分钟呢?下面的POW简介中会提及。

这10分钟的交易打包在一起,加上一些metadata,比如前一个区块(block)的hash值,时间戳,交易总数,所有交易的数据的hash等数据,就距离区块不远了。但是距离能成为一个区块链,还差了最重要的一点点,这就是下面要说的POW和挖矿。

区块链顾名思义就是一个链,每个block都有自己的previous block,当然,除了创世block之外。

挖矿和工作量证明(POW)

挖矿和奖励

接着上面的说,一个区块集结了10分钟的交易和一些metadata用于防篡改等目的,除此之外还有一个随机的nonce。所有比特币的服务器(挖矿机/矿机)的目的,就是生成这么一个区块,从而获得奖励。

先谈谈奖励吧。如果一个挖矿机成功的生成了一个区块,那么他将获得一笔比特币收入。这就是所谓的挖矿。我们前面提到过,比特币的交易是通过记账的方式进行的。而挖矿所获得的收入,也是通过一个交易完成的。每个矿机在生成区块的时候,都会在已有的交易中,增加一笔特殊的交易,这个交易就是以奖励的方式,给挖矿机中配置的那个钱包付一定的比特币(付多少见后文)。换句话说,比特币里任何一笔交易,顺着付款方向上找,最后一定是一个挖矿奖励的交易。这是比特币产生的唯一方式。

在一个去中心化的、分布式、互不信任的系统中,怎么才能确定一个区块到底是谁产生的呢?要知道,如果一个区块产生了,就代表这个区块中有一笔给挖矿者奖励的交易。这时候这个区块就会散播到素有矿机中。挖矿机验证这个区块确实是没有问题之后,就会承认这个区块并存储起来,这就相当于是这笔交易被认可了。关键在下面要说的的工作量证明(POW)。

工作量证明(POW)

挖矿就涉及到POW了,这和前面提到的加入区块的随机数nonce有关。

简单来说,POW就是不断改变nonce的值,并计算区块的hash值的过程,直到计算出的hash值满足一定的条件。因为nonce是区块的一部分,是一个4 bytes的数,而且hash算法的特点就是内容很小的改变也会很大的影响hash结果。所以通过不断的改变区块中nonce的值,就可以得到不同的区块hash值。挖矿成功就是生成的区块hash值的开头有足够的0。

也就是说,挖矿的过程就是不断改变区块中nonce的值,并计算整个区块的hash值。如果计算出来的hash值开头的0的个数满足当前的要求。那就算挖矿成功。这个”当前的要求”就是所谓的难度系数。

POW就是通过这种让机器不断重复一个耗费一定计算能力的计算过程,来证明其工作量的。当然这个过程一定不能有投机取巧的可能。也就说,从数学上能证明:除了不断使用随机的nonce值来影响区块的hash值之外,不存在其它的更快速的方法可以预测nonce的值,并使得区块的hash值以足够的0开头。

所以虽然叫做工作量证明,实际是随机的。挖矿成功的机器并不代表真的就比别的矿机计算的hash值多。但是随机的意思就是公平,肯定是越强的机器越有可能挖矿成功。

难度系数和比特币总数

比特币系统每周会统计挖矿的速度,如果挖矿速度太快(小于10分钟),就会调整难度系数——增加区块hash值开头的0的个数。也就是说,无论整个系统机器有多少,最后都不会加快挖矿的速度。

通过上面的介绍可以直到,比特币的总数和挖矿的速度有关。因为所有的比特币归根结底都是挖矿的奖励产生的。最开始的挖矿奖励为每挖出一个区块,奖励50个比特币(现在来看这特么是巨款啊)。当区块数达到210k之后,奖励减半,这个过程大概是四年。也就是说,挖矿的奖励每过4年减少一般。直到约2140年,所有比特币被挖出,届时大概有2100万个比特币产生。

当所有的比特币都被挖出来了,那谁还会挖矿呢?要直到挖矿机就是比特币的服务器,没有挖矿机就没有服务器了。届时,所有的比特币交易会需要支付一定的手续费,作为对挖矿机的奖励。也就是说,长远来了比特币转账不会一直免费。

比特币的世界也有灾难,如果比特币的拥有者丢失了自己的私钥,那么这个私钥对应的钱包里的钱就谁都不能用了。除非有人能再次算出这个私钥(这基本不可能)。

而且比特币的记账模式也有很多花哨的玩法,当然也有的比特币交易中心玩砸了,结果导致一部分比特币”消失”了。

当然,从根本上讲,这些问题的根源都是因为比特币系统是一个去中心化的、建立在互不信任的环境下的一个交易系统。

畅想

我司作为一个支付公司,如果也搞一个ppcoin,让ppcoin和实际货币有固定的汇率。这样很大比例的的交易就可以不走银行了,不走银行就没有手续费了,没有手续费了,没有手续费了。

同时可以制定相应的ppcoin的生成和奖励规则等,也可以把交易服务器开放出去,让专业的挖矿机给我司做服务器,比什么云计算要可靠实惠的多了。

当然,这不大可能哈哈哈哈哈哈哈哈哈。