在比特币上支持椭圆曲线 BLS12–381

通过使用智能合约实现来支持任何曲线

BLS12–381 是一种较新的配对友好型椭圆曲线。 与常用的 BN-256 曲线相比,BLS12-381 的安全性明显更高,并且安全目标是 128 位。

所有其他区块链,例如 Zcash 和以太坊,都必须通过硬分叉才能升级到新曲线,因为所使用的曲线是在协议级别进行硬编码的。 Zcash 花了一年多的时间在 Sapling 中升级。 以太坊 和 Tezos 在 2.5 多年前提出升级后仍未升级,如果他们打算升级的话。

比特币可以以智能合约的形式在本地运行 BLS12–381,无需任何重大更改。 下面的库为此提供了基础,使比特币成为目前唯一支持两条曲线的区块链,这要归功于其可编程性和可扩展性。 通过在智能合约中实施它们,可以类似地支持更多曲线,如 MNT4/6 和 BW。

以下内容最初由 Walker 发布在 Github 上,Walker 在首届比特币零知识证明黑客马拉松中获得第一名。


用于比特币零知识证明智能合约支持的 sCrypt BLS12–381 库。 目前的sCrypt零知识证明库是基于BN256,比特币的BLS12-381库是第一个在比特币上实现BLS12-381曲线配对验证的库。 现在您可以选择使用 BN256 或 BLS12–381 来实现零知识证明应用。 比特币是目前唯一支持零知识证明且可以选择多条曲线的区块链。

对于与平台无关的应用程序,选择需要在性能 (BN254) 和安全性 (BLS12–381) 之间进行权衡。 我们建议选择 BLS12–381,因为它更安全,速度也足够实用,但比 BN254 慢。

  • BN254 (254bit, 32byte P):

  • BLS12–381 (381bit, 48byte P):

参考:

  • Groth16
  • Efficient zk-SNARKs on Bitcoin: Technical Explainer
  • BLS12–381 For The Rest Of Us

目录

  • 曲线
  • 曲折
  • 高效配对
  • 坐标系
  • 蒙哥马利形式
  • 先决条件
  • 如何在本地运行
  • 图书馆
  • 应用程序接口
  • 验证密钥和证明数据
  • 测试

1. 曲线 BLS12–381

曲线 BLS12–381 既对配对友好(使其对数字签名有效)又对构建 zkSnarks 有效。 BLS12-381 的安全目标是 128 位。

1.1 曲线

BLS12–381 处理两条曲线,

配对是一个双线性映射,它以两个点作为输入,每个点来自一组相同阶数 r。 这两组称为 G1G2

1.2 twist 扭曲

BLS12–381 使用扭曲,将扩展场的程度降低了六倍。 因此,扭曲曲线上的 G2 可以在 Fq2 而不是 Fq12 上定义,这大大节省了复杂性,在 Fq12 中进行算术运算非常复杂且效率低下。

这改变了原始曲线

进入曲线

所以这些是我们将使用的两个组:

1.3 高效配对

配对的计算有两个部分:

米勒循环:递归计算两个输入点 f(pointG1, pointG2) 的中间函数
最后求幂:将 f 提高到 c 的大幂
等式 1:

1.3.1 减少到 3 对

验证等式2:

其中 αβ 在设置时已知,因此我们可以预先计算第二对 e(α, β) 并用它替换 αβ 作为验证密钥的一部分,从而节省一对。

1.3.2 最终一次求幂

等式 2 可以重写为:

e是双线性的,把指数(-1)移到括号里。

代入等式 1,我们得到:

而不是计算 4 次计算密集型的最终指数,我们最后只需要做一次。

注意,snarkjs/circom 的 verification_key.json 输出文件中,有一个 vk_alphabeta_12 预计算项,但是你不能用它来预计算 f(α,β),这个数据是通过miller循环和finanl求幂 f( α, β)^c 。 您可以在调试模式下运行 testcase1.scrypt 合约以获取预先计算的 f(α, β) 数据。

1.4 坐标系

查找域元素的逆是一项昂贵的操作,因此椭圆曲线算法的实现会尽量避免它。

1.4.1 仿射坐标

仿射坐标是仅具有 (x, y) 坐标对的点的传统表示,其中 x 和 y 满足曲线方程。 这是我们通常在存储和传输点时使用的。

基本思想是使用名义分数来表示坐标,减少所需的实际除法运算次数。 为此,引入了第三个坐标并使用 (X, Y, Z) 作为点的内部表示。

1.4.2 雅可比(Jacobian)坐标

雅可比点 (X, Y, Z) 表示仿射点 (X/Z², Y/Z³)。 曲线方程变为:

请注意,导入仿射点 (x,y) 的最简单方法是将其映射到 (x, y, 1)

1.5 蒙哥马利形式

一种不需要除法的模数计算方法是所谓的蒙哥马利乘法。 要计算模乘运算,

  1. 将乘数转换为蒙哥马利形式
  2. 使用蒙哥马利乘法
  3. 转换蒙哥马利形式的结果

2. 准备

  • Visual Studio Code(VSC)
  • sCrypt IDE
  • Node.js, version >= 12
  • PC CPU >= 2.6GHz, Memory >= 24GB

3.如何在本地运行

运行 npm install 来安装依赖
从 VSCode GUI 运行测试用例,选择 testcase0.scrypttest.js 文件,在文件编辑窗口单击鼠标右键,选择菜单 Run sCrypt Test

4. 库和 API

4.1 库
├─ contracts
│    ├─ bls12381.scrypt          # bls12-381 library
│    ├─ bls12381pairing.scrypt   # bls12-381 ZKP lib(Optimized 3-pairs)
│    └─ zksnark12381.scrypt      # zk-SNARKs verifier contract example
└─ tests└─ js├─ testcase0.scrypttest.js        # simple testcase├─ testcaseAzksnark.scrypttest.js # testcase A├─ testcaseBzksnark.scrypttest.js # testcase B├─ testcaseCzksnark.scrypttest.js # testcase C└─ testcaseDzksnark.scrypttest.js # testcase D
4.2 API
static function pairCheck3Point(PointG1 a0, PointG2 b0,fe12 millerb1a1,PointG1 a2, PointG2 b2,PointG1 a3, PointG2 b3) : bool

参数 (3对 pairing and 1 对预先计算好的pairing):

  • a0 : A, b0 : B
  • millerb1a1 : 预先计算 miller(α, β)
  • a2 : L, b2 : ϒ
  • a3 : C, b3 : δ

验证等式 2:

4.2.1 从 snarkjs/Circom 验证密钥和证明数据

您可以通过 scrypt.io 找到 zkSNARK snarkjs/Circom 教程

执行snarkjs/Circom命令时需要选择bls12381曲线命令行选项,因为默认是bn128曲线。 例如,

  • 编译电路
circom ../work_circom/factor.circom --r1cs --wasm --prime bls12381
  • 开始新的 powers of tau 仪式
snarkjs powersoftau 新 bls12-381 12 pot12_0000.ptau

然后可以确认输出的 verification_key.jsonproof.json 文件中有一个"curve": “bls12381"项,而不是"curve”: "bn128"项。

proof.json 文件中获取A、B、C参数,从 verification_key.json 文件中获取 α、β、ϒ、δ参数,使用 public.json 文件中的ic item和公共输入计算 L 参数:

其中公共输入 w = (1, w1, …, wi)

4.2.2 verification_key.json

测试用例 B verification_key.json

{"protocol": "groth16","curve": "bls12381","nPublic": 1,"vk_alpha_1": ["32346008969010......", "760490433841......", "1"],"vk_beta_2": [["62735191543702......", "379194604638......"],["94606778762315......", "299061862927......"],["1", "0"]],"vk_gamma_2": [["3527010695874......", "305914434424......"],["1985150602287......", "927553665492......"],["1", "0"]],"vk_delta_2": [["1895592553603......", "338057034563......"],["1793381858589......", "319699776756......"],["1", "0"]],"vk_alphabeta_12": [[["29062082199832......", "29798557291243......"],["20107026956616......", "32289268603827......"],["37794026319284......", "20272682142916......"]],[["11743275386962......", "32259555688411......"],["30689582621397......", "26992620205415......"],["75601830939387......", "26615242825680......"]]],"IC": [["179858356000600......", "10944984983678......", "1"],["341669953409364......", "26956794051246......", "1"]]
}
4.2.3 proof.json

测试用例 A proof.json

{"pi_a": ["386406607244204......", "3355814159298......", "1"],"pi_b": [["28933956745182......", "3829761206156......"],["36211079726457......", "6620758983513......"],["1", "0"]],"pi_c": ["302947598381396......", "3994710045276......", "1"],"protocol": "groth16","curve": "bls12381"
}
4.2.4 public.json

测试用例 A public.json

["13221"
]

5. 测试用例

5.1 设计电路

用 Circom 语言实现一个电路。 例如,这个简单的证明人们知道将整数 n 分解为两个整数而不透露整数。 该电路有两个名为 p 和 q 的私有输入以及一个名为 n 的公共输入。


// p and q are factorizations of n
pragma circom 2.0.0;template Factor() {// Private Inputs:signal input p;signal input q;// Public Inputs:signal output n;assert(p > 1);assert(q > 1);n <== p * q;
}
component main = Factor();
5.2 测试用例 A, B, C, D

两个私有输入 p 和 q,以及一个公共输入 n。

5.3 测试网部署

合约:

zksnark12381deploy.scrypt

部署和解锁

测试网部署交易:

交易: eba34263bbede27fd1e08a84459066fba7eb10510a3bb1d92d735c067b8309dd

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

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

相关文章

C++核心编程

C核心编程 C核心编程1 内存分区模型1.1 程序运行前1.2 程序运行后1.3 new操作符 2 引用2.1 引用的基本使用2.2 引用注意事项2.3 引用做函数参数2.4 引用做函数返回值2.5 引用的本质2.6 常量引用 3 函数提高3.1 函数默认参数3.2 函数占位参数3.3 函数重载3.3.1 函数重载概述3.3.…

【Django 笔记】第一个demo

1. pip 安装 2. django 指令 D:\software\python3\anconda3\Lib\site-packages\django\bin>django-adminType django-admin help <subcommand> for help on a specific subcommand.Available subcommands:[django]checkcompilemessagescreatecachetabledbshelldiff…

精彩回顾 | 迪捷软件亮相2023世界智能网联汽车大会

2023年9月24日&#xff0c;2023世界智能网联汽车大会&#xff08;以下简称大会&#xff09;在北京市圆满落幕。迪捷软件北京参展之行圆满收官。 本次大会由工业和信息化部、公安部、交通运输部、中国科学技术协会、北京市人民政府联合主办&#xff0c;是我国首个经国务院批准的…

WPF中的控件

内容控件&#xff1a;label、border Window控件 Label控件 Border控件 内容控件 Button控件 点击取消按钮关闭程序&#xff1b;点击登录按钮打开BorderWindow窗口。 TextBox控件 PasswordBox控件 TextBlock控件 加载窗口时显示TextBlock中的内容 RadioButton控件 CheckBox控件…

Docker清理

title: “Mysql安装” createTime: 2022-01-04T20:07:3108:00 updateTime: 2022-01-04T20:07:3108:00 draft: false author: “name” tags: [“mysql”] categories: [“docker”] description: “测试的” docker-mysql安装部署文档 文章目录 title: "Mysql安装" …

413 Request Entity Too Large问题

问题背景 在某系统中上传文件时&#xff0c;如果文件大小超过了一定范围就会爆 413 Request Entity Too Large 问题。 原因 在使用 nginx 反向代理后台服务时&#xff0c;如果请求体中过大&#xff0c;超过了默认的 1M 则会爆该错误。 解决方案 在 nginx 中&#xff0c;指…

信号类型(雷达)——脉冲雷达(四)

系列文章目录 《信号类型&#xff08;雷达通信&#xff09;》 《信号类型&#xff08;雷达&#xff09;——雷达波形认识&#xff08;一&#xff09;》 《信号类型&#xff08;雷达&#xff09;——连续波雷达&#xff08;二&#xff09;》 《信号类型&#xff08;雷达&…

【Java 进阶篇】深入理解 JDBC:Java 数据库连接详解

数据库是现代应用程序的核心组成部分之一。无论是 Web 应用、移动应用还是桌面应用&#xff0c;几乎都需要与数据库交互以存储和检索数据。Java 提供了一种强大的方式来实现与数据库的交互&#xff0c;即 JDBC&#xff08;Java 数据库连接&#xff09;。本文将深入探讨 JDBC 的…

力扣 -- 10. 正则表达式匹配

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:bool isMatch(string s, string p) {int ms.size();int np.size();//处理后续映射关系s s;//处理后续映射关系p p;vector<vector<bool>> dp(m1,vector<bool>(n1));//初始化dp[0][0]true…

【开发篇】十、Spring缓存:手机验证码的生成与校验

文章目录 1、缓存2、用HashMap模拟自定义缓存3、SpringBoot提供缓存的使用4、手机验证码案例完善 1、缓存 缓存是一种介于数据永久存储介质与数据应用之间的数据临时存储介质使用缓存可以有效的减少低速数据读取过程的次数&#xff08;例如磁盘IO&#xff09;&#xff0c;提高…

排序算法之【快速排序】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

YOLOv8改进算法之添加CA注意力机制

1. CA注意力机制 CA&#xff08;Coordinate Attention&#xff09;注意力机制是一种用于加强深度学习模型对输入数据的空间结构理解的注意力机制。CA 注意力机制的核心思想是引入坐标信息&#xff0c;以便模型可以更好地理解不同位置之间的关系。如下图&#xff1a; 1. 输入特…

Error: Activity class {xxx.java} does not exist

git切换到不同的branch之后&#xff0c;报下面的错误&#xff1a; Error: Activity class {xxx.java} does not exist 解决方案&#xff1a; 首先clean 然后会删除build目录 然后点击&#xff1a;Invalidate Caches Android Studio重启&#xff0c;然后重新build即可。

数据链路层 MTU 对 IP 协议的影响

在介绍主要内容之前&#xff0c;我们先来了解一下数据链路层中的"以太网" 。 “以太网”不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容。 下面我们再来了解一下以太网数据帧&#xff…

【Java 进阶篇】MySQL 事务详解

在数据库管理中&#xff0c;事务是一组SQL语句的执行单元&#xff0c;它们被视为一个整体。事务的主要目标是保持数据库的一致性和完整性&#xff0c;即要么所有SQL语句都成功执行&#xff0c;要么所有SQL语句都不执行。在MySQL中&#xff0c;事务起到了非常重要的作用&#xf…

Linux文件查找,别名,用户组综合练习

1.文件查看: 查看/etc/passwd文件的第5行 [rootserver ~]# head -5 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi…

【实践成果】Splunk 9.0 Configuration Change Tracking

Splunk 9.0 引入了新的功能&#xff0c;一个很重要的一个&#xff0c;就是跟踪conguration 文件的变化&#xff1a; 这个很重要的特性&#xff0c;在splunk 9.0 以后才引入&#xff0c;就看server.conf 配置中&#xff0c;9.0 以后的版本才有&#xff1a; server.conf - Splu…

数据集笔记:纽约花旗共享单车od数据

花旗共享单车公布的其共享单车轨迹数据&#xff0c;包括2013年-2021年曼哈顿、布鲁克林、皇后区和泽西城大约14500辆自行车和950个站点的共享单车轨迹数据 数据地址&#xff1a;Citi Bike System Data | Citi Bike NYC | Citi Bike NYC 性别&#xff08;0未知&#xff1b;1男&…

详解分布式搜索技术之elasticsearch

目录 一、初识elasticsearch 1.1什么是elasticsearch 1.2elasticsearch的发展 1.3为什么学习elasticsearch? 1.4正向索引和倒排索引 1.4.1传统数据库采用正向索引 1.4.2elasticsearch采用倒排索引 1.4.3posting list ​1.4.4总结 1.5 es的一些概念 1.5.1文档和字段 …

unity打包工具

接手了一个项目&#xff0c;打包存在重大问题&#xff0c;故此在unity addressables 基础上弄了一个简单的打包工具&#xff0c;代码也都做好了注释&#xff0c;操作非常简单以下为操作方法&#xff1a; 首先设置导入Addressables插件&#xff0c;并设置好详细参见&#xff1a…