Vitalik 系统设计中的封装复杂性和系统复杂性
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 系统设计中的封装复杂性和系统复杂性相关推荐
- Vitalik:协议设计中的“封装复杂性” vs. “系统复杂性”
撰文:Vitalik Buterin,以太坊联合创始人 编辑:南风 以太坊协议设计的主要目标之一是最小化复杂性:使协议尽可能简单,同时仍然使区块链能够做好一个有效的区块链网络需要做到的事情.以太坊协议 ...
- java sql封装,在Java系统中封装SQL语言的处理方法及系统的制作方法
在Java系统中封装SQL语言的处理方法及系统的制作方法[ 技术领域: ][0001]本发明涉及计算机数据处理 技术领域: ,特别是涉及一种在Java系统中封装SQL语言的处理方法及系统.[ 背景技术 ...
- Java中的封装和继承思想,模拟考试阅卷系统
Java中的封装思想,模拟考试批卷系统 首先我们看一下题目要求: 定义考题类(Question)及其子类 完成考题类(Question),单选题(SingleChoice)和多选题(MultiChoi ...
- 【20220605】文献翻译——虚拟现实中的可视化:一个系统的回顾
Visualization in virtual reality: a systematic review 摘要 1 简介 4 结果和分析 4.1 工具.工具包和框架 4.2 数据可视化 4.3 信息 ...
- 急需降低系统复杂性,我们从 Kafka 迁移到了 Pulsar
要点总结 分布式消息系统支持流和队列两种语义,这两种语义最适合使用的场景有所不同. Pulsar 的独特之处在于它同时支持流和队列使用场景. Pulsar 采用多层架构,可以轻松扩展 topic 的数 ...
- 点名系统在c++中怎么做_栅格系统是怎么做设计的
本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 栅格系统是怎么做设计的?印刷中也会用到栅格,但就本文而言,我主要想讨论的是用于PC和移动设备上的栅格系统设计. 紫色 ...
- java怎么解决重复支付问题_支付系统设计中,如何防止重复支付?
wallet-2292428_1280.jpg 在我们支付系统设计中,经常会遇到这样一个问题,防止用户重复支付.用户明明只想购买一次,却因为系统问题,导致重复支付,带来额外的物流成本和扯皮退货的运营成 ...
- Delphi中DLL封装业务逻辑的实现
三层结构是开发C/S或B/S系统经常采用的策略,这种分层方式将系统分为用户服务.业务服务和数据服务三部分,能够解决客户端与服务器结构维护成本问题.改善客户端与服务器结构延展性问题:解决应用逻辑重复 ...
- html封装windows,windows 系统封装,打造一份属于自己的系统!
在电脑的使用过程中,由于我们每个人的使用习惯和使用方式不同,所以我们都会对Windows系统进行自己的设置,尤其是一些搞数码软件的,如果不小心系统坏了,重装系统后,还得一一去进行重新设置,非常麻烦.如 ...
- java定义一个类显示没有_Java 中的每个类都至少有一个构造方法,一个类中如果没有定义构造方法,系统会自动为这个类创建一个默认的构造方法。_学小易找答案...
[单选题]关于 Java 语言叙述错误的是( ). [判断题]类中 static 修饰的变量或方法,可以使用类名或对象的引用变量访问. [命名题]命名下列化合物, [单选题]急性胰腺炎的主要临床表现是 ...
最新文章
- Repeater分页代码
- shell usage file
- RSAC简介 RSAC 2020 最热门的36款网络安全产品
- Java 语言 集合架构(Set规则集)
- 编译过程中,termcap.h 文件找不到路径 licli.a终于生成
- Android APK 打包过程 MD
- LeetCode - Convert Sorted Array to Binary Search Tree
- php类代码中常看到::的操作符
- sql server ssl安全错误_渗透测试 丨 SQL注入的攻与防
- JavaScript 中的异步:Event Loop 及其他
- 小甲鱼Python教程学习笔记(一)
- 开源OA系统魔方OA ASP.Net 4.0或4.8
- 谷歌浏览器怎么长截图怎么截_Google浏览器如何截取网页长图 - 里维斯社
- 【论文阅读】FFUNet:一种新的特征融合为医学图像分割提供了强大的解码器
- S32K FTM(FlexTimer module)详解
- java把一个文件转化为byte字节_java把一个文件转化为byte字节
- 历届试题 合根植物 C语言,植物营养历年真题(整理).doc
- 大学英语(第四册)复习(原文及全文翻译)——Unit 3 - WHY DO WE BELIEVE THAT THE EARTH IS ROUND?(我们为什么相信地球是圆的?)
- python学习——主要的代码结构,模块和包
- 信息时代的管理信息系统
热门文章
- 云服务器哪家强?AWS、Azure、阿里云、腾讯云、华为云深度评测
- linux apache 查看mpm 配置方式,Apache Prefork、Worker和Event三种MPM详解
- python可视化(2-1)绘图对象(条形图、直方图、柏拉图)
- 【基于51】红外寻迹智能小车-硬件篇
- ETL数据处理平台,快速实现数据集成
- 各层电子数排布规则_电子层排布,电子的排布规律
- #IP实验室,第二周复盘
- guass白名单的配置命令
- 求一个向量变换为另一个向量的矩阵_机器学习数学-矩阵
- matplotlib之pyplot模块——阶梯图(step():基本功能、参数)