区块链技术用纯代码为交易背书,无需第三方。

区块链是一个公开的分布式账本,任何人都可以参与记账(因此可以有无限份备份),篡改难度高,确保数据可信(认可同一份账本),每次都对账本的改动都会留痕。

分布式系统中每台计算机时间都不同,管理员不会、也无法向它们下达在某个时间同时开始做某件事的指令。

区块链的每个参与者都能贡献自己的资源(如算力)来表达对某种决策的支持或反对。

去中心化的组织方式必然会带来效率的降低。

区块链网络完全依靠自治的经济激励模型来运作。

矿工挖矿的奖励包括挖到区块获得奖励和打包的交易中包含的矿工费。

货币基于一个族群、一个地区的共识形成,在人类还没有国家和银行的概念时,就已自发地使用贝壳、石头购买牛羊,这正是货币的雏形,说明了货币本身就是想象的集合体(本质是信任和共识),只要形成共识,没有什么是不可以作为货币的。

比特币的定位是点对点的支付系统。比特币的总量设定在 2100 万个,新币产生的速度也是设定好的(每产生 21 万个区块,挖矿奖励减少一半,平均每 10 分钟产生一个区块,大约每 4 年奖励减半,2140 年左右达到设定的总量)。总量的限制类比黄金、石油的稀缺性,产生速度类比黄金、石油的开采速度。

比特币区块大小设置为 1MB 的原因主要是早期上传带宽的限制,矿工挖到区块后需要快速广播给其它节点,否则其它节点将不能及时下载到新的区块,导致网络不稳定。
(8 MB * 8 bits * 7 peers) / 30 seconds = 15 Mbit/s

以太坊将代码像交易一样储存在区块链网络中,基于区块链搭建的智能合约是试图降低信任成本的实验。
以太坊的出块时间是十几秒。以太币无限量供应,它的主要价值在于使用。

DApp 基本都发行了 Token,Token 可以在应用项目构建的生态(是支撑该 DApp 的区块链网络的子生态)中流转。

支撑区块链运行的客户端只要更新,发布一次新版本的软件协议,就被称作“分叉”一次。

软分叉情况下,旧协议判定新协议下产生的交易同样是合法的,新协议可以将旧协议的部分或全部区块视为非法。支持新旧协议的旷工彼此隔离,会影响生态,造成币价下跌,于是旧版本客户端升级成新版本,分叉后又通过自治而磨合达成新共识。

孤块:合法的区块被另一个高度相同的合法区块抢先,导致该合法区块被抛弃。

空块:矿工总是会往区块中塞入尽量多的交易,这样获得的矿工费就越多。空块中只包含 coinbase 交易,空块产生的逻辑是,最新区块被其它矿工挖到,你放弃当前区块的挖矿,继续挖矿前需要下载和检验被其它矿工挖到区块中包含的交易(避免包含同一条交易),这一短暂的等待的时间中也可以继续挖矿,但不去包含交易,这样挖到的区块虽然没有旷工费,但至少有 coinbase 奖励。

区块高度:某个区块到第一个区块之间的距离。

51% 攻击:攻击者发起转账交易 tx1,包含该交易的区块 x 被连接到区块链;攻击者马上挖矿得到区块 y 并连接到区块 x 前的一个区块,并基于区块 y 不断添加新区块,使包含区块 y 的链最长,结果是包含区块 x 的链将被丢弃,tx1 被撤销。

零确认交易:指已经广播到区块链网络但还没被矿工塞入区块的交易。一旦一条交易被塞入区块,也就是得到了矿工的验证,就称这条交易得到了 1 个确认,若这个区块后面有添加了一个新区块,就称这条交易得到了 2 个确认,以此类推。

双花:tx1 表示用一笔 btc 购买物品 a,在包含 tx1 的区块连接到链上之前(时间差),马上发起 tx2 用同一笔 btc 购买物品 b,两笔交易中有一笔无法通过验证,但 a 和 b 在交易确认前都已交付。

重放攻击场景:

  1. 硬分叉
    • 以比特币硬分叉为例,硬分叉后比特币现金(区块大小由 1MB 扩大为 8MB)开始记录自己的账本,但硬分叉之前比特币和比特币现金维护同一个交易账本,交易比特币的交易可以重放到到比特币现金所在的链上,造成重放攻击。
    • 解决方法可以是更改新链的签名方式,或者更改交易的格式等。
  2. 发生没有使用 UTXO 机制的在区块链(如以太坊)内部
    • 解决方法可以是为交易加盖时间戳,交易只有在时间戳之后的一定时间内验证才有效;或是为交易添加序号。

女巫攻击(Sybil Attack):

  • 伪造出大量虚假节点,扰乱共识的达成。
  • PoW 天然可以抵御女巫攻击(伪造节点也伪造不出算力)。

粉尘攻击:

  • 大量低价值的交易造成区块链网络拥堵。
  • 监视者向某个用户的一个地址转入少量比特币,当该用户发起交易时,监视者转入的少量比特币就有可能和该用户其它地址上的比特币拼凑出 UTXO 的输入,这样一来该用户的多个地址就都暴露了。

同态哈希:一种特殊哈希,将一个内容分成 2 部分,分别对这两部分进行同态哈希并将结果加和,得到的结果等于对整个内容的整体哈希。使用同态哈希可以减少计算量,实现信息的隐匿。

零知识证明:a 要在不向 b 提供他已知的信息之外的信息的前提下向 b 证明某个论点,做法是 a 对 b 已经掌握的信息做出和要证明的论点相关的论断,b 根据 a 的论断就可以判断 a 的论点的正确性。

SHA: Secure Hash Algorithm,256 表示 256 位。

ICO: Initial Crypto-Token Offering

DAO: Decentralized Autonomous Organizations
The DAO 是以太坊上的 DApp,它类似现实中的基金项目。The DAO 上的智能合约漏洞导致分叉出了以太坊和以太坊经典两条链。

盲签名

在一些涉及敏感数据的场景中,用户向认证者提供待认证的数据,但认证者不能查看明文。

盲签名技术设计的核心在于盲化待签名的数据。

盲签名流程:

  1. 信息发送者盲化数据:引入随机数作为盲化因子,将原始待签名数据进行盲化处理。
    • blinded_data = blind(data, blind_factor)
  2. 信息发送者请求认证者对盲化数据进行签名。
    • blinded_signature = sign(blinded_data, private_key)
  3. 信息接收者用盲化因子将盲签名解盲。
    • signature = unblind(blinded_signature, blind_factor)
  4. 信息接收者验证认证者的签名。
    • verify(signature, public_key)
    • 数字签名验签:验签者用签名者的公钥解密数字签名得到信息的摘要,再对信息的内容计算摘要,两个摘要相同则表示验签通过。
    • 数字签名的目的是防伪造、防抵赖。

电子投票系统:投票者先对选票进行盲化,投票认证者仅能对盲化后的选票进行签名认证,无法知晓投票者选票的具体内容;后续投票者将盲签名解盲,投票认证者也无法追踪投票者的投票签名。至此,保护选票意向隐私性和验证选票意向明文有效性的需求得以同时满足。

环签名

环签名将签名者的信息隐匿在签名群中,作用是隐藏签名者的身份,验签者只能确定签名来自一个群体而不能推断出具体的签名者。

共识

不同共识机制的目的都是维护区块链网络的安全,采用的手段都是经济激励,只有当维护区块链网络安全比攻击它回报更大时,参与者才有动力参与维护工作而不是作恶。

PoW

矿工决定要放入新区块的交易后,连同每次都变化的 nonce 值一起计算区块头的哈希值,直到计算结果小于给定的目标值后才算挖矿成功。能否破解难题取决于算力大小。

比特币每隔 2016 个区块调整一次目标值,约 20160 分钟(小于 2 周),如何调整难度则通过比较最新的 2016 个区块实际产生所花费的时间和期望时间来确定。

PoS

Proof of Stake

只有持有该加密货币的人才能参与挖矿,持有者有更强的意愿去维护区块链网络的安全。
类比股份制公司,持有股份越多的人享受的权益越大。

能否破解难题取决于持有加密货币的数量多少和持有时长。

马太效应将削弱采用这种共识机制的区块链的去中心化程度。

PoS 演化:

  • 将持币时长纳入考量,由持币数量和持币时长的乘积算出币龄,矿工挖出新区块后会抵消一部分持币时长,币龄将重新计算。
  • 在获得一次区块的添加权后需要等待一段时间才能再次参加挖矿。

DPoS

Delegated Proof of Stake

持币者投票选举出有权添加新区块的代表团(代议制民主)。代表团负责维护整个区块链网络的安全,要承担高昂的费用(矿机、网络),只有有实力承担费用的人才有资格申请成为候选人。

在投票阶段,每个持币者可以将票投给一定数量的候选人。每个持币者投票的权重不同,持币越多话语权越大。

代表团选定后,实际添加区块时,无需再通过竞争,出块速度显著提升。

DPoS 也牺牲了去中心化的程度,但平衡了效率的要求。

不可能三角:效率、去中心化、可扩展性。

PBFT

PBFT 中,总节点数大于作恶节点的 3 倍,系统就能正常运作。

Merkle Tree

将数据切割成许多小数据块,每个小数据块分别哈希,若数据块数据为奇数,则自动复制一笔交易使数据块数目变为偶数。将一个区块中的交易层层哈希时就用到了 Merkle tree 结构。

SPV 中,要验证交易 tx1,可以要求矿工提供和 tx1 相邻的交易 ID,以及 Merkle 树上其它相关结点的信息,自己计算出树根,与区块头中的树根进行比对(弱抗碰撞性保证矿工无法伪造 Merkle tree 的信息)。

扩容方案

隔离见证

SegWit: Segregated Witness

比特币的交易包含 2 部分:

  1. 转出、转入地址和转账金额;
  2. 见证信息,用于验证转账发起人是否有权使用这笔资金。

隔离见证的思想就是将见证信息隔离开来,不计入区块容量,效果是扩容 2~3 倍。

隔离见证还修复了一个漏洞。作恶者篡改交易的数字签名(更改数字签名格式,修改后仍能验签通过),导致交易 id 发生变化,篡改后的 id 被加到区块中,结果是用篡改之前的交易 id 无法追踪到交易,尽管这样的作恶不会影响交易的达成,做恶人也没有收益。SegWit 后,数字签名归为见证信息,生成交易 id 时不会将它纳入一起哈希。

状态通道

状态通道的思路是将状态信息放在一条特殊的通道上记录,不占用区块本身的容量。无论在这条通道上交易了多少次,状态改变了多少回,最终只有通道关闭时双方的余额信息才会被打包进区块。

闪电网络

闪电网络是状态通道技术的一次运用。

闪电网络相当于开辟了一条专用的快速转账通道,这个通道同时也是一个类似资金池的共同账户,交易双方首先需要分别往账户中打入一些比特币,矿工只会将开启通道时存入的金额以及关闭通道时账户余额的分配信息打包进区块,而不需要将每一笔交易记录在链上,交易效率提升,但矿工利益受损。

为防止欺诈,主张关闭通道的人需要等待一周左右才能拿回账户里的余额,同时还有一套惩罚机制。

以太坊上类似的区块扩容方案称为雷电网络。


  • UTXO 中,每次接受币可以采用不同地址,这些地址都关联到同一个私钥。
  • 更改数字签名格式,修改后仍能验签通过。

References