关于区块链的安全和隐私

背景

区块链技术在近年来发展迅速,被认为是安全计算的突破,但其安全和隐私问题在不同应用中的部署仍处于争论焦点。

目的

对区块链的安全和隐私进行全面综述,帮助读者深入了解区块链的相关概念、属性、技术和系统。

结构

首先介绍区块链的基本概念,然后描述其安全属性,接着介绍共识算法,最后讨论安全和隐私技术。

区块链概述

定义

区块链是一种去中心化的分布式账本技术。它由一系列链式的数据区块组成,每个区块包含了一定时间内的交易记录。这些区块按照时间顺序依次相连,形成了一条不可篡改、不可伪造的账本链条。

区块链的特点:

  1. 去中心化。去中心化意味着没有中心化的控制机构,所有节点共同参与账本的维护和更新
  2. 不可篡改。不可篡改是由于其采用了复杂的加密算法和共识机制,使得一旦数据被记录在区块链上,就很难被修改
  3. 安全透明。安全透明则保证了交易的安全性和可追溯性,所有参与者都可以查看账本中的交易记录
  4. 去信任化。去信任化让参与者无需依赖第三方的信任背书就能进行安全的交易和交互。

起源

2008年:发布第一版设计文档

2009年:发布区块链的第一个开源实现(bitcoin-core),比特币系统是基于区块链的首个应用

工作原理

以比特币网络为例,客户端发起交易,矿工收集交易到区块并验证,通过共识协议广播区块以获得网络认可,当其他节点验证交易有效后,区块被添加到区块链中。

基本能力(比特币系统的实现中)

3个基础且重要的能力:

  1. 哈希链存储。
  2. 数字签名
  3. 添加新块的共识机制

通过将一系列流行的安全技术(如哈希链默克尔树数字签名)与共识机制进行巧妙结合,比特币区块链既可以防止比特币的双重支付问题,又可以防篡改

哈希链存储。

基于哈希链存储比特币系统中构件区块的基础:

  1. hash pointer。是数据加密的hash值,可用于检查数据是否被篡改。区块链就是使用hash指针将区块连接起来的。
  2. 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.

有三个核心组件构成了数字签名方案:

  1. 密钥生成算法(key generation algorithm)。创建2个key,一个私钥,一个公钥。私钥用于对数据签名,公钥用于验证数据的有效性。
  2. 签名算法(signing algorithm)。使用私钥对输入信息进行签名。
  3. 验证算法(verification algorithm)。使用签名、数据信息和公钥作为输入,使用公钥验证数据信息的签名,并返回一个布尔值。

一个定义良好且安全的签名算法应该有两个属性:

  1. 有效的签名必须是可验证的
  2. 签名在存在性上是不可伪造的

椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm (ECDSA)):在比特币的区块链中使用该算法对交易数据进行签名。

比特币系统中,采用去中心化的身份管理,密钥对由用户自己生成,想生产多少就生成多少。公钥用作账户,私钥用作密码。

共识机制

共识机制被用于寻求网络中的大多数节点就单个状态更新达成一致,以确保全球账本(区块链)的扩展安全,并防止不诚实的尝试或恶意攻击。

交易模型

介绍了比特币采用的未花费交易输出(UTXO)模型和以太坊采用的账户交易模型,以及它们对解决双重花费问题的影响。

2个具有代表性的区块链交易级别的模型:

  1. 未花费交易输出模型(the unspent transaction outputs (UTXO)model)。在比特币系统中使用。
  2. 基于帐户的交易模型(the account-based transaction model)。在以太坊中使用。

The UTXO Model

任何一个交易,它总是由若干个输入(Input)和若干个输出(Output)构成,一个Input指向的是前面区块的某个Output,只有Coinbase交易(矿工奖励的铸币交易)没有输入,只有凭空输出。所以,任何交易,总是可以由Input溯源到Coinbase交易。

这些交易的Input和Output总是可以串联起来:

给定任何一个区块,计算当前所有的UXTO金额之和,等同于自创世区块到给定区块的挖矿奖励之和。

想要确定某个人拥有的比特币,并无法通过某个账户查到,必须知道此人控制的所有UTXO金额之和。

在钱包程序中,钱包管理的是一组私钥,对应的是一组公钥和地址。钱包程序必须从创世区块开始扫描每一笔交易,如果:

  1. 遇到某笔交易的某个Output是钱包管理的地址之一,则钱包余额增加;
  2. 遇到某笔交易的某个Input是钱包管理的地址之一,则钱包余额减少。

钱包的当前余额总是钱包地址关联的所有UTXO金额之和。

每笔 UTXO 交易如果满足以下三个约束条件就可以得到认可:

  1. 交易中引用的每个输入都必须由其所有者(发送者)签名且尚未被花费;
  2. 如果交易有多个输入,那么每个输入都必须有与其所有者相匹配的签名;
  3. 如果交易输入的总值等于或超过其输出的总值,那么该交易就是合法的。

使用UTXO的好处:

  1. 潜在的高度隐私(Potentially high degree of privacy)
  2. 潜在的高度可扩展性(Potentially high degree of scalability)
  3. 潜在的高度安全性(Potentially high degree of security)。比特币通过为将新区块提交到区块链中实施基于共识的确认机制,并将区块链作为通用账本进行维护,解决了双重支付问题。

Account-based Online Transaction Model

如果满足以下三个有效性约束,则具有令牌值(ETH)的交易是有效的:

  1. 令牌由消息编写者(发送者)签名;
  2. 可以证明编写者对令牌值的所有权
  3. 编写者的支出账户有足够的余额用于交易。

基于账户的交易模型有许多明显的好处:

  1. 与 UTXO 模型相比,它节省了更大的空间,因为 accountbalance-based 模型中的每笔交易只需要一个引用和一个签名来产生输出。
  2. 更简单。与 UTXO 模型不同,它不维护区块链交易中硬币的来源信息。因此,币不会根据收到的来源进行区分。
  3. 它不允许更改每笔交易的引用,但它提供了对账户相关数据的轻松访问。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 的主要作用:

  1. 保证交易顺序
  2. 防止重放攻击。重放攻击是指将一条用户交易信息在一条链上再次发送。

区块链中的CAP 属性

CAP理论

分布式系统涉及一组通过覆盖网络连接并相互通信以完成某些任务的计算节点。CAP定理指出,任何分布式系统只能具有以下两个属性:

  1. Consistency 一致性:每个计算节点接收最近的写入。
  2. Availability 可用性:对某些数据的任何请求始终可用。
  3. 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 使用了该技术。

零知识证明是一种密码学技术,允许一方(证明者)向另一方(验证者)证明某一陈述是真实的,而无需透露除了该陈述为真之外的任何额外信息。

例如,假设要向朋友证明知道某个秘密房间的开门密码,可在朋友不看到输入密码的情况下,进入房间并拿出预先放置的特定物品来证明,这就是一种零知识证明。

零知识证明包括交互式和非交互式两种

  1. 交互式零知识证明中,证明者和验证者之间有多个来回的通信过程;
  2. 非交互式零知识证明则证明者只需要发送一次信息给验证者,不需要后续交互。

零知识证明还可分为完美、统计和计算三种类型。

  1. 完美零知识证明中,验证者在理论上无法从证明过程中获得任何关于证明内容的信息;
  2. 统计零知识证明里,验证者获得信息的可能性非常小;
  3. 计算零知识证明是在计算上,验证者无法从证明过程中获得信息,即使理论上可能,但计算成本非常高。

可信执行环境(TEE)基于的智能合约

如果一个执行环境为应用程序的执行提供完全隔离的环境,能有效防止其他软件应用和操作系统篡改及了解在其中运行的应用程序的状态,就被称为可信执行环境(TEE)

英特尔软件防护扩展(SGX)是实现可信执行环境的一种代表性技术。例如,Ekiden 是一个基于 SGX 的保护机密的智能合约解决方案。Ekiden 将计算与共识分离。它在链下的计算节点的可信执行环境中执行智能合约计算,然后使用远程证明协议在链上验证计算节点的执行正确性。共识节点用于维护区块链,不需要使用可信硬件。Enigma 在其当前版本中利用可信执行环境,允许用户使用去中心化的信用评分算法创建保护隐私的智能合约。信用评分会考虑多个因素的权重,如账户的数量和类型、支付历史以及信用利用率。

基于游戏的智能合约

基于游戏的智能合约验证解决方案是非常新的发展,以 TrueBit和 Arbitrum为代表。

TrueBit 使用交互式“验证游戏”来确定计算任务是否正确执行。TrueBit 提供奖励以鼓励参与者检查计算任务并发现漏洞,这样智能合约就可以安全地执行具有可验证属性的计算任务。此外,在每一轮“验证游戏”中,验证者递归地检查越来越小的计算子集,这使得 TrueBit 大大减轻了节点上的计算负担。

Arbitrum为各方设计了一种激励机制,以便在链下就虚拟机的行为达成一致,因此它只要求验证者验证合同的数字签名。对于试图谎报虚拟机行为的不诚实方,Arbitrum 设计了一种有效的基于挑战的协议来识别并惩罚不诚实方。虚拟机行为的链下验证激励机制显著提高了智能合约的可扩展性和隐私性。

TrueBit 和 Arbitrum,通过激励机制鼓励各方验证智能合约的正确性,提高了智能合约的可扩展性和隐私性,但仍存在被恶意用户欺骗的风险。

讨论

实现区块链的安全和隐私需要综合多种技术,同时要注意新技术可能带来的问题,以及在安全、隐私和效率之间进行权衡。

结论

文章阐述了区块链安全和隐私的属性及实现这些属性的技术,深入理解区块链的安全和隐私属性对增强其信任度和发展防御技术至关重要,未来发展需要轻量级加密算法和实用的安全隐私方法。

参考:

  1. 区块链技术:架构及进展-计算机学报
  2. B站北京大学肖臻老师的《区块链技术与应用》
  3. 以太坊开发文档 以太坊开发文档 | ethereum.org
  4. 廖雪峰的区块链教程 简介 - 区块链教程 - 廖雪峰的官方网站

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吉林省自闭症寄宿学校:提供个性化培养方案

在吉林省的怀抱中&#xff0c;隐藏着一片温馨而特殊的天地——星贝育园自闭症儿童寄宿制学校。这里&#xff0c;不是简单的教育场所&#xff0c;而是无数自闭症儿童梦想启航的港湾&#xff0c;是他们感受爱、学习成长、绽放自我光芒的温馨家园。 自闭症&#xff0c;一个逐渐被…

【Python常用模块】_cx_Oracle模块详解

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈…

idea插件开发的第四天-完善JSON工具

介绍 Demo说明 本文基于maven项目开发,idea版本为2022.3以上,jdk为1.8本文在Tools插件之上进行开发本次demo将使用idea的一些组件优化 Tools插件说明 Tools插件是一个Idea插件,此插件提供统一Spi规范,极大的降低了idea插件的开发难度,并提供开发者模块,可以极大的为开发者开…

Q必达任务脚本

文章目录 1.购买服务器地址2.部署教程3. 代码如下4. 如何联系我 1.购买服务器地址 服务器购买地址 https://t.aliyun.com/U/rUHk58 若失效&#xff0c;可用地址 https://www.aliyun.com/activity/wuying/dj?source5176.29345612&userCode49hts92d 2.部署教程 2024年最…

鸿蒙OpenHarmony【小型系统基础内核(进程管理任务)】子系统开发

任务 基本概念 从系统的角度看&#xff0c;任务Task是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独立于其它任务运行。 OpenHarmony 内核中使用一个任务表示一个线程。 OpenHarmony 内核中同优先级进程内的任务统一调度、运…

群晖使用Docker部署WPS Office并实现异地使用浏览器制作办公文档

文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 想象一下这个场景&#xff1a;如果遇到周末紧急需要改方案&#xff0c;但团队成员都在各自家中&#xff0c;这个时候如果大家能够轻松访问这个…

Unity图形用户界面!*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。(万字解析)

Unity 3D GUI 简介 游戏开发过程中&#xff0c;开发人员往往会通过制作大量的图形用户界面&#xff08; Graphical User Interface&#xff0c;GUI &#xff09;来增强游戏与玩家的交互性。 Unity 3D 中的图形系统分为 OnGUI、NGUI、UGUI等&#xff0c;这些类型的图形系统内容…

仓颉编程入门2,启动HTTP服务

上一篇配置了仓颉sdk编译和运行环境&#xff0c;读取一个配置文件&#xff0c;并把配置文件简单解析了一下。 前面读取配置文件&#xff0c;使用File.readFrom()&#xff0c;这个直接把文件全部读取出来&#xff0c;返回一个字节数组。然后又创建一个字节流&#xff0c;给文件…

Apache James配置连接达梦数据库

项目场景&#xff1a; Apache James配置连接达梦数据库&#xff0c;其他配置中不存在的数据库也可参考此方案。 配置步骤 1、把需要的jar包导入到James 把DmJdbcDriver18.jar复制到下面lib目录下 james-2.3.2\lib 2、 修改连接配置 james-2.3.2\apps\james\SAR-INF\confi…

Dockerfile部署xxljob

使用Dockerfile部署xxljob 1. 背景 我们在使用定时任务调度时&#xff0c;通常会使用xxljob容器化部署xxljob&#xff0c;通常使用 docker pull xuxueli/xxl-job-admin:2.4.0 拉取镜像并启动容器。这种方式对于x86架构服务器来说&#xff0c;没有任何问题。但是在arm架构的服…

springboot项目引入了第三方jar包

应该把jar包放在resource目录下&#xff0c;新建一个lib目录放进去&#xff0c;不然打包的时候会报错找不到jar包&#xff0c;放入jar包&#xff0c;右键添加到库&#xff0c;才可以使用。 _g().startMarquee();

MapReduce基本原理

目录 整体执行流程​ Map端执行流程 Reduce端执行流程 Shuffle执行流程 整体执行流程 八部曲 读取数据--> 定义map --> 分区 --> 排序 --> 规约 --> 分组 --> 定义reduce --> 输出数据 首先将文件进行切片&#xff08;block&#xff09;处理&#xff…

【C语言】猜数字游戏

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 前言1. 随机数生成1.1 rand1.2 srand1.3 time1.4 设置随机数的范围 2. 猜数字游戏实现2.1 游戏菜单2.2 主函数部分2.3 game函数部分2.4 附代码2.5 优化代码 前言 前面学习的这些知识&#xff0c;我们就可以写一些稍微…

常见统计量与其抽样分布

什么是统计量 我们首先给出统计量的定义:设 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X1​,X2​,⋯,Xn​ 为来自于总体X的一个样本&#xff0c; g ( X 1 , X 2 , ⋯ , X n ) g(X_1,X_2,\cdots,X_n) g(X1​,X2​,⋯,Xn​) 为关于 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X…

C++ STL容器(三) —— 迭代器底层剖析

本篇聚焦于STL中的迭代器&#xff0c;同样基于MSVC源码。 文章目录 迭代器模式应用场景实现方式优缺点 UML类图代码解析list 迭代器const 迭代器非 const 迭代器 vector 迭代器const 迭代器非const迭代器 反向迭代器 迭代器失效参考资料 迭代器模式 首先迭代器模式是设计模式中…

linux网络编程7

24.9.24学习目录 一.网络通信过程&#xff08;续&#xff09;1.路由器 二.原始套接字&#xff08;SOCK_RAW&#xff09;1.创建原始套接字2.数据包解析 一.网络通信过程&#xff08;续&#xff09; 1.路由器 路由器是用于连接多个逻辑上分开的网络&#xff1b; 具有判断网络地…

React-Native 中使用 react-native-image-crop-picker 在华为手机上不能正常使用拍照功能

背景: React-Native 0.66 中使用 react-native-image-crop-picker 在安卓 华为手机上不能正常使用拍照功能, 其他品牌正常 代码如下: import ImagePicker from react-native-image-crop-picker;ImagePicker.openCamera(photoOptions).then(image > {callback(image);}) …

不靠学历,不拼年资,怎么才能月入2W?

之前统计局发布了《2023年城镇单位就业人员年平均工资情况》&#xff0c;2023年全国城镇非私营单位和私营单位就业人员年平均工资分别为120698元和68340元。也就是说在去年非私营单位就业人员平均月薪1W&#xff0c;而私营单位就业人员平均月薪只有5.7K左右。 图源&#xff1a;…

DownShift: Tuning Shift Reduction With Reliability for Racetrack Memories

目录 DownShift: Tuning Shift Reduction With Reliability for Racetrack Memories文章摘要&#xff1a;文章的主要贡献包括&#xff1a;文章的结构如下&#xff1a;DownShiftDownShift通过以下方式改进了现有的数据放置策略&#xff1a; GROGU&#xff08;Generating Reliabi…

简单题94. 二叉树的中序遍历 (python)20240921

问题描述&#xff1a; python&#xff1a; # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution(object…