Aztec的隐私抽象:在尊重EVM合约开发习惯的情况下实现智能合约隐私
1. 引言
Aztec的架构,不同于当前“通过EVM兼容执行环境”所实现的区块链水平扩容趋势。Aztec内部笑称其构建的为首个非zkEVM协议。
Aztec专注于实现:
- 成为理解和需要智能合约隐私的开发者的终极解决方案。
Aztec为开发者提供构建隐私优先app所需的网络和一系列工具:
- 默认是匿名的
- 私有状态读写功能
- 私有隐私合约函数执行
为此,Aztec发现,现有的类似EVM这样基于account的系统无法满足要求,这也是为何Aztec是非EVM兼容的主要原因。同时,Aztec需设法让习惯于EVM类环境的智能合约开发人员尽可能直观地处理私有状态环境的独特架构。
自Aztec创立之初,就追求智能合约隐私:
- 私有计算不需依赖可信第三方或可信硬件的安全模块。
而在完全链上智能合约隐私世界,私有状态是一等公民,这就意味着:
- 无EVM,
- 无Solidity
- 无基于account的区块链架构
因为这些都会造成隐私泄露。
2. 隐私不兼容EVM
“为何EVM无法兼容隐私?”尽管目前已有EVM合约提供了类似mixing的primitive, non-programmable隐私功能。
不过,Aztec关注的是智能合约隐私:
- 在状态变量和函数层面,将可编程隐私纳入合约本身的整个系统。
在以太坊模型中,状态变量存储于公共公开的account-based tree中,为改变其中某个变量,需向整个以太坊世界广播你想要修改该tree中的那个叶子,该叶子节点中包含了什么,以及你想如何修改。这样就存在以下缺陷:
- 每个状态变量的当前值和历史所有值都是公开的。
- 执行状态变化所调用的函数是公开的。
- 这些函数修改的状态变量是公开的。
- 等等。
3. UTXO和Nullifier:最佳拍档
Aztec依赖于encrypted UTXO (Unspent Transaction Object)数据架构——与Bitcoin存储网络状态的技术一致。
借鉴了ZCash协议的UTXO-nullifier设计思想,Aztec隐私设计的基石为:
- 包含了encrypted UTXO的append-only data tree
- 包含了相应nullifiers的append-only data tree
在本文,UTXO也称为“notes”。对非专业人员关于UTXO架构的介绍可参看:Fully Confidential Ethereum Transactions: Aztec Network’s Privacy Architecture。
为了操作所拥有的note(为encrypted UTXO对象),用户采取以下步骤:
- 调用某函数
- 该函数请求对某私有状态进行编辑
- 该函数查询该用户的note数据库,获取属于该私有状态的所有notes
- 该用户(实际为用户的Aztec节点)证明,在其本地机器上,每个retrieved notes都存在于tree machine中的某个叶子节点,而不泄露具体是哪个叶子节点。
- 该用户可该note内做读、改、删操作。
- 该用户提供a nullifier,以阻止重复操作,并避免该用户再次读取相同的叶子节点。
- 该用户插入一个新的叶子节点,包含新的值,以更新该私有状态的值。
4. Aztec的智能合约框架
智能合约隐私的要求之一就是隐藏函数输入,借助zkSNARKs,可实现函数输入隐藏。
然后,Aztec构建了Noir——用于编写输入可隐藏函数的ZK编程语言,不过Noir中并未内置状态存储和状态变量的概念。
Aztec的智能合约框架可在Noir之上创建状态变量。
为实现隐私,需要有私有状态,而为实现私有状态,则需要有私有状态变量。所谓私有状态变量,其不能是notes。notes存储数据或信息,当与nullifiers结合使用可保护隐私,但notes是常量的且不可修改的。
变量应该是可变的。通过合约函数来修改变量。为此,需在以notes为基石的基础之上,创建一个私有状态变量的概念。
目前,notes可被销毁和创建,为创建私有状态变量的抽象,也许可在幕后巧妙地销毁和创建notes。
为此,Aztec的解决方案为:
- 声明一个私有状态变量
- 写函数:手写读取当前状态,编辑该状态,最后再写入更新状态。
在该方案中,定义了如下私有状态变量结构体:
- 需收集private state tree中的哪些notes
- 需证明在该tree中存在的哪些notes
- 需对哪些notes进行nullify
- 需创建哪些新的notes并插入到该tree中
而对于开发者来说,这些变量看起来就是变量。
以private token为例。
开发者首先声明一个private_balance
状态变量,Aztec支持通过transfer
函数来修改该balance。
这样,暴露的private_state
结构会指出:
- 如何创建和销毁notes,来表示某用户balance的增加或减少,与此同时,(通过该函数释放nullifiers)不泄露用户的balance。
私有状态变量可表示任何东西:
- Values:某具有value和owner域的对象,如一张$100的钞票。
- NFTs:具有唯一标识的对象,或包含了所有唯一属性的NFT。
- Accounts:由一个或多个owner所有的对象。
- Votes、DeFi positions、身份对象等等所能想到的任何东西。
私有状态变量存储数据或信息,借助如下2个属性实现可编程性:
- 可为mutable(updatable)私有状态变量,或,immutable(non-updatable)私有状态变量。
- 可包含单个note(即singleton),或包含一组notes(该类型也称为set)来描述某状态变量。
需注意的是,notes仅用于存储信息,而并不存储函数或合约。
事实上,管理UTXO通常会有点复杂,并涉及一些“问题”,包括如何:
- 高效查找tree中某人所拥有的notes
- 组合notes
- 对组合notes进行修改
- 借助nullifiers,销毁和更新notes
与以太坊账户不同,以太坊账户可以简单地贷记和借记,notes必须被创建、组合和作废,这代表了一种截然不同的思考模式。以太坊的values就仅仅是values,而notes 包含了 values。
幸运的是,Aztec在设计时考虑了抽象,从而消除了编写Aztec合约的开发难度,使其与编写以太坊智能合约尽可能相似。
Aztec智能合约框架的好处之一就是帮助合约开发者管理note的复杂性,该设计的主要目的之一就是将notes从dApps中整个抽象走。
应用程序开发人员欢欣鼓舞!其根本不必考虑UTXO或notes,而是可以调用所期望的函数,如token.transfer(amount)
或token.getBalance()
。
因为在应用层传输特定notes将会非常痛苦,为此,Aztec智能合约框架帮助将其从dApp层中完整抽离了。
参考资料
[1] Aztec团队2023年9月博客 Privacy Abstraction with Aztec: Smart contract privacy without the brain damage
Aztec系列博客
- Aztec Hybrid Rollup:混合zkRollup,而非zkEVM
- Proof Compression
- Aztec Connect即将主网上线
- Aztec connect bridge代码解析
- Aztec 征集 Rollup Sequencer去中心化提案
相关文章:

Aztec的隐私抽象:在尊重EVM合约开发习惯的情况下实现智能合约隐私
1. 引言 Aztec的架构,不同于当前“通过EVM兼容执行环境”所实现的区块链水平扩容趋势。Aztec内部笑称其构建的为首个非zkEVM协议。 Aztec专注于实现: 成为理解和需要智能合约隐私的开发者的终极解决方案。 Aztec为开发者提供构建隐私优先app所需的网…...

【Vue】详细介绍Vue项目的目录结构及各个核心文件的示例代码
Vue.js并没有严格的文件和目录结构要求,但一般情况下,我们的Vue项目目录结构如下: ├── node_modules/ # 项目依赖的 node 模块 ├── public/ # 公共资源目录 │ ├── favicon.ico # 网页图标 │ └──…...

【人大金仓】迁移MySql数据库到人大金仓,出现sys_config表重复
需要迁移的数据库中有张表名称为sys_config,查询的时候查询结果不符合我们的预期,经咨询金仓售后人员后得知和系统表重名… 解决问题方法如下: alter database [数据库名] set search_path to "$user", [模式名,(可选&…...

linux内核进程间通信IPC----消息队列
消息队列:提供一种从一个进程向另一个进程发送一个数据块的方法。与FIFO相比,消息队列的优势在于,它独立于发送和接收进程而存在。 1.链表式结构组织,存放于内核。 2.通过队列标识来引用。 3.通过一个数据类型来索引指定的数据。 …...

PHP实现微信小程序状态检测(违规、暂停服务、维护中、正在修复)
实现原理 进入那些状态不正常的小程序会被重定向至一个Url,使用抓包软件抓取这个Url,剔除不必要参数,使用cURl函数请求网页获得HTML内容,根据内容解析出当前APPID的小程序的状态。 代码 <?php// 编码header(Content-type:ap…...

ubuntu在线直接升级
前几天VMware上安装了ubuntu,当时的内核版本支持(ipguard,加密软件),后来ubuntu自动升级了linux内核,导致加入软件不支持,无法访问加密文件了。后来加密软件商更新了软件,但还是赶不上linux内核更新速度,还…...

学习笔记:卸载nav2 navigation2导航
nav2二进制文件安装 nav2导航安装方式分为二进制文件安装和源码方式安装,如果想用最快的方式跑通代码,推荐二进制安装,不用编译,没有缺少依赖编译失败的烦恼, 安装命令: sudo apt install ros-$ROS_DISTR…...

觉非科技数据闭环系列 | BEV感知研发实践
随着自动驾驶迈向量产场景,“BEV感知数据闭环”已成为新一代自动驾驶量产系统的核心架构。数据成为了至关重要的技术驱动力,发挥数据闭环的飞轮效应或将成为下半场从1到N的胜负关键。 觉非科技在此方面已进行了大量的研究工作,并在实际量产项…...

程序员情绪把控
文章目录 建议情绪 建议 保持稳定的情绪在工作中非常重要,以下是一些建议: 自我意识:保持对自己情绪的觉察和理解,了解自己的情绪状态和触发情绪的因素。通过自我反省和观察,你可以更好地管理和调节情绪。 健康生活方…...

弱监督目标检测:ALWOD: Active Learning for Weakly-Supervised Object Detection
论文作者:Yuting Wang,Velibor Ilic,Jiatong Li,Branislav Kisacanin,Vladimir Pavlovic 作者单位:Rutgers University;The Institute for Artificial Intelligence Research and Development of Serbia;Nvidia Corporation 论文链接:http:…...

驱动开发 day3
总结:自动创建设备节点udev的流程 1.如何创建节点 手动创建:mknod 地址 设备文件类型 主设备号 次设备号(0 - 255) 自动创建:devfs (创建节点的逻辑在内核 ---> 2.4版本以前使用) udev (创建节点的逻辑在应用层) mdev (轻量级的udev) 2.…...

许可license分析 第一章
许可分析是指对软件许可证进行详细的分析和评估,以了解组织内部对软件许可的需求和使用情况。通过许可分析,可以帮助组织更好地管理和优化软件许可证的使用。以下是一些可能的许可分析方法和步骤: 收集许可证信息:首先,…...

Goby 漏洞发布|管家婆订货易在线商城 SelectImage.aspx 文件上传漏洞
漏洞名称:管家婆订货易在线商城 SelectImage.aspx 文件上传漏洞 English Name: GJP SelectImage.aspx file upload vulnerability CVSS core: 9.8 影响资产数:2617 漏洞描述: 任我行率先针对中小企业推出了管家婆进销存、财务…...

Android屏幕录制
这里使用Java语言编写实现,完整代码如下: 文件 AndroidMainfest.xml 的主要配置 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"…...

实在智能牵手埃林哲,“TARS-RPA-Agent+云时通”双剑合璧共推企业数字化转型
近日,《数字中国建设整体布局规划》进一步明确了数字化发展的方向和节奏,对企业数字化建设提出了新要求。回看过去几十年,信息化建设如火如荼,各类IT系统如雨后春笋般涌现,系统的自动化操作及系统间数据交互共享等需求…...

拥有这个中文版CustomGPT,你也能定制自己的AI问答机器人
人工智能技术的快速发展为各行各业带来了前所未有的机会,其中之一就是定制化的问答机器人。这些机器人可以用于客户支持、知识管理、虚拟助手等多个领域,帮助企业提高效率,提供更好的用户体验。很多人可能都知道通过CustomGPT能够设计自己的人…...

fastadmin 基本使用配置
fastadmin 版本 1.3.5 thinkphp 版本 5.0.25 配置 cache 为 redis 保存 // ---------------------------------------------------------------------- // | 缓存设置 // ---------------------------------------------------------------------- cache …...

netty 线程组
我们的bossgroup和workgroup都是使用的NioEventLoopGroup。其内部有一个EventExecutor类型的数组用来存储所有的线程组。 NioEventLoopGroup {EventExecutor[] children; }NioEventLoopGroup继承自MultithreadEventExecutorGroup,构造函数不指定线程数默认会根据系…...

Reactor 第十二篇 WebFlux集成PostgreSQL
1 引言 在现代的应用开发中,数据库是存储和管理数据的关键组件。PostgreSQL 是一种强大的开源关系型数据库,而 WebFlux 是 Spring 框架提供的响应式编程模型。本文将介绍如何使用 Reactor 和 WebFlux 集成 PostgreSQL,实现响应式的数据库访问…...

红队打靶:Me and My Girlfriend打靶思路详解(vulnhub)
目录 写在开头 第一步:主机发现和端口扫描 第二步:Web渗透(修改XFF代理) 第三步:数据库手工枚举 第四步:sudo php提权 总结与思考 写在开头 本篇博客在自己的理解之上根据大佬红队笔记的视频进行…...

Mysql高级——索引(2)
常见索引 索引分类 在MySQL数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。 分类含义特点关键字主键索引针对于表中主键创建的索引默认自动创建, 只能有一个PRIMARY唯一索引避免同一个表中某数据列中的值重复可以…...

【史上最硬核分享】Docker+jenkinsPipeline 运行实现 python 自动化(超详细)
一、实现思路 在 Linux 服务器安装 docker创建 jenkins 容器jenkins 中创建 pipeline 项目根据自动化项目依赖包构建 python 镜像(构建自动化 python 环境)运行新的 python 容器,执行 jenkins 从仓库中拉下来的自动化项目执行完成之后删除容器 二、环境准备 Linu…...

leetcode 3. 无重复字符的最长子串
2023.9.15 本题我用的暴力双层for循环 unordered_set 解决的,外循环控制字符起始位置,内循环将字符放入 unordered_set,并查找有无重复的元素。 用了一个全局变量记录最长字串的长度,局部变量count记录当前层循环的最长子串长度…...

doccano 文本标注工具使用
最近在做面向大模型的文本标注工作,涉及到多人协同的问题,因此用到了doccano工具。 这个工具可以使用docker进行安装,安装之后的启动也都比较简单。 关于基础使用(例如管理员登录、新建任务、上传数据集等)ÿ…...

快速排序算法的递归和非递归
基本思路 选择一个基准值,将数组划分三个区域,小于基准值的区域位于左侧,等于基准值的区域位于中间,大于基准值的区域位于右侧。将大于和小于区域继续进行分区,周而复始,不断进行分区和交换,直…...

Maven无法拉取SNAPSHOT依赖的解决办法
背景 自己所在的部门主要是为其他项目组提供基础组件,如果需要使用新特性,其他项目组还会经常引用SNAPSHOT版本的组件进行开发测试。平时自己做测试的时候,因为手里有源码,所以每次都是先执行 mvn install 在本地安装后ÿ…...

day16-面向对象综合练习(上)
1. 设计游戏的目的 锻炼逻辑思维能力利用Java的图形化界面,写一个项目,知道前面学习的知识点在实际开发中的应用场景 2. 游戏的最终效果呈现 Hello,各位同学大家好。今天,我们要写一个非常有意思的小游戏 —《拼图小游戏》 我们…...

在Windos 10专业版搭建Fyne(Go 跨平台GUI)开发环境
目录 在Windos 10专业版搭建Fyne(Go 跨平台GUI)开发环境一 Fyne 和 MSYS2简介1.1 Fyne1.2 MSYS2 二 安装 MSYS22.1 下载MSYS22.2 安装2.3 环境变量设置2.4 检测安装环境 三 参考文档 在Windos 10专业版搭建Fyne(Go 跨平台GUI)开发…...

漫谈:C、C++字符串的困局
由于历史的原因,C、C字符串是个很让程序员头疼的东西。 字符串被解读为字符数组,但是又不等价于字符数组,而是带有附加的结束符的字符数组。 结束符‘\0’也是一个字符,但是又不计算在字符串长度里面(strlen࿰…...

基于python+selenium的自动批量添加
场景 点击添加”新增“按钮,弹出”新增对话框“,输入各种数据,然后点击”确定“按钮,如此循环。数量多,这样操作累人。 selenium Selenium 是一个用于自动化 Web 浏览器操作的库,可以实现模拟点击、输入…...