浅谈区块链技术

什么是区块链

 提到区块链,大家第一时间想到的是比特币。实际上,比特币只是区块链技术的一种应用。接受度比较高的区块链定义是:一种安全共享的去中心化数据账本。区块链翻译自 block chain ,它包含了两个单词,一个是 block ,即区块,它用来存储交易数据等,可以将它理解为账本;另外一个单词是 chain ,即区块像链条一样连接起来,这么看来区块链还是比较形象的。

区块是怎么产生的

 区块链可以分为公链、私链和联盟链,其中公链是真正去中心化的。它的特点是任意节点都可以加入,并且充当“记账员”的角色,这些“记账员”可以被称为“矿工”。

 当网络中的某个节点发布了一笔交易,例如:张三给李四转账100,“矿工”们会校验这笔交易,并通过共识算法(常见的共识算法是工作量证明)来决定哪位“矿工”能记录这笔交易。这位“矿工”会打包这笔交易的信息,并加上自己的签名,生成新的区块,并将区块信息广播出去,接受其他“矿工”的校验。如果其他矿工认可这个新区块,会将这个区块添加到自己本地的区块链里,然后基于这个区块去产生新的区块。为了提高“矿工”的积极性,新生成区块的头部会加上一条交易记录,奖励生成区块的“矿工”。

签名算法

 公链是开放的,故不排除恶意节点加入。区块链采用签名算法来校验区块是否被篡改。签名算法分为公钥和私钥,顾名思义,公钥是可以公开的,而私钥只有密钥持有者知道。消息发送方会使用自己的私钥为消息生成一个签名,接收方根据发送方的公钥、消息内容和签名就可以确认这个消息是否有没有被篡改。常见的签名算法有 RSAECDSA ,比特币采用的是 ECDSA 算法,因为 ECDSA 算法拥有更短的签名。

区块链原理示意图

交易的输入和输出

 区块链还需要解决“一钱多花”的问题,比如某个节点发布一笔交易:张三给李四转账100。为了方便校验张三是不是真的有100,节点发布交易信息的时候,会附带当前这笔交易依赖的交易(即钱从哪儿来,是否足够支付)。举个例子:

 张三想给李四转100,张三之前从王五那收到了60,从赵四那收到了60。所以张三给李四转账100的交易里,会包含张三从王五、赵四收钱的记录。

共识算法

 前面提到,“矿工”们都可以记账,但谁来记账呢?这需要共识算法来维持。常见的共识算法有“工作量证明”。“工作量证明”最早用在垃圾邮件过滤,它的想法很简单:邮件的接收方要求邮件的发送方进行一定的计算,通过“工作量”校验,接收方才会接受邮件。这样一定程度上增加发送垃圾邮件的成本,减少了垃圾邮件的数量。

 区块链常用的工作量证明算法基于SHA-256,每个区块除了交易信息外,还包含 nonce 变量,“矿工”会使用SHA-256算法计算当前区块的 HASH 值,如果 HASH 值不满足要求(一般要求是 HASH 开始 n 位都为0,n 是挖矿的难度),“矿工”会修改 nonce ,直到找到满足条件的 nonce 。如果“矿工”获得了打包区块的权利,却加入了虚假的交易信息,那么区块信息广播出去之后,其他节点可能拒绝。有点“得不偿失”的意味,这也许就是“工作量证明”经受了时间检验的原因。 区块链记账

最长链原则

 网络广播总是有延迟存在,新区块产生的消息还在广播时,其他的“矿工”可能也挖到矿了,它也会将自己新生成的区块广播出去,这时区块链出现了分叉。区块链遵循最长链原则,节点收到新区块时会和自己当前的最长链进行比较:如果新收到区块所在链比自己当前的链更长,它就会基于新链继续进行挖矿。

为什么交易确认如此耗时

 交易信息需要打包成区块,并广播出去得到其他节点认可才算是交易完成。区块的大小有限制,并且前面提到,交易的输入里面需要包含当前交易依赖的其他交易信息,所以一个区块包含的交易数非常有限,这意味着需要进行排队。排队的依据一般是交易的手续费,数字货币的交易费是比较昂贵。当然比特币、以太坊等主流数字货币已经意识到这个问题,也在不停改进这个问题。

参考资料

[1]. 比特币白皮书

[2]. 比特币是如何工作的

Licensed under CC BY-NC-ND 4.0
使用 Hugo 构建
主题 StackJimmy 设计