关于区块链的安全和隐私
背景
区块链技术在近年来发展迅速,被认为是安全计算的突破,但其安全和隐私问题在不同应用中的部署仍处于争论焦点。
目的
对区块链的安全和隐私进行全面综述,帮助读者深入了解区块链的相关概念、属性、技术和系统。
结构
首先介绍区块链的基本概念,然后描述其安全属性,接着介绍共识算法,最后讨论安全和隐私技术。
区块链概述
定义
区块链是一种去中心化的分布式账本技术。它由一系列链式的数据区块组成,每个区块包含了一定时间内的交易记录。这些区块按照时间顺序依次相连,形成了一条不可篡改、不可伪造的账本链条。
区块链的特点:
- 去中心化。去中心化意味着没有中心化的控制机构,所有节点共同参与账本的维护和更新
- 不可篡改。不可篡改是由于其采用了复杂的加密算法和共识机制,使得一旦数据被记录在区块链上,就很难被修改
- 安全透明。安全透明则保证了交易的安全性和可追溯性,所有参与者都可以查看账本中的交易记录
- 去信任化。去信任化让参与者无需依赖第三方的信任背书就能进行安全的交易和交互。
起源
2008年:发布第一版设计文档
2009年:发布区块链的第一个开源实现(bitcoin-core),比特币系统是基于区块链的首个应用
工作原理
以比特币网络为例,客户端发起交易,矿工收集交易到区块并验证,通过共识协议广播区块以获得网络认可,当其他节点验证交易有效后,区块被添加到区块链中。

基本能力(比特币系统的实现中)
3个基础且重要的能力:
- 哈希链存储。
- 数字签名
- 添加新块的共识机制
通过将一系列流行的安全技术(如哈希链、默克尔树、数字签名)与共识机制进行巧妙结合,比特币区块链既可以防止比特币的双重支付问题,又可以防篡改。
哈希链存储。
基于哈希链存储比特币系统中构件区块的基础:
- hash pointer。是数据加密的hash值,可用于检查数据是否被篡改。区块链就是使用hash指针将区块连接起来的。
- Merkle tree。
默克尔树:A Merkle tree is defined as a binary search tree with its tree nodes linked to oneanother using hash pointers

数字签名
A digital signature establishes the validity of a piece of data by usinga cryptographic algorithm.
有三个核心组件构成了数字签名方案:
- 密钥生成算法(key generation algorithm)。创建2个key,一个私钥,一个公钥。私钥用于对数据签名,公钥用于验证数据的有效性。
- 签名算法(signing algorithm)。使用私钥对输入信息进行签名。
- 验证算法(verification algorithm)。使用签名、数据信息和公钥作为输入,使用公钥验证数据信息的签名,并返回一个布尔值。
一个定义良好且安全的签名算法应该有两个属性:
- 有效的签名必须是可验证的
- 签名在存在性上是不可伪造的
椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm (ECDSA)):在比特币的区块链中使用该算法对交易数据进行签名。
比特币系统中,采用去中心化的身份管理,密钥对由用户自己生成,想生产多少就生成多少。公钥用作账户,私钥用作密码。
共识机制
共识机制被用于寻求网络中的大多数节点就单个状态更新达成一致,以确保全球账本(区块链)的扩展安全,并防止不诚实的尝试或恶意攻击。
交易模型
介绍了比特币采用的未花费交易输出(UTXO)模型和以太坊采用的账户交易模型,以及它们对解决双重花费问题的影响。
2个具有代表性的区块链交易级别的模型:
- 未花费交易输出模型(the unspent transaction outputs (UTXO)model)。在比特币系统中使用。
- 基于帐户的交易模型(the account-based transaction model)。在以太坊中使用。
The UTXO Model
任何一个交易,它总是由若干个输入(Input)和若干个输出(Output)构成,一个Input指向的是前面区块的某个Output,只有Coinbase交易(矿工奖励的铸币交易)没有输入,只有凭空输出。所以,任何交易,总是可以由Input溯源到Coinbase交易。
这些交易的Input和Output总是可以串联起来:

给定任何一个区块,计算当前所有的UXTO金额之和,等同于自创世区块到给定区块的挖矿奖励之和。
想要确定某个人拥有的比特币,并无法通过某个账户查到,必须知道此人控制的所有UTXO金额之和。
在钱包程序中,钱包管理的是一组私钥,对应的是一组公钥和地址。钱包程序必须从创世区块开始扫描每一笔交易,如果:
- 遇到某笔交易的某个Output是钱包管理的地址之一,则钱包余额增加;
- 遇到某笔交易的某个Input是钱包管理的地址之一,则钱包余额减少。
钱包的当前余额总是钱包地址关联的所有UTXO金额之和。
每笔 UTXO 交易如果满足以下三个约束条件就可以得到认可:
- 交易中引用的每个输入都必须由其所有者(发送者)签名且尚未被花费;
- 如果交易有多个输入,那么每个输入都必须有与其所有者相匹配的签名;
- 如果交易输入的总值等于或超过其输出的总值,那么该交易就是合法的。
使用UTXO的好处:
- 潜在的高度隐私(Potentially high degree of privacy)
- 潜在的高度可扩展性(Potentially high degree of scalability)
- 潜在的高度安全性(Potentially high degree of security)。比特币通过为将新区块提交到区块链中实施基于共识的确认机制,并将区块链作为通用账本进行维护,解决了双重支付问题。
Account-based Online Transaction Model
如果满足以下三个有效性约束,则具有令牌值(ETH)的交易是有效的:
- 令牌由消息编写者(发送者)签名;
- 可以证明编写者对令牌值的所有权
- 编写者的支出账户有足够的余额用于交易。
基于账户的交易模型有许多明显的好处:
- 与 UTXO 模型相比,它节省了更大的空间,因为 accountbalance-based 模型中的每笔交易只需要一个引用和一个签名来产生输出。
- 更简单。与 UTXO 模型不同,它不维护区块链交易中硬币的来源信息。因此,币不会根据收到的来源进行区分。
- 它不允许更改每笔交易的引用,但它提供了对账户相关数据的轻松访问。MPT(Merkle Patricia Tree)
关于MPT
MPT树结合了字典树和默克尔树的优点,在压缩字典树中根节点是空的,而MPT树可以在根节点保存整棵树的哈希校验和,而校验和的生成则是采用了和默克尔树生成一致的方式。 以太坊采用MPT树来保存,交易,交易的收据以及世界状态,为了压缩整体的树高,降低操作的复杂度,以太坊又对MPT树进行了一些优化。将树节点分成了四种:
- 空节点(hashNode)
- 叶子节点(valueNode)
- 分支节点(fullNode)
- 扩展节点(shortNode)

Account nonce
Account nonce是一个标量值,等于从该地址发送的交易数量,对于有相关代码的账户,它是该账户创建的合约数量。以太坊的交易都是基于账户的,与基于未花费交易输出(UTXO)的比特币不同,因此需要对每次交易按顺序记录,而 nonce 值就是这个顺序,它是交易原始地址的属性,不存储在以太坊区块链上,而是通过计算从一个地址发送的交易数量来确定。
每发起一笔交易,nonce 就会加一。对于外部账户(EOA)来说,每发送一笔交易,nonce 增加;对于合约账户来说,每创建一个合约,nonce 增加。而转入交易、合约调用其他合约等属于内部调用,nonce 值不变。
Account nonce 的主要作用:
- 保证交易顺序
- 防止重放攻击。重放攻击是指将一条用户交易信息在一条链上再次发送。
区块链中的CAP 属性
CAP理论
分布式系统涉及一组通过覆盖网络连接并相互通信以完成某些任务的计算节点。CAP定理指出,任何分布式系统只能具有以下两个属性:
- Consistency 一致性:每个计算节点接收最近的写入。
- Availability 可用性:对某些数据的任何请求始终可用。
- Partition tolerance 分区容错性:分布式系统始终处于运行状态,即使部分节点无法运行。
分布式账本中的CAP属性
在分布式账本的背景下,CAP属性意味着(1)一致性:所有节点都保持一个具有最新更新的相同账本。(2)可用性:网络中任何时候生成的任何交易都将被接受在账本中。(3)分区容错性:即使部分节点发生故障,网络仍然可以正常运行。
主要问题是,如果不满足所有三个条件,任何广泛接受的货币都很难存在。
当交易启动或部分交易系统无法识别的时候,如果系统不可用,没有人会使用这种货币(CP system)。
如果任何一个节点发生故障,系统将无法正常运行,没有人会使用这种货币(CA system)。
如果分布式账本系统中不同节点保存的账本不一致,则没有人会使用这种货币(PA system)。
区块链解决方案
比特币系统的区块链似乎违反了CAP定理,这是最成功的区块链实现之一,因为它实现了一致性、可用性和分区容错。然而,事实并非如此。
在现实中,区块链一致性并不是作为可用性和分区容错同时实现的,而是在一段时间后。比特币中使用了挖矿的概念,结合共识协议和至少六次确认,以确保通过达成共识最终保持一致性。
区块链的分类和演化
分类

架构分层

区块链的安全和隐私属性:
安全和隐私要求
包括账本一致性、交易完整性、系统和数据可用性、防止双花、交易机密性、用户身份匿名性和交易不可关联性。
基本安全属性
一致性、抗篡改、抗 DDoS 攻击、抗双重花费攻击、伪匿名性等。
额外安全和隐私属性
不可关联性和交易数据隐私性,比特币区块链仅实现了伪匿名性,未能提供交易的不可关联性和数据隐私保护。
共识算法
概念
共识是一种基于组的协议,用于在组中动态达成协议。当前区块链系统中的共识算法为拜占庭将军问题提供了概率性解决方案。
工作量证明(PoW)
比特币采用的共识协议,通过解决计算难题来验证交易,有效解决了拜占庭将军问题,但存在计算效率低、依赖挖矿奖励和算力集中等问题。
通过调整nonce,满足H(block header) <= target
权益证明(PoS)
以太坊等采用的共识协议,通过参与者锁定资金作为押金来验证交易,避免了对挖矿奖励的依赖,采用惩罚机制确保安全。
在以太坊中,权益证明(Proof of Stake,简称 PoS)是一种用于达成区块链共识的机制,与比特币所采用的工作量证明(Proof of Work,PoW)有所不同。
在权益证明机制下,验证交易和创建新区块的权利是根据参与者所拥有的以太币数量(即权益)以及他们愿意锁定这些币的时长来决定的(币天)。拥有更多权益并且愿意长时间锁定的参与者,更有可能被选中来验证新区块。
与工作量证明相比,权益证明具有一些优势。例如,它消耗的能源相对较少,因为不需要大量的计算工作来竞争区块创建权。同时,权益证明对于恶意行为的惩罚更为直接和有效,因为攻击者需要拥有大量的权益才有能力进行攻击,而一旦被发现作恶,他们将损失巨大的权益。
然而,权益证明也面临一些挑战和质疑,比如可能会导致富者更富的情况,以及在初期可能存在的安全性和稳定性方面的担忧。但随着技术的发展和改进,权益证明机制在以太坊及其他区块链项目中的应用不断完善和优化。
BFT-based 共识算法
拜占庭容错算法,许多相关算法和协议被提出以解决拜占庭故障相关的误解和困难,如 PBFT、AlgoRAND 和 HoneyBadgerBFT 等。
“BFT-based 共识算法” 指的是基于拜占庭容错(Byzantine Fault Tolerance,简称 BFT)的共识算法。
拜占庭容错是在存在故障节点甚至恶意节点的情况下,仍能保证分布式系统正常运行并达成一致的能力。
基于 BFT 的共识算法旨在解决在分布式网络中,部分节点可能出现错误、故障或恶意行为时,如何让整个网络仍能达成一致的决策和状态同步。
这类算法通常具有较强的容错性,可以在多达三分之一的节点出现错误或恶意行为的情况下,依然保证系统的安全性和活性,确保系统能够正常运行和达成共识。常见的 BFT 类共识算法包括实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)等。
其他共识算法
包括 Sleepy Consensus、Proof of Elapsed Time(PoET)、Proof of Authority(PoA)和 Proof of Reputation(PoR)等。
比较
实际应用中根据不同约束,共识算法分为强一致性共识和最终一致性共识,不同算法适用于不同场景和区块链类型。

区块链中使用的隐私和安全技术
混合技术
比特币区块链不能保证用户匿名性,因为交易使用假名地址且可公开验证,通过分析地址可关联用户的交易,当交易地址与用户真实身份关联时会导致所有交易泄露,所以设计了混合服务(或搅拌器)来防止用户地址被关联。混合就是随机交换用户的币与其他用户的币,结果是对于观察者来说,币的所有权被模糊了。但这些混合服务不能防止币被盗。
Mixcoin和CoinJoin,可用于防止用户地址被关联,但存在中心化服务可能泄露用户隐私等问题。
Mixcoin
Mixcoin 是由 Bonneau 等人在 2014 年提出的,它在比特币及类似加密货币中提供匿名支付。
为了抵御被动敌手,Mixcoin 扩大了匿名集合,允许所有用户同时对币进行混合。
为了抵御主动敌手,Mixcoin 提供类似于传统通信混合的匿名性。
此外,Mixcoin 使用问责机制来检测盗窃行为,并且表明通过激励调整,用户会理性地使用 Mixcoin 而不会窃取比特币。
CoinJoin
CoinJoin于 2013 年被提出,作为比特币交易的一种替代性匿名化方法。它的提出基于联合支付的理念。
假设一个用户想要进行支付,她会找到另一个也想要进行支付的用户,然后他们通过协商在一笔交易中共同进行支付。通过这种联合支付的方式,显著降低了在一笔交易中连接输入和输出以及追踪特定用户资金流动确切方向的概率。
CoinJoin 要求用户与他们希望共同支付的对象协商交易。提供此功能的第一代混合服务(如 SharedCoin [66])使用了中心化服务器,并要求用户信任服务运营商不会窃取或允许他人窃取比特币。然而,尽管存在单点故障,中心化服务可能存在用户隐私泄露的风险,因为它们会保存交易日志并记录联合支付的所有参与者。
匿名签名
数字签名技术由几种变体发展而来。一些签名方案本身就具有为签名者提供匿名性的能力。我们称这种签名方案为匿名签名。在匿名签名方案中,群签名和环签名是较早提出的,并且是两种最重要和典型的匿名签名方案。
包括组签名和环签名,能为签名者提供匿名性,组签名适合联盟链,环签名适合公链。
群签名
Group Signature(群签名)是一种密码学方案,最初在 1991 年提出。
在一个群组中,任何成员都可以使用自己的个人密钥为整个群组匿名签署消息,任何拥有群组公钥的成员都可以检查和验证生成的签名,并确认是某个群组成员的签名用于签署消息。签名验证过程除了能确定签名者是群组成员外,不会透露签名者的真实身份。
群签名有一个群管理员,负责管理添加群组成员、处理争议事件,包括揭示原始签名者。在区块链系统中,也需要一个权威实体来创建和撤销群组,动态地向群组添加新成员以及从群组中删除或撤销某些参与者的成员资格。
由于群签名需要一个群管理员来设置群组,所以群签名适用于联盟链。最近,PlatON 在其平台中添加了群签名,为用户提供匿名支持。
环签名
环形签名(Ring Signature)也可以通过由一组用户中的任何成员进行签名来实现匿名性。“环形签名”这一术语源自使用环状结构的签名算法。如果难以确定该组中的哪个成员使用其密钥对消息进行签名,那么环形签名就是匿名的。
环形签名与群签名在两个主要方面有所不同:
- 首先,在环形签名方案中,一旦发生争议,签名者的真实身份无法被揭示,因为环形签名中没有群管理员。
- 其次,任何用户都可以自行组成一个“环”,无需额外的设置。
因此,环形签名适用于公共区块链。
环形签名的一个典型应用是 CryptoNote。它采用环形签名来隐藏交易发送者地址之间的联系。更确切地说,CryptoNote 使用其他几个密钥构建发送者的公钥,使得无法确定实际上是谁发送(签名)了交易。由于使用了环形签名,如果环成员的数量是 n,那么对手成功猜测交易真正发送者的概率是 1/n。后来,以太坊在 2015 年添加了环形签名,这为用户提供了像 CryptoNote 货币(如门罗币)那样的匿名性。
同态加密(HE)
可在区块链上加密数据,保护隐私,以太坊智能合约使用了该技术。
同态加密(Homomorphic encryption,HE)是一种强大的加密技术。它可以直接在密文上进行某些类型的计算,并且确保在对加密数据进行的操作所得到的计算结果进行解密时,会生成与在明文上进行相同操作所得结果完全相同的结果。
decode(encode(A) + encode(B)) = A+B
可以使用同态加密技术在区块链上存储数据,而不会对区块链的属性产生重大改变。这确保了区块链上的数据将被加密,解决了与公共区块链相关的隐私问题。同态加密技术的使用提供了隐私保护,并允许在公共区块链上方便地访问加密数据以用于审计和其他目的,例如管理员工费用。以太坊智能合约在存储在区块链中的数据上提供同态加密,以实现更好的控制和隐私。
基于属性的加密(ABE)
根据用户属性加密密文,具有抗共谋性,但目前应用较少,在区块链上的部署面临挑战。
基于属性的加密(Attribute-based encryption,ABE)是一种加密方法,其中属性是使用用户密钥加密的密文的定义和调节因素。
如果用户的属性与密文的属性一致,那么就可以使用用户的密钥来解密加密数据。
抗合谋性是基于属性加密的一个重要安全属性。它确保当恶意用户与其他用户合谋时,除了能用其私钥解密的数据之外,他无法访问其他数据。
基于属性的加密概念于 2005 年被提出,当时是单一授权机构。从那以后,对基本的基于属性的加密进行了许多扩展,包括具有多个授权机构共同生成用户私钥的基于属性的加密,以及支持任意谓词的基于属性的加密方案。
基于属性的加密非常强大,但由于对核心概念和高效实现的理解不足,迄今为止很少有应用部署它。到目前为止,基于属性的加密还没有以任何形式在区块链上进行实时操作部署。2011 年,提出了一种去中心化的基于属性的加密方案,以便在区块链上使用基于属性的加密。例如,在区块链上,权限可以由访问令牌的所有权来表示。网络中的所有节点,如果拥有颁发给它们的特定令牌,将被授予与该令牌相关的特殊权利和特权。令牌提供了一种跟踪谁具有某些属性的方法,并且这种跟踪应该由分发令牌的权威实体以算法和一致的方式进行。令牌可以被视为代表属性或资格的徽章,并且应该被用作不可转让的声誉或属性的量化器。
安全多方计算(SMPC)
定义了多方协议以保护输入隐私,在区块链系统中用于保护用户隐私,如 Enigma 平台。
多方计算(MPC)模型定义了一种多方协议,允许各方在其私有数据输入上共同进行一些计算,而不会侵犯其输入隐私,这样,对手除了联合计算的输出之外,对真实方的输入一无所知。
1982 年,姚期智(Andrew Yao)正式定义了安全两方计算,并在 1986 年针对百万富翁问题进行了推广。
1987 年,Goldreich 等人将两方计算推广到多方计算,假设计算的所有输入和零知识证明都是秘密共享的一部分。这种推广为许多后续且越来越高效的多方计算(MPC)协议奠定了基础。在分布式投票、私人竞标和私人信息检索中采用 MPC 的成功使其成为许多现实世界问题的流行解决方案。
MPC 的首次大规模部署是在 2008 年,用于丹麦的一个实际拍卖问题。
近年来,MPC 已被用于区块链系统以保护用户隐私。2014 年,Andrychowicz 等人在比特币系统上设计并实现了安全多方计算协议。他们构建了无需任何可信权威的安全多方彩票协议。他们的协议能够保证诚实用户的公平性,无论不诚实的用户行为如何。如果用户违反或干扰协议,那么她将成为输家,她的比特币将被转移给诚实用户。
2015 年,Zyskind 等人提出了一个名为 Enigma 的去中心化安全多方计算(SMP)平台。通过使用高级版本的 SMP 计算,Enigma 采用可验证的秘密共享方案来保证其计算模型的隐私。此外,Enigma 使用改进的分布式哈希表对共享秘密数据进行编码以实现高效存储。而且,它利用外部区块链作为抗篡改的事件记录以及对等网络的监管者,用于身份管理和访问控制。与比特币系统类似,Enigma 在消除对可信第三方的必要性和依赖性的同时,提供对个人数据的自主控制和保护。
非交互式零知识(NIZK)证明
用户可在不透露账户余额的情况下证明有足够余额进行转账,Zcash 使用了该技术。
零知识证明是一种密码学技术,允许一方(证明者)向另一方(验证者)证明某一陈述是真实的,而无需透露除了该陈述为真之外的任何额外信息。
例如,假设要向朋友证明知道某个秘密房间的开门密码,可在朋友不看到输入密码的情况下,进入房间并拿出预先放置的特定物品来证明,这就是一种零知识证明。
零知识证明包括交互式和非交互式两种。
- 交互式零知识证明中,证明者和验证者之间有多个来回的通信过程;
- 非交互式零知识证明则证明者只需要发送一次信息给验证者,不需要后续交互。
零知识证明还可分为完美、统计和计算三种类型。
- 完美零知识证明中,验证者在理论上无法从证明过程中获得任何关于证明内容的信息;
- 统计零知识证明里,验证者获得信息的可能性非常小;
- 计算零知识证明是在计算上,验证者无法从证明过程中获得信息,即使理论上可能,但计算成本非常高。
可信执行环境(TEE)基于的智能合约
如果一个执行环境为应用程序的执行提供完全隔离的环境,能有效防止其他软件应用和操作系统篡改及了解在其中运行的应用程序的状态,就被称为可信执行环境(TEE)。
英特尔软件防护扩展(SGX)是实现可信执行环境的一种代表性技术。例如,Ekiden 是一个基于 SGX 的保护机密的智能合约解决方案。Ekiden 将计算与共识分离。它在链下的计算节点的可信执行环境中执行智能合约计算,然后使用远程证明协议在链上验证计算节点的执行正确性。共识节点用于维护区块链,不需要使用可信硬件。Enigma 在其当前版本中利用可信执行环境,允许用户使用去中心化的信用评分算法创建保护隐私的智能合约。信用评分会考虑多个因素的权重,如账户的数量和类型、支付历史以及信用利用率。
基于游戏的智能合约
基于游戏的智能合约验证解决方案是非常新的发展,以 TrueBit和 Arbitrum为代表。
TrueBit 使用交互式“验证游戏”来确定计算任务是否正确执行。TrueBit 提供奖励以鼓励参与者检查计算任务并发现漏洞,这样智能合约就可以安全地执行具有可验证属性的计算任务。此外,在每一轮“验证游戏”中,验证者递归地检查越来越小的计算子集,这使得 TrueBit 大大减轻了节点上的计算负担。
Arbitrum为各方设计了一种激励机制,以便在链下就虚拟机的行为达成一致,因此它只要求验证者验证合同的数字签名。对于试图谎报虚拟机行为的不诚实方,Arbitrum 设计了一种有效的基于挑战的协议来识别并惩罚不诚实方。虚拟机行为的链下验证激励机制显著提高了智能合约的可扩展性和隐私性。
TrueBit 和 Arbitrum,通过激励机制鼓励各方验证智能合约的正确性,提高了智能合约的可扩展性和隐私性,但仍存在被恶意用户欺骗的风险。
讨论
实现区块链的安全和隐私需要综合多种技术,同时要注意新技术可能带来的问题,以及在安全、隐私和效率之间进行权衡。

结论
文章阐述了区块链安全和隐私的属性及实现这些属性的技术,深入理解区块链的安全和隐私属性对增强其信任度和发展防御技术至关重要,未来发展需要轻量级加密算法和实用的安全隐私方法。
参考:
- 区块链技术:架构及进展-计算机学报
- B站北京大学肖臻老师的《区块链技术与应用》
- 以太坊开发文档 以太坊开发文档 | ethereum.org
- 廖雪峰的区块链教程 简介 - 区块链教程 - 廖雪峰的官方网站
相关文章:
关于区块链的安全和隐私
背景 区块链技术在近年来发展迅速,被认为是安全计算的突破,但其安全和隐私问题在不同应用中的部署仍处于争论焦点。 目的 对区块链的安全和隐私进行全面综述,帮助读者深入了解区块链的相关概念、属性、技术和系统。 结构 首先介绍区块链…...
特征工程——一门提高机器学习性能的艺术
当前围绕人工智能(AI)和机器学习(ML)展开的许多讨论以模型为中心,聚焦于 ML和深度学习(DL)的最新进展。这种模型优先的方法往往对用于训练这些模型的数据关注不足,甚至完全忽视。类似MLOps的领域正迅速发展,通过系统性地训练和利用ML模型&…...
Paper解读:工作场所人机协作的团队形成:促进组织变革的目标编程模型
人工智能(AI)具有降低运营成本、提高效率和改善客户体验的潜力。 因此,在组织中组建项目团队至关重要,这样他们就会在决策过程中欢迎人工智能。 当前的技术革命要求公司快速变革,并增加了对团队在促进创新采用方面的作…...
图文深入理解Oracle Network配置管理(一)
List item 本篇图文深入介绍Oracle Network配置管理。 Oracle Network概述 Oracle Net 服务 Oracle Net 监听程序 <oracle_home>/network/admin/listener.ora <oracle_home>/network/admin/sqlnet.ora建立网络连接 要建立客户机或中间层连接,Oracle…...
leetcode-链表篇3
leetcode-61 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3]示例 2: 输入:head [0,1,2], k 4 输出&#x…...
RAG(Retrieval Augmented Generation)及衍生框架:CRAG、Self-RAG与HyDe的深入探讨
近年来,随着大型语言模型(LLMs)的迅猛发展,我们在寻求更精确、更可靠的语言生成能力上取得了显著进展。其中,检索增强生成(Retrieval-Augmented Generation)作为一种创新方法,极大地…...
C语言介绍
什么是C语言 C programing language 能干什么 Hello world? 如何学C语言 no reading no learning...
损失函数篇 | YOLOv10 更换损失函数之 MPDIoU | 《2023 一种用于高效准确的边界框回归的损失函数》
论文地址:https://arxiv.org/pdf/2307.07662v1.pdf 边界框回归(Bounding Box Regression,BBR)在目标检测和实例分割中得到了广泛应用,是目标定位的重要步骤。然而,对于边界框回归的大多数现有损失函数来说,当预测的边界框与真值边界框具有相同的长宽比,但宽度和高度的…...
WMware安装WMware Tools(Linux~Ubuntu)
1、这里终端里面输入sudo apt upgrade用于更新最新的包 sudo apt upgrade 2、安装 open-vm-tools-desktop 包, Ps:这里是以为我已经安装好了。 udo apt install open-vm-tools-desktop -y3、最后重启就大功告成了 reboot 4、测试是否成功:…...
SLAM ORB-SLAM2(30)关键帧跟踪
SLAM ORB-SLAM2(30)关键帧跟踪 1. 关键帧跟踪2. TrackReferenceKeyFrame2.1. 将当前普通帧的描述子转化为BoW向量2.2. 通过词袋BoW加速当前帧与参考帧之间的特征点匹配2.3. 将上一帧的位姿态作为当前帧位姿的初始值2.4. 通过优化3D-2D的重投影误差来获得位姿2.5. 剔除优化后的…...
k8s 部署 prometheus
创建namespace prometheus-namespace.yaml apiVersion: v1 kind: Namespace metadata:name: ns-prometheus拉取镜像 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/quay.io/prometheus/prometheus:v2.54.0prometheus配置文件configmap prometheus-configmap.yaml …...
使用VBA快速生成Excel工作表非连续列图片快照
Excel中示例数据如下图所示。 现在需要拷贝A2:A15,D2:D15,J2:J15,L2:L15,R2:R15为图片,然后粘贴到A18单元格,如下图所示。 大家都知道VBA中Range对象有CopyPicture方法可以拷贝为图片,但是如果Range对象为非连续区域,那么将产生10…...
解决GitHub下载速度慢
解决GitHub下载速度慢 方法一:使用git clone 地址 --depth 1来下载 depth 1 表示只科隆最新的一次提交,也就是默认主分支,而不是完整地克隆整个代码仓库,这样可以减少下载地数据,加快克隆操作 可以用git clone 地址 …...
【机器学习(五)】分类和回归任务-AdaBoost算法
文章目录 一、算法概念一、算法原理(一)分类算法基本思路1、训练集和权重初始化2、弱分类器的加权误差3、弱分类器的权重4、Adaboost 分类损失函数5、样本权重更新6、AdaBoost 的强分类器 (二)回归算法基本思路1、最大误差的计算2…...
【设计模式-模板】
定义 模板方法模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,并将一些步骤延迟到子类中实现。通过这种方式,模板方法允许子类在不改变算法结构的情况下重新定义算法中的某些特定步骤。 UML图 组成角色 AbstractClass&#x…...
小程序原生-列表渲染
1. 列表渲染的基础用法 <!--渲染数组列表--> <view wx:for"{{numList}}" wx:key"*this" > 序号:{{index}} - 元素:{{item}}</view> <!--渲染对象属性--> <view wx:for"{{userInfo}}" wx:key&q…...
JAVA认识异常
目录 1. 异常的概念与体系结构 1.1 异常的概念 1. 算术异常 2. 数组越界异常 3. 空指针异常 1.2 异常的分类 1. 编译时异常 2. 运行时异常 2.1 异常的处理 防御式编程 2.2 异常的捕获 2.3.1 异常声明throws 2.3.2 try-catch捕获并处理 2.3.3 finally 总结 1. 异常…...
2024年10月计划(工作为主,Ue5独立游戏为辅,)
我发现一点,就是工作很忙,比如中秋也在远程加班,周末有时也远程加班,国庆节甚至也差点去甲方工作。甚至有可能驻场。可见,小公司确实不能去。 好在,9月份时,通过渲染 除了上班时间外࿰…...
并发、并行和异步设计
译者个人领悟,一家之言: 并发和并行确实可以明确区分出来,因为cpu的速度非常快,在执行一个任务时经常要等其他组件,比如网络,磁盘等,如果一直串行等待这样就会造成很大的浪费. (就类似于烧水的同时,可以切菜,不用等烧水完成了才去切菜,我可以烧一会水,火生起来了水壶放上了,随…...
求职Leetcode题目(12)
1.只出现一次的数字 异或运算满足交换律 a⊕bb⊕a ,即以上运算结果与 nums 的元素顺序无关。代码如下: class Solution {public int singleNumber(int[] nums) {int ans 0;for(int num:nums){ans^num;}return ans;} } 2.只出现一次的数字II 这是今天滴…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
