当前位置: 首页 > news >正文

零知识证明(zk-SNARK)- groth16(一)

全称为 Zero-Knowledge Succinct Non-Interactive Argument of Knowledge,简洁非交互式零知识证明,简洁性使得运行该协议时,即便 statement 非常大,它的 proof 大小也仅有几百个bytes,并且验证一个 proof 的时间可以达到毫秒级别。
这是一个通用的零知识证明协议,可以用作各种证明,如范围证明。
核心方法是通过R1CS,QAP等方法将计算难题变为多项式,将计算结果正确性巧妙转化为了多项式的有特殊解的问题,生成对应proof,然后再运用多项式证明方法,来完成证明与验证。

Non-Interactive Argument of Knowledge of a Polynomial

(注意 计算和参数选取是在域内,即有模运算)

一般多项式的证明

场景如下:Verifier 有一个多项式 f ( x ) f(x) f(x),Prover 向 Verifer 证明他知道这一个多项式。
假设 Prover 知道的多项式为 p ( x ) p(x) p(x),那么现在要证明的就是 f ( x ) = p ( x ) f(x)=p(x) f(x)=p(x),如果这两个多项式的阶数最高为 d d d,那么两个多项式代表的曲线将最多有 d d d个交点,当 Verifier 随机在一个很大的范围内取一个值 s s s的时候,那么 s s s d d d相同的概率会非常低,所以有以下协议

  • Verifier 在大范围里随机选择一个值 s s s,并且在本地计算 f ( s ) f(s) f(s),然后把 s s s发送给 Prover
  • Prover 计算 p ( s ) p(s) p(s),然后发送给Verifier
  • Verifier 验证 f ( s ) = ? p ( s ) f(s)\overset{?}=p(s) f(s)=?p(s)

证明多项式的根

有些多项式是可以分解多个多项式的乘积的,如假设 p ( x ) = ( x − a ) ( x − b ) ( x − c ) p(x)=(x-a)(x-b)(x-c) p(x)=(xa)(xb)(xc)那么
假设 Prover 有一个多项式 p ( x ) p(x) p(x),现在他想证明他的多项式持有一部分根(部分多项式),也就是证明他的多项式 p ( x ) = t ( x ) h ( x ) p(x)=t(x)h(x) p(x)=t(x)h(x)中包含 t ( x ) t(x) t(x)假设为 ( x − a ) ( x − b ) (x-a)(x-b) (xa)(xb),而此时的 t ( x ) t(x) t(x)称为目标多项式,是公开的,要注意 Prover 是不能透露原多项式的。那么有以下协议

  • Verifier 在大范围内随机取值 s s s,计算 t = t ( s ) t= t(s) t=t(s),然后将 s s s发送给 Prover
  • Proer 计算 h ( x ) = p ( x ) t ( x ) h( x) = \frac {p(x)}{t(x)} h(x)=t(x)p(x), h ( s ) h(s) h(s), p ( s ) p(s) p(s),然后发送后两个给 Verifier
  • Verfier 验证 p ( s ) = ? t ( s ) h ( s ) p(s)\overset{?}=t(s)h(s) p(s)=?t(s)h(s)

显而易见以上变量都局限为整数,如果 p p p确实能够整除 t t t,那么等式一定是成立的,如果不能,那么式子将存在余式,有极大的概率不是整数。
当然此协议仍然有很大漏洞,比如 Prover 可能完全不知道 p ( x ) p(x) p(x),但知道公开的 t ( x ) t(x) t(x),所以可以完全捏造出 h ( x ) h(x) h(x)满足条件。

同态加密

显然我们不能在协议里进行明文的传输,但又需要密文的计算,所以需要一个满足加密和计算两种特性的算法。
同态加密算法 E ( x ) E(x) E(x),如 E ( a x + b y ) = g a x + b y = g a x ⋅ g b y = ( g x ) a ⋅ ( g y ) b = E ( x ) a ⋅ E ( y ) b . E(a x+b y)=g^{a x+b y}=g^{a x} \cdot g^{b y}=\left(g^{x}\right)^{a} \cdot\left(g^{y}\right)^{b}=E(x)^{a} \cdot E(y)^{b} . E(ax+by)=gax+by=gaxgby=(gx)a(gy)b=E(x)aE(y)b. g g g是生成元),这里基于离散对数难题和 CDH 假设(即给定 g a , g b g^a,g^b ga,gb,得到 g a b g^{ab} gab很困难)。显然这是仅仅满足同态加法的同态加密,不支持密文相乘。
那么该算法不支持乘法,仅有一个 s s s的情况下,该怎么同态计算多项式呢?显然是不行的,于是想办法把同态乘法转变为同态加法,注意到,多项式 P ( x ) P(x) P(x)可以看作是一组系数和未知数的线性结合,也就是计算出 s s s的各个幂次,这需要固定好多项式的阶数 d d d,相当于限制了多项式的阶数,这样提前计算出 s 1 , … , s d s^1,\dots,s^d s1,,sd,然后计算出多项式的每个部分相加即可。
具体使用如下,

  1. Verifier 在大范围里随机选择一个 s s s,先计算好 s s s的幂次 s 1 , … , s d s^1,\dots,s^d s1,,sd,接着计算 t ( s ) t(s) t(s),最后 E ( 1 ) , E ( s ) , … , E ( s d ) E(1),E(s),\dots,E(s^d) E(1),E(s),,E(sd)并发给 Prover
  2. Prover 收到数据后计算, h ( x ) = p ( x ) t ( x ) h( x) = \frac {p(x)}{t(x)} h(x)=t(x)p(x),然后配合多项式的系数计算 E ( p ( s ) ) E(p(s)) E(p(s)) E ( h ( s ) ) E(h(s)) E(h(s))并发送给Verifier
  3. Verifier 进行验证 E ( p ( s ) ) = ? E ( t ( s ) ) E ( h ( s ) ) E(p(s))\overset{?}=E(t(s))E(h(s)) E(p(s))=?E(t(s))E(h(s)),即 g p ( s ) = ( g h ( s ) ) t ( s ) g^{p(s)} = (g^{h(s)})^{t(s)} gp(s)=(gh(s))t(s)

** KCA(The Knowledge of Coefficient Test and Assumption)**

上面的协议的还是有很大漏洞,比如 Prover 在计算多项式的时候,没有采用多项式的格式(常数系数和未知数的线性组合),而是使用了另外的方法,算法找到一个满足 z p = ( z h ) t ( s ) z_p = (z_h)^{t(s)} zp=(zh)t(s)的两个值 z p , z h z_p,z_h zp,zh去替代掉 g p ( s ) , g h ( s ) g^{p(s)},g^{h(s)} gp(s),gh(s),也就是根本没用多项式,直接仿造了满足条件的结果。
这里就需要对 Prover 进行限制,让他必须使用满足条件的多项式,限定为常数,也限定了指数,不能随意改变指数。所以KCA也可以叫做KEA(Knowledge of exponent)
思路如下,
定义一对元素 ( a , b = α ⋅ a ) (a,b = \alpha \cdot a) (a,b=αa)(称为一个 α \alpha α-对), α ⋅ a \alpha \cdot a αa表示 α \alpha α a a a相加,也就是 a α a^\alpha aα,那么一个KC流程如下具体如下,

  1. 首先Verifier会随机选择一个非零的 α \alpha α,计算 b = α ⋅ a b = \alpha \cdot a b=αa,定义这是一个 α − s h i f t \alpha -shift αshift
  2. Verifier 发送这个 challenge pair ( a , b ) (a,b) (a,b)给 Prover。
  3. 这时候 Prover 会 respond 一对不一样,但具有相同性质的 pair ( a ′ , b ′ ) (a',b') (a,b),它应当是 α − s h i f t \alpha -shift αshift
  4. 如果收到的是一个 α − s h i f t \alpha -shift αshift,那么Verifier 接受这个response

注意,这是满足DL问题的, Prover 是很难找到一个 α \alpha α,那么她该如何构造新的 α − s h i f t \alpha -shift αshift呢?一个显而易见的方式是,Prover 选择一个常数系数 γ \gamma γ,直接构造 ( a ′ , b ′ ) = γ ( a , b ) (a',b') = \gamma(a,b) (a,b)=γ(a,b)
假设 Verifier 发送的不是一个,而是是 d d d α − s h i f t \alpha -shift αshift,那么 Prover 也将选择一组系数 c 1 , … , c d c_1,\dots,c_d c1,,cd,respond 一个
( a ′ , b ′ ) = ( ∑ i = 1 d c i a i , ∑ i = 1 d c i b i ) (a',b') = (\sum_{i=1}^d c_ia_i,\sum_{i=1}^d c_ib_i) (a,b)=(i=1dciai,i=1dcibi),显然该对也是满足 α − s h i f t \alpha -shift αshift。如果把 Verifier 发的内容优化一下,就构成了KCA。

Blind Evaluation of Polynomials Verifiable Protocol

完整的多项式盲验证协议。
解决整个问题需要满足的两个性质:

  • **Blindness:**也就是 Prover 不能获取到 s s s,同样 Verifier 也不能拿到 p ( x ) p(x) p(x)(同态)。
  • **Verifiability:**也就是得确保 Prover 发的 E ( p ( x ) ) E(p(x)) E(p(x))确实是用某个多项式 p ( x ) p(x) p(x)计算的,而不是完全不相关的数据(KCA)

那么使用KCA对前面协议进行优化如下,

  1. Verifier 随机选择 α \alpha α(非0)和 s s s,然后计算 t ( s ) t(s) t(s),接着构造 α − s h i f t \alpha -shift αshift ( g , g α ) , ( g s , g α ⋅ s ) , … , ( g s d , g α ⋅ s d ) (g,g^{\alpha}),(g^s,g^{\alpha \cdot s} ),\dots,(g^{s^d},g^{\alpha \cdot s^d}) (g,gα),(gs,gαs),,(gsd,gαsd)
  2. Prover 则使用多项式 p ( x ) p(x) p(x)的系数 c 1 , … , c d c_1,\dots,c_d c1,,cd,然后计算 E ( h ( s ) ) E(h(s)) E(h(s))以及 ( E ( p ( s ) ) , E ( α p ( s ) ) ) = ( g ∑ i = 1 d c i s i , g ∑ i = 1 d c i α ⋅ s d ) (E(p(s)),E(\alpha p(s))) = (g^{\sum_{i=1}^d c_is^i},g^{\sum_{i=1}^d c_i\alpha \cdot s^d}) (E(p(s)),E(αp(s)))=(gi=1dcisi,gi=1dciαsd),发送给Verifier
  3. Verifier进行验证 E ( p ( s ) ) = ? E ( α p ( s ) ) E(p(s))\overset ?=E(\alpha p(s)) E(p(s))=?E(αp(s)) E ( p ( s ) ) = ? E ( t ( s ) ) E ( h ( s ) ) E(p(s))\overset{?}=E(t(s))E(h(s)) E(p(s))=?E(t(s))E(h(s))即可

该方案也可以解决前面的问题,即Prover 不能随意构造满足类似 z p = ( z h ) t ( s ) z_p = (z_h)^{t(s)} zp=(zh)t(s) h ( s ) h(s) h(s),这样会很容易不满足 α − s h i f t \alpha -shift αshift的限制条件。

Parings and bilinear map

前面的协议基本实现了诚实两方之间的交互方案,相关的 proof 仅仅在两方之间有效,无法重复使用,但在实际运用中,存在这恶意的多方的情况,这显然不符合实际。所以,需要让一些秘密参数变得可重复使用甚至公开,而且足够可信以防止滥用。
首先考虑将 Verifier 生成的 ( t ( s ) , α ) (t(s),\alpha) (t(s),α)进行加密保护,防止泄露。如果采用前面的同态加密,那么在后面的乘法计算中就会涉及到同态的乘法 ,但是前面用的同态算法不支持同态乘法。那么必须用到类似乘法的时候应该怎么办呢?这时候就引入了椭圆双曲线映射。
Parings 是能够将一个集合里的两个加密输入确定性的映射到另一个集合里的一个输出的一种乘法表示函数。
即: e : G × G → G T e: \mathbb{G} \times \mathbb{G} \rightarrow \mathbb{G}_T e:G×GGT满足以下性质
e ( g 1 a , g 2 b ) = e ( g 1 , g 2 ) a b = e ( g 1 a b , g 2 ) = e ( g 1 , g 2 a b ) \begin{aligned}e(\mathrm{g_1^a,g_2^b})&=\mathrm{e(g_1,g_2)^{ab}=e(g_1^{ab},g_2)=e(g_1,g_2^{ab})}\end{aligned} e(g1a,g2b)=e(g1,g2)ab=e(g1ab,g2)=e(g1,g2ab)
e ( g 1 a , g 2 b ) e ( g 1 c , g 2 d ) = e ( g 1 , g 2 ) a b + c d \begin{aligned} e(\mathrm{g_1^a,g_2^b})e(\mathrm{g_1^c,g_2^d})&=\mathrm{e(g_1,g_2)^{ab+cd}}\end{aligned} e(g1a,g2b)e(g1c,g2d)=e(g1,g2)ab+cd
其意义在于,将某个群中的一对元素映射到一个新的群,当且仅当两个原像对应指数的积相同其像也相同。并且,该函数要求是可计算的(即不需要用暴力搜索等方式),它能够验证一对(加密后的)数据的乘积是否和另一对相同(虽然算不出这个乘积)
接下来将协议的计算放到满足Parings的椭圆曲线群上来。

Multiple Parties Composite Common Reference String

首先引入一个可信的第三方来随机生成 s s s α \alpha α,并且计算出CRS(Common Reference String),共证明和验证两部分,都是公开的( i ∈ { 0 , … , d } i \in \{0,\dots,d\} i{0,,d}),接着需要删除掉 s s s α \alpha α

  • Proving Key: E ( s i ) , E ( α s i ) = g s i , g α s i E(s^i),E(\alpha s^i) = g^{s^i},g^{\alpha s^i} E(si),E(αsi)=gsi,gαsi
  • Verification Key: E ( t ( s ) ) , E ( α ) = g t ( s ) , g α E(t(s)),E(\alpha) = g^{t(s)},g^{\alpha} E(t(s)),E(α)=gt(s),gα

接着基于CRS,让 Prover 和 Verifier 仅仅通过CRS就能完成协议。继续优化协议如下,(下面简化 p = p ( s ) , t , h p=p(s),t,h p=p(s),t,h也类似)

  • 对于 Prover 来说,公开的CRS中已经包含了第一步的内容,接下来是利用 Proving Key 来计算出 E ( h ( s ) ) E(h(s)) E(h(s)) ( E ( p ( s ) ) , E ( α p ( s ) ) ) (E(p(s)),E(\alpha p(s))) (E(p(s)),E(αp(s)))
  • 对于Verifier来说,是利用CRS中的 Verfication来进行验证( p ′ = α p p' = \alpha p p=αp
    • 首先验证 p = t ⋅ h p=t \cdot h p=th,即 e ( g p , g 1 ) = e ( g t , g h ) = e ( g , g ) p = e ( g , g ) t ⋅ h e(g^p,g^1) = e(g^t,g^h) = e(g,g)^p = e(g,g)^{t \cdot h} e(gp,g1)=e(gt,gh)=e(g,g)p=e(g,g)th
    • 然后验证 α − s h i f t \alpha -shift αshift,即 e ( g p , g α ) = e ( g p ′ , g ) e(g^p,g^\alpha) = e(g^{p'},g) e(gp,gα)=e(gp,g)

注意:这里也暴露出两个问题,

  1. Proving Key 中的 E ( α ) E(\alpha) E(α)是公开的,也就是对于 Prover 来说 ,他是可以打破多项式的限制条件的。
  2. 引入了一个可信第三方,但更复杂的现实中不能保证第三方不存在恶意,比如不销毁 trusted setup 的随机秘密,这一旦暴露会导致任何人都可以伪造证明。

于是 ZKSNARK 引入了多方联合的setup,每个人用自己的私钥 ( α , s ) (\alpha,s) (α,s)和前一个人生成的 CRS 作为输入生成一个新的 CRS,只要保证有一个人销毁了私钥,就能保证最终的CRS是安全的。具体实现如下,
假设有三方 Alice,Bob,Carol 参与,仅需要使用同态乘法让每个人的私钥相加即可
image.png
同理参与方 Carol 公开后也可以进行验证。

完整的简短非交互式的多项式证明方案

这里用 { g s i } i ∈ [ d ] \{g^{s^i}\}_{i\in[d]} {gsi}i[d]代表 s 1 , … , s d s^1,\dots,s^d s1,,sd
首先确定好目标多项式 t ( x ) t(x) t(x)和 prover 的多项式的阶数 d d d,prover 需要证明他持有的多项式里含有 t ( x ) t(x) t(x)
具体如下
image.png

参考

浅谈零知识证明:背景与起源
zcash官方科普
Exploring Elliptic Curve Pairings
Quadratic Arithmetic Programs: from Zero to Hero
Why and how zk-SNARK works
ZKSNARK介绍
李威翰,张宗洋,周子博等.简洁非交互零知识证明综述[J].密码学报,2022,9(03):379-447.DOI:10.13868/j.cnki.jcr.000525.

相关文章:

零知识证明(zk-SNARK)- groth16(一)

全称为 Zero-Knowledge Succinct Non-Interactive Argument of Knowledge,简洁非交互式零知识证明,简洁性使得运行该协议时,即便 statement 非常大,它的 proof 大小也仅有几百个bytes,并且验证一个 proof 的时间可以达…...

Spring java和go并发的实现策略

Spring Java框架和Go框架在处理并发请求时采用了不同的策略。 1. Spring Java框架: Spring框架基于Java语言,通常使用线程池来处理并发请求。具体来说,Spring框架中的Servlet容器(如Tomcat、Jetty等)会使用线程池来管…...

第二十五章 JDBC 和数据库连接池

一、JDBC 概述(P821) 1. 基本介绍 (1)JDBC 为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题。 (2)Java 程序员使用 JDBC,可以连接任何提供了 JDBC 驱动程序的数据库系统…...

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的固定帧率(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的固定帧率(C) Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在NEOAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过NEOAPI SDK设置相机固定…...

基于Java课堂签到系统

基于Java课堂签到系统 功能需求 1、用户登录:学生需要使用学号或手机号等唯一标识登录系统。 2、签到功能:在课堂开始时,学生可以通过系统进行签到,以证明出席。 3、签出功能:在课堂结束时,学生可以通过…...

springboot整合webservice使用总结

因为做的项目中用到了webservice,所以在此总结一下。 一、webservice简介 Web Service也叫XML Web Service, WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务,使…...

MySQL中的索引之分类,原理,作用,优缺点和执行计划

索引 索引的作用:加速查找 例如: 300w条数据的表中查询,无索引需要700s, 利用索引可能只需要1s用索引的时机是,数据量巨大,并且搜索快速 索引为什么能实现加速查找 基于索引的内部存储结构索引底层基于 BTree 的数据结构存储的在…...

如何做好档案数字化前的鉴定工作

要做好档案数字化前的鉴定工作,可以按照以下步骤进行: 1. 确定鉴定目标:明确要鉴定的档案的内容、数量和性质,确定鉴定的范围和目标。 2. 进行档案清点:对档案进行全面清点和登记,包括数量、种类、状况等信…...

pytorch04:网络模型创建

目录 一、模型创建过程1.1 以LeNet网络为例1.2 LeNet结构1.3 nn.Module 二、网络层容器(Containers)2.1 nn.Sequential2.1.1 常规方法实现2.1.2 OrderedDict方法实现 2.2 nn.ModuleList2.3 nn.ModuleDict2.4 三种容器构建总结 三、AlexNet网络构建 一、模型创建过程 1.1 以LeNe…...

用js让用户输入一个数累加和

需求&#xff1a;用户输入一个数&#xff0c; 计算 1 到这个数的和。 比如 用户输入的是 5&#xff0c; 则计算 1~5 之间的累加和 并且输出到控制台 <body><script>let numprompt(请输入一个数)let sum0for(let i1;i<num;i){sumi}console.log(sum)</script…...

踩坑记录-安装nuxt3报错:Error: Failed to download template from registry: fetch failed;

报错复现 安装nuxt3报错&#xff1a;Error: Failed to download template from registry: fetch failednpx nuxi init nuxt-demo 初始化nuxt 项目 报错 Error: Failed to download template from registry: fetch faile 解决方法 配置hosts Mac电脑&#xff1a;/etc/hostswin电…...

大数据学习(31)-Spark非常用及重要特性

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…...

【教学类-43-14】 20240103 (4宫格数独:正确版:576套) 不重复的基础模板数量:576套

作品展示&#xff1a;&#xff1a;——4宫格 576套不重复模板&#xff08;48页*12套题&#xff09; 背景需求&#xff1a; 生成4宫格基础模板768套&#xff0c;观看64页内容时&#xff0c;明显看到有错误 【教学类-43-13】 20240103 &#xff08;4宫格数独&#xff1a;错误版…...

AIGC开发:调用openai的API接口实现简单机器人

简介 开始进行最简单的使用&#xff1a;通过API调用openai的模型能力 OpenAI的能力如下图&#xff1a; 文本生成模型 OpenAI 的文本生成模型&#xff08;通常称为生成式预训练 Transformer 或大型语言模型&#xff09;经过训练可以理解自然语言、代码和图像。这些模型提供文…...

c基础(二)

指针&#xff1a; 含义&#xff1a;是一个值&#xff0c;一个值代表着一个内存地址&#xff0c;类似于存放路径 * 运算符 &#xff1a; 1 字符*表示指针 作用&#xff1a;通常跟在类型关键字的后面&#xff0c;表示指针指向的是什么类型的值 int * foo, * bar;声明指针后会…...

人工智能趋势报告解读:ai野蛮式生长的背后是机遇还是危机?

近期&#xff0c;Enterprise WordPress发布了生成式人工智能在营销中的应用程度的报告&#xff0c;这是一个人工智能迅猛发展的时代&#xff0c;目前人工智能已经广泛运用到内容创作等领域&#xff0c;可以预见的是人工智能及其扩展应用还将延伸到我们工作与生活中的方方面面。…...

三、C语言中的分支与循环—goto语句 (10) (完)

在C语言中&#xff0c;goto语句允许程序无条件地跳转到同一函数内的标记位置。这个标记位置通过一个标签和冒号(:)来标示。goto语句可以用于从深层嵌套的循环或条件语句中直接跳出&#xff0c;或者跳过某些代码执行。尽管goto语句在某些情况下可以使程序逻辑变得清晰&#xff0…...

RabbitMQ 常见问题

1. 如何保证消息顺序消费 在RabbitMQ中&#xff0c;消息最终会保存在队列中&#xff0c;在同一个队列中&#xff0c;消息是顺序的&#xff0c;保持先进先出的原则&#xff0c;这个由Rabbitmq保证。而不同队列中的消息&#xff0c;RabbitMQ 是无法保证其顺序性。顺序消费主要是…...

阶段二-Day10-日期类

日期类结构: 1.java.util.Date是日期类 2.DateFormat是日期格式类、SimpleDateFormat是日期格式类的子类 Timezone代表时区 3.Calendar是日历类&#xff0c;GregorianCalendar是日历的子类 一. 常用类-Date 1.1 Date构造方法 Date(long date) 使用给定的毫秒时间价值构建…...

多任务并行处理相关面试题

我自己面试时被问过两次多任务并行相关的问题&#xff1a; 假设现在有10个任务&#xff0c;要求同时处理&#xff0c;并且必须所有任务全部完成才返回结果 这个面试题的难点是&#xff1a; 既然要同时处理&#xff0c;那么肯定要用多线程。怎么设计多线程同时处理任务呢&…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...