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.xdnf.cn/news/148657.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

QT实现TCP服务器客户端的实现

ser: widget.cpp: #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);// 此时&#xf…

软件设计师_计算机网络_学习笔记

文章目录 4.1 网路技术标准与协议4.1.1 协议4.1.2 DHCP4.1.3 DNS的两种查询方式 4.2 计算机网络的分类4.2.1 拓扑结构 4.3 网络规划与设计4.3.1 遵循的原则4.3.2 逻辑网络设计4.3.3 物理网络设计4.3.4 分层设计 4.4 IP地址与子网划分4.4.1 子网划分4.4.2 特殊IP 4.5 HTML4.6 无…

BL808学习日志-2-LVGL for M0 and D0

一、lvgl测试环境 对拿到的M1S_DOCK开发板进行开发板测试,博流的官方SDK是支持M0和D0两个内核都进行测试的;但是目前只实现了M0的LVGLBenchmark,测试D0内核中发现很多莫名其妙的问题。一会详细记录。 使用的是开发板自带的SPI显示屏&#xff…

STM32复习笔记(五):FSMC连接外部SRAM

目录 Preface: (一)原理相关 (二)CUBEMX配置 (三)轮询方式读写 (四)DMA方式读写 Preface: STM32F4有一个FSMC(Flexible Static Memory Contr…

C++ YAML使用

C++工程如何使用YAML-cpp 一、前期准备工作 1、已安装minGW、cmake、make等本地工具。 2、下载YAML-cpp第三方开源代码(一定要下载最新的release版本,不然坑很多)。 3、生成YAML-cpp静态库 (1)在yaml-cpp-master下建立build文件夹; (2)在该文件夹下生成MakaFile文…

Ubuntu22.04 交叉编译gcc9.5 for arm

一、准备 环境:ubuntu22.04为刚刚安装,未安装gcc等包 vi ~/.bashrc输入 export PATH$PATH:/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin 保存,reboot 安装: sudo apt install cmake sudo apt install gawk sudo apt instal…

C++ 程序员入门之路——旅程的起点与挑战

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

国庆假期day5

作业:请写出七层模型及每一层的功能,请绘制三次握手四次挥手的流程图 1.OSI七层模型: 应用层--------提供函 表示层--------表密缩 会话层--------会话 传输层--------进程的接收和发送 网络层--------寻主机 数据链路层----相邻节点的可靠传…

国庆10.4

QT实现TCP服务器客户端 服务器 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器头文件 #include <QTcpSocket> //客户端头文件 #include <QList> //链表容器 #include <QMe…

mysql面试题14:讲一讲MySQL中什么是全同步复制?底层实现?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:讲一讲mysql中什么是全同步复制?底层实现? MySQL中的全同步复制(Synchronous Replication)是一种复制模式,主服务器在写操作完成后,必须等待…

Apacha Flume

0目录 1.Flume概述 2.Flume安装部署 3.案例1 4.案例2 5.案例3 1.Flume概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。 1.2 Flume基础架构 Flume组…

ES6中对象的扩展

1. 属性的简洁表示法 可以直接写入变量和函数作为对象的属性和方法。在对象中只写属性名&#xff0c;不写属性值&#xff0c;代表属性值等于和属性名相同的的变量的值。 属性的简写 let foo bar; let baz {foo}; // { foo: bar } // 等同于 let baz { foo: foo}方法的简写…

Nginx高级 第一部分:扩容

Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云服务资源增加 整机&#xff1a;IBM、浪潮、DELL、HP等 CPU/主板&#xff1a;更新到主流 网卡&#xff1a;10G/40G网卡 磁盘&#xff1a;SAS(SCSI) HDD&#xff08;机械…

十天学完基础数据结构-第二天(数据结构简介)

什么是数据结构&#xff1f; 在计算机科学中&#xff0c;数据结构是一种组织和存储数据的方式。它定义了数据的布局&#xff0c;以及对这些数据执行的操作。你可以把数据结构看作是计算机内存中的特定组织方式&#xff0c;就像图书馆中书籍的排列一样。 数据结构可以是各种形…

python获取时间戳

使用 datetime 库获取时间。 获取当前时间&#xff1a; import datetime print(datetime.datetime.now()) . 后面的是微秒&#xff0c;也是一个时间单位&#xff0c;1秒1000000微秒。 转为时间戳&#xff1a; import datetimedate datetime.datetime.now() timestamp date…

【数据结构】堆的应用-----TopK问题

目录 一、前言 二、Top-k问题 &#x1f4a6;解法一&#xff1a;暴力排序 &#x1f4a6;解法二&#xff1a;建立N个数的堆 &#x1f4a6;解法三&#xff1a;建立K个数的堆&#xff08;最优解&#xff09; 三、完整代码和视图 四、共勉 一、前言 在之前的文章中&#xff…

Springboot场景开发多面手

LinkedBear &#xff0c;资深 Java 高级工程师&#xff0c;底层技术研究者与分享者&#xff0c;倾心研究 Spring 技术体系多年&#xff0c;对 Spring、Spring Boot 、SpringCloud 等框架有独到的见解&#xff0c;拥有丰富的框架体系实践经验和架构封装经验。善于总结、输出&…

CharacterEncodingFilter的用法

CharacterEncoding是SpringMVC提供的一个一个过滤器,用于设置请求和响应的字符编码,解决乱码问题,他本身是一个过滤器 那么在SpringBoot中,CharacterEncoding就有一个很好的秒用 setEncoding("UTF-8")设置编码 setForceEncoding(true) 设置请求和响应编码 还需要在配…

leetcode做题笔记160. 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

计算机视觉——飞桨深度学习实战-深度学习网络模型

深度学习网络模型的整体架构主要数据集、模型组网以及学习优化过程三部分&#xff0c;本章主要围绕着深度学习网络模型的算法架构、常见模型展开了详细介绍&#xff0c;从经典的深度学习网络模型以CNN、RNN为代表&#xff0c;到为了解决显存不足、实时性不够等问题的轻量化网络…