FRI及相关SNARKs的Fiat-Shamir安全

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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

甲方自建ERP这事靠不靠谱?来听听读过中欧商学院的老板怎么说

李总自建ERP开发团队的失败案例&#xff0c;投入三年&#xff0c;花了五六百万&#xff0c;做出来的东西&#xff0c;远不如免费开源的Odoo软件。Odoo有强大的技术平台&#xff0c;有无穷的功能插件。李总现身说法&#xff1a;“早知道有Odoo&#xff0c;何必瞎折腾&#xff0c…

SAP IDOC 开发入门

1, 基本概念 IDOC技术在早起版本的R/3系统就已经集成了&#xff0c;不过国内真正用起来还是05年以后了&#xff0c;其实IDOC是很强大的&#xff0c;在主数据和一些业务数据同步方面&#xff0c;几乎不需要做任何开发就可以配置完成&#xff0c;例如BD11&#xff0c;BD13这些事…

3 Spring底层概念介绍

BeanDefinition BeanDefinition表示Bean定义&#xff0c;BeanDefinition中存在很多属性用来描述一个Bean的特点。比如&#xff1a; class&#xff0c;表示Bean类型 scope&#xff0c;表示Bean作用域&#xff0c;单例或原型等 lazyInit&#xff1a;表示Bean是否是懒加载 initM…

2.Docker基本架构简介与安装实战

1.认识Docker的基本架构 下面这张图是docker官网上的&#xff0c;介绍了整个Docker的基础架构&#xff0c;我们根据这张图来学习一下docker的涉及到的一些相关概念。 1.1 Docker的架构组成 Docker架构是由Client(客户端)、Docker Host(服务端)、Registry(远程仓库)组成。 …

C语言实现 1.在一个二维数组中形成 n 阶矩阵,2.去掉靠边元素,生成新的 n-2 阶矩阵;3.求矩阵主对角线下元素之和:4.以方阵形式输出数组。

矩阵形式&#xff1a; 1 1 1 1 1 2 1 1 1 1 3 2 1 1 1 4 3 2 1 1 5 4 3 2 1 完整代码&#xff1a; /*编写以下函数 1&#xff0e;在一个二维数组中形成如以下形式的 n 阶矩阵&#xff1a; 1 1 1 1 1 2 1 1 1 1 3 2 1 1 1 4 3 2 1 1 5 4 3 2 1 2&#xff0e;去掉…

【Vue3+Vite+bwip-js库】 生成DataMatrix码

前提条件 已存在的vue3vite架构前端项目对二维码分类有一定的了解 生成的码的样式如下&#xff08;DataMatrix&#xff09; 该二维码容量如下 详情见&#xff1a;DataMatrix介绍 Vue3Vite 导入 bwip-js生成DataMatrix 1. 安装 npm install bwip-js --save2. 引入使用 <…

基于STC12C5A60S2系列1T 8051单片机A/D转换器应用

基于STC12C5A60S2系列1T 8051单片机A/D转换器应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍STC12C5A60S2系列1T 8051单片机A/D转换器介绍STC12C5A60S2系列1T 805…

xlua源码分析(二)lua Call C#的无wrap实现

xlua源码分析&#xff08;二&#xff09;lua Call C#的无wrap实现 上一节我们主要分析了xlua中C# Call lua的实现思路&#xff0c;本节我们将根据Examples 03_UIEvent&#xff0c;分析lua Call C#的底层实现。例子场景里有一个简单的UI面板&#xff0c;面板中包含一个input fie…

3.线性神经网络-3GPT版

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 线性回归基础优化算法一、线性回归1、买房案例2、买房模型简化3、线性模型4、神经网络5、损失函数6、训练数据7、参数学习8、显示解9、总结 二、 基础优化算法1、梯度下降2、学习率3、小批量随机梯度下降4、批量大小5、…

Qt 中model/View 架构 详解,以及案例实现相薄功能

model/View 架构 导读 ​ 我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中。早期的 Qt 要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如一个列表。我们对这个列表进行查找、插入等的操作,或者把修改…

HNU程序设计 练习五-函数

1.小熊买糖果 【问题描述】 小熊去到商店&#xff0c;选择了一种它非常喜欢的糖果&#xff0c;其单价为 k 元&#xff0c;假定商店里有无穷多的这种糖果。 它的父亲允许它花费任意多的10元硬币和一个 r 元硬币去购买&#xff0c;但不能找零&#xff0c;请帮助小熊确定它能购买…

EMC Unity存储系统如何查看SSD的使用寿命

为什么要写这个博客&#xff1f; 客户对老的EMC unity的存储系统要扩容&#xff0c;如何确定SSD磁盘是全新的还是拆机二手的&#xff1f;很多时候客户还有一个奇葩的要求&#xff0c;就是要和5年前的磁盘PN一致&#xff0c;甚至要求固件版本一致&#xff0c;最关键的还要求是全…

Leetcode刷题详解——反转链表

1. 题目链接&#xff1a;206. 反转链表 2. 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1…

【java学习—十二】io流(1)

文章目录 1. 主要内容2. File类3. 练习题4. Java IO原理 1. 主要内容 java.io.File 类的使用&#xff08;计算机操作系统中的文件和文件夹&#xff09; IO原理及流的分类。 IO即input和output。 流的解释&#xff1a;     比如&#xff1a;通过程序把图片放到某一个文件…

pycharm 断点调试python Flask

以flask框架为例&#xff0c;其启动命令为 python app.py runserver 后面需要拼接runserver 点击开始断点 参考&#xff1a;https://www.cnblogs.com/bigtreei/p/14742015.html

Mac -- zsh-最新全网超详细的个性化终端(Terminal)颜色及vim颜色配置(亲测可行)

转自 Mac -- zsh-最新全网超详细的个性化终端(Terminal)颜色及vim颜色配置(亲测可行)_mac zsh-CSDN博客 以下都是苹果 设置&#xff0c;这是简化版的&#xff0c;详细的看我引用的 个性化终端颜色背景设置 显示检查器 打开终端&#xff0c;鼠标在终端中&#xff0c;右击&…

[PyTorch][chapter 60][强化学习-2-有模型学习2]

前言&#xff1a; 前面我们讲了一下策略评估的原理,以及例子. 强化学习核心是找到最优的策略&#xff0c;这里 重点讲解两个知识点&#xff1a; 策略改进 策略迭代与值迭代 最后以下面环境E 为例&#xff0c;给出Python 代码 。 目录&#xff1a; 1&#xff1a; 策略改进 2&…

图数据库Neo4j——SpringBoot使用Neo4j 简单增删改查 复杂查询初步

前言 图形数据库是专门用于存储图形数据的数据库&#xff0c;它使用图形模型来存储数据&#xff0c;并且支持复杂的图形查询。常见的图形数据库有Neo4j、OrientDB等。 Neo4j是用Java实现的开源NoSQL图数据库&#xff0c;本篇博客介绍如何在SpringBoot中使用Neo4j图数据库&…

防止重复提交请求

前景提要&#xff1a; ts 简易封装 axios&#xff0c;统一 API 实现在 config 中配置开关拦截器 axios 实现请求 loading 效果 用一个数组保存当前请求的 url&#xff0c;此时还未响应。如果再次发起同样请求&#xff0c;比对 url 发现已经存在数组中&#xff0c;则拦截请求&a…

【PyQt学习篇 · ⑨】:QWidget -控件交互

文章目录 是否可用是否显示/隐藏是否编辑是否为活跃窗口关闭综合案例信息提示状态提示工具提示“这是什么”提示 焦点控制单个控件角度父控件角度 是否可用 setEnabled(bool)&#xff1a;该函数用于设置QWidget控件的可用性&#xff0c;参数bool为True表示该控件为可用状态&…