New Work-flow of Circuit Bootstrapping

参考文献:

  1. [CGGI17] Chillotti I, Gama N, Georgieva M, et al. Faster packed homomorphic operations and efficient circuit bootstrapping for TFHE. ASIACRYPT 2017 (1): 377-408.
  2. [CDKS21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion between (ring) LWE ciphertexts. ACNS 2021 (1): 460-479.
  3. [KLD+23] Kim A, Lee Y, Deryabin M, et al. LFHE: Fully homomorphic encryption with bootstrapping key size less than a megabyte[J]. Cryptology ePrint Archive, 2023.
  4. [DKMS24] De Micheli G, Kim D, Micciancio D, et al. Faster amortized FHEW bootstrapping using ring automorphisms. Public Key Cryptography 2024 (4): 322-353.
  5. [WWL+24] Wang R, Wen Y, Li Z, et al. Circuit Bootstrapping: Faster and Smaller. EUROCRYPT 2024 (2): 342-372.
  6. Leveled mode of TFHE
  7. Conversion Between ®LWE
  8. 加权自动机:在 Semirings 上建模

文章目录

  • LHE Mode
    • Original TFHE
    • Novel Work Flow
  • Automorphism-Based PBS
    • Using Sparse Isomorphism
    • MV-PBS
  • Analysis & Parameters

LHE Mode

TFHE 除了有 FHE mode,还有 [CGGI17] 提出的 LHE mode:

  • 前者每个 Gate 都需要自举,利用 LinPoly + PBS 实现布尔运算;
  • 后者仅在噪声过大或者类型不符时才自举,利用 det-WFA + CMux-based OBDD + BRS 实现布尔运算。由于 RLWE 和 RGSW 外积的噪声增长不对称性,只要 RGSW 加密消息的范数很小(比如:布尔值、单项式),那么 LHE 的容许 CMux 深度就会很大。

自动机的运算:

在这里插入图片描述

决策树的运算:

在这里插入图片描述

比特序列表示的运算:

在这里插入图片描述

但是,它们都是用 CMux Gate 搭建的,控制位是 RGSW 密文(布尔值/单项式的 Powers-of-Base),数据位是 RLWE/LWE 密文(系数编码)。如果想要把数据位提升到控制位,就需要 LWE-to-RGSW 的密文转换,也就是 “电路自举”。

Original TFHE

[CGGI17] 的电路自举的工作流如下:

在这里插入图片描述

他们使用三组参数:

  • ( q ‾ , n ‾ ) (\underline{q}, \underline{n}) (q,n) 是 Level 0 的 LWE 参数集,存储数据,具有最高的噪声。模数和维度都尽可能小,使得自举更高效。
  • ( q , N ) (q,N) (q,N) 是 Level 1 的 RGSW 参数集,存储控制位。模数和维度的规模,决定了外积的效率和深度。
  • ( Q ‾ , N ‾ ) (\overline{Q}, \overline{N}) (Q,N) 是 Level 2 的 RLWE 参数集,用于 PBS 自举,具有最小的噪声。选取足够大的模数,获得所需的深度。

电路自举包含两个步骤:令 v = ( v 0 , v 1 , ⋯   , v l − 1 ) v=(v_0,v_1,\cdots,v_{l-1}) v=(v0,v1,,vl1) 是 RGSW 使用的 Gadget Vector,令 s k ‾ , s k , s k ‾ \underline{sk},sk,\overline{sk} sk,sk,sk 分别是三层的私钥。

  1. Functional Bootstrapping Step

    • 输入单个 Level-0 LWE 密文 L W E s k ‾ ( m ) LWE_{\underline{sk}}(m) LWEsk(m),使用 l l l 次 PBS 计算出 L W E s k ‾ ( m v i ) LWE_{\overline{sk}}(mv_i) LWEsk(mvi)
    • 这里可以使用 [CLOT21] 的 PBSmanyLUT 加速。
  2. Ciphertext Conversion Step

    • RGSW 密文的第一部分:使用 LWE-to-RLWE PubKS 过程,把 ( b , a ) = L W E s k ‾ ( m v i ) (b,a)=LWE_{\overline{sk}}(mv_i) (b,a)=LWEsk(mvi) 切换到 R L W E s k ( m v i ) RLWE_{sk}(mv_i) RLWEsk(mvi)

      使用的 KSK 是 R L W E s k ′ ( s k j ‾ ) RLWE'_{sk}(\overline{sk_j}) RLWEsk(skj),计算过程是
      ( b , 0 ) + ∑ j a j ⊙ R L W E s k ′ ( s k j ‾ ) (b,0) + \sum_j a_j \odot RLWE'_{sk}(\overline{sk_j}) (b,0)+jajRLWEsk(skj)

    • RGSW 密文的第二部分:使用 LWE-to-RLWE PriKS 过程,把 ( b , a ) = L W E s k ‾ ( m v i ) (b,a) = LWE_{\overline{sk}}(mv_i) (b,a)=LWEsk(mvi) 切换到 R L W E s k ( s k ⋅ m v i ) RLWE_{sk}(sk \cdot mv_i) RLWEsk(skmvi)

      使用的 KSK 是 R L W E s k ′ ( s k ⋅ s k j ‾ ) RLWE'_{sk}(sk \cdot \overline{sk_j}) RLWEsk(skskj) 以及 R L W E s k ′ ( s k ) RLWE'_{sk}(sk) RLWEsk(sk),计算过程是
      b ⊙ R L W E s k ′ ( s k ) + ∑ j a j ⊙ R L W E s k ′ ( s k ⋅ s k j ‾ ) b \odot RLWE'_{sk}(sk) + \sum_j a_j \odot RLWE'_{sk}(sk \cdot \overline{sk_j}) bRLWEsk(sk)+jajRLWEsk(skskj)

    • 最后把 R L W E s k ( m v i ) RLWE_{sk}(mv_i) RLWEsk(mvi) R L W E s k ( s k ⋅ m v i ) RLWE_{sk}(sk \cdot mv_i) RLWEsk(skmvi) 组装成 R G S W s k ( m ) RGSW_{sk}(m) RGSWsk(m) 密文即可。上述的 PubKS 和 PriKS 也可以采用 pre-computed variant,提高效率、降低噪声,代价是更大的 KSK 规模。

对于计算开销:使用 MV-PBS 之后,实际上 Ciphertext Conversion Step 占据了大部分。对于存储开销:也是 Ciphertext Conversion Step 中的 KSK 占据了大部分。

疑问:为何不使用 [CDKS21] 的基于自同构的 LWE-to-RLWE 呢?

  • [CGGI17] 的 PubKS 或 PriKS,需要 N ‾ \overline{N} N 次和标量 a j ∈ Z Q ‾ a_j \in \mathbb Z_{\overline Q} ajZQ(系数表示下分解和数乘)的外积运算,每次都需要 2 l N 2lN 2lN 次模乘,共计 2 l N ‾ N 2l\overline NN 2lNN
  • 基于自同构的 LWE-to-RLWE,需要 N ‾ / N ⋅ log ⁡ n \overline{N}/N \cdot\log n N/Nlogn 次和多项式 a ∈ R Q ‾ , n a \in R_{\overline Q,n} aRQ,n(系数表示下分解,再转化为 NTT 表示)的外积运算(长度 N ‾ \overline{N} N 的内积表示为 N ‾ / N \overline{N}/N N/N 个长度 N N N 的卷积),每次都需要 2 ( l + 1 ) N log ⁡ N + 2 l N 2(l+1)N\log N + 2lN 2(l+1)NlogN+2lN 次模乘,共计 2 ( l + 1 ) N ‾ log ⁡ 2 N + 2 l N ‾ log ⁡ N 2(l+1)\overline{N}\log^2 N + 2l\overline{N}\log N 2(l+1)Nlog2N+2lNlogN
  • 假如 N = 1024 N = 1024 N=1024,那么 log ⁡ 2 N = 100 ≪ N \log^2 N = 100 \ll N log2N=100N,效率提升应当十分显著,密钥规模也小得多,噪声方差会偏大 N ‾ log ⁡ N \overline{N}\log N NlogN 因子。

Novel Work Flow

[WWL+24] 提出了新的工作流,移除了 ACC to LWE 步骤,直接把 ACC 重构为 RGSW(实际上就是把 Extract 和基于自同构的 LWE-to-RLWE 合并了),从而消除了开销最大的 PubKS 和 PriKS 过程。

在这里插入图片描述

仅使用 Level 0 和 Level 2 两组参数集,新的电路自举流程是:

  1. PBS Without Sample Extraction

    • 输入单个 Level-0 LWE 密文 L W E s k ‾ ( m ) LWE_{\underline{sk}}(m) LWEsk(m),使用 l l l 次 PBS 计算出
      R L W E s k ‾ ( N ‾ − 1 m v i + ∑ k = 1 N ‾ − 1 y k X k ) RLWE_{\overline{sk}}(\overline{N}^{-1}mv_i+\sum_{k=1}^{\overline{N}-1}y_k X^k) RLWEsk(N1mvi+k=1N1ykXk)
      预期的明文在常数项(缩放 N ‾ − 1 \overline{N}^{-1} N1 抵消后续自同构的影响),其余的系数是冗余的。

    • 这里使用了 [WWL+24] 优化的 Automorphism-Based MV-PBS 算法。

  2. Ciphertext Conversion

  • RGSW 密文的第一部分:使用 [CDKS21] 提出的 Trace 稀疏分解算法(分圆塔),使用 Galois自同构 τ 2 k + 1 , k = log ⁡ N ‾ , ⋯   , 2 , 1 \tau_{2^k+1}, k=\log \overline{N},\cdots,2,1 τ2k+1,k=logN,,2,1 对应的 KSK,计算出 ( b , a ) = R L W E s k ‾ ( m v i ) (b,a) = RLWE_{\overline{sk}}(mv_i) (b,a)=RLWEsk(mvi)

  • RGSW 密文的第二部分:使用 [DKMS24] 提出的 RLWE’-to-RGSW 技术, 给定 S S K = R L W E s k ‾ ′ ( s k ‾ 2 ) SSK = RLWE'_{\overline{sk}}(\overline{sk}^2) SSK=RLWEsk(sk2),计算
    ( 0 , b ) + a ⊙ R L W E s k ‾ ′ ( s k ‾ 2 ) = R L W E s k ‾ ( s k ‾ ⋅ m v i + s k ‾ ⋅ e ) (0,b) + a \odot RLWE'_{\overline{sk}}(\overline{sk}^2) = RLWE_{\overline{sk}}(\overline{sk} \cdot mv_i + \overline{sk} \cdot e) (0,b)+aRLWEsk(sk2)=RLWEsk(skmvi+ske)
    其中 e ∈ R Q ‾ , N ‾ e \in R_{\overline{Q},\overline{N}} eRQ,N R L W E s k ‾ ( m v i ) RLWE_{\overline{sk}}(mv_i) RLWEsk(mvi) 的噪声。

  • 最后把 R L W E s k ‾ ( m v i ) RLWE_{\overline{sk}}(mv_i) RLWEsk(mvi) R L W E s k ‾ ( s k ‾ ⋅ m v i ) RLWE_{\overline{sk}}(\overline{sk} \cdot mv_i) RLWEsk(skmvi) 组装成 R G S W s k ‾ ( m ) RGSW_{\overline{sk}}(m) RGSWsk(m) 密文即可。

Ciphertext Conversion 的算法是:

在这里插入图片描述

总体的复杂度是:

在这里插入图片描述

疑问:文章说由于 step 2 无法切换维度,因此就把 RGSW 留在 Level 2 参数集。但是,这会导数 LHE 的计算开销较大(自举噪声和密钥切换噪声都累积在 KaTeX parse error: Got function '\overline' with no arguments as subscript at position 11: \mathbb Z_\̲o̲v̲e̲r̲l̲i̲n̲e̲{Q} 的低位,没必要保留)。可以依然使用中等规模的参数 ( q , N ) (q,N) (q,N),可修改为:

  1. 使用 Ring-Swich 技术,额外要求 s k ‾ ∈ R N ≤ R N ‾ \overline{sk} \in R_{N} \le R_{\overline{N}} skRNRN,首先把 ACC 模切换到安全的模数 q q q,然后直接提取出维度 N N N 子环(含有所需的常数项),这几乎是免费的
  2. 现在 ACC 是参数 ( q , N ) (q,N) (q,N) 下的 RLWE 密文,执行 Trace 消除冗余系数,然后做成 RGSW 密文,执行 LHE 运算
  3. 这样做,step 1 完全不变(稀疏私钥的安全性),step 2 速度更快、存储更小

如果不想要稀疏私钥,也可以这么做:依旧提取出维度 N ‾ \overline{N} N 的 LWE 密文,然后分成 N ‾ / N \overline{N}/N N/N 个区间(内积 = 卷积),使用 [CDKS21] 的基于自同构的 LWE-to-RLWE 算法,仅需 N ‾ / N \overline{N}/N N/N 次调用,效率损失也很小。

Automorphism-Based PBS

[WWL+24] 使用了两种 PBS Without Sample Extraction 算法,其一是 CMux-based Blind Rotation,其二是 Automorphism-Based Blind Rotation。

[WWL+24] 对前者的 Level 0 使用二元秘密( ∥ s ∥ 2 2 = n ‾ / 2 \|s\|_2^2 = \underline{n}/2 s22=n/2),对后者的 Level 0 使用 σ = 3.2 \sigma=3.2 σ=3.2 的高斯秘密( ∥ s ∥ 2 2 = n ‾ σ 2 \|s\|_2^2 = \underline{n}\sigma^2 s22=nσ2)。为了降低模切换噪声(大约是 σ m s 2 = ( ∥ s ∥ 2 2 + 1 ) / 12 \sigma_{ms}^2 = (\|s\|_2^2+1)/12 σms2=(s22+1)/12),[WWL+24] 两者的 Level 2 都使用二元秘密。

Using Sparse Isomorphism

[LMK+23] 的基于自同构的自举,关键是使用了同构 Z 2 N ∗ ≅ Z N / 2 × Z 2 \mathbb Z_{2N}^* \cong \mathbb Z_{N/2} \times \mathbb Z_2 Z2NZN/2×Z2,生成元是 { g , − 1 } \{g,-1\} {g,1}。要求系数形如 2 k + 1 ∈ Z 2 N 2k+1 \in \mathbb Z_{2N} 2k+1Z2N,从而可以表示为 ± g j \pm g^{j} ±gj 形式,只需要准备 2 2 2 个 KSK,使用 Galois 自同构计算指数上的数乘 X a i ⋅ s i = τ ± g j ( X s i ) X^{a_i \cdot s_i} = \tau_{\pm g^j}(X^{s_i}) Xaisi=τ±gj(Xsi)

为了进一步提高自举效率(和 a i a_i ai 不同取值的数量有关),[WWL+24] 使用了更加稀疏的系数,形如 k ⋅ 2 ν + 1 ∈ Z 2 N k \cdot 2^\nu +1 \in \mathbb Z_{2N} k2ν+1Z2N,只要 N ≥ 8 N \ge 8 N8 并且 ν ≥ 2 \nu \ge 2 ν2,则它们构成了某个元素 g ∈ Z 2 N g \in \mathbb Z_{2N} gZ2N 生成的乘法循环群,只需要准备 1 1 1 个 KSK 即可。易知 o r d ( 5   m o d   2 N ) = N / 2 ord(5 \bmod 2N)=N/2 ord(5mod2N)=N/2,因此可以选取 g = 5 2 ν − 2 g=5^{2^{\nu-2}} g=52ν2

类似于 [LMK+23],只要系数 a i a_i ai 都具有 k ⋅ 2 ν + 1 k \cdot 2^\nu+1 k2ν+1 形式,那么就可以把内积写成关于 g g g 的多项式,再使用 Horner 法则整理为:
∑ i a i s i = P s ( g ) : = ∑ j ∈ I 0 s j + g ( ⋯ + g ( ∑ j ∈ I 2 N / 2 ν − 1 s j ) ) ( m o d 2 N ) \sum_i a_i s_i = P_s(g) := \sum_{j \in I_0} s_j + g\left(\cdots+g\left(\sum_{j \in I_{2N/2^\nu}-1}s_j\right)\right) \pmod{2N} iaisi=Ps(g):=jI0sj+g +g jI2N/2ν1sj (mod2N)
其中 I j = { i : a i = g j } , j = 0 , 1 , ⋯   , 2 N / 2 ν − 1 I_j = \{i: a_i = g^j\}, j=0,1,\cdots,2N/2^\nu-1 Ij={i:ai=gj},j=0,1,,2N/2ν1

由于 o r d ( g ) = 2 N / 2 ν ord(g) = 2N/2^\nu ord(g)=2N/2ν,盲旋转总共执行了 2 N / 2 ν − 1 2N/2^\nu-1 2N/2ν1 次串行的 τ g \tau_g τg 自同构,因此初始 ACC 加密 T V ( X ) TV(X) TV(X),则最终计算出 T V ( X g − 1 ) ⋅ X ∑ i a i s i TV(X^{g^{-1}}) \cdot X^{\sum_i a_i s_i} TV(Xg1)Xiaisi,因此需要预先把 test vector 扭曲 X → X g X \to X^g XXg,保证计算结果的正确性。

在执行盲旋转之前,使用 ⌊ x ⌉ k ⋅ 2 ν + 1 \lfloor x \rceil_{k \cdot 2^\nu+1} xk2ν+1 把 LWE 系数都舍入到合适的形式,这里的舍入噪声会比 [LMK+23] 更大。

在这里插入图片描述

也采用了 [LMK+23] 的窗口技术,进一步降低自同构的数量。

在这里插入图片描述

由于期望值难以计算,为了确定最优的窗口大小,他们使用 Monte Carlo simulation 统计出不同 w w w 对应的自同构数量。对于不同维度 N ′ = 2 N / 2 ν N' = 2N/2^\nu N=2N/2ν,试验出的最佳 w w w 是:

在这里插入图片描述

完整的 PBS 算法是:

在这里插入图片描述

MV-PBS

由于 LWE 密文舍入到的 ( b , a ) (b,a) (b,a) 都是 k ⋅ 2 ν + 1 k \cdot 2^\nu+1 k2ν+1 形式的整数,而非 2 ν 2^\nu 2ν 倍数,因此无法直接成为 Multi-Value PBS。可以采取很简单的技巧:
X b + ∑ i a i s i = X b + ∑ i ( a i + 1 ) s i − ∑ i s i X^{b+\sum_i a_is_i} = X^{b+\sum_i(a_i+1)s_i - \sum_i s_i} Xb+iaisi=Xb+i(ai+1)siisi
其中的 ( b , a ) (b,a) (b,a) 都是 2 ν 2^\nu 2ν 的倍数,从而 b + ∑ i a i s i b+\sum_i a_is_i b+iaisi 也都是 2 ν 2^\nu 2ν 的倍数。这额外需要 A U X = R G S W s k ‾ ( X − ∑ i s k ‾ i ) AUX = RGSW_{\overline{sk}}(X^{- \sum_i \underline{sk}_i}) AUX=RGSWsk(Xiski) 作为辅助信息。

用于电路自举的 MV-PBS 算法如下:计算符号函数、不做密文提取。

在这里插入图片描述

完整的 PBS 算法是:

在这里插入图片描述

Analysis & Parameters

为了减少 Gadget Vector 的长度,[WWL+24] 对于所有的外积都使用了 [KLD+23] 的 Approximate Gadget Decomposition,选取 B l < q B^l < q Bl<q,那么 v = ( δ , δ B , ⋯   , δ B l − 1 ) v = (\delta,\delta B,\cdots,\delta B^{l-1}) v=(δ,δB,,δBl1),其中 δ = ⌈ q / B l ⌉ \delta = \lceil q/B^l \rceil δ=q/Bl,近似误差 ϵ ≤ δ / 2 \epsilon \le \delta/2 ϵδ/2,环元素和 R L W E ′ ( m ) RLWE'(m) RLWE(m) 的外积噪声是 σ 2 ≤ l N B 2 σ f r e s h 2 / 12 + V a r ( m ) ⋅ ϵ 2 / 3 \sigma^2 \le lNB^2\sigma_{fresh}^2/12 + Var(m)\cdot\epsilon^2/3 σ2lNB2σfresh2/12+Var(m)ϵ2/3(减少了前者,增加了后者,做个平衡),其中 V a r ( m ) ≤ ∥ m ∥ 2 2 Var(m) \le \|m\|_2^2 Var(m)m22。如果是 R L W E RLWE RLWE R G S W RGSW RGSW 的外积,则还有 ∥ m ∥ 2 2 ⋅ σ R L W E 2 \|m\|_2^2 \cdot \sigma_{RLWE}^2 m22σRLWE2 的影响。

有五个不同的 Gadget Vector,它们的 R L W E ′ RLWE' RLWE 的消息格式为

  1. 执行 LHE mode 运算:维度 N ‾ \overline{N} N,模数 Q ‾ \overline{Q} Q,控制位形如 m = b X i , b ∈ { 0 , 1 } m=bX^i, b \in \{0,1\} m=bXi,b{0,1},因此 ∥ m ∥ 2 2 ≤ 1 \|m\|_2^2 \le 1 m221
  2. PBS 中的外积:维度 N ‾ \overline{N} N,模数 Q ‾ \overline{Q} Q,CMux-based 形如 m = s k ‾ i m=\underline{sk}_i m=ski(二元),Auto-based 形如 m = X s k ‾ i m=X^{\underline{sk}_i} m=Xski(高斯),都是 ∥ m ∥ 2 2 ≤ 1 \|m\|_2^2 \le 1 m221
  3. PBS 中的自同构:维度 N ‾ \overline{N} N,模数 Q ‾ \overline{Q} Q,CMux-based 中不存在,Auto-based 形如 m = s k ‾ ( X g j ) m=\overline{sk}(X^{g^j}) m=sk(Xgj),满足 ∥ m ∥ 2 2 ≤ N ‾ / 2 \|m\|_2^2 \le \overline{N}/2 m22N/2
  4. 密文转换中的迹映射:维度 N ‾ \overline{N} N,模数 Q ‾ \overline{Q} Q,形如 m = s k ‾ ( X g u ) m=\overline{sk}(X^{g^u}) m=sk(Xgu),满足 ∥ m ∥ 2 2 ≤ N ‾ / 2 \|m\|_2^2 \le \overline{N}/2 m22N/2
  5. 密文转换中的乘以私钥:维度 N ‾ \overline{N} N,模数 Q ‾ \overline{Q} Q,形如 m = s k ‾ 2 m=\overline{sk}^2 m=sk2(二元),满足 ∥ m ∥ 2 2 ≤ N ‾ 2 / 4 \|m\|_2^2 \le \overline{N}^2/4 m22N2/4

[WWL+24] 首先选取了 Level 0 和 Level 2 的维度和模数,然后固定 ν = 2 \nu=2 ν=2,对应的 PBS 输入密文的最大容许噪声是 σ i n 2 = 2 10 \sigma_{in}^2 = 2^{10} σin2=210,最后选取不同的 Gadget Vector 参数。

在这里插入图片描述

由于对 step 2 的优化,新电路自举算法的规模和效率都有很大的提升:

在这里插入图片描述

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

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

相关文章

计算机组成结构—IO接口(IO控制器)

目录 一、I/O 接口的功能 二、I/O 接口的基本结构 1. 总线连接的数据通路 2. I/O 接口的基本组成 三、I/O 端口及其编址 1. 统一编址 2. 不统一编址 四、I/O 接口的类型 两个系统或两个部件之间的交接部分&#xff0c;一般就称为 接口。接口可以是硬件上两种设备间的连…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:医疗健康智能服务

作为国产运动医学的领导者&#xff0c;致力于提供运动医学的整体临床解决方案&#xff0c;公司坐落于北京经济技术开发区。应用于肩关节、膝关节、足/踝关节、髋关节、肘关节、手/腕关节的运动医学设备、植入物和手术器械共计300多个品规通过NMPA的批准&#xff0c;临床应用于国…

docker构建java项目镜像

资料参考 参考自黑马教程&#xff1a;10.Docker基础-自定义镜像_哔哩哔哩_bilibili 初步准备 打包好java项目jar包&#xff0c;和Dockerfile文件一起放到指定目录下&#xff0c;后续操作都是在该目录下操作&#xff0c; 我这边是&#xff1a;/usr/local/src/train-ticket/ …

React -- memo允许你的组件在 props 没有改变的情况下跳过重新渲染。

memo(Component, arePropsEqual?) 使用 memo 将组件包装起来&#xff0c;以获得该组件的一个 记忆化 版本。通常情况下&#xff0c;只要该组件的 props 没有改变&#xff0c;这个记忆化版本就不会在其父组件重新渲染时重新渲染。但 React 仍可能会重新渲染它&#xff1a;记忆化…

vue3路由详解,从0开始手动配置路由(vite,vue-router)

创建一个不含路由的vue项目 &#xff08;查看路由配置可以直接跳过这一段&#xff09; 输入npm指令&#xff0c;然后写一个项目名称&#xff0c;之后一路回车即可 npm create vuelatest 注意这里我们不选引入vue router&#xff0c;成功后可以 查看目录 然后按提示信息输入指…

PLC通过Profinet转Modbus网关与流量计通讯案例

1、案例背景 在工业自动化系统中&#xff0c;PLC(可编程逻辑控制器)与流量计之间的通信是保证以后设备生产数据准确传输和实现控制功能的关键。但是&#xff0c;由于PLC和流量计可能使用不同的通信协议(如Profinet和Modbus)&#xff0c;因此需要一种转换机制来实现它们之间的通…

Telnet发邮件的功能如何实现?有哪些限制?

Telnet发邮件有哪些步骤&#xff1f;使用Telnet发送邮件安全吗&#xff1f; 虽然大多数人使用图形化的电子邮件客户端发送和接收邮件&#xff0c;但了解如何通过Telnet发邮件依然是有益的。AokSend将详细介绍Telnet发邮件的功能如何实现&#xff0c;帮助读者掌握这种基础但有用…

问题:材料题请点击右侧查看材料问题 查看材料 #学习方法#经验分享#学习方法

问题&#xff1a;材料题请点击右侧查看材料问题 查看材料 A.Colleges may reduce their enrollment. B.Top universities become increasingly competitive. C.Universities become selective in student admission. D.Colleges invest less in academy and infrastructure…

模拟超市收银系统

题目 模拟超市收银系统 内容要求&#xff1a;使用文本命令行窗口设计模拟超市收银系统。要求由收银员输入顾客的会员卡卡号&#xff08;若有卡&#xff09;、所购商品的货号等。从文件中取出有关价格信息&#xff0c;再把这些信息返回给收银台。同时把该收银台的销售总量和有…

「动态规划」如何求地下城游戏中,最低初始健康点数是多少?

174. 地下城游戏https://leetcode.cn/problems/dungeon-game/description/ 恶魔们抓住了公主并将她关在了地下城dungeon的右下角。地下城是由m x n个房间组成的二维网格。我们英勇的骑士最初被安置在左上角的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。骑士…

Node.js环境搭建

背景 想接触下node开发, 打算做个node环境 一、安装包获取 我喜欢使用压缩包解压然后配置的方式进行 地址为: Index of /download/release/ ,可按需选择自己的版本,我选择了如下版本 二、解压配置 将压缩包解压只自己想要安装的文件加下,配置环境变量,解压如下所示: …

Polar Web【中等】写shell

Polar Web【中等】写shell Contents Polar Web【中等】写shell思路&探索EXP运行&总结 思路&探索 初看题目&#xff0c;预测需要对站点写入木马&#xff0c;具体操作需要在过程中逐步实现。 打开站点(见下图)&#xff0c;出现 file_put_contents 函数&#xff0c;其…

HarmonyOS开发-鸿蒙UiAbility 组件间跳转

前言 随着春节假期结束各行各业复产复工&#xff0c;一年一度的春招也持续火热起来。最近&#xff0c;有招聘平台发布了《2024年春招市场行情周报&#xff08;第一期&#xff09;》。总体来说今年的就业市场还是人才饱和的状态&#xff0c;竞争会比较激烈。 但是&#xff0c;…

算法学习笔记(7.6)-贪心算法(霍夫曼编码)

目录 1.什么是霍夫曼树 2.霍夫曼树的构造过程 3.霍夫曼编码 3.1具体的作用-频率统计 ##实战题目 1.什么是霍夫曼树 给定N个权值作为N个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若该树的带权路径长度达到最小&#xff0c;称这样的二叉树为最优二叉树&#xff0c;也…

计算机组成结构—IO方式

目录 一、程序查询方式 1. 程序查询基本流程 2. 接口电路 3. 接口工作过程 二、程序中断方式 1. 程序中断基本流程 2. 接口电路 3. I/O 中断处理过程 三、DMA 方式 1. DMA 的概念和特点 2. DMA 与 CPU 的访存冲突 3. DMA 接口的功能 4. DMA 接口的组成 5. DMA 的…

STCunio数字电源带PID数字闭环(带详细的代码说明文档)

STCunio&#xff0c;即 system on chip unusual i/o,采用类似 arduino 构架设计&#xff0c;即使没有单片机知 识的设计师和艺术家们能够很快地通过它学习电子和传感器的基础知识&#xff0c;并应用到他们的设 计当中。设计中所要表现的想法和创意才是最主要的&#xff0c;至于…

Windows 搭建C++ 纯开源开发环境 进行 YOLOv8 模型推理的开发测试环境

文章大纲 IDE 选择纯开源首选 Codeblocks 跨平台开发IDE其次选择 visual studio 社区版 or visual studio code包管理MSYS2pacmanconda & mambavcpkgNuGetapt-get其他手动配置 Visual studio 开发环境下载 visual studio基本配置基本测试:打开图片,打开摄像头读取图片读取…

STL中stack和queue模拟实现+容器适配器

目录 容器适配器 STL标准库中stack和queue的底层结构 deque的简单介绍 deque的缺陷 为什么选择deque作为stack和queue的底层默认容器 stack的模拟实现 queue的模拟实现 容器适配器 适配器是一种设计模式&#xff08;设计模式是一套被反复使用的&#xff0c;多数人知晓…

吴谨言墨雨背后用真诚柱铸就爆款之路

吴谨言&#xff1a;墨雨背后&#xff0c;用真诚铸就爆款之路在繁华的娱乐圈&#xff0c;每一个成功的背后隐藏着不为人知的努力和汗水。而今天&#xff0c;我们要讲述的&#xff0c;正是这样一位用真诚和执着&#xff0c;一步步走向成功的演员——吴谨言。近日&#xff0c;一则…

cs与msf权限传递

cs传递到msf 1&#xff0c;先启动cs ┌──(root㉿ring04h)-[~/cobalt_strike_4.7] └─# ./teamserver 192.168.196.144 123456 ​ ┌──(root㉿ring04h)-[~/cobalt_strike_4.7] └─# ./start.sh ​ 2&#xff0c;上传木马&#xff0c;上线主机 3&#xff0c;msf配置一个…