Mina protocol - 体验教程

Mina protocol - 体验教程

  • 一、零知识证明( Zero Knowledge Proof )
    • 1、零知识证明(ZKP)的基本流程
      • 工作流程:
    • 2、zkApp 的优势:
    • 3、zkApp 每个方法的编译过程:
  • 二、搭建第一个zkapp
    • 先决条件
    • 1、下载或者更新 zkApp CLI​
    • 2、创建一个新项目
    • 3、准备项目
    • 4、编写 index.ts
    • 5.、编写 zkapp 智能合约
    • 6、与智能合约交互
    • 7、构建并运行智能合约
    • 8、运行结果

一、零知识证明( Zero Knowledge Proof )

零知识证明是一种密码学协议,允许证明者在不泄露任何额外信息的情况下,向验证者证明自己知道某个特定的秘密或信息。简单来说,证明者可以证明自己“知道”某件事,而无需透露这件事的具体内容。

零知识证明的重要性在于它能在保护隐私的同时,确保信息的真实性和可靠性。


零知识证明通常生成很麻烦,但是验证很迅速,其主要的运用场景是:

  • 隐私保护:验资、投票、交易
  • 计算压缩:区块链扩容

1、零知识证明(ZKP)的基本流程

  1. 编译(Compile)
  • 输入:program
  • 输出:verification_key(验证密钥,类型为字符串)
  1. 证明(Prove)
  • 输入:program,public_inputs(公共输入),private_inputs(私有输入)
  • 输出:proof(证明,类型为字符串)
  1. 验证(Verify)
  • 输入:proof,public_inputs,verification_key
  • 输出:布尔值(返回true 或 false 以验证证明的有效性)

在这里插入图片描述

工作流程:

Prover Function(证明者函数): 通过私有输入和公共输入生成零知识证明。
Verifier Function(验证者函数): 接收零知识证明与公共输入,并通过验证密钥进行验证,返回 true 或 false。


2、zkApp 的优势:

  1. zkApp 使用 TypeScript 编写,支持在浏览器中直接运行。
  2. 可编程隐私(Programmable Privacy):提供灵活的隐私配置,允许开发者根据需求编写隐私功能。
  3. 链下执行与链上验证(Offchain Execution & Onchain Verification):zkApp 可以在链下执行计算,链上只做验证,从而减少了Gas费用。
  4. 无需可信设置(No Trusted Setup):zkApp 不依赖于传统的可信设置步骤,简化了系统复杂度。
  5. 可组合性与 zkRollup 风格的扩展性(Composability and zkRollup-style Scaling):zkApp 通过递归扩展支持可组合性和 Rollup 风格的扩展性,提升了系统的可扩展性。
  6. 通过 Mina 区块链实现互操作性(Interoperability through Mina’s succinct blockchain):zkApp 通过 Mina 的精简区块链实现了跨链互操作性。

3、zkApp 每个方法的编译过程:

每个 zkApp 的方法实际上被编译成一个程序,该程序具有以下两个要素:

  • 输入(Input): 方法的参数(arguments)和链上状态(on-chain values)。
  • 输出(Output): 执行的更新列表以及与链上状态相关的前提条件列表。

zkApp 中的智能合约的执行流程可以被描述为:

zkCircuits(State0(public), private inputs) ===> Tx[proof, updates] ===> State1

解释:zkCircuits 处理初始状态(State0),接受公共和私有输入,生成交易证明(Tx proof)和更新列表(updates),最终更新到新的状态(State1)。
在这里插入图片描述
方法的参数包含私有输入和智能合约的某些状态。
方法还利用外部世界的状态信息,生成对智能合约状态和外部世界状态的更新。

二、搭建第一个zkapp

  • 编写一个基本的智能合约,该合约存储一个作为链上状态的数字。
  • 合约逻辑允许仅通过其平方来替换这个数字;例如,3 -> 9 ->81,依此类推。
  • 使用zkApp CLI创建一个项目。
  • 编写你的智能合约代码。
  • 使用模拟的本地 Mina 区块链与智能合约进行交互。

先决条件

  • Node.JS v18+
  • NPM v10+
  • git v2+

1、下载或者更新 zkApp CLI​

npm install -g zkapp-cli

在这里插入图片描述

2、创建一个新项目

  • Zk project 命令能够为你的项目生成用户界面。
  • 请选择none选项。​
zk project <project-name>

在这里插入图片描述

3、准备项目

首先删除新项目附带的默认文件。

rm src/Add.ts
rm src/Add.test.ts
rm src/interact.ts

创建新文件:

zk file src/Square
touch src/main.ts
  • zk file命令创建了src/square.ts 和 src/Square.test.ts 测试文件。

4、编写 index.ts

在文本编辑器中打开 src/index.ts 并将其更改为如下所示:

import { Square } from './Square.js';export { Square };

src/index.ts 文件包含了你希望从智能合约项目外部(例如从用户界面)进行调用的所有导出内容。

5.、编写 zkapp 智能合约

在src/Square.ts文件中编写你的智能合约。

/*Field:o1js中的原生数字类型。你可以将Field元素视为无符号整数。Field元素是o1js中最基础的类型,所有其他o1js兼容类型都是基于 Field元素构建的。
SmartContract:创建zkApp智能合约的类。
state:在zkApp智能合约中使用的便捷装饰器,用于创建对zkApp账户中链上存储状态的引用。
State:在zkApp智能合约中使用的类,用于在zkApp账户中创建链上存储的状态。
method:在zkApp智能合约中使用的便捷装饰器,用于创建智能合约中的方法(类似函数)。使用此装饰器的方法是用户与智能合约交互的入口点。*/ 
import { Field, SmartContract, state, State, method } from 'o1js';// 名为 Square 的智能合约有一个链上状态元素,名为num,类型为Field,
// zkApp可以拥有最多八个链上状态字段
export class Square extends SmartContract {@state(Field) num = State<Field>();init() {super.init(); // 添加init方法,用于在部署时设置智能合约的初始状态this.num.set(Field(3)); // 将链上状态num初始化为值 3}// 如果用户向update()方法提供的数字(例如 9)是现有链上状态num的平方(例如 3),则将链上存储的num值更新为提供的值(在此情况下为 9)。// 如果用户提供的数字不满足这些条件,他们将无法生成证明或更新链上状态。@method async update(square: Field) {const currentstate = this.num.get(); this.num.requireEquals(currentstate); square.assertEquals(currentstate.mul(currentstate));this.num.set(square);}
}

当用户调用智能合约上的方法时,所有断言必须为真,才能从该智能合约生成零知识证明。Mina网络只有在附加的证明有效时才会接受交易并更新链上状态。

6、与智能合约交互

接下来,编写一个与智能合约交互的脚本。在 src 文件夹下创建 main.ts 文件,以便你能够与智能合约进行交互。

/*Field:与之前学到的相同的 o1js 无符号整数类型。Mina:用于模拟本地 Mina 区块链,方便将智能合约部署到其中,并像用户一样与其交互。PrivateKey:一个包含用于操作私钥的函数的类。AccountUpdate:生成一个可以更新 zkApp 账户的数据结构的类。
*/
import { Square } from './Square.js';
import { Field, Mina, PrivateKey, AccountUpdate } from 'o1js';// 初始化本地区块链
const useProof = false; // 设置是否使用证明
const Local = await Mina.LocalBlockchain({ proofsEnabled: useProof });
Mina.setActiveInstance(Local);// 模拟本地区块链提供了预先资助的账户
const deployerAccount = Local.testAccounts[0];
const deployerKey = deployerAccount.key;
const senderAccount = Local.testAccounts[1];
const senderKey = senderAccount.key;
// ----------------------------------------------------// 创建公钥/私钥对。公钥是您的地址以及将 zkApp 部署到的位置
const zkAppPrivateKey = PrivateKey.random();
const zkAppAddress = zkAppPrivateKey.toPublicKey();// 创建一个 Square 实例,并将其部署到 zkAppAddress
const zkAppInstance = new Square(zkAppAddress);
const deployTxn = await Mina.transaction(deployerAccount, async () => {AccountUpdate.fundNewAccount(deployerAccount);await zkAppInstance.deploy();
});
await deployTxn.sign([deployerKey, zkAppPrivateKey]).send(); // 发送签名// 获取部署后 Square 的初始状态
const num0 = zkAppInstance.num.get();
console.log('state after init:', num0.toString());// ----------------------------------------------------
// 创建了一个新交易,尝试将字段更新为值9。
const txn1 = await Mina.transaction(senderAccount, async () => {await zkAppInstance.update(Field(9));
});
await txn1.prove();
await txn1.sign([senderKey]).send();const num1 = zkAppInstance.num.get();
console.log('state after txn1:', num1.toString());// ----------------------------------------------------
// 尝试一个失败的交易,看一看结果会是怎样
try {const txn2 = await Mina.transaction(senderAccount, async () => {await zkAppInstance.update(Field(75));});await txn2.prove();await txn2.sign([senderKey]).send();
} catch (error: any) {console.log(error.message);
}
const num2 = zkAppInstance.num.get();
console.log('state after txn2:', num2.toString());// ----------------------------------------------------const txn3 = await Mina.transaction(senderAccount, async () => {await zkAppInstance.update(Field(81));
});
await txn3.prove();
await txn3.sign([senderKey]).send();const num3 = zkAppInstance.num.get();
console.log('state after txn3:', num3.toString());// ----------------------------------------------------

7、构建并运行智能合约

现在,Square 智能合约已经完成,以下命令将以模拟本地区块链运行您的项目。要将 TypeScript 代码编译成 JavaScript,请使用:

npm run build

要运行 JavaScript 代码:

node build/src/main.js

您可以选择将这些命令合并为一行(推荐):

npm run build && node build/src/main.js

8、运行结果

在这里插入图片描述

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

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

相关文章

Chainlit集成LlamaIndex实现知识库高级检索(句子窗口节点检索)

检索原理 句子窗口检索原理 通常在执行基础的RAG检索时我们会将文档按指定的块大小(chunk_size)进行切割&#xff0c;然后进行embedding的向量化处理后存入向量数据库中&#xff0c;在检索时我们会计算用户问题(question) 与文档块的相似度&#xff0c;并选取K个最相似的文档(…

LeetCode[中等] 49.字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 思路&#xff1a; new Dictionary<string, List<string>>() 存储数据&#xff0c;key为排序之后的字符…

2024年9月18日历史上的今天大事件早读

1043年9月18日 范仲淹实行改革 1393年9月18日 “活财神”沈万三逝世 1783年9月18日 瑞士著名数学家欧拉逝世 1851年9月18日 《纽约时报》创刊 1903年9月18日 清末爱国将领冯子材逝世 1917年9月18日 护法战争爆发 1931年9月18日 “九一八”事变爆发 1936年9月18日 阎锡山…

澳元/美元价格:进一步上涨看向美联储

澳元/美元在0.6700关口附近波动不定。美元因美国经济数据强劲而重新获得上行动力。接下来&#xff0c;澳大利亚将公布西太平洋领先指数。 美元的再度走强使风险敏感资产承压&#xff0c;澳元/美元周二维持在0.6700关口上方的小幅区间内。尽管美元反弹&#xff0c;澳元仍成功维…

深入解析代理模式:静态代理、JDK 动态代理和 CGLIB 的全方位对比!

代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了对象的替身&#xff0c;即代理对象来控制对实际对象的访问。通过代理对象&#xff0c;可以在不修改目标对象的情况下&#xff0c;扩展或控制其功能。例如&#xff0c;代理模式可以用于延…

6个Python小游戏项目源码【免费】

6个Python小游戏项目源码 源码下载地址&#xff1a; 6个Python小游戏项目源码 提取码: bfh3

Python异常处理:自定义异常②

文章目录 1. 什么是自定义异常&#xff1f;2. 为什么需要自定义异常&#xff1f;3. 如何定义自定义异常&#xff1f;3.1 基本自定义异常3.2 带详细信息的自定义异常3.3 自定义异常的继承层次 4. 使用自定义异常4.1 抛出自定义异常4.2 捕获自定义异常 5. 自定义异常的应用场景5.…

【C/C++】涉及string类的经典OJ编程题

【C/C】涉及string类的经典OJ编程题 一. 把字符串转化成整数&#xff08;atoi&#xff09;解法一&#xff1a;&#xff08;不用long&#xff09;完整代码&#xff1a;解法二&#xff1a;&#xff08;用long&#xff09; 二.字符串相加代码实现&#xff08;含注释&#xff09;&a…

【UE5】使用2DFlipbook图作为体积纹理,实现实时绘制体积纹理【第一篇】

这是一篇对“Creating a Volumetric Ray Marcher-Shader Bits”的学习心得 文章时间很早&#xff0c;因此这里针对UE5对原文做出兼容性修正&#xff08;为避免累赘不做出注明。链接如上&#xff0c;有需要自行学习&#xff09; 以及最后对Custom做可能的蓝图移植&#xff0c;做…

【Android Studio】2024.1.1最新版本AS调试老项目(老版AS项目文件、旧gradle)导入其他人的项目

文章目录 实验环境开始修改项目文件1. 删除.gradle及.idea两个文件夹2.修改SDK路径&#xff08;本地SDK存放路径&#xff09;3.修改gradle版本4.修改gradle插件版本&#xff08;AGP&#xff09;5.修改JDK版本 实验环境 Android Studio 版本 项目版本 开始修改项目文件 1. 删…

docker可视化管理工具推荐!docker.ui

正式介绍之前&#xff0c;可以看下这款工具的截图&#xff0c;开源地址在文末提供&#xff1a; docker.ui&#xff1a;一个可视化的docker管理工具 docker是一个开源的容器平台&#xff0c;可以让开发者和运维人员快速地构建、运行和部署应用。 docker的优势在于它可以实现应…

机器人的动力学——牛顿欧拉,拉格朗日,凯恩

机器人的动力学推导方法有很多&#xff0c;常用得有牛顿&#xff0c;拉格朗日&#xff0c;凯恩等方法&#xff0c;接下来&#xff0c;简单说说他们之间的使用。注&#xff1a;这里不考虑怎么来的&#xff0c;只说怎么应用。 参考1&#xff1a;4-14动力学分析方法-牛顿—欧拉方…

网络设备登录——《路由与交换技术》实验报告

目录 一、实验目的 二、实验设备和环境 三、实验记录 1.通过 Console 登录 步骤1:连接配置电缆。 步骤2:启动PC,运行超级终端。 步骤3:进入Console 配置界面 2.通过 Telnet 登录 步骤1:通过 Console 接口配置 Telnet 用户。 步骤2:配置 super 口令 步骤3:配置登录欢迎…

【数据仓库】数据仓库常见的数据模型——维度模型

文章部分图参考自&#xff1a;多维数据模型各种类型&#xff08;星型、雪花、星座、交叉连接&#xff09; - 知乎 (zhihu.com) 文章部分文字canla一篇文章搞懂数据仓库&#xff1a;四种常见数据模型&#xff08;维度模型、范式模型等&#xff09;-腾讯云开发者社区-腾讯云 (ten…

Comsol 利用多孔材料填充复合吸声器,拓宽低频完美吸声

参考文献&#xff1a;Cheng B , Gao N , Huang Y ,et al.Broadening perfect sound absorption by composite absorber filled with porous material at low frequency:[J].Journal of Vibration and Control, 2022, 28(3-4):410-424.DOI:10.1177/1077546320980214. 为了提高低…

MySQL基于GTID同步模式搭建主从复制

系列文章目录 rpmbuild构建mysql5.7.42版本的rpm包 文章目录 系列文章目录一、mysql-5.7.42RPM包构建二、同步模式分类介绍1.异步同步模式2.半同步模式2.1.实现半同步操作流程2.2.半同步问题总结2.3.半同步一致性2.4.异步与半同步对比 3.GTID同步 三、GTID同步介绍1.gtid介绍2…

C语言程序设计(进阶)

行到水穷处&#xff0c;坐看云起时。 中秋快乐呀&#xff01; 数据在内存中的存储 1.数据类型的介绍 &#xff08;1&#xff09;基本的内置类型&#xff1a; char //字符数据类型 short //短整型 int //整型 long //长整型 …

【零基础速领】全套AI大模型入门指南(学习路线+PDF文档+面试)

已经有越来越多的人开始认识到学习AI的重要性了&#xff01;可能是自主的认知&#xff0c;也可能是被身边的人卷的。总之&#xff0c;可能已经没有人不知道人工智能这个概念了&#xff0c;可能人人都已知道ChatGPT了&#xff0c;哪怕他没有用过。 ChatGPT发布后&#xff0c;很…

nginx实现https安全访问的详细配置过程

文章目录 前言什么是 HTTP&#xff1f;什么是 HTTPS&#xff1f;HTTP 和 HTTPS 的区别为什么 HTTPS 被称为安全的&#xff1f;配置过程配置自签名证书 前言 首先我们来简单了解一下什么是http和https以及他们的区别所在. 什么是 HTTP&#xff1f; HTTP&#xff0c;全称为“超…

LeetCode_sql_day24(1212.查询球队积分)

描述 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表: Matches…