/ 中存储网

区块链技术原理

2016-10-10 17:15:30 来源:区块链社区

区块链是一种新型去中心化协议,能安全地存储比特币交易或其它数据,信息不可伪造和篡改,可以自动执行智能合约,无需任何中心化机构的审核。交易既可以是比特币这样的数字货币,也可以是债权、股权、版权等数字资产,区块链技术解决了拜占庭将军问题,大大降低了现实经济的信任成本与会计成本,重新定义了互联网时代的产权制度。

要讲区块链却不讲数字货币是不可能的。毕竟区块链是为了满足比特币独特的需求才被创造出来的。

比特币的目标是能够替代传统货币,作为货币,它就必须有流通能力。简单地说,比特币用户之间可以互相转移比特币。而为了保证比特币的流通能够正常的进行,比特币软件必须提供一些最基本的安全上的保证。比如说,如果A给了你一个比特币,这一个比特币就是你的了。要是A能随随便便把这个比特币抢回去,那肯定不行。

如果你使用的是纸质货币,A要拿回给了你的东西,就必须在物理上把它抢回去。那只要使用物理上的方法保护好这个东西就好了。但是如果你用的是支付宝怎么办?支付宝上的转账无非是数字上的加加减减,并不涉及物理实体的转移。你所需要做的无非是信任支付宝这个第三方的机构,相信支付宝没有和A串通好,一起坑你的钱。

但是这两条到了比特币身上就都行不通了。比特币不是物理实体,同时也不存在一个所有人都信任的第三方(比特币的设计目标就是创造一种用户可以完全匿名的货币,自然不可能去依赖一个这样的第三方)。那应该怎么办呢?其实思路很简单:如果A在大庭广众之下,当着一千个人的面答应把钱给你,那么就算没有第三方的保证,A也很难抵赖。

从实现上来说,每当用户使用比特币进行了交易,关于这次交易的信息就会被广播给所有的比特币用户。这样就算有人想要抵赖,也会被抓到证据。

好了,讲了这么多,好像问题都解决了,那么这里面有区块链什么事呢?

我们可以从一个新生节点的角度看一下这个问题。新生节点要加入比特币网络,就必须对整个网络的情况有所了解。它必须知道网络中的整个交易历史,因为只有这样它才能知道当前其他所有节点各持有多少比特币。而这些交易历史所构成的结构就是区块链。区块链是一系列区块按照时间构成的一个链条,链条中每一个区块都包含数条交易记录。

因为比特币本身在安全上的要求(见前文),区块链必须满足一些特性。简而言之,就是不能让人有修改历史的能力。假设有一个区块链A->B->C,任何接收到这个区块链的新生节点,必须能够很方便的验证交易A之后确实发生了交易B,交易B之后确实发生了交易C。在密码学中,防止数据被改动有一个很方便的工具,就是hash。如果C之中包含了B的hash值(如sha256值),那么如果有任何人尝试发送改动过的B(不妨称为B')给新节点,新节点立刻就能发现B'的hash值和C中记录的不符。所以只要新节点获取到了区块链中最新的一个块,它就能往回验证整个历史的合法性。

那么,新节点要怎么知道最新的块是否合法呢?答案其实是:“它并不能知道。”打个比方说,要是你身边的所有人都商量好了合起伙来骗你,你就没办法判断你听到的是不是假话。但是比特币网络存在这样一个假设:“好人总是占大多数的”。也就是说,当新生节点向网络发出请求,它收到的最常见的回复就是合法的回复。

我们解决掉了历史验证的问题,但还有另一个问题:谁有权利往区块链上添加新的块?如果有恶意节点将“A给C一个比特币”改成了“A给B一个比特币”,其他节点应该怎么区分?答案和之前一样:“它并不能区分。”但是不要忘了,我们假设网络中的好人是占大多数的。在大家的计算能力差不多的情况下,这等同于假设网络中的好人们拥有更多的计算力资源。也就是说,如果我们把“往区块链上增加区块”这件事变成一件需要大量计算的工作,那么拥有更多计算力资源的好人们就能抢在坏人之前加入新区块。

而这个计算量巨大的工作,仍然是hash。所有的节点会达成一个共识:“只接受hash值前几位符合条件的区块”(比如只接收hash值第一位是0的区块)。节点可以通过改动区块中的padding来凑hash值。只要hash算法是安全的,节点就没办法高效的凑对hash值,只能暴力尝试所有的padding来碰运气。运气好凑上了的节点,还可以在区块中增加一条给自己一个比特币的交易记录作为对自己的奖励。这个策略还很适合于控制新区块出现的速度(比特币需要在计算力变动的情况下维持匀速增长),只要增强对hash值的要求(比如原先要求第一位是0,现在要求头两位都是0),就能减慢区块链增长的速度。

区块链的设计目标和工作原理大概是这样。如果有讲的不清楚的地方,或是有错漏的地方,欢迎在评论中指出。 

要讲区块链却不讲数字货币是不可能的。毕竟区块链是为了满足比特币独特的需求才被创造出来的。

比特币的目标是能够替代传统货币,作为货币,它就必须有流通能力。简单地说,比特币用户之间可以互相转移比特币。而为了保证比特币的流通能够正常的进行,比特币软件必须提供一些最基本的安全上的保证。比如说,如果A给了你一个比特币,这一个比特币就是你的了。要是A能随随便便把这个比特币抢回去,那肯定不行。

如果你使用的是纸质货币,A要拿回给了你的东西,就必须在物理上把它抢回去。那只要使用物理上的方法保护好这个东西就好了。但是如果你用的是支付宝怎么办?支付宝上的转账无非是数字上的加加减减,并不涉及物理实体的转移。你所需要做的无非是信任支付宝这个第三方的机构,相信支付宝没有和A串通好,一起坑你的钱。

但是这两条到了比特币身上就都行不通了。比特币不是物理实体,同时也不存在一个所有人都信任的第三方(比特币的设计目标就是创造一种用户可以完全匿名的货币,自然不可能去依赖一个这样的第三方)。那应该怎么办呢?其实思路很简单:如果A在大庭广众之下,当着一千个人的面答应把钱给你,那么就算没有第三方的保证,A也很难抵赖。

从实现上来说,每当用户使用比特币进行了交易,关于这次交易的信息就会被广播给所有的比特币用户。这样就算有人想要抵赖,也会被抓到证据。

好了,讲了这么多,好像问题都解决了,那么这里面有区块链什么事呢?

我们可以从一个新生节点的角度看一下这个问题。新生节点要加入比特币网络,就必须对整个网络的情况有所了解。它必须知道网络中的整个交易历史,因为只有这样它才能知道当前其他所有节点各持有多少比特币。而这些交易历史所构成的结构就是区块链。区块链是一系列区块按照时间构成的一个链条,链条中每一个区块都包含数条交易记录。

因为比特币本身在安全上的要求(见前文),区块链必须满足一些特性。简而言之,就是不能让人有修改历史的能力。假设有一个区块链A->B->C,任何接收到这个区块链的新生节点,必须能够很方便的验证交易A之后确实发生了交易B,交易B之后确实发生了交易C。在密码学中,防止数据被改动有一个很方便的工具,就是hash。如果C之中包含了B的hash值(如sha256值),那么如果有任何人尝试发送改动过的B(不妨称为B')给新节点,新节点立刻就能发现B'的hash值和C中记录的不符。所以只要新节点获取到了区块链中最新的一个块,它就能往回验证整个历史的合法性。

那么,新节点要怎么知道最新的块是否合法呢?答案其实是:“它并不能知道。”打个比方说,要是你身边的所有人都商量好了合起伙来骗你,你就没办法判断你听到的是不是假话。但是比特币网络存在这样一个假设:“好人总是占大多数的”。也就是说,当新生节点向网络发出请求,它收到的最常见的回复就是合法的回复。

我们解决掉了历史验证的问题,但还有另一个问题:谁有权利往区块链上添加新的块?如果有恶意节点将“A给C一个比特币”改成了“A给B一个比特币”,其他节点应该怎么区分?答案和之前一样:“它并不能区分。”但是不要忘了,我们假设网络中的好人是占大多数的。在大家的计算能力差不多的情况下,这等同于假设网络中的好人们拥有更多的计算力资源。也就是说,如果我们把“往区块链上增加区块”这件事变成一件需要大量计算的工作,那么拥有更多计算力资源的好人们就能抢在坏人之前加入新区块。

而这个计算量巨大的工作,仍然是hash。所有的节点会达成一个共识:“只接受hash值前几位符合条件的区块”(比如只接收hash值第一位是0的区块)。节点可以通过改动区块中的padding来凑hash值。只要hash算法是安全的,节点就没办法高效的凑对hash值,只能暴力尝试所有的padding来碰运气。运气好凑上了的节点,还可以在区块中增加一条给自己一个比特币的交易记录作为对自己的奖励。这个策略还很适合于控制新区块出现的速度(比特币需要在计算力变动的情况下维持匀速增长),只要增强对hash值的要求(比如原先要求第一位是0,现在要求头两位都是0),就能减慢区块链增长的速度。

区块链的设计目标和工作原理大概是这样。如果有讲的不清楚的地方,或是有错漏的地方,欢迎在评论中指出。