漫谈区块链

最近花时间看了一些区块链相关的书籍和文章,想简单记录下一些核心的技术知识和概念,后面会在这篇基础上分析各部分技术细节。

我的新书《LangChain编程从入门到实践》 已经开售!推荐正在学习AI应用开发的朋友购买阅读!
LangChain编程从入门到实践

技术架构模型

Snipaste_2019-11-02_15-09-27.png

区块链的类型

f7676a8eafd6a2f8ea91d70c1639bc40.png

公有链

公有链通常也称为非许可链(Permissionless Blockchain),任何人都可以参与区块链数据维护和读取,容易部署应用程序,完全去中心化不受任何机构控制。现在市场上的主流大势区块链项目比特币、以太坊等都是公有链项目。在公有链中的共识机制一般是工作量证明(PoW)和权益证明(PoS)。

联盟链

联盟链是一种需要注册许可的区块链,这种区块链也称为许可链(Permissioned Blockchain)。区块链上的读写权限、参与记账权限按联盟规则来制定。整个网络由成员机构共同维护,网络接入一般通过成员机构的网关节点接入,共识过程由预先选好的节点控制。因此联盟链一般不采用工作量证明的挖矿机制,而是多采用权益证明(PoS)或PBFT(Practical Byzantine Fault Tolerant)、RAFT等共识算法。

私有链

私有链,不完全能够解决信任问题,但是可以改善可审计性。私有链的价值主要是提供安全、可追溯、不可篡改、自动执行的运算平台。

CAP 理论

由上面的承载能力是指区块链交易性能,这个问题就涉及到分布式领域的 CAP 定理:Consistency 是一致性,表示同样数据在分布式系统中所有地方都是被复制成相同;Availability 是可用性,表示所有在分布式系统活跃的节点都能够处理操作且能响应查询;Partition tolerance 是分区容忍性,表示不同节点之间数据同步有意外情况产生时,能够容错。
CAP 理论认为你不能同时拥有上述三种,只能同时选择两种。所以,当我们应用到区块链上时,可以明显地发现区块链其实是一个 AP 系统,尤其在 A 这个指标上,也就是可用性做得非常好,所以相应地C 就会降低,反映到具体系统中的交易吞吐量上自然会也会降低。这点我们也可以从 EOS 等高性能的区块链身上佐证,EOS 全球只有 21 个记账节点,而以太坊全球有上万个节点可以随时参与记账,所以越想去中心化,你的 TPS 就不可能高,这也就是为什么EOS 的 TPS 高,而以太坊的 TPS 低。
* TPS 表示区块链每秒能确认的交易数 TPS = transactions / block_time
* transactions 是由区块大小 block_size 和平均每笔交易大小
决定的,而区块大小受全网网络状态 network_bandwidth 限制,也是由记账节点之间物理带宽witness_performance 决定的。(这个公式只是简单的定量分析)
TPS = (block_size * network_bandwidth * witness_performance) /(block_time * witness_count)
Snipaste_2019-11-02_15-02-58.png
提高 TPS,可以提升分子项,降低分母项,也就是增大区块大小block_size、提升记账节点网络带宽 network_bandwidth、提升记账节点处理性能 witness_performance,减小区块时间 block_time、减小记账节点数量 witness_count。分子项我们可以看到,它基本受限于物理资源的上限,所以可操作性不大,所以越想去中心化(记账节点的个数 witness_count越多),你的 TPS 就不可能高,这也就是为什么EOS 的 TPS 高,而以太坊的 TPS 低。

区块链的共识算法

区块链的共识算法是一种基于经济学的博弈算法,它的整体思路就是让作弊者的作弊成本远远大于收益。这一点其实对应到区块链领域有个著名的问题:双花攻击(double-spending),双花攻击是指一个代币被花费了两次,这在任意的区块链系统中是不被允许的。假设作弊者的计算资源(算力)占整个系统的 30%,那么连续两次获得记账权的概率是 9%,看起来作弊的可能性还是挺高的,如果是连续 6 次获得记账权呢?概率直降到万分之七。在比特币中,这个 6 也就是 6 次确认,表示连续 6 个块过去了,如果我的交易没有被双花的话,那么它被篡改的可能性将越来越小,最后变得几乎不可能被篡改,这也是区块链不可被篡改说法的由来,试想如果任何作弊者花了大量的成本获取了系统 30% 的计算资源(算力),最后只有万分之七的概率获得篡改的可能性,比起作弊,还不如诚实记账的收益高。

PoW共识

PoW 全称 Proof of Work,中文名是工作量证明,PoW 共识机制其实是一种设计思路,而不是一种具体的实现。所以我们需要构造一个计算不对称的难题,这个难题在比特币中被选定为以 SHA256 算法计算一个目标哈希,使得这个哈希值符合前 N 位全是 0。由于结果只能暴力搜索,而且搜索
空间非常巨大,作弊几乎不可能,另外符合条件的值也是均匀分布在整个空间中的,所以哈希是一个非常公平且粗暴的算法。
以上的基本逻辑就是 PoW 挖矿过程:
1. 生成 Coinbase 交易,并与其他所有准备打包进区块的交易组成交易列表,并生成默克尔哈希;
2. 把默克尔哈希及其他相关字段组装成区块头,将区块头(Block Header)作为工作量证明的输入,区块头中包含了前一区块的哈希,区块头一共 80 字节数据;
3. 不停地变更区块头中的随机数即 nonce 的数值,也就是暴力搜索,并对每次变更后的的区块头做双重 SHA256 运算,即 SHA256(SHA256(Block_Header))),将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成。
具体看这个视频

PoS共识

PoS 全称是 Proof of Stake,中文翻译为权益证明。
币龄CoinAge,字面意思就是币数量乘以天数。比如你有 100 个币,在某个地址上 9 天没有动,那么产生的币龄就是 900,如果你把这个地址上这100 币转移到任意地址,包括你自己的地址,那么 900 个币龄就在转移过程中被花费了,你的币数量虽然还是 100 个,但是币龄变更为 0。币龄在数据链上就可以取到,任何人都可以验证。
区块链共识机制的第一步就是随机筛选一个记账者,PoW是通过计算能力来获得记账权,计算能力越强,获得记账权的概率越大;PoS 则将此处的计算能力更换为财产证明,就是节点所拥有的币龄越多,获得的记账的概率就越大。这有点像公司的股权结构,股权占比大的合伙人话语权越重。

DPos共识机制

DPoS 共识算法就是将 PoS 共识算法中的记账者转换为指定节点数组成的小圈子,而不是所有人都可以参与记账,这个圈子可能是 21 个节点,也有可能是 101 个节点,这一点取决于设计,只有这个圈子中的节点才能获得记账权。这将极大地提高系统的吞吐量,因为更少的节点也就意味着网络和节点的可控。具体看这篇DPOS共识算法

P2P网络协议

P2P 网络技术要解决两个主要问题,第一是资源定位,第二是资源获取。节点发现(一般包括初始节点发现和启动后节点发现)和局域网穿透是属于资源定位问题;节点交互协议是属于资源获取问题,节点之间的交互是遵循一些特定的命令,这些命令写在消息的头部,消息体写的则是消息内容。命令分为两种,一种是请求命令,一种是数据交互命令。
除去少数支持 UDP 协议的区块链项目外,绝大部分的区块链项目所使用的底层网络协议依然是TCP/IP 协议。所以从网络协议的角度来看,区块链其实是基于 TCP/IP 网络协议的,这与 HTTP 协议、SMTP 协议是处在同一层,也就是应用层。
比特币的 P2P 网络基于 TCP 构建,主网默认通信端口为 8333。以太坊的 P2P 网络则与比特币不太相同,以太坊 P2P 网络是一个完全加密的网络,提供 UDP 和
TCP 两种连接方式,主网默认 TCP 通信端口是 30303,推荐的 UDP 发现端口为 30301。

加密签名算法

区块链中主要应用了两类密码学算法,第一类是哈希算法,第二类是非对称加密算法。

哈希算法

哈希算法被广泛地使用在构造和验证区块、交易的完整性上,由于哈希算法的特性,使得我们可以把任意的交易数据做成数据摘要,然后再一个一个链接起来,形成数据块的链式结构。这样我们可以通过验证每个区块间接地验证交易,然后每个交易原数据也可以做成哈希数据摘要,用于验证交易数据的完整性。
Snipaste_2019-11-02_16-24-16.png

非对称加密算法

公私钥密码算法是区块链 Token 系统的基石,在比特币大类的代码中,基本上使用的都是 ECDSA。ECDSA 是 ECC 与 DSA 的结合,整个签名过
程与 DSA 类似,所不一样的是签名中采取的算法为 ECC(椭圆曲线函数)。从技术上看,我们先从生成私钥开始,其次从私钥生成公钥,最后从公钥生成地址,以上每一步都是不可逆过程,也就是说无法从地址推导出公钥,从公钥推导到私钥。
Snipaste_2019-11-02_16-23-35.png

交易机制(UTXO模型)

UTXO 全称是:“Unspent Transaction Output”,这指的是:未花费的交易输出,UTXO 的核心设计思路是无状态,它记录的是交易事件, 而不记录最终状态,也就是说只记录变更事件,用户需要根据历史记录自行计算余额。Redis 的 AOF 模式备份模式也是如此。
Snipaste_2019-11-02_16-34-44.png
所有的交易都可以找到前向交易,例如 TX5 的前向交易是 TX2,TX2 中的 Output1 作为TX5 中的 Input0。意思就是 TX2 中的付款人使用了 Output1 中指向的比特币转移给 TX5 中的收款人,接着 TX5 中的
人又把收到的比特币转移给了 TX6 中的收款人,成为了 TX6 中 Output0。我们也可以发现,TX6 中的收款人还没有产生 TX7 交易,也就是说 Output0 还没有被花费,即UTXO 的真正语义:Unspent Transaction Output,未花费的交易输出。可以发现 UTXO 也同样能表示余额,不过是重演计算的方式,它用不同的方式表达了余额,我们把一个地址上所有的 UTXO 全部找出来,就是这个地址总的余额了。无论是 TX5 还是 TX2,都已经成为历史交易, 它们都忠实客观地记录了两笔交易,这两笔交易代表的是事件,而不是余额状态转移。

主流框架平台

比特币

大部分区块链都是以比特币区块链为基础进行扩充的,比特币区块链包括区块链中公开记账、创建创世区块、交易、打包 Transaction、广播交易的几个步骤,具体看这篇
中本聪的关于比特币的白皮书,是区块链的起源。

以太坊

以太坊 Ethereum 项目的目标是打造一个去中心化的新一代互联网应用平台,这个平台称作 Dapp平台。这些 Dapp 基于以太坊智能合约虚拟机开发、编译、部署,并且可以自定义业务逻辑,部署后全网可见且自动执行,理想情况下不存在宕机、审查、欺诈、第三方干预的情况。
智能合约是一个由计算机处理、可执行合约条款的交易协议,其总体目标是满足协议既定的条件,例如支付、抵押、保密协议。这可以降低合约欺诈造成的损失,降低仲裁和强制执行所产生的成本以及其他的交易成本。
智能合约包含两部分,一部分是开发语言,主要以 Solidity 为主,Dapp 开发者编写好代码以后,使用 Solidity 编译成十六进制字节码,然后部署到 EVM 上,也就是把合约广播到全网,等矿工打包后就形成了常年运行的 Dapp 了。另一部分就是 EVM。 EVM 是以太坊智能合约虚拟机,它是一个轻量级的虚拟机隔离环境,它并不提供访问本地网络、进程、文件系统的功能,它更像是一个封闭的容器,这个容器里面装了一个正在运行 Dapp,Dapp 在运行过程中,可以被请求或其他事件触发,然后执行相应的逻辑,这些请求和事件是由以太坊上的交易产生的,不是来自本地操作系统的事件。Dapp 运行过程中,每次状态发生变化,则意味着全网同步更新,大家的计算结果都是一致的,这有两个特性:
1. 所有 Dapp 的计算结果经过全网共识,一旦确认过几乎无法被伪造和篡改;
2. 由于必须经过全网共识,所以这限制了整个网络的容量。
以太坊白皮书

超级账本 HyperLedger

超级账本基本代表了联盟链,其项目下的技术框架最为知名,应用也最为广泛。超级账本由 Linux 基金会主持,宗旨是构建一个面向企业应用场景的开源分布式账本技术平台。因为企业应用场景的多样性,所以超级账本包含了不只一个项目,它是由多个项目组成的。一共 9个项目,其中 5 个是主要的技术框架,其他 4 个是辅助性工具。
超级账本Hyperledger白皮书(1.0.1版)

EOS

EOS 是一个以太坊的竞争型区块链,它提供了全新的区块链架构,使得去中心化平台水平扩容和垂直扩容都成为了可能。如果智能合约是程序,那么可以把 EOS 看成是一个超大的操作系统了,它为所有的程序,也就是智
能合约提供了基本设施。例如账户、授权、数据库、异步通信等接口。
它甚至可以跨平台驱动大量的 CPU 或者集群,所以 EOS 的 TPS 肯定是远超以太坊的,这也使得构建基于区块链的应用几乎没有成本而且快速高效。

  • EOS.IO 技术白皮书

    写在最后

    我认为区块链系统环境搭建,区块链应用开发,都是专业技能,但也只是传统计算机编程的升级版,加入了加密,算法,分布式数据库等技术,作为普通开发者能够参与的有偏底层的公链开发和偏应用的智能合约设计。

    参考链接

    区块链知识体系总结
作者

莫尔索

发布于

2019-12-12

更新于

2024-12-18

许可协议

评论