Defining Smart Contract Defects on Ethereum论文解读

背景

这一部分介绍了智能合约的概念和基础知识,以及 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.rhkb.cn/news/434746.html

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

相关文章

Python in Excel作图分析实战!

Excel 中的 Python 现已正式发布,适用于 Microsoft 365 商业版和企业版的 Windows 用户。去年 8 月,微软与 Anaconda 合作,通过集成 Python 为 Excel 引入了一个令人兴奋的新增功能,从而可以将 Python 和 Excel 分析无缝结合到同一…

开放原子开源基金会网站上的开源项目Opns存在缓冲区溢出缺陷

最近在开放原子开源基金会网站上,看到一些开源项目,之前分析出华为的鸿蒙操作系统代码,没有发现有价值的安全漏洞。现在,下载上面的Onps开源网络协议栈,既然是通讯所使用的软件,其质量应该值得信任呢&#…

MySQL - 进阶篇

一、存储引擎 1. MySQL体系结构 2. 存储引擎简介 3. 存储引擎特点 4. 存储引擎选择 二、索引 1. 索引概述 2. 索引结构 3. 索引分类 4. 索引语法 5. SQL性能分析 6. 索引使用 7. 索引设计原则 三、SQL优化 1. 插入数据 2. 主键优化 3. order by优化 4. group by优化 5. limi…

【JavaEE】——线程池大总结

阿华代码,不是逆风,就是我疯, 你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你! 目录 引入:问题引入 一:解决方案 1:方案一——协程/纤程 (1…

CST仿真分析:圆柱形谐振腔的模式分析

波导谐振器一般可以由波导两端短路形成,矩形和圆柱形谐振腔比较常见。矩形谐振腔模式的表示,是从波导的TEmn和TMmn变成了TEmnp和TMmnp,p是沿z方向的周期。之所以我们这里分析圆柱形,一是三个下角标更不容易理解(TEnip和…

七段 LED 显示器(7段数码管)

7 段 LED 显示器, 通常简称为 LED 数码管 或 数码管. 通过 菜单--绘制--数字芯片--添加 7 段 LED 显示器 可以引入它. 普通模式 它内部其实就是七盏长条状的 LED 灯, 有的横着放, 有的竖着放. 七个灯用 a b c d e f g 分别表示. 灯的位置从上到下, 从里到外顺时针下来, 如上图…

【图像生成大模型imagen】细节逼真富有创造力

谷歌在 I/O 开发者大会上还带来了更先进的 Imagen 3 文本生成图片模型,进一步增强了文本生成图片的技术能力。 谷歌表示,在过去的一年里,我们努力提高图像质量和保真度,Imagen 3 能生成令人难以置信的图像细节,生成逼…

RSA加解密

第1关:实现RSA加解密类 任务描述 本关任务:编写一个能进行rsa加密和解密的程序 相关知识 为了完成本关任务,你需要掌握:1.rsa算法原理,2.快速乘法算法 rsa算法原理 1978年美国麻省理工学院的三名密码学者R.L.Rivest…

解决远程连接AlpineLinux Mysql/MariaDB 无法连接的问题

&#x1f525;博客介绍&#xff1a; EvLast &#x1f3a5;系列专栏&#xff1a; << C项目>> <<数据结构与算法>> << 算法入门>> &#x1f3a5; 当前专栏:<< C项目>> 专题 : 解决开发中的日常Bug &#x1f44d;&#x1f44…

问题记录:end value has mixed support, consider using flex-end instead

一、问题记录 二、解决问题 根据提示改为flex-end 三、理解问题 ‌这个警告信息表明&#xff0c;在Flex布局中使用“end”属性时存在兼容性问题&#xff0c;建议使用“flex-end”代替。 当在Flex布局中使用“justify-content: end;”时&#xff0c;浏览器可能对“end”值的支…

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】 一、上篇回顾二、项目准备2.1 准备模板项目2.2 支持计时功能2.3 配置UART4引脚2.4 支持printf重定向到UART42.5 支持printf输出浮点数2.6 支持printf不带\r的换行2.7 支持ccache编译缓存 三、TFLM集成3.1 添加tfli…

Linux之实战命令18:col应用实例(五十二)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

深刻理解Redis集群(下):Redis 哨兵(Sentinel)模式

背景 现在对3个节点的sentinel进行配置。sentinel的配置文件在redis的安装目录中已经存在&#xff0c;只需要复制到指定的位置即可。 sentinel是独立进程&#xff0c;有对应的脚本来执行。 基于之前的redis 一主二从的架构&#xff0c;我们继续启动3个sentinel进程。 哨兵模式的…

Servlet——springMvc底层原理

我们也先了解一下什么的动态资源&#xff0c;什么是静态资源。 静态资源&#xff1a;无需程序运行就可以获取的资源&#xff08;照片、html、css、js等&#xff09; 动态资源&#xff1a;需要通关程序运行才可以获得的资源。 &#xff08;其实动态、静态的资源都与Servlet有…

手机软件何时统一——桥接模式

文章目录 手机软件何时统一——桥接模式凭什么你的游戏我不能玩紧耦合的程序演化合成&#xff0f;聚合复用原则松耦合的程序桥接模式桥接模式基本代码 手机软件何时统一——桥接模式 凭什么你的游戏我不能玩 时间&#xff1a;5月31日20点  地点&#xff1a;大鸟房间  人物…

游戏账号系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;游戏类别管理&#xff0c;游戏账号管理&#xff0c;站内联系管理&#xff0c;交易订单管理&#xff0c;帐号退货管理 微信端账号功能包括&#xff1a;系统首…

一个家越来越有钱,是因为女人身上有这3个好习惯!

在一个家庭中&#xff0c;女人往往扮演着举足轻重的角色。 她们不仅是家庭的支柱&#xff0c;也是家庭和谐与繁荣的重要因素。 正所谓“家和万事兴”&#xff0c;一个家庭是否能够兴旺发达&#xff0c;与家中女人的习惯和态度息息相关。 实际上&#xff0c;一个家越来越有钱…

2024年双十一值得入手好物?2024年双十一必买清单!

双十一的号角已经吹响&#xff0c;你是否还在为买什么而纠结&#xff1f;快来看看这份2024年双十一必买清单&#xff01;这里汇聚了各类令人惊喜的好物&#xff0c;从科技新宠到生活必备&#xff0c;总有一款能打动你的心&#xff01; 一、真1000w配置——西圣find可视挖耳勺 …

基于php的幸运舞蹈课程工作室管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

uni-app - - - - -vue3使用i18n配置国际化语言

uni-app - - - - -使用i18n配置国际化语言 1. 安装vue-i18n2. 配置文件2.1 创建如下文件2.2 文件配置2.3 main文件导入i18n 3. 页面内使用3.1 template内直接使用3.2 变量接收使用 1. 安装vue-i18n npm install vue-i18n --save2. 配置文件 2.1 创建如下文件 locales文件夹里…