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

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

🧑 博主简介: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年工作经验,…...

rag-给一篇几百页的pdf,如何从中找到关键信息并汇总出关系图

小思考 对pdf肯定要做模糊chunk,能用模型切分就用模型切分,不能用模型就用规则,规则要尽可能保存连续文本,特殊数据格式(图、表格)必须完整保存,必须能被捕捉到。这些独立的表格or图数据&#…...

Rust语言学习

Rust语言学习 通用编程概念所有权所有权引用和借用slice struct(结构体)定义并实例化一个结构体使用结构体方法语法 枚举 enums定义枚举match控制流运算符if let 简单控制流 使用包、Crate和模块管理不断增长的项目(模块系统)包和crate定义模块来控制作用…...

wordPress WooCommerce 本地文件包含漏洞复现(CVE-2025-1661)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

【CSS文字渐变动画】

CSS文字渐变动画 HTML代码CSS代码效果图 HTML代码 <div class"title"><h1>今天是春分</h1><p>正是春天到来的日子&#xff0c;花都开了&#xff0c;小鸟也飞回来了&#xff0c;大山也绿了起来&#xff0c;空气也有点嫩嫩的气息了</p>…...

2021-06-15 C逆序存入数组的元素

缘由编程&#xff0c;逆序存入数组的元素_编程语言-CSDN问答 #define N 7 main() { static int a[N]{12,9,16,5,7,2,l},k,s; for(k0;k<N;k) Printf("%4d",a[k]);for (k0;k<N/2; k) {sa[k]; a[k]a[N-1-k]; a[N-1-k]s; } for (k0;k<N;k) Printf("%4…...

Qt 控件概述 QLabel

目录 QLabel显示类控件 label如何做到与窗口同步变化 边框 Frame QLabel显示类控件 ​​ ​​ textFormat &#xff1a;设置文件格式 ​ Pixmap &#xff1a;标签图片 label如何做到与窗口同步变化 Qt中对应用户的操作 &#xff1a; 事件和信号 拖拽窗口大小就会触发…...

k8s服务中userspace,iptables,和ipvs的比较

在 Kubernetes 中&#xff0c;kube-proxy 是负责实现服务负载均衡的组件。它支持三种代理模式&#xff1a;userspace、iptables 和 ipvs。这三种模式在性能、功能和复杂性上有所不同。以下是它们的详细比较&#xff1a; 1. Userspace 模式 Userspace 是 Kubernetes 最早支持的…...

Vue 渲染 LaTeX 公式 Markdown 库

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…...

KMP-子串匹配算法-关键点理解

1.理解next[]数组的使用与来历 2.求解next[]数组 一、kmp算法的原理 首先观察暴力解法&#xff1a;假设主串为&#xff1a;abdxxabc&#xff0c;模式串为abxxabd。 暴力解法&#xff0c;就是对主串每个字符作为第一个字符&#xff0c;开始和模式串比较。 比如&#xff1a;从…...

网络原理之网络层、数据链路层

1. 网络层 1.1 IP协议 1.1.1 基本概念 主机: 配有IP地址,但是不进⾏路由控制的设备路由器: 即配有IP地址,⼜能进⾏路由控制节点: 主机和路由器的统称 1.1.2 协议头格式 说明&#xff1a; 4位版本号(version): 指定IP协议的版本,对于IPv4来说,就是4,对于IPv6来说,就是6 4位头…...

ssh 多重验证的好处:降低密钥长度,动态密码

ssh 多重验证的好处&#xff1a; 多重验证&#xff1a;可能要比单纯提高密钥长度&#xff0c;或密码的长度更好&#xff0c;可以获得更好的保证服务器安全的效果。降低密钥长度&#xff1a;可以提高 CPU运行时的有效速度&#xff0c;特别是在传输大文件、或传输低比特率视频时…...

版本控制器Git ,Gitee如何连接Linux Gitee和Github区别

&#x1f4d6; 示例场景 假设你和朋友在开发一个「在线笔记网站」&#xff0c;代码需要频繁修改和协作&#xff1a; 只用本地文件管理 每次修改后手动复制文件&#xff0c;命名为 v1.html、v2.html 问题&#xff1a;无法追踪具体改动内容&#xff1b;多人修改易冲突&#xff1…...

网站测速:提升用户体验的关键

在互联网飞速发展的今天&#xff0c;网站已成为企业展示形象、提供服务以及用户获取信息的重要平台。而网站的速度&#xff0c;如同高速公路的路况&#xff0c;直接影响着用户的访问体验和满意度。因此&#xff0c;网站测速成为了网站运营和维护中不可或缺的关键环节。 网站速…...

【动态规划篇】91. 解码方法

91. 解码方法 题目链接&#xff1a; 91. 解码方法 题目叙述&#xff1a; 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; “1” -> ‘A’ “2” -> ‘B’ … “25” -> ‘Y’ “26” -> ‘Z’ 然而&#xff0c;在解码已编码的消息时&#xff0c;你…...

Python高级——类的知识

一、知识梳理&#xff1a; 二、货币场景搭建&#xff1a; 1&#xff09;代码展示&#xff1a; class RMB:count 0def __init__(self,yuan0,jiao0,fen0):self.__yuan yuanself.__jiao jiaoself.__fen fenRMB.count 1def __add__(self, other):temp RMB()temp.__yuan se…...

Python 编程题 第十一节:选择排序、插入排序、删除字符、目标移动、尾部的0

选择排序 假定第一个为最小的为已排序序列&#xff0c;与后面的比较&#xff0c;找到未排序序列中最小的后&#xff0c;交换位置&#xff0c;获得最小元素&#xff0c;依次往后 lst[1,14,25,31,21,13,6,8,14,9,7] def selection_sort(lst):for i in range(len(lst)):min_inde…...

resnet与densenet的比较

一、 ResNet&#xff08;残差网络&#xff09;和 DenseNet&#xff08;密集连接网络&#xff09; ResNet&#xff08;残差网络&#xff09;和 DenseNet&#xff08;密集连接网络&#xff09;都是深度学习中非常经典的卷积神经网络架构&#xff0c;它们在图像分类、目标检测等诸…...

Linux 运维工作中,掌握一系列基础命令与积累丰富经验至关重要

基础命令 文件与目录操作 ls&#xff1a;用于查看目录内容。例如ls -l能以长格式显示文件和目录的详细信息&#xff0c;ls -a则可显示包括隐藏文件在内的所有文件。cd&#xff1a;用于切换工作目录。像cd /home/user可切换到/home/user目录&#xff0c;cd ..能返回上一级目录…...

【算法day16】电话号码的字母组合

电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 https://leetcode.cn/problems/letter-combinations…...

软件工程之软件验证计划Software Verification Plan

个人主页&#xff1a;云纳星辰怀自在 座右铭&#xff1a;“所谓坚持&#xff0c;就是觉得还有希望&#xff01;” 本文为基于ISO26262软件验证计划模板&#xff0c;仅供参考。 软件验证计划&#xff0c;包括&#xff1a; 1. 软件需求验证计划 2. 软件架构设计验证计划 3. 软件单…...

软考系统架构设计师之计算机组成与体系结构笔记

一、计算机硬件组成 1. 冯诺依曼结构与哈佛结构 冯诺依曼结构&#xff1a;以存储器为中心&#xff0c;指令和数据统一存储&#xff0c;通过总线连接运算器、控制器、输入输出设备。其核心思想是“存储程序控制”&#xff0c;但存在存储器访问瓶颈问题。哈佛结构&#xff1a;指…...

「JavaScript深入」Socket.IO:基于 WebSocket 的实时通信库

Socket.IO Socket.IO 的核心特性Socket.IO 的架构解析Socket.IO 的工作流程Socket.IO 示例&#xff1a;使用 Node.js 搭建实时聊天服务器1. 安装 Socket.IO2. 服务器端代码&#xff08;Node.js&#xff09;3. 客户端代码&#xff08;HTML JavaScript&#xff09;4. 房间功能 高…...

redis分布式锁实现Redisson+redlock中watch dog是如何判断当前线程是否持有锁进行续租的呢?

在 Redis 中&#xff0c;Watch Dog&#xff08;看门狗&#xff09;机制主要用于实现分布式锁的自动续期&#xff08;如 Redisson 的 RedLock 实现&#xff09;。其核心目的是确保当业务逻辑执行时间超过锁的初始过期时间&#xff08;leaseTime&#xff09;时&#xff0c;锁不会…...

Spring Cloud之负载均衡之LoadBalance

目录 负载均衡 问题 步骤 现象 什么是负载均衡&#xff1f; 负载均衡的一些实现 服务端负载均衡 客户端负载均衡 使用Spring Cloud LoadBalance实现负载均衡 负载均衡策略 ​编辑 ​编辑LoadBalancer原理 服务部署 准备环境和数据 服务构建打包 启动服务 上传J…...

一份1000元机器人开发资金计划表

一、硬件采购&#xff08;约850元&#xff09; 类别项目数量单价&#xff08;元&#xff09;总价&#xff08;元&#xff09;说明主控板Arduino Uno R3120~5050入门首选&#xff0c;开源生态完善&#xff0c;适合学习基础控制逻辑。传感器HC-SR04超声波模块21020用于避障或测距…...

分布式任务调度

今天我们讲讲分布式定时任务调度—ElasticJob。 一、概述 1、什么是分布式任务调度 我们可以思考⼀下下⾯业务场景的解决⽅案: 某电商平台需要每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放⼀批优惠券 某银⾏系统需要在信⽤卡到期还款⽇的前三天进⾏短信提醒 某…...

嵌入式面经(2)——央企篇

前文得知我只投央企,不投国企,有面试的央企大致有三类:感兴趣的同学可以和我私聊 军工央企相关(航空航天,兵器兵工) 制造央企相关(三桶油,装备制造) 金融运维相关(信通集团,国有银行) 接下来我将对我有的面试中询问的面经进行总结 一.军工央企相关(航空航天,…...

第7章 类与面向对象

6-1 二维平面上的点操作&#xff08;Python3&#xff09; 题目描述 设计一个表示二维平面上点的类 Point。该类应该包含以下功能&#xff1a; 两个私有属性 _x 和 _y&#xff0c;分别表示点的横坐标和纵坐标。 一个构造函数 __init__&#xff0c;用于初始化点的坐标。 一个…...

架构设计的灵魂交响曲:系统设计各维度的深度解析与实战指南

引言: 系统设计的背景与重要性 在快速变化的技术环境中&#xff0c;数字化转型成为企业生存与发展的核心驱动力。系统设计能力不仅是技术团队的核心竞争力&#xff0c;也是推动业务创新和提升整体效率的关键因素。根据Gartner的研究&#xff0c;超过70%的数字化转型项目未能实…...