探索 Mina 协议:zk 应用程序的实际用例

zkapps(零知识应用)是由零知识证明支持的 mina 协议智能合约,特别是 zk-snarks [零知识简洁非交互式知识论证]。zkapps 取代了 snapps [智能非交互式知识论证]应用]。 zkapp 智能合约是使用 o1js(typescript 库)编写的。 zkapps 在用户的 web 浏览器中运行客户端,并仅发布一个小的有效性证明,然后由 mina 节点进行验证。 zkapp 由智能合约和 ui 组成,我将在下一节中进一步描述。

应用

我创建了关于年龄验证的 zkapp,其中用户年龄在不干预个人数据的情况下得到验证。

我继续安装 zkapp-cli npm 包,它实际上创建了用于继续使用证明器函数和验证器函数的模板,作为 zk 证明构建过程的一部分

执行

下面是添加验证自定义逻辑的实现。它定义了 zk-snark 的电路逻辑,在证明生成过程中使用。实际的证明者函数由 o1js 库管理,并在使用私有输入在链外执行 zkapp 方法时调用。

import { field, smartcontract, state, state, method } from 'o1js';/** * private age verification contract * the contract will verify if the user's age is greater than or equal to the threshold age. * the contract uses zero-knowledge proofs to keep the user's age private. */export class ageverification extends smartcontract {  // state variable to store the verification result (valid or invalid)  @state(field) valid = state();  // method to initialize the state  init() {    super.init();    this.valid.set(field(0)); // default is invalid  }  // method to verify the age  @method async verifyage(age: field, threshold: field) {    // compute age - threshold    const difference = age.sub(threshold);    // use circuit-compatible logic to check if the difference is non-negative    const isvalid = difference.equals(field(0)).or(difference.greaterthanorequal(field(0)))      ? field(1)      : field(0);    // set the validity of the verification result    this.valid.set(isvalid);  }}

下面的脚本是一个与 ageverification zkapp 交互的测试套件。它在 txn.prove() 期间调用证明者逻辑,并通过检查其更新状态来验证 zkapp 的行为。

实际的证明者功能位于底层的 zkapp 方法(verifyage)中,txn.prove() 是在测试过程中生成证明的机制。

为了测试输入,我编辑了测试脚本,如下所示。

import { accountupdate, field, mina, privatekey, publickey } from 'o1js';import { ageverification } from './ageverification'; // import the correct contractlet proofsenabled = false;describe('ageverification', () => {  let deployeraccount: mina.testpublickey,    deployerkey: privatekey,    senderaccount: mina.testpublickey,    senderkey: privatekey,    zkappaddress: publickey,    zkappprivatekey: privatekey,    zkapp: ageverification; // update to use ageverification instead of add  beforeall(async () => {    if (proofsenabled) await ageverification.compile(); // update compile for ageverification  });  beforeeach(async () => {    const local = await mina.localblockchain({ proofsenabled });    mina.setactiveinstance(local);    [deployeraccount, senderaccount] = local.testaccounts;    let feepayer = local.testaccounts[0].key;    deployerkey = deployeraccount.key;    senderkey = senderaccount.key;    zkappprivatekey = privatekey.random();    zkappaddress = zkappprivatekey.topublickey();    zkapp = new ageverification(zkappaddress); // instantiate ageverification contract  });  async function localdeploy() {    const txn = await mina.transaction(deployeraccount, async () => {      accountupdate.fundnewaccount(deployeraccount);      await zkapp.deploy();    });    await txn.prove();    // this tx needs .sign(), because `deploy()` adds an account update that requires signature authorization    await txn.sign([deployerkey, zkappprivatekey]).send();  }  it('generates and deploys the `ageverification` smart contract', async () => {    await localdeploy();    const valid = zkapp.valid.get(); // access the 'valid' state variable    expect(valid).toequal(field(0)); // initially, the contract should set 'valid' to field(0)  });  it('correctly verifies the age in the `ageverification` smart contract', async () => {    await localdeploy();    const age = field(25); // example age value    const threshold = field(18); // example threshold value    // call the verifyage method    const txn = await mina.transaction(senderaccount, async () => {      await zkapp.verifyage(age, threshold); // use the verifyage method    });    await txn.prove();    await txn.sign([senderkey]).send();    const valid = zkapp.valid.get(); // check the validity state after verification    expect(valid).toequal(field(1)); // expected to be valid if age >= threshold  });});

以下是测试结果

testing result

我在interact.ts文件中添加了证明者机制,它基本上生成一个zk-snark证明,并在mina区块链中进行交易时提交证明。当 interact.ts 脚本生成证明时,验证是在处理交易时由 mina 区块链执行的。这是 zk-snark 系统的一个关键方面,证明者生成验证者(mina 网络)检查的证明。

import fs from 'fs/promises';import { Mina, NetworkId, PrivateKey, Field } from 'o1js';import { AgeVerification } from './AgeVerification'; // check command line arglet deployAlias = process.argv[2];if (!deployAlias)  throw Error(`Missing  argument.Usage:node build/src/interact.js `);Error.stackTraceLimit = 1000;const DEFAULT_NETWORK_ID = 'testnet';// parse config and private key from filetype Config = {  deployAliases: Record;};let configJson: Config = JSON.parse(await fs.readFile('config.json', 'utf8'));let config = configJson.deployAliases[deployAlias];let feepayerKeysBase58: { privateKey: string; publicKey: string } = JSON.parse(  await fs.readFile(config.feepayerKeyPath, 'utf8'));let zkAppKeysBase58: { privateKey: string; publicKey: string } = JSON.parse(  await fs.readFile(config.keyPath, 'utf8'));let feepayerKey = PrivateKey.fromBase58(feepayerKeysBase58.privateKey);let zkAppKey = PrivateKey.fromBase58(zkAppKeysBase58.privateKey);// set up Mina instance and contract we interact withconst Network = Mina.Network({  // We need to default to the testnet networkId if none is specified for this deploy alias in config.json  // This is to ensure the backward compatibility.  networkId: (config.networkId ?? DEFAULT_NETWORK_ID) as NetworkId,  mina: config.url,});const fee = Number(config.fee) * 1e9; // in nanomina (1 billion = 1.0 mina)Mina.setActiveInstance(Network);let feepayerAddress = feepayerKey.toPublicKey();let zkAppAddress = zkAppKey.toPublicKey();let zkApp = new AgeVerification(zkAppAddress);let age = Field(25); // Example agelet threshold = Field(18); // Example threshold age// compile the contract to create prover keysconsole.log('compile the contract...');await AgeVerification.compile();try {  // call verifyAge() and send transaction  console.log('build transaction and create proof...');  let tx = await Mina.transaction(    { sender: feepayerAddress, fee },    async () => {      await zkApp.verifyAge(age, threshold); // Replacing update() with verifyAge    }  );  await tx.prove();  console.log('send transaction...');  const sentTx = await tx.sign([feepayerKey]).send();  if (sentTx.status === 'pending') {    console.log(      'nSuccess! Age verification transaction sent.n' +        'nYour smart contract state will be updated' +        `nas soon as the transaction is included in a block:` +        `n${getTxnUrl(config.url, sentTx.hash)}`    );  }} catch (err) {  console.log(err);}function getTxnUrl(graphQlUrl: string, txnHash: string | undefined) {  const hostName = new URL(graphQlUrl).hostname;  const txnBroadcastServiceName = hostName    .split('.')    .filter((item) => item === 'minascan')?.[0];  const networkName = graphQlUrl    .split('/')    .filter((item) => item === 'mainnet' || item === 'devnet')?.[0];  if (txnBroadcastServiceName && networkName) {    return `https://minascan.io/${networkName}/tx/${txnHash}?type=zk-tx`;  }  return `Transaction hash: ${txnHash}`;}

我使用的年龄和阈值输入为 25 和 18。

由于测试已通过运行 npm run test 成功完成。我继续使用 zk config 在 devnet 上进行部署

我提供了以下输入:

部署别名:test
网络类型:测试网
网址:https://api.minascan.io/node/devnet/v1/graphql
付费者:新的付费者密钥
交易:0.1

可以从这里检索 url:

url detail

然后在部署后我得到了以下响应。

config details

deployment

合约部署在以下devnet

部署后,我继续使用 ui,通过提供 rpc url 和部署的合约地址,选择简单的 html、css 和 js,这是最终的 ui。

ui

将智能合约与ui集成后zkapp的创建就完成了。在为 ageverification zkapp 构建用户界面 (ui) 后,前端与智能合约的集成允许用户与零知识证明系统无缝交互。 ui 有助于向合约提交用户年龄和阈值数据,同时通过 zk-snark 维护隐私。这使得用户能够在不透露实际值的情况下验证自己的年龄,从而保持机密性。后端利用证明者功能生成证明,mina 区块链对其进行有效验证。这种端到端解决方案可确保安全、用户友好的体验,同时充分利用 mina 基于 zk-snark 的架构提供的隐私和可扩展性功能。

以上就是探索 Mina 协议:zk 应用程序的实际用例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1500164.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 22:21:50
下一篇 2025年12月19日 22:22:03

相关推荐

  • 如何在JavaScript中实现选项卡切换?

    在javascript中实现选项卡切换可以通过以下步骤实现:1. 设置html结构,2. 编写javascript代码处理选项卡切换,3. 使用事件委托提高性能,4. 添加css动画效果,5. 实现键盘导航,6. 优化性能,7. 增加错误处理,8. 遵循最佳实践。 在JavaScript中实现选项卡…

    好文分享 2025年12月20日
    000
  • JavaScript中的Web Workers怎么用?

    web workers在javascript中用于在后台运行脚本,不影响主线程性能。使用方法包括:1.创建独立的javascript文件(如worker.js);2.在主线程中初始化并使用worker。注意通信、安全性和错误处理。 用JavaScript中的Web Workers?简单来说,Web …

    2025年12月20日
    000
  • 如何在JavaScript中实现语音识别?

    在javascript中实现语音识别可以通过web speech api的speechrecognition接口实现。具体步骤包括:1.初始化speechrecognition对象并设置语言和参数;2.监听识别结果和错误;3.处理兼容性和错误;4.优化识别效果,如设置语言和调整参数;5.在实际应用中…

    2025年12月20日
    000
  • 怎样用JavaScript操作Cookie?

    在javascript中操作cookie的基本方法包括:1. 设置cookie,使用setcookie函数;2. 读取cookie,使用getcookie函数;3. 删除cookie,通过设置过期时间实现。这些操作通过document.cookie属性进行,需注意安全性、性能和跨域问题。 在处理Ja…

    2025年12月20日
    000
  • 什么是JavaScript中的尾调用优化?

    尾调用优化(tco)是javascript中的一种性能优化技术,可以避免栈溢出。1)尾调用是指函数在最后一步调用另一个函数并直接返回结果。2)理论上,javascript引擎应复用调用栈帧,但并非所有引擎都支持。3)使用时需检查引擎支持、准备备用方案和进行性能测试。 尾调用优化(Tail Call …

    2025年12月20日
    000
  • JavaScript中如何删除Cookie?

    在javascript中删除cookie的方法是设置其过期时间为过去的时间。具体步骤包括:1. 使用deletecookie函数,将cookie的过期时间设置为1970年1月1日,并确保路径一致;2. 如果cookie是在子域名下设置的,需要在删除时指定相同的域名;3. 注意secure和httpo…

    2025年12月20日
    000
  • 怎样用JavaScript创建仪表盘?

    在javascript中创建仪表盘主要有两种方法:1. 使用canvas api,适合需要频繁更新的场景;2. 使用svg,适用于复杂图形和不需要频繁更新的场景。这两种方法各有优缺点,选择时需考虑性能、响应式设计、用户交互、可访问性和数据驱动等因素。 在JavaScript中创建仪表盘是一个有趣且实…

    2025年12月20日
    000
  • 如何在JavaScript中实现分页功能?

    在javascript中实现分页功能可以通过以下步骤:1. 使用slice方法切割数据数组,每页显示固定数量的数据。2. 创建导航控制,包括“上一页”、“下一页”和跳转功能,使用javascript处理点击事件。3. 考虑性能优化,如服务器端分页、懒加载或虚拟滚动,提升用户体验。 你问如何在Java…

    2025年12月20日
    000
  • 怎样用JavaScript实现简单的动画效果?

    用javascript实现动画效果可以通过以下步骤:1.使用setinterval函数定时更新元素位置,2.改用requestanimationframe确保动画平滑,3.使用css的transform属性优化性能,4.结合css过渡和动画增强效果,5.添加交互效果提升用户体验。这样可以创建出既美观…

    2025年12月20日
    000
  • 怎样在JavaScript中实现截图功能?

    在javascript中实现截图功能可以使用html2canvas库。1) 基本截图:使用html2canvas将dom元素转换为canvas,再转为图片。2) 全页截图:结合html2canvas和浏览器滚动功能,多次截图拼接全页。需要注意性能优化和跨域资源问题。 在JavaScript中实现截图…

    2025年12月20日
    000
  • 如何用JavaScript实现折叠面板(Accordion)?

    实现javascript折叠面板需三步:1.定义html结构;2.使用css控制显示隐藏;3.通过javascript处理用户交互和无障碍性,确保性能优化和用户体验。 在JavaScript中实现一个折叠面板(Accordion)是一项有趣且实用的任务。折叠面板在现代Web开发中非常常见,用于节省页…

    2025年12月20日
    000
  • 如何在JavaScript中实现动画效果?

    javascript可以通过dom操作和时间控制实现动画效果。1.使用requestanimationframe、setinterval或settimeout控制元素的样式属性,如position和opacity。2. requestanimationframe更适合制作流畅的动画。3.需考虑性能优…

    2025年12月20日
    000
  • 如何在JavaScript中实现SSE(Server-Sent Events)?

    在javascript中实现server-sent events(sse)可以通过以下步骤完成:1. 客户端使用eventsource对象连接到服务器,并监听事件;2. 服务器端使用node.js和express设置sse连接,每隔5秒发送数据。这项技术适用于需要实时更新的应用场景,如股票行情和社交…

    2025年12月20日
    000
  • JavaScript中如何检测动画是否结束?

    在javascript中检测动画是否结束可以使用以下方法:1. 使用css transitions和animations,通过transitionend和animationend事件;2. 使用javascript动画库,如gsap,通过其回调函数;3. 使用requestanimationfram…

    2025年12月20日
    000
  • 如何在JavaScript中实现状态管理?

    在javascript中实现状态管理可以使用全局变量、模块模式、redux、mobx、vuex或pinia。1. 全局变量简单但易导致命名冲突。2. 模块模式利用闭包封装状态,适合小型应用。3. redux通过单一状态树管理状态,适用于中型应用。4. mobx提供简洁的api和响应式编程,适合中型应…

    2025年12月20日
    000
  • 如何用JavaScript实现下拉菜单(Dropdown)?

    用javascript实现下拉菜单可以通过以下步骤:1. 使用javascript控制.dropdown-content的显示和隐藏;2. 点击.dropdown-toggle按钮时切换show类;3. 点击菜单外的区域时自动关闭菜单。这个实现需要考虑事件冒泡、键盘导航、响应式设计、性能优化和动画效…

    2025年12月20日
    000
  • JavaScript中如何修改URL但不刷新页面?

    如何在javascript中修改url而不刷新页面?使用history.pushstate()添加新历史记录,或history.replacestate()修改当前url。1. history.pushstate({ page: 1 }, “title”, “/n…

    2025年12月20日
    000
  • 怎样用JavaScript抛出自定义错误?

    在javascript中,可以通过创建自定义错误类来抛出自定义错误。1)定义一个继承自error类的自定义错误类,如customerror或apierror。2)在构造函数中调用super方法,并添加额外的属性如errorcode或statuscode。3)使用throw关键字抛出自定义错误,并在c…

    2025年12月20日
    000
  • 怎样用JavaScript实现3D效果?

    用javascript实现3d效果主要依赖于webgl技术和three.js库。1. webgl是一种基于opengl es 2.0的javascript api,允许在浏览器中进行硬件加速的3d图形渲染。2. three.js是一个基于webgl的javascript 3d库,简化了3d开发过程,…

    2025年12月20日
    000
  • JavaScript中如何使用回调函数?

    回调函数在javascript中用于异步编程,通过将函数作为参数传递并在操作完成后调用。1) 典型应用场景包括处理网络请求和文件读取。2) 挑战包括回调地狱,可通过命名函数和错误处理改善。3) 建议使用promise或async/await来替代复杂回调。 在JavaScript中,回调函数是一种非…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信