Mina protocol - 体验教程

news2024/12/24 3:04:12

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.coloradmin.cn/o/2143873.html

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

相关文章

基于Springboot美食推荐小程序的设计与实现(源码+数据库+文档)

一.项目介绍 pc端&#xff1a; 支持用户、餐厅老板注册 支持管理员、餐厅老板登录 管理员&#xff1a; 管理员模块维护、 餐厅管理模块维护、 用户管理模块维护、 商品管…

Qt:NULL与nullptr的区别(手写nullptr)

前言 发现还是有人不知道NULL 与nullptr的区别&#xff0c;故写此文章。 正文 对于NULL 先看NULL的源码 我们可以看出这段代码是一个典型的预处理器宏定义块&#xff0c;用于处理 NULL 宏的定义。 先看开头 #if defined (_STDDEF_H) || defined (__need_NULL)这行代码检…

git报错,error: bad signature 0x00000000fatal: index file corrupt

报错 git -c diff.mnemonicprefixfalse -c core.quotepathfalse --no-optional-locks checkout daily --progress error: bad signature 0x00000000 fatal: index file corrupt 原因 git 仓库中索引文损坏 处理 1.该备份的先备份 2.删除索引并重置 rm -f .git/index git r…

医学数据分析实训 项目五 分类分析--乳腺癌数据分析与诊断

文章目录 项目六&#xff1a;分类分析实践目的实践平台实践内容&#xff08;一&#xff09;数据理解及准备&#xff08;二&#xff09;模型建立、预测及优化任务一&#xff1a;使用 KNN算法进行分类预测任务二&#xff1a;使用贝叶斯分类算法进行分类预测任务三&#xff1a;使用…

Linux基础3-基础工具4(git,冯诺依曼计算机体系结构)

上篇文章&#xff1a;Linux基础3-基础工具3&#xff08;make,makefile,gdb详解&#xff09;-CSDN博客 本章重点&#xff1a; 1. git简易使用 2. 冯诺依曼计算机体系结构介绍 一. git使用 1.1 什么是git? git是用于管理代码版本的一种工具&#xff0c;我们在如GitHub&#xf…

C++ | (二)类与对象(上)

燕子去了&#xff0c;有再来的时候&#xff1b;杨柳枯了&#xff0c;有再青的时候&#xff1b;桃花谢了&#xff0c;有再开的时候。但是&#xff0c;聪明的&#xff0c;你告诉我&#xff0c;我们的假期为什么一去不复返呢&#xff1f; 目录 一、初识类 1.1 类的定义 1.2 C中…

面试真题-TCP的三次握手

TCP的基础知识 TCP头部 面试题&#xff1a;TCP的头部是多大&#xff1f; TCP&#xff08;传输控制协议&#xff09;的头部通常是固定的20个字节长&#xff0c;但是根据TCP选项&#xff08;Options&#xff09;的不同&#xff0c;这个长度可以扩展。TCP头部包含了许多关键的字…

depcheck 检查项目中依赖的使用情况 避免幽灵依赖的产生

depcheck 检查项目中依赖的使用情况 避免幽灵依赖的产生 什么是幽灵依赖 (幻影依赖) 形成原因 幽灵依赖是指node_modules中存在 而package.json中没有声明过的依赖 但却能够在项目的依赖树中找到并使用的模块 Node.js 的模块解析规则&#xff1a; Node.js 采用了一种非传统的模…

C++速通LeetCode简单第20题-多数元素

方法一&#xff1a;暴力解法&#xff0c;放multiset中排序&#xff0c;然后依次count统计&#xff0c;不满足条件的值erase清除。 class Solution { public:int majorityElement(vector<int>& nums) {int ans 0;multiset<int> s;for(int i 0;i < nums.s…

「iOS」viewController的生命周期

iOS学习 ViewController生命周期有关方法案例注意 ViewController生命周期有关方法 init - 初始化程序&#xff1b;loadView - 在UIViewController对象的view被访问且为空的时候调用&#xff1b;viewDidLoad - 视图加载完成后调用&#xff1b;viewWillAppear - UIViewControll…

给大模型技术从业者的建议,入门转行必看!!

01—大模型技术学习建议‍‍‍ 这个关于学习大模型技术的建议&#xff0c;也可以说是一个学习技术的方法论。 首先大家要明白一点——(任何)技术都是一个更偏向于实践的东西&#xff0c;具体来说就是学习技术实践要大于理论&#xff0c;要以实践为主理论为辅&#xff0c;而不…

换个手机IP地址是不是不一样?

在当今这个信息爆炸的时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。而IP地址&#xff0c;作为手机连接网络的桥梁&#xff0c;也时常引起我们的关注。你是否曾经好奇&#xff0c;换个手机&#xff0c;IP地址会不会也跟着变呢&#xff1f;本文将深入探讨这个问题&a…

Android15之编译Cuttlefish模拟器(二百三十一)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

直流斩波电路

目录 1. 降压斩波电路&#xff08;Buck Converter&#xff09; 2. 升压斩波电路&#xff08;Boost Converter&#xff09; 3. 升降压斩波电路&#xff08;Buck-Boost Converter&#xff09; 4. Cuk斩波电路&#xff08;Cuk Converter&#xff09; 直流斩波电路是一种将直流…

Unity3D下如何播放RTSP流?

技术背景 在Unity3D中直接播放RTSP&#xff08;Real Time Streaming Protocol&#xff09;流并不直接支持&#xff0c;因为Unity的内置多媒体组件&#xff08;如AudioSource和VideoPlayer&#xff09;主要设计用于处理本地文件或HTTP流&#xff0c;而不直接支持RTSP。所以&…

上海人工智能实验室开源视频生成模型Vchitect 2.0 可生成20秒高清视频

上海人工智能实验室日前推出的Vchitect2.0视频生成模型正在悄然改变视频创作的游戏规则。这款尖端AI工具不仅简化了视频制作流程&#xff0c;还为创作者提供了前所未有的灵活性和高质量输出。 Vchitect2.0的核心优势在于其强大的生成能力和高度的可定制性。用户只需输入文字描…

用Matlab求解绘制2D散点(x y)数据的最小外接圆、沿轴外接矩形

用Matlab求解绘制2D散点&#xff08;x y&#xff09;数据的最小外接圆、沿轴外接矩形 0 引言1 原理概述即代码实现1.1 最小外接圆1.2 沿轴外接矩形 2 完整代码3 结语 0 引言 本篇简单介绍下散点数据最小外接圆、沿轴外接矩形的简单原理和matlab实现过程。 1 原理概述即代码实现…

C语言-数据结构 有向图拓扑排序TopologicalSort(邻接表存储)

拓扑排序算法的实现还是比较简单的&#xff0c;我们需要用到一个顺序栈辅助&#xff0c;采用邻接表进行存储&#xff0c;顶点结点存储入度、顶点信息、指向邻接结点的指针&#xff0c;算法过程是&#xff1a;我们先将入度为0的顶点入栈&#xff0c;然后弹出栈顶结点&#xff0c…

使用CUBE_MX使用I2C通信,实现对EEPROM的读写

一、使用CUBE_MX配置 1.配置I2C 2.配置USART1 3.重中之重(在KEIL5打开串口使用的库) 二、KEIL5配置 #include "main.h" #include "i2c.h" #include "gpio.h" #include "usart.h"#include <stdio.h>void SystemClock_Config(vo…

flash_attention简要笔记

优化效果 原来&#xff0c;attention部分的计算量和中间激活占用显存的复杂度都是 O ( N 2 ) O(N^2) O(N2) 计算量部分原来QK矩阵乘和attn_scoreV矩阵乘的计算量&#xff0c;复杂度都是 O ( N 2 ) O(N^2) O(N2)&#xff1b;中间激活因为中间有一个attn_score&#xff0c;所以复…