Polygon Miden zkRollup中的UTXO+账户混合状态模型

1. 引言

本文重点讨论Polygon Miden所设计的UTXO+账户混合状态模型,以实现某些有趣的属性。

Miden的目标是:【即越具有隐私性,其可扩展性越好】

  • 构建可扩展去中心化的rollup
  • 采用支持隐私的架构
    在这里插入图片描述

Miden支持灵活的交易模式:

  • 公开交易
  • 无状态交易
  • 私人交易
  • 本地交易
    在这里插入图片描述

2. 何为去中心化zkRollup?

常规zkRollup方案是:

  • L2用户将L2交易提交给operators
  • 由 operators将L2交易打包为区块
  • 由operators生成对应区块状态转换的ZK proof,并将该ZK proof提交给L1

在这里插入图片描述

去中心化zkRollup方案的:

  • 安全性继承自L1
  • 独立于L1的L2链,可有其自己的共识机制
  • 可有permissionless的operators集合

构建去中心化rollup的挑战有:

  • 1)共识机制
  • 2)execution bloat执行膨胀
  • 3)state bloat状态膨胀

本文重点关注执行膨胀和状态膨胀。

  • 所谓执行膨胀,是指网络需执行所有交易:

    • 产块者需执行某区块内的所有交易
    • 网络中的其它节点也需要重新执行该区块内的所有交易
      在这里插入图片描述
  • 所谓状态膨胀,是指状态大小随时间增长:

    • 节点需要全量状态来验证区块。
    • 节点需要全量状态来生成新的区块。
      在这里插入图片描述

3. Miden解决方案:UTXO+账户混合状态模型

执行膨胀和状态膨胀会带来如下问题:

  • 1)中心化问题:需要强大(如大磁盘大内存等)的机器来运行节点。
  • 2)缺少隐私性问题:网络中的每个人可看到链上发生的每笔交易细节。(Everyone sees everything)每个人都需要重新执行所有交易,并维护全量状态。
  • 3)不可持续性问题(not sustainable):永远增长的状态。其增长速度超过了单个硬件机器配置的增长速度。

为此,希望所构建的解决方案能:

  • 1)使执行膨胀最小化:即:
    • 所有交易(包括网络交易)仅执行一次:【ZKP可实现】
    • 可由不同的网络参与者并行执行交易:【要求并发状态模型】
    • 本地执行:对不影响 具有共享状态账户 的交易,其可在本地执行,并在本地证明:
      在这里插入图片描述
  • 2)使状态膨胀最小化:即:
    • 轻量验证节点:验证节点可丢弃绝大多数状态(即nullifier DB),无需维护全量状态即可验证区块:【ZKP可实现】
    • 动态裁剪:产块者可独立决定维护哪些状态,即,无需维护全量状态即可生成新的区块:【要求并发状态模型】
    • 由吞吐量驱动状态大小:状态大小主要依赖于当前TPS,而不是账户总数,也不是notes总数。
      在这里插入图片描述

在这里插入图片描述
当前的区块链状态模型主要有2大类:

  • 1)基于账户的状态模型:其具有如下特征:
    • 适于表达智能合约
    • 不太适于并行交易执行
    • 不利于匿名
  • 2)基于UTXO的状态模型:其具有如下特征:
    • 不太适于表达智能合约
    • 适于并行交易执行,各个UTXO是相互独立的。
    • 适于实现匿名

Miden借助 账户模型 + UTXO模型 + ZK proofs,来实现:

  • Actor-based model with concurrent off-chain state,即具备链下并行状态的、基于actor的模型。
    在这里插入图片描述

3. Miden的交易模型:actor-based model with concurrent off-chain state

常规的actor模型是指:

  • actors为具有“inboxes”的状态机
  • actors之间通过消息传递来通信
  • 消息的生成和消费是异步的

对应到Miden中的actor模型为:

  • 账户维护了 状态 + 对外暴露的(Miden VM程序)接口
  • 消息以notes来表示,notes中携带了 资产 + 花费该资产的“spend script”(为Miden VM程序)
  • 不同于以太坊中仅需要1笔交易来实现资产转移。由于消息的生成和消费是异步的,即意味着,当在2个账户之间转移资产时,需要2笔交易。
    • 1笔交易用于创建note。
    • 另1笔交易用于消费该note。
      在这里插入图片描述

3.1 Miden中的交易解析

与以太坊中的交易不同,Miden中的交易:

  • 总是仅包含一个账户,其无法关联更多账户
  • 消费0个或多个notes:通过执行某note的“spend script”来消费该note
  • 生成0个或多个notes
    在这里插入图片描述
    Miden交易执行的流程为:
    在这里插入图片描述
  • 通过执行note1的script来消费note1
  • note1的script会调用账户的接口函数(如receive()函数来接收资产,从而使得note1可将其资产传给)
  • 账户的函数可修改该账户的状态,并创建新的notes。
  • 重复以上流程来消费note2。note scripts会依次顺序执行。

3.2 Miden中交易的证明

由于Miden中的交易仅关联单个账户,因此看立即为交易生成ZK proof(Miden中采用STARK证明系统Winterfell):

  • 交易的正确执行可在单个STARK proof中证明
  • 所有交易的STARK proofs可并行生成
    在这里插入图片描述

3.3 Miden中区块的证明

在这里插入图片描述
在这里插入图片描述
基本流程为:

  • 对区块内的一堆tx proofs进行递归聚合,来获得batch proof
  • 然后再对batch proof进行递归聚合,来获得block proof
  • 最后对block进行递归聚合,来生成最终提交给L1的validity proof(如称为Epoch proof)

需注意的是:

  • 以上递归聚合流程可并行进行
  • 以上tx proofs可并行生成
  • 以上batch proofs可并行生成
  • 以上block proofs不可并行生成

在这里插入图片描述
还有一个很有趣的点在于:

  • tx proofs可在用户本地生成
  • batch proofs、block proofs、Epoch proofs需在网络中生成,如由产块者生成。

3.4 Miden中的本地交易和网络交易

传统的交易执行流程为:

  • prepare:为交易准备输入
  • execute:执行该交易
  • prove:为该交易生成证明
    在这里插入图片描述
    其中:
  • 网络交易中,由网络(如产块者)来执行交易并为该交易生成证明。
  • 本地交易中:由用户在本地:准备交易输入、执行该交易、为该交易生成证明。而:
    • 产块者不需要执行该交易,也不需要为该交易生成证明。
    • 产块者仅需要聚合该交易proof。
      在这里插入图片描述

本地交易和网络交易,这2种交易模式的对比情况为:
在这里插入图片描述

3.5 Miden中共享状态处理逻辑

以Uniswap(为具有共享状态的账户)为例,有多个账户与其交互,需对共享状态进行处理:

  • 2个用户独立执行交易tx1和交易tx2,分别创建了note1和note2。这2笔交易的目标都是uniswap account。
  • 产块者创建交易tx3,并执行交易tx3。交易tx3会消费note1和note2,然后输出note3和note4。note3和note4分别 以 其note1和note2的原始account为目标。
    在这里插入图片描述
  • 然后这2个用户独立执行交易tx4和交易tx5,来分别消费note3和note4。
    在这里插入图片描述

即:

  • 与具有共享状态账户 进行交互的交易,其必须为网络交易,而不能是本地交易。

4. Miden中的状态模型

Miden rollup中的状态主要分为3大类:

  • 1)account DB:存储所有账户的当前状态。以Spare Merkle tree作为数据存储结构,来将account IDs 映射到 account Hashes。不过Miden提供了2种不同的存储账户到数据库的方式:
    • 1.1)on-chain state链上状态:对于具有链上状态的账户,节点会存储该账户的整个状态。与以太坊的账户存储模式相同。
    • 1.2)off-chain state链下状态:对于具有链下状态的账户,节点仅存储该账户的哈希值。
      • 由用户自己来负责存储其账户的实际状态。

在这里插入图片描述

  • 2)notes DB:存储了目前为止所创建的所有notes。采用Merkle Mountain Range(MMR)数据结构来存储,为append-only accumulator。其叶子节点为某区块内所创建的一组notes。
    选择Merkle Mountain Range(MMR)数据结构的原因在于:
    • 即使丢弃了大多数节点,notes也可添加到MMR。
    • inclusion witness永远不会不新鲜,但其可能需要扩展。
      在这里插入图片描述
  • 3)nullifier DB:用于跟踪所有已消费的notes。采用Sparse Merkle tree作为数据结构来存储,用于映射note hash 到 0/1。其中1表示已消费,0表示未消费。nullifiers被组织成epochs,如4到6个月。实际有稍微更成熟的数据结构,即每个epoch共用一棵树,然后又创建新的树给下一epoch使用。节点仅需要维护最近2个epochs的nullifiers。
    在这里插入图片描述

由区块 n n n引起的状态变更示意为:
在这里插入图片描述
Miden状态增长驱动因素为:

  • 1)account DB:
    • 增长主要来源为:具有链上状态的账户数 的增加
    • 增长次要来源为:账户总数 的增加
    • 裁剪策略为:忽略链上账户数据,但保留这些账户的哈希值
  • 2)notes DB:
    • 增长主要来源为:未消费的public notes的数量 的增加
    • 增长次要来源为:未消费的notes数量 的增加
    • 裁剪策略为:忽略链上note数据
  • 3)nullifier DB:
    • 增长主要来源为:吞吐量(TPS) 的增加
    • 增长次要来源为:nullifier epoch长度 的增加
    • 裁剪策略为:无
      在这里插入图片描述

参考资料

[1] 2022年10月在哥伦比亚波哥大举行的DevCon 6中,Polygon Miden联合创始人Bobbin Threadbare分享的视频Using a Hybrid UTXO and Account-based State Model in a ZK Rollup by Bobbin Threadbare

Miden系列博客

  • zk、zkVM、zkEVM及其未来
  • Polygon L2扩容方案揭秘
  • 混合Rollup:探秘 Metis、Fraxchain、Aztec、Miden和Ola
  • Polygon Miden:扩展以太坊功能集的ZK-optimized rollup

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一致性 Hash 算法

是什么: 一致性 hash,是一种比较特殊的 hash 算法,它的核心思想是解决在分布式环境下, hash 表中可能存在的动态扩容和缩容的问题。 为什么会出现一致性Hash 一般情况下,我们会使用 hash 表的方式以 key-value 的方式来…

新手程序员怎么接单?

程序员如何在自己年富力强的时候,最大化发挥自己的能力?将超能力转化为“钞能力”? 有人还在苦哈哈当老黄牛,一身使不完的牛劲,有人已经另辟蹊径,开创了自己的一片致富小天地。 接单找兼职,就…

JS三大运行时全面对比:Node.js vs Bun vs Deno

全文约 5100 字,预计阅读需要 15 分钟。 JavaScript 运行时是指执行 JavaScript 代码的环境。目前,JavaScript 生态中有三大运行时:Node.js、Bun、Deno。老牌运行时 Node.js 的霸主地位正受到 Deno 和 Bun 的挑战,下面就来看看这…

Flink容错机制

容错机制 在Flink中,有一套完整的容错机制来保证故障后的恢复,其中最重要的就是检查点。 检查点的保存 1)周期性的触发保存 “随时存档”确实恢复起来方便,可是需要我们不停地做存档操作。如果每处理一条数据就进行检查点的保存…

React(react18)中组件通信06——redux-toolkit + react-redux

React(react18)中组件通信06——redux-toolkit react-redux 1 前言1.1 redux 和 react-redux1.2 关于redux-toolkit1.2.1 官网1.2.2 为什么要用Redux Toolkit? 1.3 安装 Redux Toolkit1.4 Redux Toolkit相关API 2. 开始例子——官网例子2.1 …

巨人互动|Facebook海外户Facebook内容的类型

随着人们日益依赖的社交媒体来进行信息获取与交流,Facebook作为全球最大的社交媒体平台之一,那么Facebook的内容都有哪些类型呢?下面小编来讲讲吧! 1、实时发生的事 我们需要实时了解时事动态,这样可以使用户对品牌发…

纯css html 真实水滴效果

惯例,不多说直接上图 秉承着开源精神,我们将这段代码无私地分享给大家,因为我们深信,信息的共享和互相学习是推动科技进步的关键。我们鼓励大家在使用这段代码的同时,也能够将其中的原理、思想和经验分享给更多的人。 这份代码是我们团队用心…

VR庆中秋丨奇幻月景邀您共赏!

中秋佳节, 如何来一场别开生面的云游月景体验? 3DVR技术开启中秋过节新姿势, 嫦娥奔月伴玉兔、 太白花间饮美酒、 吴刚月下伐桂树…… 立体化还原璀璨的传统中秋文化, 还有趣味猜灯谜活动, 丰富豪礼等你来拿&a…

如何使用ChatGPT构建一个Web应用程序?

围绕ChatGPT的最大卖点之一是它可以成为一种有效的编程工具。其想法是这样的:你用自然语言描述需求,该聊天机器人生成满足该需求的代码。但是ChatGPT在这方面到底有多好呢? 还有什么比亲自测试一下更好的方法呢?我们让ChatGPT从头…

FPGA千兆网 UDP 网络视频传输,基于88E1518 PHY实现,提供工程和QT上位机源码加技术支持

目录 1、前言版本更新说明免责声明 2、我这里已有的以太网方案3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条UDP协议栈UDP视频数据组包UDP协议栈数据发送UDP协议栈数据缓冲IP地址、端口号的修改Tri Mode Ethernet MAC介绍以及移植注意事项88E1518 PHYQT上位机和源码…

【软件测试】开发/测试模型

开发/测试模型 瀑布模型 设计:技术文档(设计那些接口,库表,mq,定时任务),UI视觉稿 特点:线性的结构。 优点:每个阶段做什么,产出什么非常清晰 缺点:测试人员介入太晚…

解释器风格架构C# 代码

/*解释器风格架构是一种基于组件的设计架构,它将应用程序分解为一系列组件,每个组件负责处理特定的任务。这种架构有助于提高代码的可维护性和可扩展性。以下是如何使用C#实现解释器风格架构的步骤:定义组件:首先,定义…

Makefile快速上手

Makefile学习 https://maxwell-lx.vip/basic-usage-make/ https://zhuanlan.zhihu.com/p/92010728 https://zhuanlan.zhihu.com/p/350297509 一、是什么 可以理解为一个自动化的编译脚本,避免繁琐的手动编译过程。有点类似shell脚本。 1.1 从小例子入手 &…

SQLAlchemy常用数据类型

目录 SQLAlchemy常用数据类型 代码演示 代码分析 SQLAlchemy常用数据类型 SQLAlchemy 是一个Python的SQL工具库和对象关系映射(ORM)工具,它提供了一种在Python中操作数据库的高效方式。下面是SQLAlchemy中常用的一些数据类型: Integer:整形&…

静态路由+BFD实例

项目拓扑与项目需求 项目需求 ① 主链路为电信,电信链路出故障时,业务数据流量切换到联通链路 实验步骤 步骤1:设备重命名以及IP地址的配置 设备 接口编号 IP地址 AR1 G0/0/0 10.0.13.1/24 G0/0/1 10.0.14.1/24 AR2 G0/0/0 10.0…

Windows 下安装及配置 MySQL 8.1 (图文教程)

目录 下载 MySQL安装 MySQL配置 MySQL修改密码配置环境变量 卸载 MySQL开源项目微服务商城项目前后端分离项目 下载 MySQL 访问 MySQL 下载地址:https://dev.mysql.com/downloads/mysql/ 下载 MySQL 时,你可以选择 ZIP 包或 MSI 安装: ZIP包…

十六,镜面IBL--预滤波环境贴图

又到了开心的公式时刻了。 先看看渲染方程 现在关注第二部分,镜面反射。 其中 这里很棘手,与输入wi和输出w0都有关系,所以,再近似 其中第一部分,就是预滤波环境贴图,形式上与前面的辐照度图很相似&#…

安达发|印刷包装行业利用APS自动排产系统迎来绿色革命

随着环保意识的不断提高,印刷包装行业也在寻求绿色发展之路。近年来,该行业在材料研发、生产工艺等方面取得了显著成果,为实现可持续发展奠定了基础。 印刷包装行业作为现代工业的重要组成部分,其发展水平直接影响到国民经济的整体…

SpringBoot 学习(二)配置

2. SpringBoot 配置 2.1 配置文件类型 配置文件用于修改 SpringBoot 的默认配置。 2.1.1 properties 文件 **properties ** 是属性文件后缀。 文件名:application.properties 只能保存键值对。 基础语法:keyvalue namewhy注入配置类 Component //…

为什么u盘在mac上显示不出来

插入U盘是个看似简单的操作,但有时候在Mac电脑上却出现了无法显示U盘的情况。这样的问题是非常让人头疼的,特别是当你急需使用U盘中的文件时。那么,究竟为什么U盘在Mac上会显示不出来呢?今天就让我们一起来深入了解一下这个问题&a…