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.mzph.cn/web/53053.shtml

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

相关文章

黑神话悟空+云技术,游戏新体验!

近期&#xff0c;一款名为黑神话悟空的游戏因其独特的艺术风格和创新的技术实现在玩家中产生了不小的影响。 而云桌面技术作为一种新兴的解决方案&#xff0c;正在改变人们的游戏体验方式&#xff0c;使得高性能游戏可以在更多设备上流畅运行。 那么&#xff0c;黑神话悟空如…

Hazel 2024

不喜欢游戏的人也可以做引擎&#xff0c;比如 cherno 引擎的作用主要是有两点&#xff1a; 将数据可视化交互 当然有些引擎的功能也包含有制作数据文件&#xff0c;称之为资产 assets 不做窗口类的应用栈&#xff0c;可能要花一年才能做一个能实际使用的应用&#xff0c;只需…

VSCode扩展连接虚拟机MySQL数据库

在虚拟机安装MySQL vscode通过ssh远程登录Ubuntu 在vscode终端运行以下命令。 sudo apt-get install mysql-server-5.7 用以下命令确认MySQL是否安装完成。 sudo mysql MySQL安装成功。 在VSCode安装SQL扩展 扩展名&#xff1a;MySQL Shell for VS Code。 安装完成后&am…

JavaScript高级——闭包的作用

1、使用函数内部的变量在函数执行完后&#xff0c;仍然存活在内存中&#xff08;延长了局部变量的生命周期&#xff09; 2、让函数外部可以操作&#xff08;读写&#xff09;到函数内部的数据&#xff08;变量/函数&#xff09; 3、函数执行完后&#xff0c;函数内部声明的局…

使用原生HTML的drag实现元素的拖拽

HTML 拖放&#xff08;Drag and Drop&#xff09;接口使应用程序能够在浏览器中使用拖放功能。例如&#xff0c;用户可使用鼠标选择可拖拽&#xff08;draggable&#xff09;元素&#xff0c;将元素拖拽到可放置&#xff08;droppable&#xff09;元素&#xff0c;并释放鼠标按…

java进销存系统源码:管店云进销存解决方案

在当今数字化转型的大背景下&#xff0c;企业对高效、可靠的进销存管理系统的需求日益增长。Java作为一种广泛使用的编程语言&#xff0c;以其成熟的技术栈和强大的生态系统&#xff0c;成为了开发高性能进销存系统的首选语言之一。本文将介绍一款基于Java进销存系统源码的“管…

c++刷题

17.电话号码的组合 来源于题解思路&#xff1a; 继承 CC14 KiKi设计类继承 #include <iostream> #include <memory> using namespace std; class Shape{ private:int x;int y; };class Rectangle:public Shape { public:Rectangle(int length,int width):Shape…

Cartographer源码理解

一、前言 最近一个半月&#xff0c;利用空余时间对Cartographer源码进行了简单的阅读&#xff0c;在这里做了个简单梳理&#xff0c;和大家分享交流。 cartographer源码量其实是有点大的&#xff0c;逐行逐句去解释实在是有心无力了&#xff0c;而且已经有大佬做了类似的事情…

Java笔试面试题AI答之单元测试JUnit(5)

文章目录 25. 简述什么是Junit 忽略测试&#xff08;Ignore Test&#xff09;&#xff1f;一、基本概念二、使用方法三、注意事项四、示例 26. 简述什么是Junit 超时测试&#xff08;Timeout Test&#xff09;&#xff1f;Junit 超时测试的主要特点包括&#xff1a;实现方式&am…

buildroot移植qt报错Info: creating stash file (补充qt添加字库)

移植qt库&#xff0c;编译文件报错Info: creating stash file /home/rbing/QT/uart/.qmake.stash Project ERROR: Unknown module(s) in QT: serialport rbingouc:~/QT/uart$ /home/rbing/linux/tool/buildroot-2022.02.9/output/host/usr/bin/qmake Info: creating stash fil…

一些写leetcode的笔记

标准库中的string类没有实现像C#和Java中string类的split函数&#xff0c;所以想要分割字符串的时候需要我们自己手动实现。但是有了stringstream类就可以很容易的实现&#xff0c;stringstream默认遇到空格、tab、回车换行会停止字节流输出。 #include <sstream> #incl…

部分动态铜皮的孤岛无法删除。报错

(SPMHCI-1): Cannot break shape into fragments. 网上寻找了很多答案&#xff0c;都不太理想&#xff0c;不是我想要的方法。 终于功夫不负有心人&#xff0c;在Cadence官方论坛找到了蛛丝马迹。 Breaking Static shape into fragments - PCB Design - PCB Design & IC …

uniapp 做一个查看图片的组件,图片可缩放移动

因为是手机端&#xff0c;所以需要触摸可移动&#xff0c;双指放大缩小。 首先在components里建个组件 查看图片使用 uni-popup 弹窗 要注意 transform的translate和scale属性在同一标签上不会一起生效 移动就根据触摸效果进行偏移图片 缩放就根据双指距离的变大变小进行缩…

【 html+css 绚丽Loading 】 000052 璇玑转轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

[网络]http的简单认识

文章目录 一. 什么是http二. http协议工作过程三. http协议格式1. 抓包工具fiddler2. http请求报文3. http响应报文 一. 什么是http HTTP (全称为 “超⽂本传输协议”) 是⼀种应⽤⾮常⼴泛的 应⽤层协议 HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议 HTTP 往…

MyBatis中多对一关系的三种处理方法

目录 MyBatis中多对一关系的三种处理方法 1.通过级联属性赋值 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 2.通过标签 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 3.分步查询 …

【C++二叉树】102.二叉树的层序遍历

107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a; 层序遍历&#xff0c;但是要注意输出的结果是一个二维数组&#xff0c;不是一层一个值一个值的输出&#xff0c;而是要一层一层的输出。可以通过一个循环控制每一层的数据个数&#xff…

PyCharm 安装教程

传送门 PyCharm 是一款由 JetBrains 开发的强大的 Python 集成开发环境&#xff08;IDE&#xff09;。它支持多种功能&#xff0c;包括调试、代码补全、智能代码分析、版本控制集成等&#xff0c;特别适合开发 Python 项目。接下来&#xff0c;我们将详细介绍如何在不同操作系…

【C++高阶】解锁C++的深层魅力——探索特殊类的奥秘

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C 类型转换 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C特殊类 &#x1f4d2;1. 不能被拷贝…

文字loading加载

效果 1. 导入库 import sys from PyQt5.QtCore import QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QPainter, QFont, QColor, QBrush from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QProgressBar, QLabel 代码首先导入了P…