比特币上第一个成功的零知识付费数独赏金

2024-02-11 00:59

本文主要是介绍比特币上第一个成功的零知识付费数独赏金,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们很高兴地宣布比特币网络上的第一个成功的零知识赏金。我们已应用零知识赏金解决 9x9 数独谜题。

与使用零知识或有付款 (ZKCP) 的支付到数独相比,卖家无需与买家互动,买家只需发布一次赏金交易。更关键的是,买方不能在卖方花费资源解决难题并证明解决方案有效后中止,从而通过拒绝发布赏金交易来剥夺卖方的付款。

支付到数独

电路

ZK赏金电路

该电路是通用 ZK 赏金电路的实例。在第 1 步中,子电路 C 验证数独解法。在步骤 4 中,使用 ZKP 友好的 Poseidon 加密。

// Circuit for proving the knowledge of the solution to a sudoku puzzle.
template Main(N, sqrtN, lCyphertext) {// Private inputs:signal input w[N][N];           // Solition to the specified puzzle.signal input db[4];             // Seller (Bob) private key.signal input Qs[2][4];          // Shared (symmetric) key. Used to encrypt w.// "Public" inputs that are still passed as private to reduce verifier size on chain:signal input Qa[2][4];          // Buyer (Alice) public key.// TODO: Could also be hardcoded into the circuit like the unsolved puzzle.signal input Qb[2][4];          // Seller (Bob) public key.signal input nonce;             // Needed to encrypt/decrypt xy.signal input ew[lCyphertext];   // Encrypted solution to puzzle.// Public inputs:signal input Hpub[2];            // Hash of inputs that are supposed to be public.// As we use SHA256 in this example, we need two field elements// to acommodate all possible hash values.// Unsolved sudoku board. This could also be passed as a public input.var unsolved[N][N] = [[0, 0, 0, 0, 0, 6, 0, 0, 0],[0, 0, 7, 2, 0, 0, 8, 0, 0],[9, 0, 6, 8, 0, 0, 0, 1, 0],[3, 0, 0, 7, 0, 0, 0, 2, 9],[0, 0, 0, 0, 0, 0, 0, 0, 0],[4, 0, 0, 5, 0, 0, 0, 7, 0],[6, 5, 0, 1, 0, 0, 0, 0, 0],[8, 0, 1, 0, 5, 0, 3, 0, 0],[7, 9, 2, 0, 0, 0, 0, 0, 4]];// step 1 Assert w is a valid solution. //component sudokuVerify = Sudoku(sqrtN, N);for (var i = 0; i < N; i++) {for (var j = 0; j < N; j++) {sudokuVerify.unsolved[i][j] <== unsolved[i][j];sudokuVerify.solved[i][j] <== w[i][j];}}// step 2 Assert that (db * Qa) = Qs // This will ensure that Bob actually derived Qs using Alices public key Qa.// This uses Circom code to emulate operations on secp256k1 by 0xPARC:// https://github.com/0xPARC/circom-ecdsacomponent privToPub0 = Secp256k1ScalarMult(64, 4);for (var i = 0; i < 4; i++) {privToPub0.scalar[i] <== db[i];}for (var i = 0; i < 4; i++) {privToPub0.point[0][i] <== Qa[0][i];privToPub0.point[1][i] <== Qa[1][i];}signal Qs_x_diff[4];signal Qs_y_diff[4];for (var i = 0; i < 4; i++) {Qs_x_diff[i] <-- privToPub0.out[0][i] - Qs[0][i];Qs_x_diff[i] === 0;Qs_y_diff[i] <-- privToPub0.out[1][i] - Qs[1][i];Qs_y_diff[i] === 0;}// step 3 Assert that (db * G) = Qb /// This makes sure that Qb is really the public key corresponding to db.component privToPub1 = ECDSAPrivToPub(64, 4);for (var i = 0; i < 4; i++) {privToPub1.privkey[i] <== db[i];}signal Qb_x_diff[4];signal Qb_y_diff[4];for (var i = 0; i < 4; i++) {Qb_x_diff[i] <-- privToPub1.pubkey[0][i] - Qb[0][i];Qb_x_diff[i] === 0;Qb_y_diff[i] <-- privToPub1.pubkey[1][i] - Qb[1][i];Qb_y_diff[i] === 0;}// step 4 Assert that encrypting w with Qs produces ew. /component p = PoseidonEncryptCheck(N*N);for (var i = 0; i < lCyphertext; i++) {p.ciphertext[i] <== ew[i];}for (var i = 0; i < N; i++) {for (var j = 0; j < N; j++) {p.message[i*N + j] <== w[i][j];}}component sharedKey = FromatSharedKey();sharedKey.pointX[0] <== Qs[0][0];sharedKey.pointX[1] <== Qs[0][1];sharedKey.pointX[2] <== Qs[0][2];sharedKey.pointX[3] <== Qs[0][3];p.nonce <== nonce;p.key[0] <== sharedKey.ks[0];p.key[1] <== sharedKey.ks[1];p.out === 1;}
sudoku_circom.js

智能合约

赏金合约仅在第 20 行验证 ZK 证明。如果有效,它使用 OP_PUSH_TX 从第 25 行到第 30 行将赏金奖励发送给买方。

contract SudokuBounty {ECPoint Qa;         // Buyer's (Alice) public key.VerifyingKey vk;    // Verifying key from the circuits setup.int satsReward;         // Amount of satoshis to be handed as a reward for the solution.int expirationBlockN;   // nLocktime of deadline when Alice can reclaim the reward.public function unlock(ECPoint Qb,    // Bobs public key.int[82] ew,    // Solution of puzzle, encrypted with shared key Qs.Sha256 Hpub,   // Hash of public inputs.int nonce,     // Nonce for encryption with shared key. Can be timestamp.Proof pi,      // Proof of solution for the whole circuit C.SigHashPreimage preimage) {// ...   Verify the proof. bool proofCorrect = ZKSNARK.verifyOptimized(pubInputs, pi, this.vk);require(proofCorrect); Ensure next output will pay Qb. //require(Tx.checkPreimage(preimage));Ripemd160 pkh = hash160(point2PubKey(Qb));bytes outputScript = Utils.buildPublicKeyHashScript(pkh);bytes output = Utils.buildOutput(outputScript, this.satsReward);require(hash256(output) == SigHash.hashOutputs(preimage));}public function refund(Sig aliceSig, SigHashPreimage preimage) {// ...}
}
数独赏金合约

如果在第 33 行的截止日期之前没有人领取赏金,Alice 可以收回赏金。

一个可用的示例

与一般的 ZK 赏金一样,分为三个步骤:

  1. 爱丽丝在电路的第 22-32 行中为数独谜题放置了赏金交易Tm

  2. Bob 解决了这个难题,并使用共享的 ECDH 密钥对解决方案进行了加密。他生成一个ZK证明并提交一个交易 Tc 来领取赏金,其中包含证明和加密的解决方案。

  3. 使用 Tc,Alice 在 Tc 的输出中使用她自己的私钥和 Bob 的公钥导出相同的共享密钥,解密 Tc 输入中的加密解决方案以获得最终解决方案。

请注意,Alice 和 Bob 之间没有来回交互,也没有涉及受信任的中间人。也没有其他观看这两个交易的人知道解决方案,因为它是加密的。

完整的代码可以在这个 repo 中找到,带有端到端的测试和部署。

优化:减少公共输入的数量

链上 ZKP 验证者对电路的每个公共输入进行椭圆曲线标量乘法,这是相当昂贵的。我们将这些输入作为私有参数传递给电路,并且仅将它们的散列用作公共输入。电路和智能合约都断言对这些输入进行哈希处理实际上会产生指定的哈希值。这种方法将公共输入从 100(数独板的每个字段需要其自己的输入)减少到仅 2

这篇关于比特币上第一个成功的零知识付费数独赏金的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698445

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

Spring Roo 实站( 一 )部署安装 第一个示例程序

转自:http://blog.csdn.net/jun55xiu/article/details/9380213 一:安装 注:可以参与官网spring-roo: static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sampleROO_OPTS http://stati

【Python知识宝库】上下文管理器与with语句:资源管理的优雅方式

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、什么是上下文管理器?二、上下文管理器的实现三、使用内置上下文管理器四、使用`contextlib`模块五、总结 前言 在Python编程中,资源管理是一个重要的主题,尤其是在处理文件、网络连接和数据库

dr 航迹推算 知识介绍

DR(Dead Reckoning)航迹推算是一种在航海、航空、车辆导航等领域中广泛使用的技术,用于估算物体的位置。DR航迹推算主要通过已知的初始位置和运动参数(如速度、方向)来预测物体的当前位置。以下是 DR 航迹推算的详细知识介绍: 1. 基本概念 Dead Reckoning(DR): 定义:通过利用已知的当前位置、速度、方向和时间间隔,计算物体在下一时刻的位置。应用:用于导航和定位,

使用gradle做第一个java项目

涉及到的任务如下: assemble任务会编译程序中的源代码,并打包生成Jar文件,这个任务不执行单元测试。 Total time: 5.581 secs E:\workspace\Test>gradle assemble :compileJava :processResources UP-TO-DATE :classes :findMainClass :jar :b

vue2实践:第一个非正规的自定义组件-动态表单对话框

前言 vue一个很重要的概念就是组件,作为一个没有经历过前几代前端开发的我来说,不太能理解它所带来的“进步”,但是,将它与后端c++、java类比,我感觉,组件就像是这些语言中的类和对象的概念,通过封装好的组件(类),可以通过挂载的方式,非常方便的调用其提供的功能,而不必重新写一遍实现逻辑。 我们常用的element UI就是由饿了么所提供的组件库,但是在项目开发中,我们可能还需要额外地定义一

【H2O2|全栈】Markdown | Md 笔记到底如何使用?【前端 · HTML前置知识】

Markdown的一些杂谈 目录 Markdown的一些杂谈 前言 准备工作 认识.Md文件 为什么使用Md? 怎么使用Md? ​编辑 怎么看别人给我的Md文件? Md文件命令 切换模式 粗体、倾斜、下划线、删除线和荧光标记 分级标题 水平线 引用 无序和有序列表 ​编辑 任务清单 插入链接和图片 内嵌代码和代码块 表格 公式 其他 源代码 预