比特币libsecp256k1中safegcd算法形式化验证完成

1. 引言

比特币和其他链(如 Liquid)的安全性取决于 ECDSA 和 Schnorr 签名等数字签名算法的使用。Bitcoin Core 和 Liquid 都使用名为 libsecp256k1 的 C 库来提供这些数字签名算法,该库以其所运行的椭圆曲线命名。这些算法利用一种称为modular inverse模逆的数学计算,这是计算中相对昂贵的组成部分。

  • 2019年:Daniel J. Bernstein 和 Bo-Yin Yang 2019年论文 Fast constant-time gcd computation and modular inversion 中,开发了一种新的模逆算法。
  • 2021 年,Peter Dettman 为 libsecp256k1实现了这种称为“safegcd”的算法。详情见:Safegcd inverses, drop Jacobi symbols, remove libgmp #831。

作为safegcd这种新算法审查过程的一部分,Blockstream Research 率先完成了该算法设计的形式化验证(见2021年2月 Blockstream团队Russell O’Connor 和 Andrew Poelstra 博客 A Formal Proof of safegcd Bounds),使用 Coq 证明助手形式化验证了该算法确实在 256 位输入上以正确的模逆结果终止。

2. 算法与实现之间的差距

2021 年的形式化工作仅表明 Bernstein 和 Yang 设计的算法可以正常工作。但是,在 libsecp256k1 中使用该算法需要在 C 编程语言中实现 safegcd 算法的数学描述。如,该算法的数学描述执行向量的矩阵乘法,这些向量的宽度可以达到 256 位有符号整数,但是 C 编程语言本身只会提供高达 64 位(或使用某些语言扩展的 128 位)的整数。

  • 实现 safegcd 算法需要使用 C 的 64 位整数对矩阵乘法和其他计算进行编程。
  • 此外,还添加了许多其他优化以使实现速度更快。优化细节见:The safegcd implementation in libsecp256k1 explained。
  • 最后,libsecp256k1 中有四种单独的 safegcd 算法实现:
    • 两种用于签名生成的恒定时间算法:一种针对 32 位系统进行了优化,一种针对 64 位系统进行了优化。
    • 以及两种用于签名验证的可变时间算法:同样一种用于 32 位系统,一种用于 64 位系统。

3. Verifiable C

为了验证 C 代码是否正确实现了 safegcd 算法,必须检查所有实现细节。Blockstream使用可Verifiable C(验证软件工具链的一部分)来使用 Coq 定理证明器对 C 代码进行推理。
在这里插入图片描述

验证通过为每个正在验证的函数使用Separation logic分离逻辑指定先决条件和后置条件来进行。分离逻辑是一种专门用于推理子程序、内存分配、并发性等的逻辑。

一旦为每个函数指定了规范,验证过程将从函数的先决条件开始,并在函数主体中的每个语句后建立新的不变量,直到最终在函数主体末尾或每个返回语句末尾建立后置条件。大部分形式化工作都花在代码行之间,使用不变量将每个 C 表达式的原始操作转换为有关被操作的数据结构在数学上代表什么的更高级语句。如,C 语言视为 64 位整数数组的内容实际上可能是 256 位整数的表示。

最终结果是经过 Coq 证明助手验证的formal proof正式证明,即 libsecp256k1 的 safegcd 模逆算法的 64 位可变时间实现在功能上是正确的,详细可参看:

  • https://htmlpreview.github.io/?https://github.com/BlockstreamResearch/simplicity/blob/master/alectryon/verif_modinv64_impl.v.html

4. 验证的局限性

功能正确性证明存在一些限制。Verifiable C 中使用的分离逻辑实现了所谓的部分正确性。这意味着它仅证明 C 代码在返回时返回正确的结果,但不能证明终止本身。通过使用之前2021年的 Coq 对 safegcd 算法界限的证明来减轻这一限制,以证明主循环的循环计数器值实际上从未超过 11 次迭代。

另一个问题是 C 语言本身没有正式规范。相反,Verifiable C 项目使用CompCert 编译器项目来提供 C 语言的正式规范。这保证了当使用 CompCert 编译器编译经过验证的 C 程序时,生成的汇编代码将符合其规范。但是,这并不能保证 GCC、clang 或任何其他编译器生成的代码一定能正常工作。如,C 编译器允许对函数调用中的参数有不同的求值顺序。即使 C 语言有正式规范,任何未经正式验证的编译器仍然可能错误编译程序。这在实践中确实会发生——如,见2020年9月memcmp may be miscompiled by GCC #823。
最后,Verifiable C 不支持传递结构、返回结构或分配结构。虽然在 libsecp256k1 中,结构始终通过指针传递(这在Verifiable C 中是允许的),但在某些情况下会使用结构分配。对于模逆正确性证明,有 3 个分配必须由一个专门的函数调用替换,该函数调用逐个字段执行结构分配。

5. 小结

Blockstream Research 已正式验证了 libsecp256k1 模逆函数的正确性。这项工作进一步证明 C 代码验证在实践中是可行的。使用通用证明助手可以验证基于复杂数学参数构建的软件。

没有什么可以阻止 libsecp256k1 中实现的其余函数也得到验证。因此,libsecp256k1 可以获得最高的软件正确性保证。

参考资料

[1] Blockstream团队Russell O’Connor 和 Andrew Poelstra 2024年11月25日在比特币杂志上博客 Safegcd’s Implementation Formally Verified

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

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

相关文章

15分钟做完一个小程序,腾讯这个工具有点东西

我记得很久之前,我们都在讲什么低代码/无代码平台,这个概念很久了,但是,一直没有很好的落地,整体的效果也不算好。 自从去年 ChatGPT 这类大模型大火以来,各大科技公司也都推出了很多 AI 代码助手&#xff…

Kafka知识体系

一、认识Kafka 1. kafka适用场景 消息系统:kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能,还有其他消息系统难以实现的消息顺序消费及消息回溯功能。 存储系统:kafka把消息持久化到磁盘上&#xff0c…

JVM调优篇之JVM基础入门AND字节码文件解读

目录 Java程序编译class文件内容常量池附录-访问标识表附录-常量池类型列表 Java程序编译 Java文件通过编译成class文件后,通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。 规范 Java虚拟机有自己的一套规范,遵循这套规范,任…

【Petri网导论学习笔记】Petri网导论入门学习(十一) —— 3.3 变迁发生序列与Petri网语言

目录 3.3 变迁发生序列与Petri网语言定义 3.4定义 3.5定义 3.6定理 3.5例 3.9定义 3.7例 3.10定理 3.6定理 3.7 有界Petri网泵引理推论 3.5定义 3.9定理 3.8定义 3.10定义 3.11定义 3.12定理 3.93.3 变迁发生序列与Petri网语言 对于 Petri 网进行分析的另一种方法是考察网系统…

Flink--API 之Transformation-转换算子的使用解析

目录 一、常用转换算子详解 (一)map 算子 (二)flatMap 算子 (三)filter 算子 (四)keyBy 算子 元组类型 POJO (五)reduce 算子 二、合并与连接操作 …

Top 10 Tools to Level Up Your Prompt Engineering Skills

此文章文字是转载翻译,图片是自已用AI 重新生成的。文字内容来自 https://www.aifire.co/p/top-10-ai-prompt-engineering-tools 供记录学习使用。 Introduction to AI Prompt Engineering AI Prompt Engineering 简介 1,Prompt Engineering 提示工程…

Rust语言俄罗斯方块(漂亮的界面案例+详细的代码解说+完美运行)

tetris-demo A Tetris example written in Rust using Piston in under 500 lines of code 项目地址: https://gitcode.com/gh_mirrors/te/tetris-demo 项目介绍 "Tetris Example in Rust, v2" 是一个用Rust语言编写的俄罗斯方块游戏示例。这个项目不仅是一个简单…

Spring Boot 与 Spring Cloud Alibaba 版本兼容对照

版本选择要点 Spring Boot 3.x 与 Spring Cloud Alibaba 2022.0.x Spring Boot 3.x 基于 Jakarta EE,javax.* 更换为 jakarta.*。 需要使用 Spring Cloud 2022.0.x 和 Spring Cloud Alibaba 2022.0.x。 Alibaba 2022.0.x 对 Spring Boot 3.x 的支持在其发行说明中…

(免费送源码)计算机毕业设计原创定制:Java+ssm+JSP+Ajax SSM棕榈校园论坛的开发

摘要 随着计算机科学技术的高速发展,计算机成了人们日常生活的必需品,从而也带动了一系列与此相关产业,是人们的生活发生了翻天覆地的变化,而网络化的出现也在改变着人们传统的生活方式,包括工作,学习,社交…

Ubuntu Opencv 源码包安装

说明: ubuntu20.04 建议 使用 opencv-4.6.0版本 ubuntu18.04 建议 使用 opencv-4.5.2-版本 安装包准备 1、下载源码包 OpenCV官网 下载相关版本源码 Sources # 克隆方式 OpenCV 源码git clone https://github.com/opencv/opencv.gitcd opencvgit checkout 4.5.2 …

Linux 下自动化之路:达梦数据库定期备份并推送至 GitLab 全攻略

目录 环境准备 生成SSH 密钥对 数据库备份并推送到gitlab脚本 设置定时任务 环境准备 服务器要有安装达梦数据库(达梦安装这里就不示例了),git 安装Git 1、首先,确保包列表是最新的,运行以下命令: …

<项目代码>YOLOv8 停车场空位识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

Spring Boot 集成 Knife4j 的 Swagger 文档

在开发微服务应用时,API 文档的生成和维护是非常重要的一环。Swagger 是一个非常流行的 API 文档工具,可以帮助我们自动生成 RESTful API 的文档,并提供了一个友好的界面供开发者测试 API。本文将介绍如何在 Spring Boot 项目中集成 Knife4j …

微信小程序中会议列表页面的前后端实现

题外话:想通过集成腾讯IM来解决即时聊天的问题,如果含语音视频,腾讯组件一年5万起步,贵了!后面我们改为自己实现这个功能,这里只是个总结而已。 图文会诊需求 首先是个图文列表界面 同个界面可以查看具体…

git(Linux)

1.git 三板斧 基本准备工作: 把远端仓库拉拉取到本地了 .git --> 本地仓库 git在提交的时候,只会提交变化的部分 就可以在当前目录下新增代码了 test.c 并没有被仓库管理起来 怎么添加? 1.1 git add test.c 也不算完全添加到仓库里面&…

【动手学电机驱动】STM32-FOC(8)MCSDK Profiler 电机参数辨识

STM32-FOC(1)STM32 电机控制的软件开发环境 STM32-FOC(2)STM32 导入和创建项目 STM32-FOC(3)STM32 三路互补 PWM 输出 STM32-FOC(4)IHM03 电机控制套件介绍 STM32-FOC(5&…

5G NR:带宽与采样率的计算

100M 带宽是122.88Mhz sampling rate这是我们都知道的,那它是怎么来的呢? 采样率 子载波间隔 * 采样长度 38.211中对于Tc的定义, 在LTE是定义了Ts,在NR也就是5G定义了Tc。 定义这个单位会对我们以后工作中的计算至关重要。 就是在…

【湿度数据处理】中国地面气候资料日值数据集(V3.0)(MATLAB全代码)

【湿度数据处理】中国地面气候资料日值数据集 处理1:数据范围筛选处理2:缺测数据筛查处理3:缺测数据插补参考基于此博客完成各要素数据提取后-【数据集处理】中国地面气候资料日值数据集(V3.0)(含MATLAB全代码),进行后续数据筛选及缺测处理,此处以湿度数据为例。 提取到的…

MySQL面试-1

InnoDB中ACID的实现 先说一下原子性是怎么实现的。 事务要么失败,要么成功,不能做一半。聪明的InnoDB,在干活儿之前,先将要做的事情记录到一个叫undo log的日志文件中,如果失败了或者主动rollback,就可以通…

大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本

点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop&#xff0…