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去中心化提案

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

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

相关文章

【微信小程序开发】宠物预约医疗项目实战-环境配置与Vant UI集成

第一章 宠物预约医疗项目实战-环境配置与Vant UI集成 文章目录 前言一、Vant UI是什么?二、使用步骤2.1 安装 node.js2.2 通过 npm 安装vant2.3 修改 app.json2.4 修改 project.config.json2.5 构建 npm 包2.6 使用组件全局引入和局部引入全局引入局部引入 前言 Va…

基于Java+SpringBoot+Vue+uniapp点餐小程序(亮点:协同过滤算法、会员系统,购物车结算、在线聊天)

校园点餐小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序(小蔡coding)2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 系统功能结构设计4.2 主要功能描述 五…

SpringBoot整合Flowable

1. 配置 &#xff08;1&#xff09; 引入maven依赖 <dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>6.7.2</version></dependency><!-- MySQL连接 -->&l…

MySQL--MySQL索引事务

事务的概念 事务指逻辑上的一组操作&#xff0c;组成这组操作的各个单元&#xff0c;要么全部成功&#xff0c;要么全部失败。 在不同的环境中&#xff0c;都可以有事务。对应在数据库中&#xff0c;就是数据库事务。 使用 &#xff08;1&#xff09;开启事务&#xff1a;start…

什么是接口自动化?为什么要做?和怎么做接口自动化?

服务端接口测试介绍 什么是服务端&#xff1f; 一般所说的服务端是指为用户在 APP 或 PC 使用的互联网功能提供数据服务的背后的一切。以天猫精灵智能音箱系列的产品链路为例&#xff0c;服务端便是网关&#xff08;包括网关在内&#xff09;之后的链路。 什么是接口&#xf…

【自然语言处理】【大模型】RWKV:基于RNN的LLM

相关博客 【自然语言处理】【大模型】RWKV&#xff1a;基于RNN的LLM 【自然语言处理】【大模型】CodeGen&#xff1a;一个用于多轮程序合成的代码大语言模型 【自然语言处理】【大模型】CodeGeeX&#xff1a;用于代码生成的多语言预训练模型 【自然语言处理】【大模型】LaMDA&a…

深入网络底层,了解Linux系统收发网络数据包的过程、原理、流程,附图文说明

深入网络底层&#xff0c;了解Linux系统收发网络数据包的过程、原理、流程&#xff0c;附图文说明。 Linux 服务器收到网络数据包&#xff0c;需要经过哪些处理&#xff0c;一步步将数据传给应用进程的呢&#xff1f;应用进程发送数据包时&#xff0c;Linux 又是如何操作将数据…

android studio platform使用体验分享(as无法跳转c/c++等native源码的福音,强烈推荐)

hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;这些天粉丝朋友们分享了一下Android Studio for Platform 这个最新的google开发的阅读aosp源码的工具&#xff0c;特别适合做原生系统开发。具体官方介绍如下地址&#xff1a; 参考链接&#xff1a;https://developer.…

react的状态管理简单钩子方法

1.recoil useProvider文件: import { atom, useRecoilState } from recoil;const initState atom({key: initState,default: {state: [],}, })// 将业务逻辑拆分到一个单独文件中&#xff0c;方便进行状态管理 export interface StateProps {id: number;text: string;isFini…

差分进化算法解析:Scala实现详细指南及其在优化问题中的应用

1. 差分进化算法简介 差分进化算法(Differential Evolution, DE)是一种演化计算的方法,主要用于连续空间的优化问题。与其他进化算法如遗传算法不同,DE专门设计用于处理实数编码的解,使其成为处理连续优化问题的理想选择。 该算法的基本思想是通过结合当前代的个体与他们…

使用Python编写一个多线程的12306抢票程序

国庆长假即将到来&#xff0c;大家纷纷计划着自己的旅行行程。然而&#xff0c;对于很多人来说&#xff0c;抢购火车票人们成了一个令人头疼的问题。12306网站的服务器经常因为流量高而崩溃&#xff0c;导致抢票变得越来越严重异常困难。 首先&#xff0c;让我们来了解一下1230…

异地远程访问本地SQL Server数据库【无公网IP内网穿透】

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 现在我们身边的只能设备越来越多&#xff…

php经常遇到的方法和问题整理长期更新

1、array_shift() 函数 定义和用法 array_shift() 函数用于删除数组中的第一个元素&#xff0c;并返回被删除的元素。 注释&#xff1a;如果键名是数字的&#xff0c;所有元素都将获得新的键名&#xff0c;从 0 开始&#xff0c;并以 1 递增&#xff08;参见下面实例&#xff0…

京东获得店铺的所有商品 API 说明文档

item_search_shop-获得店铺的所有商品 jd.item_search_shop 注册账号获取测试key 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff0…

文心一言 VS 讯飞星火 VS chatgpt (94)-- 算法导论9.2 3题

三、用go语言&#xff0c;给出 RANDOMIZED-SELECT的一个基于循环的版本。 文心一言&#xff1a; 在循环中实现 RANDOMIZED-SELECT 的一个版本可以如下所示。这个版本使用 Go 语言编写&#xff0c;利用随机化来选择一个元素&#xff0c;并在循环中不断地调整选择的元素&#x…

【探索Linux】—— 强大的命令行工具 P.8(进程地址空间)

阅读导航 前言一、内存空间分布二、什么是进程地址空间1. 概念2. 进程地址空间的组成 三、进程地址空间的设计原理1. 基本原理2. 虚拟地址空间 概念 大小和范围 作用 虚拟地址空间的优点 3. 页表 四、为什么要有地址空间五、总结温馨提示 前言 前面我们讲了C语言的基础知识&am…

HTTP协议(超级详细)

HTTP协议介绍 基本介绍&#xff1a; HTTP&#xff1a;超文本传输协议&#xff0c;是从万维网服务器传输超文本到本地浏览器的传送协议HTTP是一种应用层协议&#xff0c;是基于TCP/IP通信协议来传送数据的&#xff0c;其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现&#xff0…

剑指 Offer 41. 数据流中的中位数

剑指 Offer 41. 数据流中的中位数 class MedianFinder {PriorityQueue<Integer> pq1, pq2;/** initialize your data structure here. */public MedianFinder() {pq1 new PriorityQueue<>((a, b) -> Integer.compare(a, b)); // 返回最小的元素&#xff0c;存…

vue脚手架创建,ref、双向绑定,axios请求。。

Vue CLI 是 Vue.js 官方提供的一个脚手架工具&#xff0c;可以快速搭建 Vue.js 项目&#xff0c;并提供了一些常见的工程化功能&#xff0c;如代码打包、热重载、单元测试等。以下是 Vue CLI 的搭建和使用步骤&#xff1a; 安装 Node.js 首先需要在本地安装 Node.js&#xff…

LeetCode-62-不同路径-动态规划

题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径…