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

零知识证明:区块链隐私保护的变革力量

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述


在这里插入图片描述

零知识证明:区块链隐私保护的变革力量

一、引言

在当今数字化时代,数据隐私和安全已成为人们日益关注的焦点。随着区块链技术的广泛应用,其在数据存储和传输过程中的安全性和透明度备受赞誉,但同时也面临着隐私泄露的潜在风险。在区块链网络中,交易信息通常是公开可见的,这虽然保证了交易的可追溯性和不可篡改性,但也可能暴露用户的敏感信息,如交易金额、交易双方身份等。

为了解决这一问题,一种名为零知识证明的“黑科技”应运而生零知识证明允许一方(证明者)向另一方(验证者)证明某个陈述是真实的,而无需透露除了该陈述为真之外的任何额外信息。这一概念在区块链领域的应用具有深远的意义,它能够在不影响区块链核心特性(如去中心化、透明度和安全性)的前提下,为用户提供强大的隐私保护。

例如,在加密货币交易中,用户可以使用零知识证明向区块链网络证明自己拥有足够的资金进行交易,而无需透露具体的账户余额或交易历史。这不仅保护了用户的隐私,还能确保交易的合法性和有效性。此外,零知识证明还可以应用于身份验证、供应链管理、医疗保健等众多领域,为这些领域的数据隐私保护提供创新的解决方案。

在本文中,我们将深入探讨区块链技术的基本概念原理特性和应用场景,详细介绍零知识证明的工作原理及其在区块链中的应用方式,并通过实际代码示例展示其具体实现过程。通过对这些内容的深入理解,我们将能够清晰地看到零知识证明如何正在改变并将继续改变区块链技术的未来发展方向,为构建更加安全、私密和高效的数字世界奠定坚实的基础。

二、区块链概述

在这里插入图片描述

2.1 区块链的概念

区块链是一种分布式账本技术,它将数据以区块的形式进行存储,并通过密码学算法确保这些区块之间的链接安全可靠。每个区块包含了一批交易信息以及指向前一个区块的哈希指针,形成了一条从创世区块开始的链式结构。

这种分布式账本的独特之处在于它不依赖于单一的中心化机构来维护,而是由众多的节点(参与者)共同参与维护。每个节点都拥有整个区块链的副本,并且通过特定的共识机制来达成对新交易和区块的一致性认可。

例如,比特币就是基于区块链技术构建的一种数字货币系统。在比特币网络中,全球各地的计算机节点共同维护着一个公共的区块链账本,记录着所有比特币的交易历史。当一笔新的比特币交易发生时,它会被广播到网络中的各个节点,经过节点的验证和确认后,被打包进一个新的区块,并添加到区块链中。

2.2 区块链的原理

  • 交易与区块:在区块链中,交易是最基本的操作单元。用户发起的交易包含了发送方地址、接收方地址、交易金额等信息。这些交易被收集起来,组成一个区块。一个区块通常还包含一个区块头和区块体。区块头中存储了区块的元信息,如前一区块的哈希值、时间戳、难度目标等,区块体则包含了该区块内的所有交易信息。
  • 哈希算法:哈希算法在区块链中起着至关重要的作用。它将任意长度的数据转换为固定长度的哈希值。例如,比特币使用的 SHA-256 哈希算法,无论输入的数据有多长,输出的哈希值都是 256 位。哈希算法具有单向性,即从哈希值很难反推出原始数据;同时,它还具有抗碰撞性,即很难找到两个不同的数据产生相同的哈希值。通过将区块头进行哈希运算,得到的哈希值作为该区块的唯一标识,并且由于前一区块的哈希值包含在当前区块头中,使得区块链的区块之间形成了紧密的链接关系。
  • 共识机制:为了确保区块链网络中的各个节点能够对交易和区块达成一致,需要一种共识机制。常见的共识机制有工作量证明(Proof of Work,PoW)、权益证明(Proof of Stake,PoS)等。以工作量证明为例,节点需要通过不断地尝试计算一个满足特定难度要求的哈希值(称为挖矿),来竞争创建新的区块的权利。第一个找到符合要求哈希值的节点将其创建的区块广播到网络中,其他节点在接收到区块后,会验证区块的有效性,如果验证通过,则将该区块添加到自己维护的区块链副本中,从而实现了整个网络对区块的一致性认可。

2.3 区块链的特性

  • 去中心化:区块链不存在一个中心化的控制机构,而是由众多的节点共同参与管理。这意味着没有单个实体能够完全掌控整个区块链的运行。例如,在比特币网络中,没有银行或政府机构来决定谁可以进行交易或控制货币的发行。去中心化的特性使得区块链具有更高的抗审查性和可靠性,因为即使部分节点遭受攻击或出现故障,整个网络仍然能够正常运行。
  • 透明度:区块链上的交易信息是公开透明的,所有的节点都可以查看区块链上的历史交易记录。这种透明度有助于建立信任,因为任何人都可以验证交易的真实性和合法性。例如,在供应链管理中,消费者可以通过区块链查看产品的生产、运输和销售等各个环节的信息,确保产品的质量和来源可靠。
  • 安全性:区块链采用了多种密码学技术来确保其安全性。哈希算法保证了区块数据的完整性,使得数据一旦被记录在区块链上就难以被篡改。同时,数字签名技术用于验证交易的发起者身份,防止交易被伪造。此外,由于区块链的分布式存储特性,攻击者需要控制大量的节点才能对区块链进行有效的攻击,这大大增加了攻击的难度和成本。

2.4 区块链的应用场景

  • 数字货币:如比特币、以太坊等加密货币是区块链最著名的应用。它们允许用户在无需第三方中介的情况下进行安全、快速的价值转移。
  • 供应链管理:通过在区块链上记录产品的生产、加工、运输等信息,可以实现供应链的全程追溯,提高供应链的透明度和效率,降低假冒伪劣产品的风险。
  • 金融服务:区块链可以用于跨境支付、证券交易结算、信贷征信等金融领域。例如,跨境支付可以通过区块链实现更快、更便宜的资金转移,减少中间银行的手续费和处理时间。
  • 智能合约:以太坊等区块链平台支持智能合约的运行。智能合约是一种自动执行的合约条款,以代码的形式部署在区块链上。例如,在房地产交易中,可以通过智能合约实现自动的产权转移和资金交割,减少人为错误和欺诈风险。
  • 医疗保健:患者的医疗记录可以存储在区块链上,实现医疗数据的安全共享和隐私保护。不同的医疗机构可以在患者授权的情况下访问和更新这些数据,提高医疗诊断的准确性和效率。

三、零知识证明基础

在这里插入图片描述

3.1 零知识证明的概念

零知识证明是一种密码学技术,它允许证明者向验证者证明某个陈述是真实的,而无需透露陈述本身之外的任何其他信息。简单来说,就是证明者能够让验证者相信某个事实,却不泄露关于这个事实的具体细节。

例如,假设有一个迷宫,证明者知道从入口到出口的路径,但不想直接告诉验证者这条路径。通过零知识证明,证明者可以以一种交互的方式向验证者证明自己知道路径,而验证者在这个过程中无法得知路径的具体走向。

3.2 零知识证明的原理

在这里插入图片描述

零知识证明通常基于一些复杂的数学假设和密码学算法来实现。其中一个常见的原理是基于离散对数问题或椭圆曲线离散对数问题。

以离散对数问题为例,假设有一个大素数 (p) 和一个生成元 (g),对于给定的 (y = g^x \bmod p),计算 (x) 是非常困难的(离散对数问题)。证明者知道 (x),要向验证者证明自己知道 (x) 且不透露 (x) 的值。证明者可以通过以下步骤进行零知识证明:

  1. 证明者选择一个随机数 (r),计算 (a = g^r \bmod p),并将 (a) 发送给验证者。
  2. 验证者选择一个随机挑战 (c)(通常是 0 或 1),并将 (c) 发送给证明者。
  3. 如果 (c = 0),证明者计算 (z = r);如果 (c = 1),证明者计算 (z = r + x \bmod (p - 1)),然后将 (z) 发送给验证者。
  4. 验证者收到 (z) 后,如果 (c = 0),则验证 (a = g^z \bmod p);如果 (c = 1),则验证 (a \cdot y = g^z \bmod p)。如果验证通过,则证明者的证明有效。

在这个过程中,验证者每次只能得到一个与 (x) 相关的部分信息(通过 (z)),但由于随机挑战 (c) 的存在,验证者无法通过多次交互拼凑出 (x) 的完整值,从而实现了零知识证明。

3.3 零知识证明的类型

  • 交互式零知识证明:如上述迷宫例子和离散对数问题的证明过程,证明者和验证者需要进行多轮的交互,验证者通过随机挑战来逐步验证证明者的陈述。这种类型的零知识证明在早期研究中较为常见,但由于需要交互,在一些应用场景中可能存在效率和可扩展性问题。
  • 非交互式零知识证明:为了克服交互式零知识证明的局限性,非交互式零知识证明应运而生。它通过使用一些可信的公共随机源(如区块链上的哈希值)来替代验证者的随机挑战,使得证明者可以一次性生成证明,验证者可以在任何时候独立地验证证明的有效性。非交互式零知识证明在区块链应用中更为实用,因为它可以减少网络通信开销,提高系统的效率和可扩展性。

四、零知识证明在区块链中的应用

4.1 隐私保护交易

在区块链数字货币交易中,零知识证明可以用于隐藏交易的金额、发送方和接收方的具体信息。例如,在 Zcash 这种隐私加密货币中,采用了零知识证明技术(具体为 zk - SNARKs)来实现隐私保护交易。

当用户进行交易时,交易信息会被加密处理,并且通过零知识证明向区块链网络证明交易的合法性,如证明发送方有足够的资金进行交易、交易金额未被篡改等,而无需透露交易的具体细节。这样,区块链上的其他节点只能看到交易是合法的,但无法得知交易的具体内容,从而保护了用户的隐私。

4.2 身份验证与授权

在区块链的身份验证和授权场景中,零知识证明可以让用户证明自己拥有某些身份属性或权限,而无需暴露具体的身份信息。

例如,在一个基于区块链的访问控制系统中,用户可以使用零知识证明向系统证明自己满足特定的访问条件,如年龄超过 18 岁、是某个组织的成员等,而无需提供身份证号码、组织成员证号等敏感信息。系统只需要验证零知识证明的有效性,就可以决定是否给予用户访问权限。

4.3 智能合约隐私

智能合约在区块链上运行时,其代码和执行结果通常是公开可见的。零知识证明可以用于保护智能合约中的敏感数据和逻辑。

例如,一个涉及商业机密的智能合约,如企业之间的合作协议智能合约,合约中的某些关键条款(如价格、利润分配等)可以通过零知识证明进行加密处理。在合约执行过程中,只有参与方能够通过零知识证明验证合约条款的执行情况,而外部观察者无法得知合约的具体内容,从而保护了企业的商业机密。

五、零知识证明代码示例与注释

5.1 基于Java的代码示例

以下是一个简单的基于Java的区块链零知识证明示例代码,这里以简化的离散对数问题场景来展示零知识证明的基本原理。示例代码实现了证明者向验证者证明自己知道某个离散对数问题的解,同时不泄露具体解的值。

import java.math.BigInteger;
import java.security.SecureRandom;public class ZeroKnowledgeProofExample {// 大素数pprivate static final BigInteger P = new BigInteger("23");// 生成元gprivate static final BigInteger G = new BigInteger("5");// 证明者知道的秘密值xprivate static final BigInteger X = new BigInteger("3");// 证明者选择随机数r的方法private static BigInteger proverChooseRandom() {SecureRandom random = new SecureRandom();// 生成一个在1到P - 1之间的随机数return new BigInteger(P.bitLength() - 1, random).add(BigInteger.ONE);}// 证明者生成a = g^r mod p的方法private static BigInteger proverGenerateA(BigInteger r) {return G.modPow(r, P);}// 验证者生成随机挑战c(0或1)的方法private static int verifierGenerateChallenge() {SecureRandom random = new SecureRandom();return random.nextInt(2);}// 证明者根据挑战c生成z的方法private static BigInteger proverGenerateZ(BigInteger r, int c) {if (c == 0) {return r;} else {return r.add(X).mod(P.subtract(BigInteger.ONE));}}// 验证者验证证明的方法private static boolean verifierVerify(BigInteger a, int c, BigInteger z) {if (c == 0) {return G.modPow(z, P).equals(a);} else {BigInteger gToZ = G.modPow(z, P);BigInteger gToX = G.modPow(X, P);return gToZ.multiply(gToX).mod(P).equals(a);}}// 主函数进行零知识证明过程public static void main(String[] args) {// 证明者选择随机数rBigInteger r = proverChooseRandom();// 证明者生成aBigInteger a = proverGenerateA(r);// 验证者生成挑战cint c = verifierGenerateChallenge();// 证明者生成zBigInteger z = proverGenerateZ(r, c);// 验证者验证证明boolean result = verifierVerify(a, c, z);if (result) {System.out.println("零知识证明成功!");} else {System.out.println("零知识证明失败!");}}
}

以下是对上述代码的详细注释:

  1. 定义常量部分
// 大素数p
private static final BigInteger P = new BigInteger("23");
// 生成元g
private static final BigInteger G = new BigInteger("5");// 证明者知道的秘密值x
private static final BigInteger X = new BigInteger("3");

这里定义了零知识证明示例所基于的离散对数问题的相关参数。P是一个大素数,G是对应的生成元,X是证明者所知道的秘密值(在实际场景中,这个值是不对外公开的,但在示例中为了演示方便先进行了定义)。

  1. 证明者选择随机数 r 的方法
// 证明者选择随机数r的方法
private static BigInteger proverChooseRandom() {SecureRandom random = new SecureRandom();// 生成一个在1到P - 1之间的随机数return new BigInteger(P.bitLength() - 1, random).add(BigInteger.ONE);
}

这个方法用于让证明者选择一个随机数r。通过SecureRandom类来生成一个在1P - 1之间的随机数,以满足离散对数问题的计算要求。

  1. 证明者生成 a = g^r mod p 的方法
// 证明者生成a = g^r mod p的方法
private static BigInteger proverGenerateA(BigInteger r) {return G.modPow(r, P);
}

根据证明者选择的随机数r,使用modPow方法计算Gr次幂对P取模的结果,即得到a的值。

  1. 验证者生成随机挑战 c01)的方法
// 验证者生成随机挑战c(0或1)的方法
private static int verifierGenerateChallenge() {SecureRandom random = new SecureRandom();return random.nextInt(2);
}

验证者通过SecureRandom类生成一个随机的整数,范围是01,作为对证明者的随机挑战c

  1. 证明者根据挑战 c 生成 z 的方法
// 证明者根据挑战c生成z的方法
private static BigInteger proverGenerateZ(BigInteger r, int c) {if (c == 0) {return r;} else {return r.add(X).mod(P.subtract(BigInteger.ONE));}
}

根据验证者给出的挑战c的值,如果c0,则z就等于之前选择的随机数r;如果c1,则z等于r加上秘密值X后对P - 1取模的结果。

  1. 验证者验证证明的方法
// 验证者验证证明的方法
private static boolean verifierVerify(BigInteger a, int c, BigInteger z) {if (c == 0) {return G.modPow(z, P).equals(a);} else {BigInteger gToZ = G.modPow(z, P);BigInteger gToX = G.modPow(X, P);return gToZ.multiply(gToX).mod(P).equals(a);}
}

验证者根据接收到的acz来验证零知识证明的有效性。如果c0,则验证Gz次幂对P取模的结果是否等于a;如果c1,则先分别计算Gz次幂和GX次幂对P取模的结果,然后将这两个结果相乘后对P取模,验证其是否等于a

  1. 主函数进行零知识证明过程
// 主函数进行零知识证明过程
public static void main(String[] args) {// 证明者选择随机数rBigInteger r = proverChooseRandom();// 证明者生成aBigInteger a = proverGenerateA(r);// 验证者生成挑战cint c = verifierGenerateChallenge();// 证明者生成zBigInteger z = proverGenerateZ(r, c);// 验证者验证证明boolean result = verifierVerify(a, c, z);if (result) {System.out.println("零知识证明成功!");} else {System.out.println("零知识证明失败!");}
}

在主函数中,按照零知识证明的流程依次调用前面定义的各个方法。首先证明者选择随机数r并生成a,然后验证者生成挑战c,接着证明者根据c生成z,最后验证者验证证明并根据结果输出相应的提示信息。

请注意,这个示例只是一个非常简化的零知识证明演示,实际应用中的零知识证明会更加复杂,涉及到更严格的数学假设、更高的安全性要求以及更复杂的交互和验证机制等。

5.2 基于python的代码示例

以下是一个简单的基于离散对数问题的零知识证明代码示例(使用 Python 语言):

# 大素数 p 和生成元 g
p = 23
g = 5# 证明者知道的秘密值 x
x = 3# 证明者选择随机数 r
def prover_choose_random():import randomreturn random.randint(1, p - 1)# 证明者生成 a = g^r mod p
def prover_generate_a(r):return (g ** r) % p# 验证者生成随机挑战 c(0 或 1)
def verifier_generate_challenge():import randomreturn random.randint(0, 1)# 证明者根据挑战 c 生成 z
def prover_generate_z(r, c):if c == 0:return relse:return (r + x) % (p - 1)# 验证者验证证明
def verifier_verify(a, c, z):if c == 0:return (g ** z) % p == aelse:return ((g ** z) * (g ** x)) % p == a# 主函数进行零知识证明过程
def zero_knowledge_proof():# 证明者选择随机数 rr = prover_choose_random()# 证明者生成 aa = prover_generate_a(r)# 验证者生成挑战 cc = verifier_generate_challenge()# 证明者生成 zz = prover_generate_z(r, c)# 验证者验证证明return verifier_verify(a, c, z)# 运行零知识证明并输出结果
if __name__ == "__main__":result = zero_knowledge_proof()if result:print("零知识证明成功!")else:print("零知识证明失败!")

在上述代码中:

  • 首先定义了大素数 p 和生成元 g,以及证明者知道的秘密值 x
  • prover_choose_random 函数用于证明者选择一个随机数 r
  • prover_generate_a 函数根据随机数 r 计算 a = g^r mod p
  • verifier_generate_challenge 函数用于验证者生成随机挑战 c
  • prover_generate_z 函数根据挑战 c 和随机数 r 以及秘密值 x 计算 z
  • verifier_verify 函数用于验证者根据接收到的 acz 来验证零知识证明的有效性。
  • zero_knowledge_proof 函数将整个零知识证明的过程整合起来,最后在主函数中运行并输出证明结果。

六、总结

零知识证明作为一种强大的密码学技术,在区块链领域的应用正不断拓展和深化。它为区块链的隐私保护提供了创新的解决方案,使得区块链能够在保持去中心化、透明度和安全性等核心特性的同时,更好地保护用户的隐私信息。通过在隐私保护交易、身份验证与授权、智能合约隐私等多个方面的应用,零知识证明正在重塑区块链的生态系统,为区块链技术在更多领域的广泛应用奠定了基础。

随着技术的不断发展,零知识证明在区块链中的应用将会更加成熟和完善,有望推动区块链技术走向更加安全、私密和高效的未来

七、参考资料文献

  • [1] 《区块链技术指南》,邹均,等著,机械工业出版社
  • [2] 《密码学原理与实践》,Douglas R. Stinson 著,电子工业出版社
  • [3] 以太坊官方文档:https://ethereum.org/
  • [4] Zcash 官方网站:https://z.cash/

相关文章:

零知识证明:区块链隐私保护的变革力量

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

解决:el-select可输入时失焦会失去输入框中值

1、展示部分 <template><el-select v-model"addForm.companyName" filterable placeholder"请输入/选择公司名称" :loading"loading":filter-method"(value) > dataFilter(value)" change"selectCompany">&…...

ollama-webui - Ollama的ChatGPT 风格的 Web 界面

更多AI开源软件&#xff1a; 发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - &#xff1a;发现分享好用的AI工具、AI开源软件、AI模型。收录了AI搜索引擎&#xff0c;AI绘画工具、AI对话聊天、AI音频工具、AI图片工具、AI视频工具、AI内容检测、AI法律助手、AI高考、AI志…...

「下载」智慧产业园区-数字孪生建设解决方案:重构产业全景图,打造虚实结合的园区数字化底座

数字孪生技术作为一种创新的管理工具&#xff0c;正逐步展现出其在智慧园区建设中的重要意义。以下将从几个方面详细阐述数字孪生在智慧园区建设中的关键作用。 一、提升园区运营管理的智能化水平 数字孪生技术通过构建园区的虚拟镜像&#xff0c;实现了对园区物理世界的全面…...

使用Grafana中按钮插件实现收发HTTP请求

最近项目中需要监控分布式集群的各项指标信息&#xff0c;需要用到PrometheusGrafana的技术栈实现对分布式集群的各个节点状态进行可视化显示&#xff0c;但是要求前端需要提供一个易用的接口让用户可以触发一些操作&#xff0c;例如负载高时进行负载均衡或弹性伸缩。网上找到的…...

【附源码】Electron Windows桌面壁纸开发中的 CommonJS 和 ES Module 引入问题以及 Webpack 如何处理这种兼容

背景 在尝试让 ChatGPT 自动开发一个桌面壁纸更改的功能时&#xff0c;发现引入了一个 wallpaper 库&#xff0c;这个库的入口文件是 index.js&#xff0c;但是 package.json 文件下的 type:"module"&#xff0c;这样造成了无论你使用 import from 还是 require&…...

Elasticsearch介绍及安装部署

Elasticsearch介绍 Elasticsearch 是一个分布式搜索引擎&#xff0c;底层基于 Lucene 实现。Elasticsearch 屏蔽了 Lucene 的底层细节&#xff0c;提供了分布式特性&#xff0c;同时对外提供了 Restful API。Elasticsearch 以其易用性迅速赢得了许多用户&#xff0c;被用在网站…...

物理层知识要点

文章目录 物理层接口的四大特性通信基础编码和调制&#xff08;1&#xff09;数字数据编码为数字信号&#xff08;2&#xff09;模拟数据编码为数字信号&#xff08;3&#xff09;常见调制方式&#xff08;3&#xff09;信道的极限容量 多路复用技术数据传输方式物理层下的传输…...

SpringBoot 自动装配原理及源码解析

目录 一、引言 二、什么是 Spring Boot 的自动装配 三、自动装配的核心注解解析 3.1 SpringBootApplication 注解 &#xff08;1&#xff09;SpringBootConfiguration&#xff1a; &#xff08;2&#xff09;EnableAutoConfiguration&#xff1a; &#xff08;3&#xf…...

Craft CMS 模板注入导致 Rce漏洞复现(CVE-2024-56145)(附脚本)

0x01 产品描述: ‌Craft CMS‌ 是一个灵活且强大的内容管理系统(CMS),专为创意团队和开发人员设计,提供高度可定制、直观且性能优越的网站和内容管理解决方案。它以用户友好的界面、强大的插件生态系统以及支持现代web开发最佳实践的特性而闻名‌0x02 漏洞描述: 由于模板…...

Next.js 新手容易犯的错误 _ 加载与缓存管理的关键(5)

1 错误地处理搜索参数&#xff08;Search Params&#xff09; 问题是什么&#xff1f; 在 Next.js 中&#xff0c;搜索参数指的是 URL 中用 ?keyvalue 表示的部分&#xff0c;比如 https://example.com/products?colorred 中的 colorred。这通常用于过滤、排序或选择某些选…...

/etc/fstab 文件学习systemd与该文件关系

文章目录 一、文件字段1.1、设备标识1.2、挂载点1.3、文件系统类型1.4、挂载选项1.5、dump1.5、fsck顺序 二、/etc/fstab 与systemd 的关系2.1、/etc/fstab 与systemd 的关系2.2、systemd 之前/etc/fstab生效过程2.3、systemd 时代/etc/fstab生效过程 三、相关知识3.1、如何更具…...

从源码分析swift GCD_DispatchGroup

前言&#xff1a; 最近在写需求的时候用到了DispatchGroup&#xff0c;一直没有深入去学习&#xff0c;既然遇到了那么就总结下吧。。。。 基本介绍&#xff1a; 任务组&#xff08;DispatchGroup&#xff09; DispatchGroup 可以将多个任务组合在一起并且监听它们的完成状态。…...

25计软新增考研院校!或可捡漏上岸!

C哥专业提供——计软考研院校选择分析专业课备考指南规划 新增的计算机与软件工程考研院校为考研同学带来了多方面的机遇&#xff0c;这些机遇不仅体现在过国家线后可能面临的更低竞争压力&#xff0c;还包括更多元化的教育选择和更广阔的就业前景&#xff1a; 一、降低竞争压…...

C# 线程安全集合

文章目录 引言一、ConcurrentBag<T>二、ConcurrentQueue<T>三、ConcurrentStack<T>四、ConcurrentDictionary<TKey, TValue>五、总结引言 在多线程编程环境中,多个线程可能同时访问和操作集合数据。如果使用普通集合,很容易引发数据不一致、错误结果…...

箱包发霉怎么处理 箱包发霉处理修复方法

箱包发霉怎么处理&#xff1f;箱包不仅是我们出行的必需品&#xff0c;更是承载着个人风格与品味的时尚配饰。然而箱包工厂生产的箱包&#xff0c;在潮湿多变的环境中&#xff0c;箱包很容易成为霉菌滋生的温床&#xff0c;尤其是那些长时间储存的箱包&#xff0c;更是霉菌的“…...

【每日学点鸿蒙知识】Charles抓包、lock文件处理、WebView组件、NFC相关、CallMethod失败等

1、HarmonyOS系统中如何使用Charles抓包&#xff1f; 在HarmonyOS操作系统中&#xff0c;使用Charles进行抓包的步骤如下&#xff1a; 在Charles中设置代理。 首先&#xff0c;在Charles的菜单栏上选择“Proxy”→“Proxy Settings”&#xff0c;然后填入代理端口&#xff0…...

【异常】GL-SFT1200路由器中继模式,TL-CPE1300D无法搜寻5G网问题分析

【异常】GL-SFT1200路由器中继模式,TL-CPE1300D无法搜寻5G网问题 情况实验结论情况 在用GL-SFT1200路由器切换中继模式时,由于web密码忘却,需要重置,但根据官网使用手册,或者对应的中文版手册,重置失败。通过跟商家联系,进行uboot刷机,提供了指导文档,尝试后刷机成功…...

LINUX--shell

函数 格式&#xff1a; func() { command } function 关键字可写&#xff0c;也可不写。 示例 1&#xff1a; #!/bin/bash func() { #定义函数 echo "Hello $1" } func world #执行主文件 # bash test.sh Hello world 数组 数组是相…...

TCP常见问题

文章目录 一、两种状态图二、常见问题1、MSL是什么 3、为何等待2MSL3、为何三次握手&#xff0c;不握手、握手一次、两次行吗4、为何四次挥手&#xff0c;三次行吗&#xff0c;两次行吗 一、两种状态图 四次挥手 二、常见问题 1、MSL是什么 MSL是Maximum Segment Lifetime的英…...

OpenCV学习——图像融合

import cv2 as cv import cv2 as cvbg cv.imread("test_images/background.jpg", cv.IMREAD_COLOR) fg cv.imread("test_images/forground.png", cv.IMREAD_COLOR)# 打印图片尺寸 print(bg.shape) print(fg.shape)resize_size (1200, 800)bg cv.resize…...

网速、续航双在线!2024随身WiFi品牌精选推荐!格行按键切三网值得买吗?

随身wifi这个东西大家用的还是蛮多的&#xff0c;特别是一些户外工作的人员&#xff0c;往往都需要配备一个随身wifi&#xff0c;这样户外工作的时候才有网络&#xff0c;工作才会比较方便一些。今天就来盘点2024年热门随身wifi哪个牌子的好用&#xff1f; 1.华为&#xff1a;通…...

ubuntu18.04连接不上网络问题

现象&#xff1a;右上角的网络图标消失&#xff0c;仅剩输入法、音量和开关图标&#xff0c;ifconfig只显示本地回环 原因&#xff1a;网络适配器未开启 解决&#xff1a; 1. 查看网络状态&#xff1a;cat /var/lib/NetworkManager/NetworkManager.state 这里显示是false&a…...

访谈积鼎科技总经理:国产CFD软件发展与未来趋势展望

傅彦国&#xff0c;上海积鼎信息科技有限公司创始人 记者&#xff1a;请傅总介绍下我国流体仿真行业的发展现状是怎样的&#xff1f; 傅彦国&#xff1a;自2018年政府加大了对核心技术自主研发的支持力度&#xff0c;国产CFD软件逐渐步入发展正轨。 首先&#xff0c;从市场规…...

【Linux知识】exec命令行详解

文章目录 概述主要用途和 bash 有什么区别&#xff1f; 概述 在 Linux 系统中&#xff0c;exec 命令用于执行一个可执行文件&#xff0c;替换当前进程的映像。也就是说&#xff0c;当你在终端中使用 exec 命令后&#xff0c;当前的 shell 会被替换为 exec 指定的程序&#xff…...

【学术小白的学习之路】基于情感词典的中文句子情感分析(代码词典获取在结尾)

【学术小白的学习之路】基于情感词典的情感分析 1.基础函数1.1 判断情感词的否定词数量1.2 导入情感词典1.3 切分句子1.3.1为什么划分1.3.2 划分代码 1.4 完整代码 2.导入词典3.中文情感分析算法思路4.1情感词获取思路4.2 计算情感分值4.3 得分的归一化处理 4.实证5.总结 本文的…...

Linux 中 grep、sed、awk 命令

1. awk&#xff1a;强大的文本分析工具 awk&#xff0c;全称“Awk语言”&#xff0c;是一种专门用于处理文本文件的语言。它不仅能够根据关键字匹配某一行&#xff0c;还能进行复杂的文本分析和处理。awk的语法简洁明了&#xff0c;功能强大&#xff0c;是文本处理领域的佼佼者…...

一起考高项啊--现代化基础设施(工业互联网)

1、工业互联网的内涵和外延 工业互联网不是互联网在工作的简单应用&#xff0c;是具有更为丰富的内涵和外延。 它既是工业数字化、网络化、智能化转型的基础设施&#xff0c;也是互联网、大数据、人工智能与实体经济深度融合的应用模式&#xff0c;同时也是一种新业态、新产业…...

python学opencv|读取图像(二十)使用cv2.circle()绘制圆形进阶

【1】引言 前序已经掌握了使用cv2.circle()绘制圆形的基本操作&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;二十&#xff09;使用cv2.circle()绘制圆形-CSDN博客 由于圆形本身绘制起来比较简单&#xff0c;因此可以自由操作的空间也就大&#x…...

期权懂|如何减小个股期权交易中的风险?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 如何减小个股期权交易中的风险&#xff1f; 一、选择合适的期权合约 &#xff08;1&#xff09;选择活跃的期权合约&#xff1a;投资者应优先选择交易活跃的期权合约。交易活跃的…...