Defining Smart Contract Defects on Ethereum论文解读

news2024/11/17 18:22:40

背景

这一部分介绍了智能合约的概念和基础知识,以及 Solidity 编程语言。

  • 智能合约:定义了智能合约作为一种运行在区块链上的程序,它能够在无需第三方干预的情况下自动执行合同条款。
  • 智能合约的不可变性:强调了智能合约一旦部署到区块链就无法修改的特性,这意味着一旦发现漏洞,就无法修复,因此确保智能合约无缺陷至关重要。
  • 以太坊虚拟机 (EVM):介绍了 EVM 作为以太坊平台上执行智能合约的虚拟机,并解释了其运行原理。
  • 智能合约的地址:说明了每个智能合约都有一个唯一的 160 位十六进制地址,用于标识和调用智能合约。
  • selfdestruct 函数:介绍了 selfdestruct 函数,它可以将智能合约从区块链上删除,并将合约余额转移到指定地址。
  • Solidity 编程语言:说明了 Solidity 是以太坊平台上最流行的智能合约编程语言,并将在本文中用于描述智能合约的示例。
  • Gas 系统:解释了以太坊中 gas 系统的作用,即矿工运行智能合约并收取费用。gas 成本取决于交易所需的计算资源,gas 价格由交易创建者提供。gas 限制用于限制交易消耗的最大 gas 数量,超出限制会导致交易终止并抛出异常。
  • 数据存储:介绍了智能合约中数据的三种存储方式:
    • storage:持久存储区域,用于存储数据,写入和读取操作的成本最高。
    • memory:临时存储区域,用于存储临时数据,写入和读取操作的成本低于 storage,但数据生命周期结束后会被释放。
    • calldata:用于存储外部合约函数的参数,读取操作的成本最低。
      这一部分介绍了 Solidity 编程语言中与 Ether 转账和接收相关的 API,以及版本控制的概念。

Ether 转账和接收

  • API:Solidity 提供了三种 API 用于在账户之间转账 Ether:
    • address.transfer(amount):将指定数量的 Ether 转账到目标地址。如果转账失败,会抛出异常并终止交易。
    • address.send(amount):将指定数量的 Ether 转账到目标地址。如果转账失败,会返回 false,但不会抛出异常。
    • address.call.value(amount)():将指定数量的 Ether 转账到目标地址的函数。如果转账失败,会返回 false,但不会抛出异常。
  • gas 限制
    • transfersend 函数会限制被调用合约的 fallback 函数的 gas 限制为 2300 gas。由于这个 gas 数量不足以执行写入存储、调用函数或发送 Ether 等操作,因此这两种函数只能用于向外部拥有账户 (EOA) 转账 Ether。
    • call.value() 函数不会限制 fallback 函数的 gas 限制,因此可以用于向合约或 EOA 转账 Ether。
  • 区别
    • transfersend 的区别在于处理转账失败的方式:transfer 会抛出异常并终止交易,而 send 会返回 false。

版本控制

  • Solidity 版本:Ethereum 支持多个版本的 Solidity 编程语言,每个版本都可能包含重大的语言变更。开发者需要在部署智能合约时选择合适的 Solidity 版本。
  • 版本 pragma:为了简化代码重用,合约可以使用版本 pragma 指示支持的 Solidity 版本。版本 pragma 的格式为 pragma solidity^versionpragma solidity version。例如,pragma solidity^0.4.1 表示合约支持版本 0.4.1 及以上版本(不包括 0.5.0),而 pragma solidity 0.4.1 表示合约仅支持版本 0.4.1。

定义以太坊平台上智能合约的缺陷

研究动机

  • 智能合约的不可变性:智能合约一旦部署到区块链就无法修改,因此检测和修复缺陷至关重要,以确保合约的健壮性。
  • 智能合约与传统软件的差异:与传统的软件(如 Android 应用)相比,智能合约具有独特的特性,例如 gas 系统、去中心化等,这可能导致智能合约包含一些特定的缺陷。

研究方法

3.2.1 StackExchange Posts

  • 研究者为了定义智能合约的缺陷,首先需要收集开发者遇到的问题。
  • 开发者经常在像 Ethereum StackExchange 这样的问答网站上合作和分享经验。
  • 通过分析 Ethereum StackExchange 上的帖子,研究者可以识别和定义以太坊上的一组合约缺陷。
  • 在这项研究中,研究者爬取了 17,128 个 StackExchange 帖子并进行了进一步分析。

3.2.2 Key Words Filtering

  • 从成千上万的问答帖子中找到重要信息是非常耗时的。

  • 因此,研究者使用关键词来过滤 StackExchange 帖子中的重要信息。

  • 为了确保关键词列表的完整性,论文的两位作者仔细阅读了 Solidity 文档,并记录下他们认为重要的关键词。

  • 之后,他们合并了关键词列表,并使用这些关键词来过滤帖子。

  • 在阅读帖子时,研究者添加了新的关键词来丰富他们的列表并过滤新的帖子。

  • 最终,研究者使用了 66 个关键词来过滤出 4,141 个帖子。
    在这里插入图片描述

  • TABLE 1: Classification scheme(分类方案表)列出了不同类别的缺陷及其描述,例如 Gas Limitation(费用限制)、Permission Check(权限检查)、Inappropriate Logic(不适当的逻辑)等。

3.2.3 手动过滤:

目标:研究者的目标是找到与 Solidity 相关的智能合约缺陷。然而,仅仅包含关键词的帖子不一定与 Solidity 相关的合约缺陷有关。
非相关内容:许多帖子讨论的是 web3、开发环境(如 Remix、Truffle)、钱包或功能性问题,这些并不直接涉及 Solidity 相关的合约缺陷。

手动过滤过程:研究者需要从数据集中移除这些非相关帖子,只保留与合约缺陷相关的帖子。例如,如果一个帖子的标题是“使用 web3 从一个账户向另一个账户转移 ERC20 代币”,虽然帖子包含了“ERC20”这样的关键词,但它实际上与 web3 相关,而不是 Solidity 相关的合约缺陷,因此会被排除在数据集之外。

分析结果:这些 4,141 个帖子的详细分析结果可以在 GitHub 上找到,链接为:https://github.com/Jiachi-Chen/TSE-ContractDefects。

3.2.6. 数据集标注:

  • 为了帮助未来的智能合约分析和测试研究,研究人员手动识别了定义的合约缺陷是否存在于他们的数据集中,该数据集包含578个真实世界的智能合约。
  • 为了构建这个数据集,研究人员首先从Etherscan爬取了所有17,013个经过验证的智能合约。(现在有了Smart Contract Sanctuary 是一个专为在 Etherscan 上验证过的 Ethereum 智能合约提供存储的仓库。)
  • 为了可扩展性,研究人员从这些合约中随机选择了600个。
  • 研究人员排除了13个不含任何函数的智能合约,最终得到了587个智能合约,包含231,098行代码。

研究结果

3.3 Results

  • 在这部分,研究人员定义了每种缺陷并给出了示例。
  • 根据后果,这些缺陷被分为五个类别:安全缺陷、性能缺陷、可用性缺陷、可维护性缺陷和可重用性缺陷。

在这里插入图片描述

  • 研究人员首先在表2中简要定义了每个合约缺陷。

表1和表2的区别

表1

  • 表1提供了一个分类方案,用于将智能合约缺陷进行分类。
  • 它列出了不同的类别,并为每个类别提供了描述。
  • 这些类别包括:Gas Limitation Bugs(由于Gas限制引起的错误)、Permission Check Bugs(权限检查失败引起的错误)、Inappropriate Logic(合约中不适当的逻辑)、Ethereum Features Bugs(以太坊新特性引起的错误)、Version Gaps(以太坊或Solidity更新引起的错误)和Inappropriate Standard(未遵循以太坊提供的标准)。
  • 这个表格的目的是为了帮助研究者和开发者理解智能合约中可能遇到的不同类型的缺陷,并为每个类别提供了一个概览。

表2

  • 表2列出了20种具体定义的智能合约缺陷。
  • 每种合约缺陷都有一个简短的定义,并说明了它可能导致的后果。
  • 这些缺陷被分为五类,包括安全性缺陷、性能缺陷、可用性缺陷、可维护性缺陷和可重用性缺陷。
  • 表2提供了每种缺陷的具体信息,包括它们可能对智能合约造成的影响以及它们所属的类别。

区别

  • 表1 更侧重于提供一个分类框架,帮助识别和理解智能合约缺陷的不同类型。
  • 表2 则提供了这些缺陷的具体定义、例子和可能的影响,是更详细的缺陷列表。

安全缺陷

(1) 未检查的外部调用(Unchecked External Calls):为了转移以太币或调用其他智能合约的函数,Solidity提供了一系列针对原始地址的外部调用函数,例如address.send(), address.call(), address.delegatecall()。当发生错误时,这些方法将返回一个布尔值(False),但不会抛出异常。如果调用者不检查外部调用的返回值,他们无法确保代码逻辑是否正确。

(2) DoS攻击在外部影响下:当检测到异常时,智能合约将回滚交易。然而,在循环体内抛出异常是危险的。

(3)严格余额相等性:攻击者可以通过使用 selfdestruct(victim address) API 强制向任何合约发送以太币。这种方法不会触发回退函数,这意味着受害合约无法拒绝这些以太币。因此,由于攻击者发送的意外以太币,余额相等的检查逻辑将失效。

(4) 不匹配的类型赋值:Solidity 支持不同类型的整数(例如,uint8, uint256)。整数的默认类型是 uint256,它支持的范围是从 0 到 2^256。uint8 占用更少的内存,但只支持从 0 到 2^8 的数字。Solidity 在值超过其最大值时不会抛出异常。在编程中,逐步增加是一个常见操作,如果没有检查最大值就执行增量操作可能会导致溢出。

(5) 交易状态依赖:合约需要在某些函数中进行权限检查,比如自毁函数(清单1中的L33行)。权限检查失败可能会导致严重后果。例如,如果有人通过了自毁函数的权限检查,他/她可以销毁合约并窃取所有的以太币。

(6) 区块信息依赖:以太坊提供了一套API(例如,block.blockhash, block.timestamp)来帮助智能合约获取与区块相关的信息,比如时间戳或哈希数。许多合约使用这些区块信息来执行某些操作。然而,矿工可以影响区块信息;例如,矿工可以将区块时间戳变化大约900秒[24]。换句话说,区块信息依赖操作在一定程度上可以被矿工控制。

(7) 重入攻击(Re-entrancy):并发是传统软件的一个重要特性。然而,Solidity 不支持并发,智能合约的函数在运行时可能会被中断。Solidity 允许使用 call 方法进行并行外部调用。如果被调用合约没有正确管理全局状态,那么被调用合约可能会受到攻击,这种攻击称为重入攻击。

(8) 嵌套调用:CALL 指令非常昂贵(作为 CALL 操作的一部分,非零值转移需要支付 9000 gas )。如果循环体包含 CALL 操作,但没有限制循环执行的次数,总 gas 成本很可能超过 gas 限制,因为迭代次数可能很高,且很难知道其上限。

(9) 误导性的数据位置:在像 Java 或 C 这样的传统编程语言中,在函数内部创建的变量是局部变量。数据存储在内存中,函数退出后内存会被释放。在 Solidity 中,即使在函数内部创建,struct、mapping 和数组的 数据也是存储在存储(storage)中的。然而,由于 Solidity 中的存储不是动态分配的,函数内部创建的存储变量默认会指向存储槽位 0 。这可能导致不可预测的错误。

可用性缺陷

(1) 不匹配的ERC-20标准:ERC-20 Token Standard [17] 是以太坊上实现加密货币代币的技术标准。它定义了在更大的以太坊生态系统中以太坊代币需要遵循的标准规则列表,允许开发者准确预测代币之间的交互。这些规则包括代币如何在地址之间转移以及如何访问每个代币内的数据。函数名称、参数类型和返回值应严格遵循ERC20标准。ERC-20定义了9个不同的函数和2个事件,以确保基于ERC20的代币可以轻松与其他ERC20代币交换。然而,我们发现许多智能合约遗漏了返回值或遗漏了一些函数。

(2) 缺少提醒:其他程序可以通过智能合约的应用程序二进制接口(ABI)调用智能合约。ABI 是在以太坊生态系统中与合约交互的标准方式,无论是从区块链外部还是合约之间的交互。然而,ABI 只能告诉调用者一个函数的输入和输出是什么,但它不会告知调用者函数调用是否成功。抛出一个事件来通知调用者函数是否成功执行可以减少不必要的错误和浪费的燃料(gas)。

(3) 缺少返回语句:某些函数声明了返回值,但实际上没有返回任何内容。对于这些情况,EVM在将代码编译为字节码时会添加一个默认的返回值。由于调用者可能不知道被调用合约的源代码,他们可能会使用返回值来处理代码执行,从而导致不可预测的错误。

(4) 贪婪合约:一个合约可以通过发送以太币到另一个地址或使用自毁函数selfdestruct来提取以太币。如果没有这些与提取相关的函数,合约中的以太币将永远无法提取,并被永久锁定。我们定义一个贪婪合约是指该合约可以接收以太币(包含可支付回退函数payable fallback function),但没有办法提取它们。

性能缺陷

(1) 未使用的语句:如果函数参数或局部变量既不影响合约的任何语句,也不返回值,那么最好移除这些参数或变量,以提高代码的可读性。

(2) 高消耗燃料的函数类型:对于公共函数,Solidity会立即将函数参数(数组)复制到内存中,而外部函数可以直接从calldata读取。内存分配是昂贵的,而从calldata读取是便宜的。为了降低燃料消耗,如果没有内部函数调用这个函数,并且函数参数包含数组,建议使用外部函数而不是公共函数。

(3) 高消耗燃料的数据类型:在Solidity中,bytes 是一种动态大小的字节数组,而 byte[] 与 bytes 类似,但是 bytes 消耗的燃料比 byte[] 少,因为 bytes 在 calldata 中是紧密打包的。EVM 每次操作32字节,byte[] 总是占用32字节的倍数,这意味着会浪费大量的空间,而 bytes 则不会。因此,bytes 占用的存储空间更少,消耗的燃料也更少。为了降低燃料消耗,建议使用 bytes 而不是 byte[]。

可维护性缺陷

(1) 硬编码地址:由于我们不能在部署智能合约后修改它们,硬编码地址可能会导致安全漏洞。

例子:这种合约缺陷可能导致两种主要错误。第一种是非法地址。以太坊使用混合大小写的地址校验和来验证地址是否合法,这一规则在EIP-55中定义。在清单1的第12行有一个错误地址。所有者地址是一个非法地址,地址的最后一位应该是‘F’,但错误地写成了‘D’。这个非法地址导致没有人能够提取该合约中的金额。第二种是自杀地址。selfdestruct 函数(第36行)可以从区块链上移除代码,使合约成为一个自杀合约,但这具有潜在的危险。如果有人向自杀合约发送以太币,这些以太币将永远丢失。receiver(第38行)是一个包含selfdestruct函数的智能合约。其地址在第38行硬编码,且无法修改。如果receiver执行了selfdestruct函数,它将成为一个自杀合约。所有发送到receiver的以太币将永远丢失。

(2) 缺少中断器:当攻击者发现合约中的漏洞时,他们可以利用这些漏洞攻击合约并窃取以太币。例如,DAO因为代码中的一个漏洞导致攻击者可以反复提取以太币,最终损失了5000万美元的以太币。中断器是一种机制,用于在检测到漏洞时停止合约的运行。虽然我们不能在将合约部署到区块链后修改它们,但如果合约包含中断器,受害合约的所有者可以减少损失。

可重用性缺陷

(1) 废弃的API:Solidity是一种年轻且不断发展的编程语言。一些API在未来可能会被弃用或更新。在这种情况下,Solidity文档通常会使用警告来通知开发者某些API将来会被弃用。这些API可能在当前的编译器版本中仍然受支持。然而,如果开发者使用这些API,他们可能需要为了代码复用而重构代码,这会导致资源浪费。

(2) 未指定编译器版本:不同的Solidity版本可能包含不同的API/指令。在Solidity编程中,某些API只在特定的版本中受支持。如果一个合约没有指定编译器版本,开发者可能会在未来的代码复用时遇到编译错误,这是由于版本差异造成的。

从实践者视角来看

动机

为了验证定义的智能合约缺陷是否具有危害性,创建了一个在线调查,以收集真实世界中的智能合约开发者的意见。

方法

做了一个问卷调查

结果

在这里插入图片描述

DISTRIBUTION AND IMPACT OF CONTRACT DEFECTS

动机

  • 优先级排序: 由于时间紧迫或成本问题,无法一次性修复所有缺陷。因此,了解不同缺陷的影响可以帮助开发人员决定哪些缺陷应该优先修复。
  • 资源分配: 理解缺陷的影响可以帮助开发人员合理分配资源,例如时间、人力和资金,以最大程度地提高智能合约的安全性、可靠性和可用性。
  • 风险管理: 了解缺陷的影响可以帮助开发人员识别潜在的风险,并制定相应的风险缓解措施。

方法

** 影响级别定义**:
作者从三个维度定义了影响级别:

  • 合约维度 (Contract Dimension): 关注缺陷导致的合约行为的严重程度。例如,重新进入缺陷可能导致攻击者攻击合约,并窃取合约中的所有以太币。
  • 攻击者维度 (Attacker Dimension): 关注攻击者利用缺陷进行攻击的可能性以及攻击者可能获得的收益。
  • 用户维度 (User Dimension): 关注缺陷对调用者的影响,例如潜在的错误、气体浪费和代码重用错误。

影响分类
作者将 5 种常见后果分为三个严重程度级别:

  • 关键 (Critical): 缺陷可能导致合约崩溃、被攻击者控制或失去所有以太币。
  • 主要 (Major): 缺陷可能导致合约失去部分以太币。
  • 轻微 (Trivial): 缺陷不会影响合约的正常运行,但可能导致调用者程序出现错误或代码重用困难。

结果

影响级别分配
在这里插入图片描述
作者将每个缺陷映射到一个或多个影响级别,并将详细结果展示在表格中。

分布类型
作者发现了 5 种常见的分布类型:

  • 影响 1 (IP1): 严重不良行为,例如崩溃或被攻击者控制,攻击者可以利用缺陷获利。
  • 影响 2 (IP2): 严重不良行为,例如崩溃或被攻击者控制,但攻击者无法通过利用缺陷获利。
  • 影响 3 (IP3):
    • 类型 1 (T1): 严重不良行为,例如崩溃或被攻击者控制,但不良行为无法被外部触发。
    • 类型 2 (T2): 主要不良行为,例如失去部分以太币,攻击者可以利用缺陷获利,但无法通过利用缺陷获利。
  • 影响 4 (IP4): 合约可以正常工作,但缺陷可能导致调用者程序出现错误或代码重用困难。
  • 影响 5 (IP5): 合约可以正常工作,并且不会导致调用者程序出现错误,但缺陷可能导致气体浪费,并使合约难以理解和重用。

讨论

  1. 字节码级别检测:
    挑战: 智能合约的源代码可能不可见,因此需要通过字节码进行检测。字节码丢失了大量的语义信息,这使得检测变得更加困难。
    建议: 研究人员可以开发更高级的字节码分析技术,例如控制流图分析和符号执行,以帮助理解字节码的执行行为和潜在缺陷。

  2. EVM 操作:
    挑战: EVM 会优化源代码,这可能导致一些信息丢失或优化,使得检测更加困难。例如,检测函数是否具有返回值在源代码级别是 straightforward 的,但在字节码级别却难以检测,因为 EVM 会添加默认值。
    建议: 研究人员需要开发更高级的代码转换和优化分析技术,以帮助理解 EVM 操作对智能合约的影响,并识别潜在的缺陷。

  3. 源代码级别检测:
    方法: 使用抽象语法树 (AST) 将源代码分解成函数,并检查每个函数是否存在潜在的缺陷。

相关工作

本节概述了与本研究相关的工作,并对比了不同的研究方法和成果。
Atzei等人的工作

  • 提出了针对以太坊智能合约的系统性调查,介绍了12种安全漏洞,并讨论了攻击者可能利用的攻击方式。
  • 安全漏洞来源于学术文献、网络博客、讨论论坛以及作者的实际编程经验。
  • 与本研究的不同之处在于,本研究不仅关注安全性,还考虑了可用性、性能、可维护性和可重用性方面。

Oyente

  • 是第一个智能合约漏洞检测工具,使用符号执行来检测四种安全问题。
  • 测量了19,366个现有以太坊合约,发现8,519个合约含有定义的安全问题。

Zeus

  • 是Oyente的升级版,减少了假阳性和假阴性结果。
  • 检测7种安全问题,其中4种与Oyente相同,另外3种是新定义的问题。
  • 测试了1524个智能合约,发现大约94.6%的合约至少含有一个安全问题。

ContractFuzzer

  • 专注于检测7种安全漏洞,包括无气发送、异常混乱、重入攻击等。
  • 使用离线EVM工具和在线模糊测试工具,基于智能合约ABI自动生成测试输入。
  • 测试了6,991个智能合约,发现459个含有漏洞。

MAIAN

  • 专注于可能导致合约无法释放以太币、可以将以太币转移到任意地址或可以被任何人销毁的安全问题。
  • 使用符号分析和具体验证来检测这些问题。
  • 测试了970,898个智能合约,发现34,200个含有至少一个安全问题。

SMARTEMBED

  • 使用克隆检测方法来检测智能合约中的漏洞。
  • 包含训练阶段和预测阶段,使用AST和Fasttext将代码转换为嵌入矩阵,计算给定合约与数据库中合约的相似性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

element-plus中日历组件设置起始为周一

问题描述 element-plus中的日历组件默认是周日到周六,因业务需求,需要实现从周一到周日的顺序。 解决方式 引入dayjs及本地语言包,使用本地时区即可。 import dayjs from dayjs import dayjs/locale/zh-cn ... // 这一句是为了让日历使用本地…

Invalid Teleport target on mount: null (object)

Failed to locate Teleport target with selector “.demon”. Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree main.…

银河麒麟V10下如何将TXT文件转为PDF?

银河麒麟V10下如何将TXT文件转为PDF? 1. 安装软件2. TXT转PS3. PS转PDF 💖The Begin💖点点关注,收藏不迷路💖 在银河麒麟高级服务器操作系统V10中,将TXT文件转换为PDF文件可以通过简单的几步完成。 1. 安装…

Linux oracle数据库静默安装

系统:Centos7 一、安装准备 1.1 更换依赖源 yum源进行切换(这里采用的阿里云的yum源)(切换之前建议先备份 /etc/yum.repos.d 中的文件) wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/rep…

网络工程师指南:防火墙配置与管理命令大全,零基础入门到精通,收藏这一篇就够了

本指南详细介绍了防火墙的配置与管理命令,涵盖了防火墙的工作原理、常见配置命令、安全策略与访问控制、日志管理与故障排查,并通过实战案例展示了如何有效防御网络攻击。通过学习本指南,网络工程师能够系统掌握防火墙的配置与管理技能&#…

收银系统源码-ERP进销存解决方案

收银系统目前已经成为门店日常经营的必备软件工具,功能一般需涵盖线下门店收银,ERP进销存、线上商城等。一套好的ERP进销存模块也能很大程度帮助门店经营管理门店。 ERP进销存功能涵盖了商品的采购、销售、调拨、盘点、库存管理、资金管理等全链路管理&…

【周末推荐】替换SwitchyOmega的Chrome浏览器插件

SwitchyOmega插件在我们这个圈子里应该无人不知无人不晓了吧,最近有很多朋友反馈自己的SwitchyOmega不工作了,今天我们将聊聊为什么SwitchyOmega不工作了,并推荐2款实用的Chrome浏览器插件解决这个问题。 为什么要替换SwitchyOmega&#xff…

这种膜为啥能随温度变透明?怎么制备的?有啥特点?

大家好,今天我们来了解一项关于纳米纤维膜的研究——《Diphylleia Grayi-Inspired Intelligent Temperature-Responsive Transparent Nanofiber Membranes》《Nano-Micro Letters》。在现代科技的发展中,透明材料的需求日益增长,传统材料已无…

VBA技术资料MF206:右键录入指定的数据及图标

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

卡通角色检测系统源码分享

卡通角色检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

旭升集团携手纷享销客,构建全方位客户关系管理平台

宁波旭升集团股份有限公司(以下简称“旭升集团”)自2003年成立,总部位于中国宁波,集团设有压铸、锻造、挤压、集成四大事业部,在亚洲、欧洲、美洲等地均设立研发中心及制造基地,产品主要覆盖新能源汽车的电…

Cisco ASA 9.22.1 发布下载,新增功能概览

Cisco ASA 9.22.1 - 思科自适应安全设备 (ASA) 软件 Cisco Adaptive Security Appliance (ASA) 请访问原文链接:https://sysin.org/blog/cisco-asa/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 新增功能 重要…

Git(5):分支合并merge和rebase

git merge 假设有两个分支:master 分支和 feature 分支,现在需要将 feature 分支合并到 master 分支。 git checkout mastergit merge feature在合并分支时,git 提供了不同的合并策略,用于处理不同的合并场景。 Fast-forward 如…

Spring Boot 进阶- Spring Boot 自定义拦截器详解

上篇文章中我们创建了一个RestFul风格的接口,并且介绍了如何对其结果进行格式化的方式。这篇文章我们来讲在SpringMVC中常用到的另一个概念拦截器。 什么是拦截器? 在Spring MVC中拦截器有点类似于在Servlet中的过滤器的概念,主要是用来拦截用户求,并且对用户请求进行相应…

2024双十一买啥最划算?2024双十一五款值得入手的好物入手

2024双十一购物狂欢节将至,还在为买什么而纠结吗?这里为你入手五款值得入手的好物。从生活必备到时尚单品,涵盖多个领域,让你在双十一以划算的价格买到心仪之物,开启品质生活新旅程。 一、西圣find可视挖耳勺 入手理…

【libp2p——NAT】

1. 什么是NAT NAT(Network Address Translation,网络地址转换)是指一种网络技术,它允许多个设备通过一个公共IP地址连接到互联网。NAT通常被用在家庭或小型办公室的路由器上,以允许多台计算机共享一个互联网连接。这种…

Tensorflow 2.0 cnn训练cifar10 准确率只有0.1 [已解决]

cifar10 准确率只有0.1 问题描述踩坑解决办法 问题描述 如果你看的是北京大学曹健老师的tensorflow2.0,你在class5的部分可能会遇见这个问题 import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.keras.layers import Dense, Dropout,MaxPooling2D,Fla…

揭秘 MrBeast 爆款视频秘籍,视频从业者必看!

MrBeast 是美国第一网红,可能也是世界第一网红。他的YouTube频道在2024年9月拥有3.17亿订阅者,成为订阅者最多的频道。这一庞大的粉丝基础不仅代表了他的影响力,也反映了他所创造内容的受欢迎程度。 视频制作的高投入 MrBeast每个视频的拍…

死磕P7: JVM类加载那些事儿,一起探知类的前世今生(一)

这是「死磕P7」系列第 005 篇文章,欢迎大家来跟我一起 死磕 100 天,争取在 2025 年来临之际,给自己一个交代。 前面几篇介绍了 JVM 的区域划分及垃圾收集相关的内容,只是告诉了你我有一栋豪华大酒店,大楼里有哪些房间&…

高级前端进阶:揭秘 MemFire Cloud 的强大助力

在前端开发的道路上,我们总是在追求效率与速度的平衡,如何写出优雅的代码,如何让开发流程更加顺滑成为了每个前端开发者的目标。对于那些希望提升效率、减少繁琐开发步骤的开发者来说,MemFire Cloud,一款国产的一站式应…