FRI及相关SNARKs的Fiat-Shamir安全

news2024/11/8 19:48:20

1. 引言

本文主要参考:

  • Alexander R. Block 2023年论文 Fiat-Shamir Security of FRI and Related SNARKs
  • Albert Garreta 2023年9月在ZK Summit 10上分享 ZK10: Fiat-Shamir security of FRI and related SNARKs - Albert Garreta (Nethermind)

评估参数用的Sagemath code见:

  • https://github.com/alexander-r-block/FRI-Parameter-Testing-Sagemath

2. 何为FRI-based SNARK?

何为FRI-based SNARK?
非正式来说,其为遵循如下配方的SNARK:

  • 1)PIOP:Polynomial Interactive Oracle proof。
  • 2)FRI + Merkle trees:将PIOP用FRI和Merkle trees进行compile。
  • 3)Fiat-Shamir transform

2.1 何为PIOP?

PIOP=Polynomial Interactive Oracle proof。
PIOP是一种交互协议,有Prover和Verifier两种角色,有problem statement x x x,和仅对Prover已知的witness w w w。Prover和Verifier以一定轮数相互交换消息。
在这里插入图片描述
PIOP的独特性在于:

  • Prover发送的消息 m i ( X ) m_i(X) mi(X)为“low degree” polynomials。
  • 在交互阶段结束时,Verifier会在random points来open这些 m i ( X ) m_i(X) mi(X)多项式,并基于这些openings是否满足某些代数关系,来决定是accept还是reject。

当在对PIOP做安全性分析时,一个关键假设是:

  • 假设攻击者(恶意Prover)发送的所有maps都是多项式。【这实际是一个很强的假设,从而让PIOP安全性分析相对简单。】

这样,对PIOP的安全性分析,通常会归结为争论:

  • 除非Verifier(非常不幸)恰巧发送了某特定low-degree polynomial的root,否则攻击者无法破坏该PIOP协议。
    而根据Schwartz-Zippel lemma有:“degree d d d多项式具有 ≤ d \leq d d个roots”。
    因此,攻击者破解该PIOP协议的概率 ≤ d / 2 λ \leq d/2^{\lambda} d/2λ

PIOP是一种对ZKP进行分析的很好的抽象框架,但实际上,PIOP存在如下问题:

  • 1)Verifier如何检查Prover发送的是low degree多项式?
    • 方法之一是:Verifier检查这些多项式的所有evaluations,来确认其是否与某多项式一致,但这会让Verifier非常慢。
  • 2)maps m i ( X ) m_i(X) mi(X)太大,难以发送。这会让proof size巨大,可能会与Prover直接发送witness size相当。

因此,针对以上PIOP问题的解决方案为:

  • Polynomial Commitment Scheme(PCS)多项式承诺方案:即使用某多项式承诺方案对该PIOP进行编译。此时:
    • PIOP中Prover发送的消息为 m i ( X ) m_i(X) mi(X)多项式的承诺值 C m ( m i ( X ) ) Cm(m_i(X)) Cm(mi(X)),而不再是 m i ( X ) m_i(X) mi(X)多项式本身。
    • 在交互协议阶段结束时,为获得在随机点的openings m i ( a ) m_i(a) mi(a),由于此时Verifier只有 m i ( X ) m_i(X) mi(X)的承诺值,其无法自己open,因此Verifier会根据特定的PCS规则 与Prover交互,以获得openings m i ( a ) m_i(a) mi(a)

在这里插入图片描述
目前的PCS多项式承诺方案有:

  • KZG多项式承诺方案
  • IPA-based多项式承诺方案
  • (FRI + Merkle tree)-based多项式承诺方案:本文重点关注本方案。因很多从业人员常使用(FRI + Merkle tree)-based多项式承诺方案,但实际上其需要在非常严格地配置下,才能将FRI用作PCS多项式承诺方案。而这种严格配置,会让(FRI + Merkle tree)-based PCS很慢。
    因此实际应用时,会将FRI配置为非PCS,后续将详谈这个关键点。

在Marlin和Dark等论文中,有如下定理:

  • 若PIOP和PCS是安全的,则新协议是安全的。

2.2 Fiat-Shamir transform

Fiat-Shamir transformation可:

  • 移除交互性
  • 对public coin协议,所有Verifier消息都是随机的
  • 简单思路为:将Verifier的challenges替换为hashes。
  • 将哈希函数 模型化为 a Random Oracle。

借助Fiat-Shamir转换为非交互式协议之后:

  • Verifier会基于 ( x , m 1 , c 1 , ⋯   , m μ ) (x,m_1,c_1,\cdots,m_{\mu}) (x,m1,c1,,mμ)的有效性来决定是accept还是reject。
  • Verifier会检查 c i c_i ci是否“well hashed”。

当前FRI-based SNARKs有:

  • STARK
  • Plonky2
  • RISC Zero
  • Boojum

在这里插入图片描述

3. Fiat-Shamir issues

3.1 Fiat-Shamir转换的安全性

令:

  • Π \Pi Π为某交互式协议
  • F S ( Π ) FS(\Pi) FS(Π)为其Fiat-Shamir转换

则,有可能 Π \Pi Π是安全的,但 F S ( Π ) FS(\Pi) FS(Π)是不安全的。
如:

  • 示例一: Π \Pi Π为sequential repetition of a “small” protocol。如某small protocol的sound error为 1 / 2 1/2 1/2,交互式重复该协议2次,则sound error变为 ( 1 / 2 ) 2 = 1 / 4 (1/2)^2=1/4 (1/2)2=1/4
    当但对该small协议做FS转换获得新协议时,则可能是灾难——其security仍为 1 / 2 1/2 1/2
  • 示例二: Π \Pi Π为parallel repetition of a “smaller” protocol Π 0 \Pi_0 Π0(Attema, Fehr, Kloss, 2022)。【本文重点关注这种并行重复执行协议示例】
    假设 Π 0 \Pi_0 Π0 small协议的安全性为 ϵ \epsilon ϵ,为增加其安全性,并行对其进行重复执行——以2倍并行为例,Prover在每轮会发送2个消息,Verifier在每轮会应答2个challenges。这就相当于以2个线程来并行运行 Π 0 \Pi_0 Π0 Π \Pi Π的Verifier会accept,当且仅当, Π 0 \Pi_0 Π0的Verifier会同时accept ( x , m 1 , c 1 , m 2 , c 2 , m 3 ) (x,m_1,c_1,m_2,c_2,m_3) (x,m1,c1,m2,c2,m3) ( x , m 1 ′ , c 1 ′ , m 2 ′ , c 2 ′ , m 3 ′ ) (x,m_1',c_1',m_2',c_2',m_3') (x,m1,c1,m2,c2,m3)。这样 Π \Pi Π的安全性将是 Π 0 \Pi_0 Π0的二次方,即 ϵ 2 \epsilon^2 ϵ2
    在这里插入图片描述

parallel repetition场景下的FS攻击,攻击者攻击流程为:

  • 1)Prover选择 ( m 1 , m 1 ′ ) (m_1,m_1') (m1,m1)
  • 2)计算 ( c 1 , c 1 ′ ) = H a s h ( x , m 1 , m 1 ′ ) (c_1,c_1')=Hash(x,m_1,m_1') (c1,c1)=Hash(x,m1,m1)
  • 3)检查 c 1 c_1 c1是否为某“special” challenge,其使得 Π 0 \Pi_0 Π0的第一个proof ( x , m 1 , c 1 , m 2 , c 2 , m 3 ) (x,m_1,c_1,m_2,c_2,m_3) (x,m1,c1,m2,c2,m3)是有效的。如, c 1 c_1 c1可为特定多项式的root。【因此,实际需确保Verifier发送的challenge不是多项式的root,否则将破坏协议。】
  • 4)若 c 1 c_1 c1不是特殊的challenge,则Prover rewinds,然后重复执行上面的步骤1)。
    【原则上,Prover需要 ≈ 1 / ϵ = 2 λ \approx1/\epsilon=2^{\lambda} 1/ϵ=2λ次迭代即可成功。其中 λ \lambda λ为交互式协议的安全参数。】
    在这里插入图片描述
    然后,假设Prover最终找到了该特殊的challenge c 1 c_1 c1,并继续如下流程:
  • 1)令 m 2 m_2 m2为某消息,使得Prover可获得第一个有效proof ( x , m 1 , c 1 , m 2 , c 2 , m 3 ) (x,m_1,c_1,m_2,c_2,m_3) (x,m1,c1,m2,c2,m3)
  • 2)然后在另一线程中,重复之前的流程:
    • 2.1)选择任意 m 2 ′ m_2' m2
    • 2.2)计算 ( c 2 , c 2 ′ ) = H a s h ( x , m 1 , m 1 ′ , c 1 , c 1 ′ , m 2 , m 2 ′ ) (c_2,c_2')=Hash(x,m_1,m_1',c_1,c_1',m_2,m_2') (c2,c2)=Hash(x,m1,m1,c1,c1,m2,m2)
    • 2.3)检查 c 2 ′ c_2' c2是否为某“special” challenge,其使得 Π 0 \Pi_0 Π0的第二个proof ( x , m 1 ′ , c 1 ′ , m 2 ′ , c 2 ′ , m 3 ′ ) (x,m_1',c_1',m_2',c_2',m_3') (x,m1,c1,m2,c2,m3)是有效的。如, c 2 ′ c_2' c2可为特定多项式的root。【因此,实际需确保Verifier发送的challenge不是多项式的root,否则将破坏协议。】
    • 2.4)若 c 2 ′ c_2' c2不是特殊的challenge,则Prover rewinds,然后重复执行上面的步骤2.1)。
      【原则上,Prover需要 ≈ 1 / ϵ = 2 λ \approx1/\epsilon=2^{\lambda} 1/ϵ=2λ次迭代即可成功。其中 λ \lambda λ为交互式协议的安全参数。】
      在这里插入图片描述

结论为:

  • 假设Prover为Round 1找到了特殊的 c 1 c_1 c1,为Round 2找到了特殊的 c 2 c_2 c2
  • ( x , m 1 , c 1 , m 2 , c 2 , m 3 ) (x,m_1,c_1,m_2,c_2,m_3) (x,m1,c1,m2,c2,m3) ( x , m 1 ′ , c 1 ′ , m 2 ′ , c 2 ′ , m 3 ′ ) (x,m_1',c_1',m_2',c_2',m_3') (x,m1,c1,m2,c2,m3)均为有效proofs。
  • 找到该特殊 c i c_i ci需要约 ≈ 1 / ϵ = 2 λ \approx 1/\epsilon=2^{\lambda} 1/ϵ=2λ次迭代尝试。
  • 总共,Prover需要 1 / ϵ + 1 / ϵ = 2 / ϵ 1/\epsilon +1/\epsilon=2/\epsilon 1/ϵ+1/ϵ=2/ϵ次迭代尝试。
  • 这样,安全性仅增加了1个bit,尽管期待的是增加2倍,原因在于parallel repetition的交互版本具有的soundness为 1 / ϵ 2 1/\epsilon^2 1/ϵ2
  • 总的来说,第2个parallel repetition对soundness没有任何贡献。
    在这里插入图片描述
    相关经验法则为:
  • Π 0 \Pi_0 Π0为 soundness error为 ϵ \epsilon ϵ μ \mu μ-round协议
  • Π 0 ′ \Pi_0' Π0为并行重复 Π 0 \Pi_0 Π0 t t t 次。
  • F S ( Π 0 ′ ) FS(\Pi_0') FS(Π0)具有的soundness error 为 ≈ ϵ ⌈ t / μ ⌉ \approx \epsilon ^{\left \lceil t/\mu \right \rceil} ϵt/μ
  • 因此,所添加的 Π 0 \Pi_0 Π0并行实例个数,应为 μ \mu μ的倍数,才能实现在FS转换前类似的soundness。
    在这里插入图片描述

3.2 何时FS转换是安全的?

以上面的结论和经验法则可知,存在如下情况:

  • Π 0 ′ \Pi_0' Π0具有soundness ϵ ′ \epsilon' ϵ,但 F S ( Π 0 ′ ) FS(\Pi_0') FS(Π0)具有低得多的soundness。

那么,问题来了,何时FS转换能保持相同量级的soundness?即何时FS转换后的协议与初始的交互协议具有相同的安全级别?
有2种概念:

  • 1)Special soundness(Atttema, Fehr, Kloss, 2022):即证明初始交互协议满足某种特殊的soundness强概念。若初始交互协议是special sound的,则FS转换后的协议与该初始协议一样安全。
  • 2)Round-by-Round (RBR) knowledge soundness(Chiesa, Manohar, Spooner, 2020):即若证明初始交互协议具有Round-by-Round (RBR) knowledge soundness,则FS转换后的协议与该初始协议一样安全。

所谓Round-by-Round (RBR) knowledge soundness:

  • 在之前的2个例子(Sequential repetition和Parallel repetition)中,可称其为 “the overall soundness ϵ \epsilon ϵ of Π \Pi Π is the accumulation of smaller soundness errors throughout Π \Pi Π’s rounds”。
  • 但这正是之前FS攻击所利用之处:攻击者其可rewind proofs,并试图破坏该small soundness checks,这些checks具有small soundness,然后Fiat-Shamir transform将不再按预期工作。
  • 当满足如下情况时,则称该协议是RBR (knowledge) sound的:【协议的安全性,不是多个不太安全checks的累加】
    • 即,当“each round of Π \Pi Π has soundness error ≈ \approx the overall error ϵ \epsilon ϵ of Π \Pi Π”时。

在Theorem (Block, G., Tiwari, Zajac) 中指出:

  • RBR knowledge soundness => special soundness => RBR soundness。

4. FRI及其FS安全性

FRI协议:

  • FRI是a IOP。
  • FRI Prover具有某函数 f : F → F f:\mathbb{F}\rightarrow \mathbb{F} f:FF
  • FRI Verifier可访问所有的 f ( v ) f(v) f(v),其中 v ∈ D v\in D vD D ⊆ F D\subseteq \mathbb{F} DF
  • 理想情况下,FRI协议的目的是:让Verifier信服 f ( X ) f(X) f(X)为某degree ≤ d \leq d d的多项式。
  • 实际情况下,FRI协议的目的是:让Verifier信服 f ( X ) f(X) f(X) δ \delta δ-close 某degree ≤ d \leq d d的多项式。
    • 所谓 δ \delta δ-close,是指:在 D D D的相对大的子集 D 0 D_0 D0内, f ( X ) f(X) f(X)与某low degree多项式 agree,即 ∣ D 0 ∣ ≥ ( 1 − δ ) ∣ D ∣ |D_0|\geq (1-\delta)|D| D0(1δ)D,且 0 < δ < 1 0<\delta <1 0<δ<1

Theorem (Block, G., Katz, Thaler, Tiwari, Zajac; StarkWare) 中指出:

  • FRI协议是RBR (knowledge) sound的。【根据之前的RBR knowledge soundness => special soundness => RBR soundness,可知FRI协议也是special sound的。】

因此,FRI协议FS转换之后,其soundness ≈ Q ε F R I + Q 2 2 \approx \mathcal{Q}_{\varepsilon_{FRI}}+\frac{\mathcal{Q}^2}{2} QεFRI+2Q2。即,可安全的对FRI进行Fiat-Shamir转换。

5. 使用FRI来编译PIOPs

5.1 FRI-based PCS in practice

当 “ δ \delta δ-close” 是 “very close”时,FRI可用于构建多项式承诺:

  • 为验证 f ( z ) = y f(z)=y f(z)=y,需使用FRI来检查:“ q ( X ) : = f ( X ) − y X − z q(X):=\frac{f(X)-y}{X-z} q(X):=Xzf(X)y” 为 “ δ \delta δ-close” to 某degree ≤ d − 1 \leq d-1 d1 多项式。
  • 此处“very close”,是指:在 某unique decoding radius δ ≤ ( 1 − ( d + 1 ) / ∣ D ∣ ) / 2 \delta\leq (1-(d+1)/|D|)/2 δ(1(d+1)/∣D)/2范围内。
  • 但是,取如此小的 δ \delta δ值,在效率上是有开销的。会导致不具备实用性的不高效的FRI协议。也就是说,实际应用时,并不会取如此低的proximity参数。
  • 实际上,当前所有的协议(如STARK、Plonky2、RISC Zero等),会取更大的proximity参数 δ \delta δ值,其最大为Johnson bound: 1 − ( d + 1 ) / ∣ D ∣ 1-\sqrt{(d+1)/|D|} 1(d+1)/∣D
  • 这样的实际取值,导致以上"PCS"将不再是一个多项式承诺方案。原因在于:
    • 可能有多个多项式,其均满足 δ \delta δ-close to the map q ( X ) q(X) q(X)
    • Prover可open这多个close多项式中的任意一个。【此时,Prover不再是对某多项式进行commit,而是对一组多项式进行commit。这是个问题。】
    • 将FRI用作PCS beyond unique decoding radius的相关项目有:
      • RedShift:Plonk + FRI —— 其soundness error随execution trace width指数级扩大。
      • STARK-type协议:DEEP-FRI、ethSTARK等 + Hab¨ock。【其使用FRI来编译PIOPs,当不将FRI看成是多项式承诺方案。】【Polygon Labs Ulrich Hab¨ock 2022年论文《A summary on the FRI low degree test》中,对所评估的soundness进行了一点改进。】

为此,主要结论为:

  • Theorem (Block, G., Katz, Thaler, Tiwari, Zajac) 中指出:有某large class C \mathscr{C} C of PIOPs,使得:
    • 假设该初始PIOP是RBR (knowledge) sound的。
    • 则所生成的FRI-based SNARG是knowledge sound的,即为a SNARK。

因此,关键点在于:

  • 以上Theorem支持,仅通过看该PIOP,来证明该SNARK的安全性。这样通常相对更易于分析。

Alexander R. Block 2023年论文 Fiat-Shamir Security of FRI and Related SNARKs 中:

  • 展示了ethSTARK和Plonky2作为PIOPs是RBR knowledge sound的,且在class C \mathscr{C} C中。
  • 从而可推断出:ethSTARK和Plonky2作为SNARGs是knowledge sound的。
  • 与此同时,StarkWare也展示了ethSTARK的相同结论。
  • 称PIOPs in C \mathscr{C} C 0 0 0-correlated。

在这里插入图片描述

参考资料

[1] Alexander R. Block 2023年论文 Fiat-Shamir Security of FRI and Related SNARKs
[2] Albert Garreta 2023年9月在ZK Summit 10上分享 ZK10: Fiat-Shamir security of FRI and related SNARKs - Albert Garreta (Nethermind)

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

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

相关文章

【Git企业开发】第五节.远程操作

文章目录 前言一、理解分布式版本控制系统二、远程仓库 2.1 新建远程仓库 2.2 克隆远程仓库 2.3 向远程仓库推送 2.4 拉取远程仓库总结 前言 一、理解分布式版本控制系统 我们目前所说的所有内容(工作区&#xff0c;暂存区&#xff0c;版本库等等)&#x…

100G QSFP28 BIDI LR1光模块最新解决方案

上期文章我们有介绍到100G QSFP28 BIDI ER1 Lite光模块&#xff0c;本期内容我们将继续为大家介绍100G光模块系列的100G QSFP28 BIDI LR1光模块。这款产品同样也在易天ECOC光通讯展展出&#xff0c;下面跟着小易一起来看看吧&#xff01; 易天光通信的100G QSFP28 BIDI LR1单纤…

【Linux学习笔记】进程概念(中)

1. 操作系统的进程状态2. Linux操作系统的进程状态3. 僵尸进程4. 孤儿进程5. 进程优先级5.1. 优先级是什么和为什么要有优先级5.2. Linux中的进程优先级 6. 进程切换7. 环境变量7.1. 环境变量的认识7.2. 环境变量相关的命令7.3. 环境变量和本地变量7.4. 命令行参数7.5. 获取环境…

突破防火墙的一种方法

当Linux防火墙阻止来自某个ip的数据时&#xff0c;它应该是根据ip数据报里“源IP地址”字段取得的对方ip吧&#xff0c;那对方就不能通过篡改“源IP地址”来绕过防火墙吗&#xff1f;NAT模式下的路由器就修改了这个字段。 但这样的话&#xff0c;攻击者是收不到服务器返回的数…

通过内网穿透分享本地电脑上有趣的照片:部署piwigo网页

通过cpolar分享本地电脑上有趣的照片&#xff1a;部署piwigo网页 文章目录 通过cpolar分享本地电脑上有趣的照片&#xff1a;部署piwigo网页前言1.Piwigo2. 使用phpstudy网页运行3. 创建网站4. 开始安装Piwogo5. 设定一条内网穿透数据隧道6. 与piwigo网站绑定7. 在创建隧道界面…

k8s 多网卡方案multus

kubernetes 多网卡方案之 Multus_CNI 部署以及基本使用 一、multus cni 出现的背景 在k8s的环境中启动一个容器&#xff0c;默认情况下只存在两个虚拟网络接口&#xff08;loopback 和 eth0&#xff09;&#xff0c; loopback 的流量始终都会在本容器内或本机循环&#xff0c…

CSAPP BOMB LAB part2

bomb lab part2 phase3 汇编语法 switch 汇编版本 switch 例子: switch 使用 jump table movl 指令 cmpl指令是x86汇编语言中的一个比较指令&#xff0c;用于比较两个操作数的值。cmpl指令的格式如下&#xff1a; cmpl source, destinationsource和destination可以是…

为什么我电脑上C:\Windows\System32\config\regback文件夹是空的,怎么设置才能有备份文件

环境&#xff1a; Win10 专业版 19041 问题描述&#xff1a; 为什么我电脑上C:\Windows\System32\config\regback文件夹是空的&#xff0c;怎么设置才能有备份文件 解决方案&#xff1a; 微软说从 Windows 10 版本 1803 开始&#xff0c;系统注册表不再备份到 RegBack 文件…

第二章 线性表【数据结构与算法】【精致版】

第二章 线性表【数据结构与算法】【精致版】 前言版权第二章 线性表2.1 应用实例应用实例一 约瑟夫环问题(Josephus problem)应用实例二 一元多项式运算器 2.2 线性表的概念及运算2.2.1线性表的逻辑结构2.2.2 线性表的运算 2.3 线性表的顺序存储2.3.1 顺序表2.3.2 顺序表的基本…

网络安全进阶学习第二十一课——XXE

文章目录 一、XXE简介二、XXE原理三、XXE危害四、XXE如何寻找五、XXE限制条件六、XXE分类七、XXE利用1、读取任意文件1.1、有回显1.2、没有回显 2、命令执行&#xff08;情况相对较少见&#xff09;3、内网探测/SSRF4、拒绝服务攻击(DDoS)4.1、内部实体4.2、参数实体 八、绕过基…

制造企业如何三步实现进销存管理?

制造企业如何三步实现进销存管理&#xff1f; 一、什么是进销存软件&#xff1f; 进销存软件是一种针对制造业企业设计的管理软件系统&#xff0c;旨在协调和优化企业的生产、采购、销售以及库存管理等方面的活动。该系统的主要目标是提高企业的生产效率、降低库存成本、优化…

C++二分查找算法的应用:俄罗斯套娃信封问题

本文涉及的基础知识点 二分查找 题目 给你一个二维整数数组 envelopes &#xff0c;其中 envelopes[i] [wi, hi] &#xff0c;表示第 i 个信封的宽度和高度。 当另一个信封的宽度和高度都比这个信封大的时候&#xff0c;这个信封就可以放进另一个信封里&#xff0c;如同俄罗…

npm ERR! code ELIFECYCLE

问题&#xff1a; 一个老项目&#xff0c;现在想运行下&#xff0c;打不开了 npm install 也出错 尝试1 、使用cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm install 还是不行 尝试2、 package.json 文件&#xff0c;去掉 那个插件 chorm…

VS Code 开发 Spring Boot 类型的项目

在VS Code中开发Spring Boot的项目&#xff0c; 可以导入如下的扩展&#xff1a; Spring Boot ToolsSpring InitializrSpring Boot Dashboard 比较建议的方式是安装Spring Boot Extension Pack&#xff0c; 这里面就包含了上面的扩展。 安装方式就是在扩展查找 “Spring Boot…

​​​​​​​2022年上半年 软件设计师 上午试卷(33-68)

35 C 36 D 该题在2013年下半年考过类似的题目&#xff0c;从图中可见&#xff0c;页内地址的长度为12位&#xff0c;2124096&#xff0c;即4K&#xff0c;页号长度为21-12110&#xff0c;2101024&#xff0c;段号长度为31-22110&#xff0c;2101024。故正确答案为D。 37&#x…

传感器类总结(一)MPU9250 1原理介绍

1简介 MPU9250是一款9轴运动跟踪装置&#xff0c;在它3x3x1mm的封装中集成了3轴陀螺仪&#xff0c;3轴加速度计&#xff0c;3轴磁力计以及运动处理器&#xff08;DMP&#xff09;并且兼容 MPU6515。通过IIC&#xff0c;可以直接输出9轴的全部数据。因此它也是四轴姿态结算的基…

【LeetCode刷题-链表】--203.移除链表元素

203.移除链表元素 方法&#xff1a;定义一个节点指向头节点head&#xff0c;避免头结点单独操作 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* …

哪个牌子的骨传导蓝牙耳机好?盘点市面上口碑最好的五款骨传导耳机

随着技术的发展&#xff0c;运动蓝牙耳机这个类别已经进化到了骨传导的形式&#xff0c;也受到了广大运动爱好者的一致好评&#xff0c;在日常运动中&#xff0c;也经常会看到佩戴骨传导耳机的消费者&#xff0c;但普通的骨传导耳机却表现并不是很好&#xff0c;所以在选购骨传…

修改Typora默认微软雅黑字体

修改Typora字体 写在前面 我最近在折腾windows电脑&#xff0c;从macos转像windows不容易啊&#xff0c;因为键盘快捷键经常弄错&#xff0c;这篇文章就是修改Typora中字体显示的问题。 正文内容 我发现在windows中&#xff0c;字体非常的难看&#xff0c;微软雅黑也太丑了…

Zeebe 微服务编排引擎 入门

相关阅读: linux 安装 zeebe: Zeebe学习(一)——Linux下安装zeebe以及快速入门_互联网集市 Zeebe是一个用于微服务编排的工作流引擎。 这篇文章将帮助你确切地了解什么是Zeebe以及它如何可能与你相关。我们将简要介绍Zeebe以及它所解决的问题,然后再进行更详细的介绍。…