跟我一起学习区块链技术 (2)

in #cn7 years ago

书接上文, 今天继续来普及区块链的概念.

跟我一起学习区块链技术(0)
跟我一起学习区块链技术 (1)

Antpool-Signals-for-Bitcoin-Unlimited.png

2. 那些听起来很悬的概念

今天的内容应该一样满烧脑的, 确实感觉区块链这个东西覆盖了太多抽象的概念, 很多听起来很悬, 解释起来更悬的名词.

2.1 智能合约

智能合约的出现最早能够推演到1995年(另一说是1994年), 由密码学家尼克·萨博首次提出. 这个概念最近比较热是在以太坊这个区块链上, 以太坊说白了就是一个大平台, 你可以在这个平台开发出属于自己的区块链产品.
那什么是智能合约呢? 这是一头劝退怪, 原文定义是: 一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议。
其实有没有那么悬呢? 没有, 在以太坊上, 智能合约就是一段代码, 用来加密验证成功后去执行的一段代码. 这段代码的内容可以是给谁加多少以太币或者是给谁减少多少以太币, 在共识达成的情况下, 全网执行这段代码, 如此而已.

2.2 UTXO

UTXO 是 Unspent Transaction Output 的缩写. 其中, Transaction 一般缩写为 TX.

在比特币交易中, 每笔交易都会若干交易输入, 也就是资金来源, 也都会若干笔交易输出, 也就是资金去向.

一般来说, 每一笔交易都要花费 (spend) 一笔输入, 产生一笔输出, 而其所产生的输出, 就是“未花费过的交易输出”, 也就是 UTXO.

使用 UTXO, 你总能找到一笔输出出现时, 他的所有的全部路径, 这笔资金的全生命周期, 都可以被查询到.

UTXO 模式, 就是指使用 UTXO 进行记账的模式, 比如比特币, Qtum.

2.3 双花, 51%攻击

前一篇文章有介绍过, 每一笔交易实际上都是广播出去等待矿工计算确认并加到链上. 如果把一笔资金同时发出去两份, 由于确认的滞后性, 会不会产生一笔资金重复使用的问题, 就是双花问题.

通过追溯 UTXO, 是解决双花问题的第一步. 但是如果这两笔资金分别被不同的矿工计算并确认加到链上呢? 这里就引入了 51% 攻击问题, 也就是说如果有人掌握了 51% 的计算力, 那么伪造双花会很容易, 所以比特币的一个公理就是计算力极为分散.

然而事实上, 无论双花还是51%攻击, 到目前为止并没有一个绝对的解决方案.

2.4 分叉, 软分叉, 硬分叉

区块链的系统本身是一套软件系统, 是软件, 就有 bug, 就要升级, 熟悉软件的都知道升级就有概率会带来问题, 而这个问题在分布式系统中, 会有更显而易见的问题, 就是升级同步问题, 有的节点系统升级了, 有的节点系统没有升级.

升级的系统可以采用了新的数据结构和共识算法, 这可能造成对旧的系统的兼容或者不兼容, 从而在计算验证时, 新的系统创建新的链, 旧的系统创建旧的链, 我们把这种现象叫做, 区块链的分叉.

所以以后提到分叉, 只要想到, 这是区块链要升级, 就好了.

那什么是软分叉, 什么是硬分叉呢? 如果这次分叉是强制升级, 新的系统不兼容老的系统, 就是硬分叉; 如果这次升级大家互相兼容, 新老系统都可以工作在同一条链上, 就是软分叉.

2.5 椭圆曲线加密 (ECC)

前一篇文章介绍了区块数据采用的加密算法是非对称加密, 在非对称加密界里, 生成公私钥的方法, 比较常用的是 RSA, 但是区块链采用了另一种方法, ECC, 即椭圆曲线加密.

RSA 的原理是给定两个素数p、q 很容易相乘得到n,而对n进行因式分解却相对困难.

ECC 的原理是 K=kG 中, 给定 K 和 G, 很难计算 k. 具体求证过程可以参考这篇文章, http://8btc.com/article-138-1.html

2.6 侧链, 竞争币, 竞争块链

侧链, 其实不算做一个区块链, 更确切的说应该是侧链协议. 定义侧链之前, 先说一下竞争币和竞争块链.

由于比特币本身是开源的, 所以初期便出现了很多基于比特币代码修改而成的新币, 这个就是竞争币; 比特币协议本身也是公开的, 所以还有一些编码能力强的团队, 基于协议本身对块链算法进行重写, 形成了新的区块链产品, 这就是竞争块链.

由于竞争币和竞争块链的价值, 或真实, 或炒作, 开始有更多的人进入, 就让区块链产品间的币互换产生了需求, 比如 1 比特币换多少以太币之类, 这就产生了侧链协议的概念, 侧链的概念更像交易所, 能够对不同的币之间进行汇兑. 当然底层实现上要复杂的多. 具体可以参考<区块链:从数字货币到信用社会>一书的”区块链进阶”章节.

2.7 小结

区块链概念性的内容到这里就差不多了, 后面的章节我会加入一些代码来深入讲一下区块链技术研发的内容.