1. 引言

以太坊协议设计的主要目标 之一是降低复杂性:在保证链功能和高效性能的基础上,使协议尽可能简单。

大部分以太坊协议设计于2014~2016年,协议本身并不完美,一直在致力于降低以太坊协议的复杂性。

难点之一对复杂性本身进行定义。一种方式是将其拆分为2个维度来考虑:

  • 1)encapsulated complexity 封装复杂性:当系统具有子系统时,尽管子系统内部复杂,但对外暴露一个简单的接口。
  • 2)systemic complexity.系统复杂性:当系统的不同部分无法干净地拆分时,各个部分之间有复杂的相互交互。

2. BLS签名 VS Schnorr签名

详细可参看博客:

  • ECDSA VS Schnorr signature VS BLS signature

BLS和Schnorr是基于椭圆曲线构建的2种很流行的密码学签名机制。

BLS签名从数学上看起来很简单:

  • BLS签名:σ=H(m)∗k\sigma = H(m) *kσ=H(m)∗k
  • BLS验签:e([1],σ)=?e(H(m),K)e([1],\sigma)\stackrel{?}{=}e(H(m), K)e([1],σ)=?e(H(m),K)

其中HHH为hash函数,mmm为待签名message,kkk和KKK为签名者的私钥和公钥。
BLS签名看起来很简单,但是真正的复杂性隐藏在eee函数的定义中:elliptic curve pairings。

BLS签名需要pairing椭圆曲线,而Schnorr签名只需要basic椭圆曲线即可。但是Schnorr签名的签名和验签逻辑要更复杂:

  • Schnorr签名:待签名消息为MMM:

    • 从allowed set中选出随机值kkk
    • 令r=gkr=g^kr=gk
    • 令e=H(r∣∣M)e=H(r||M)e=H(r∣∣M),其中∣∣||∣∣表示拼接,rrr以bit string表示。
    • 令s=k−xes=k-xes=k−xe
      完整的签名表示为(s,e)(s,e)(s,e) pair。
  • Schnorr验签:

    • 令rv=gsyer_v=g^sy^erv​=gsye
    • 令ev=H(rv∣∣M)e_v=H(r_v||M)ev​=H(rv​∣∣M)
      若ev=ee_v=eev​=e,则验签通过。

哪种签名更简单呢?具体取决于你所关注的点。BLS签名具有大量的技术复杂性,但是该复杂性隐藏在eee函数的定义之下。若将eee函数看成是黑盒,则BLS签名确实非常简单。而Schnorr签名具有更少的total complexity,但是BLS签名具有更多的pieces,可与外界进行巧妙的互动。如:

  • 1)实现BLS多签(对2个秘钥k1,k2k_1,k_2k1​,k2​的签名进行合成)是很容易的:仅需要σ1+σ2\sigma_1+\sigma_2σ1​+σ2​。而,Schnorr多签需要2轮交互,同时需要考虑处理Key Cancellation Attack。
  • 2)Schnorr签名需要生成随机数,而BLS签名中不需要随机数。

Elliptic curve pairings是一种强大的“complexity sponge”,其内部包含了大量的封装复杂性,但是整体方案具有更少的系统复杂性。

同理,对于 KZG commitments(需要pairings),比 inner product arguments(不需要pairings),具有更复杂的内部逻辑。

3. Cryptography vs Cryptoeconomics

很多链在设计时都需要考虑 Cryptography vs Cryptoeconomics。如对于rollups 会在validity proofs(又名ZK-SNARKs)与 fraud proofs之间进行选择。

ZK-SNARKs为复杂的技术。但ZK-SNARK背后的工作原理可以一篇博客解释清楚。在ZK-SNARK中,验证某些计算需要的复杂性 比 计算本身 要复杂多倍。这也是为啥 ZK-SNARKs for the EVM 仍然在开发中,而fraud proofs for the EVM 已进入测试阶段。

  • 高效实现ZK-SNARK需要 进行具有特殊优化的circuit设计 + 使用不熟悉的编程语言 等各种挑战。
  • 而Fraud proofs本质更简单:若某人发起挑战,你仅需直接在链上运行相应的计算。为了效率,有时会增加binary-search机制,但是这并不会增加多少复杂性。

尽管ZK-SNARKs是复杂的,但其是封装复杂性。而相对低复杂度的fraud proofs,其是系统复杂性。

fraud proofs中的系统复杂性示例有:

  • 1)需要仔细的激励工程,来避免Verifier困境。
  • 2)若在共识层实现,需要为fraud proofs定义额外的交易类型,并需要考虑当有多个actors同时竞争提交fraud proof的情况。
  • 3)需依赖同步网络。
  • 4)支持censorship attack,也可用于commit theft。
  • 5)基于fraud proofs的Rollups要求liquidity providiers支持instant withdrawals。

基于以上原因,以及密码学方案的复杂性角度来看,ZK-SNARKs具有更长期的安全性:ZK-SNARKs have are more complicated parts that some people have to think about, but they have fewer dangling caveats that everyone has to think about.

4. 其它示例

  • Proof of work(Nakamoto consensus):具有低封装复杂性,该机制非常简单易于理解,但具有更高的系统复杂性(如selfish mining attacks)。
  • Hash函数:高封装复杂性,但具有非常易于理解的低系统复杂性。
  • Random shuffling算法:shuffling算法可:
    • 为 内部复杂的(如Whisk),具有易于理解的枪随机性。
    • 为 内部简单的,但具有更弱的随机性,且更难于分析(高系统复杂性)。
  • Miner extractable value(MEV):很强大的协议,支持复杂的交易,但其内部非常简单,而这些复杂交易可具有高系统复杂性,以一种非常规的方式影响产块激励。
  • Verkle trees:Verkle trees具有一定的封装复杂性,但其实际上确实比Merkle hash trees要更复杂一点点。但是,系统上,Verkle tree可为a key-value map提供相对clean-and-simple接口。主要的系统复杂性 “leak”在于:可能有攻击者可操纵tree,使得某特定value具有很长的branch,但是这种风险对于Verkle trees和Merkle trees都是一样的。

5. 如何来权衡封装复杂性和系统复杂性

大多数情况下选择低封装复杂性也意味着低系统复杂性。有些封装复杂性也会影响系统复杂性。

以以太坊的two-level state tree为例,其为a tree of account objects,而每个account object又具有其自己的storage tree:

以太坊的two-level state tree结构复杂,一开始看其复杂性似乎封装得很好,协议的其它部分通过a key/value store来与该two-level state tree进行读/写交互,因此,无需关注该tree的具体结构。
但是,随后,这种封装复杂性产生了系统效应:accounts可以有任意大的storage trees,即意味着没办法可靠地期望某个特定的状态片段(例如,“所有以0x1234开头的帐户”)具有可预测的大小。从而使得将状态切分为片段更困难,使同步协议设计复杂化,并尝试distribute the storage process。
为什么封装复杂性成为了系统复杂性?因为接口改变了。
如何解决呢?当前的建议是替换为使用Verkle tree ,并对该Verkle tree进行well-balanced single-layer设计。

实际在封装复杂性和系统复杂性权衡过程中,可多实际测试平衡。

参考资料

[1] Vitalik 2022年2月博客 Encapsulated vs systemic complexity in protocol design

Vitalik 系统设计中的封装复杂性和系统复杂性相关推荐

  1. Vitalik:协议设计中的“封装复杂性” vs. “系统复杂性”

    撰文:Vitalik Buterin,以太坊联合创始人 编辑:南风 以太坊协议设计的主要目标之一是最小化复杂性:使协议尽可能简单,同时仍然使区块链能够做好一个有效的区块链网络需要做到的事情.以太坊协议 ...

  2. java sql封装,在Java系统中封装SQL语言的处理方法及系统的制作方法

    在Java系统中封装SQL语言的处理方法及系统的制作方法[ 技术领域: ][0001]本发明涉及计算机数据处理 技术领域: ,特别是涉及一种在Java系统中封装SQL语言的处理方法及系统.[ 背景技术 ...

  3. Java中的封装和继承思想,模拟考试阅卷系统

    Java中的封装思想,模拟考试批卷系统 首先我们看一下题目要求: 定义考题类(Question)及其子类 完成考题类(Question),单选题(SingleChoice)和多选题(MultiChoi ...

  4. 【20220605】文献翻译——虚拟现实中的可视化:一个系统的回顾

    Visualization in virtual reality: a systematic review 摘要 1 简介 4 结果和分析 4.1 工具.工具包和框架 4.2 数据可视化 4.3 信息 ...

  5. 急需降低系统复杂性,我们从 Kafka 迁移到了 Pulsar

    要点总结 分布式消息系统支持流和队列两种语义,这两种语义最适合使用的场景有所不同. Pulsar 的独特之处在于它同时支持流和队列使用场景. Pulsar 采用多层架构,可以轻松扩展 topic 的数 ...

  6. 点名系统在c++中怎么做_栅格系统是怎么做设计的

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 栅格系统是怎么做设计的?印刷中也会用到栅格,但就本文而言,我主要想讨论的是用于PC和移动设备上的栅格系统设计. 紫色 ...

  7. java怎么解决重复支付问题_支付系统设计中,如何防止重复支付?

    wallet-2292428_1280.jpg 在我们支付系统设计中,经常会遇到这样一个问题,防止用户重复支付.用户明明只想购买一次,却因为系统问题,导致重复支付,带来额外的物流成本和扯皮退货的运营成 ...

  8. Delphi中DLL封装业务逻辑的实现

      三层结构是开发C/S或B/S系统经常采用的策略,这种分层方式将系统分为用户服务.业务服务和数据服务三部分,能够解决客户端与服务器结构维护成本问题.改善客户端与服务器结构延展性问题:解决应用逻辑重复 ...

  9. html封装windows,windows 系统封装,打造一份属于自己的系统!

    在电脑的使用过程中,由于我们每个人的使用习惯和使用方式不同,所以我们都会对Windows系统进行自己的设置,尤其是一些搞数码软件的,如果不小心系统坏了,重装系统后,还得一一去进行重新设置,非常麻烦.如 ...

  10. java定义一个类显示没有_Java 中的每个类都至少有一个构造方法,一个类中如果没有定义构造方法,系统会自动为这个类创建一个默认的构造方法。_学小易找答案...

    [单选题]关于 Java 语言叙述错误的是( ). [判断题]类中 static 修饰的变量或方法,可以使用类名或对象的引用变量访问. [命名题]命名下列化合物, [单选题]急性胰腺炎的主要临床表现是 ...

最新文章

  1. Repeater分页代码
  2. shell usage file
  3. RSAC简介 RSAC 2020 最热门的36款网络安全产品
  4. Java 语言 集合架构(Set规则集)
  5. 编译过程中,termcap.h 文件找不到路径 licli.a终于生成
  6. Android APK 打包过程 MD
  7. LeetCode - Convert Sorted Array to Binary Search Tree
  8. php类代码中常看到::的操作符
  9. sql server ssl安全错误_渗透测试 丨 SQL注入的攻与防
  10. JavaScript 中的异步:Event Loop 及其他
  11. 小甲鱼Python教程学习笔记(一)
  12. 开源OA系统魔方OA ASP.Net 4.0或4.8
  13. 谷歌浏览器怎么长截图怎么截_Google浏览器如何截取网页长图 - 里维斯社
  14. 【论文阅读】FFUNet:一种新的特征融合为医学图像分割提供了强大的解码器
  15. S32K FTM(FlexTimer module)详解
  16. java把一个文件转化为byte字节_java把一个文件转化为byte字节
  17. 历届试题 合根植物 C语言,植物营养历年真题(整理).doc
  18. 大学英语(第四册)复习(原文及全文翻译)——Unit 3 - WHY DO WE BELIEVE THAT THE EARTH IS ROUND?(我们为什么相信地球是圆的?)
  19. python学习——主要的代码结构,模块和包
  20. 信息时代的管理信息系统

热门文章

  1. 云服务器哪家强?AWS、Azure、阿里云、腾讯云、华为云深度评测
  2. linux apache 查看mpm 配置方式,Apache Prefork、Worker和Event三种MPM详解
  3. python可视化(2-1)绘图对象(条形图、直方图、柏拉图)
  4. 【基于51】红外寻迹智能小车-硬件篇
  5. ETL数据处理平台,快速实现数据集成
  6. 各层电子数排布规则_电子层排布,电子的排布规律
  7. #IP实验室,第二周复盘
  8. guass白名单的配置命令
  9. 求一个向量变换为另一个向量的矩阵_机器学习数学-矩阵
  10. matplotlib之pyplot模块——阶梯图(step():基本功能、参数)