什么是智能合约?你需要知道的一切

  • hacken
  • 发布于 2025-06-27 14:32
  • 阅读 17

本文深入探讨了智能合约的关键概念、工作原理、生命周期、优势、常见类型以及安全实践。智能合约作为Web3的重要组成部分,通过自动化执行交易和流程,降低成本,提高效率和安全性。然而,智能合约也面临着诸多安全挑战,需要采取全面的安全措施来保障其可靠性和安全性。

更新于:2025 年 6 月 26 日

阅读时间:22 分钟

作者:Hacken

随着区块链技术不断重塑各个行业,理解智能合约对于 Web3 爱好者至关重要。这些自执行合约在区块链上运行,无需中央监管,从而实现去中心化应用(dApps)和金融系统,同时确保信任和效率。本指南介绍了智能合约的关键概念,包括其结构、优势和必要的安全实践,帮助你探索 Web3 中动态的智能合约世界。

什么是智能合约?

智能合约是当特定条件满足时自动执行交易的数字协议。它们是区块链技术的关键组成部分,随着 Blockchain 2.0 的推出而广受欢迎。智能合约允许各种流程运行,而无需中间人。

这些合约运行在以太坊虚拟机(EVM)等平台上,并且是图灵完备的,这意味着它们可以处理复杂的计算和逻辑。由于智能合约在区块链上运行,它们不依赖于中央机构,使其具有去中心化的特性。

智能合约的用例和优势

智能合约的复杂性和目的各不相同,从基本交易到管理整个应用程序。常见的分类包括公共合约(在开放区块链上)与私有合约(访问受限),以及用于同质化代币的 ERC-20 和用于 NFT 的 ERC-721 等基于代币的标准。它们还服务于各种应用,如代币互换、转账和借贷。

去中心化金融(DeFi)是主要的用例,它为借贷和交易提供无需信任的平台,无需中间人。代币化的现实世界资产,如房地产和稳定币,也利用智能合约来提高透明度和运营效率。它们还为 Polymarket 等预测市场提供动力,用户可以在其中押注具有经过验证的区块链结果的事件,以及促进具有流动性激励的无需信任交易的借贷平台。

智能合约通过自动化任务、减少人为错误和消除对中介机构的需求来简化流程。它们的效率显着加快了执行时间,并通过最小化管理费用和降低交易费用(尤其是在跨境支付中)来实现成本降低。此外,它们的不可变性确保一旦部署,它们就无法被更改,从而在区块链上提供强大的安全性和透明度。

流行的智能合约平台

由 EVM 和 Solidity 驱动的以太坊仍然是最流行的智能合约开发平台,尽管面临安全漏洞等挑战。Solana 使用 Solana 虚拟机(SVM)和 RUST 等新兴竞争对手,以及 Sui 和 Aptos 等采用 Move 的平台,因其增强的可扩展性和改进的编程框架而越来越受欢迎。

智能合约的不可变性

关于智能合约,需要记住的一件重要事情是,一旦它们部署在区块链上,就无法更改或更新。这种不可变性是区块链技术的一个关键特征,确保协议随着时间的推移保持可靠和安全。

智能合约如何工作

如前所述,智能合约是图灵完备的结构,运行在 EVM 等基础设施上。它们允许用户采用一种编程方式来处理基础设施。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleWallet {
    mapping(address => uint256) private balances;

    event Deposit(address indexed account, uint256 amount);
    event Withdraw(address indexed account, uint256 amount);

    function deposit() external payable {
        require(msg.value > 0, "Must deposit > 0");
        balances[msg.sender] += msg.value;
        emit Deposit(msg.sender, msg.value);
    }

    function withdraw(uint256 _amount) external {
        require(_amount > 0 && balances[msg.sender] >= _amount, "Invalid withdraw");
        balances[msg.sender] -= _amount;
        payable(msg.sender).transfer(_amount);
        emit Withdraw(msg.sender, _amount);
    }

    function checkBalance(address _account) external view returns (uint256) {
        return balances[_account];
    }

    function contractBalance() external view returns (uint256) {
        return address(this).balance;
    }
}

一旦它们被编码并部署到区块链,智能合约就会成为区块链状态的一部分,并被分配一个唯一的地址,该地址源自部署者的地址和 nonce,从而确保合约地址是以确定性的方式生成的。通过这个地址,它们可以被其他合约和用户访问。与合约的交互包括调用其函数或向其地址发送资金(如果它被配置为接收付款)。对合约的调用会触发函数执行,其中底层虚拟机逐条执行合约的字节码指令,模拟一个虚拟堆栈机。

智能合约在有限的范围内运行,并且只能与链上数据和同一网络内的其他合约进行交互。跨网络或链下交互需要 Oracle 或外部链下计算系统,这些系统提供真实世界的数据或跨链功能。在执行期间,合约可以发出事件,这些事件被记录在区块链上,并为链下应用程序编制索引,以便观察并响应这些变化。

在部署之后以及与智能合约交互期间,每笔交易都要经过一个结构化的处理过程,以确保其有效性并符合区块链协议规则。交易最初被广播到网络并传播到池中,验证者(或者在某些区块链中是矿工)会从池中提取它们。验证者根据网络的共识算法运行,例如工作量证明(PoW)、权益证明(PoS)或其他高级机制,如委托权益证明(DPoS)或实用拜占庭容错(PBFT)。

共识算法通过确定哪个验证者有权提议下一个交易区块来强制执行对区块链状态的协议,从而确保仅包含经过验证的且非冲突的交易。一旦验证,交易将提交到区块链,在那里它们成为不可变的记录。验证者有动力诚实行事,并且如果他们违反协议规则或执行无效操作,则在某些共识模型中会受到处罚或削减机制,从而维护区块链生态系统的完整性。

每笔交易的执行都会消耗计算资源,以 gas 衡量。Gas 是交易处理中的一个基本单位,表示执行合约中特定操作所需的计算步骤的成本。为了有效地管理网络资源并防止滥用,每笔交易都有一个 gas 限制 —— 这是由发送者设置的上限,定义了他们愿意在计算上花费多少。复杂的操作,如状态修改和存储写入,会产生更高的 gas 成本,这反映了网络的计算负载。

验证者会受到与每笔交易相关的 gas 费的激励,因为这些费用代表了处理交易和保护网络的补偿。交易的 gas 价格(通常由网络状况决定)会影响其处理速度 —— 较高的费用使交易更有吸引力,可以立即包含在下一个区块中。通过 gas 费调节需求,区块链维持了一个稳定的、去中心化的环境,在其中,通过平衡的资源分配和验证者激励来维护网络完整性。

这是一个它如何工作的例子:

智能合约如何工作?

在这个例子中,智能合约通过允许用户通过区块链交易与之交互来运行。用户将数据和加密货币(例如以太币)发送到智能合约,该合约随后执行其预定义的代码。验证者或网络上的对等方验证交易和合约的结果,确保其符合网络规则并且在区块链上是一致的。一旦验证,交易和合约结果将包含在一个新区块中,该区块被添加到区块链中。此过程会随着时间的推移构建一个安全、不可变的交互记录,从而创建一个连续的经过验证的交易和智能合约活动链。

一旦交易被处理和验证,它们将成为区块链永久记录的一部分,并且可以通过区块链浏览器跟踪每笔交易的链上历程。区块链浏览器提供了一个透明的界面,用于查询交易、地址、区块,甚至智能合约交互的状态和详细信息。通过输入交易哈希、地址或区块号,用户可以检索信息,例如交易确认、gas 费、涉及的地址和时间戳数据,所有这些信息都会实时更新。

这些浏览器将原始区块链数据解码为人类可读的格式,使任何人都可以监视和验证链上活动。对于开发人员、审计人员或参与者来说,浏览器可以揭示有关网络性能、合约事件和资金流动的关键见解,从而有助于确保整个网络的透明度、问责制和数据完整性。此访问支持区块链技术的核心原则 —— 信任、透明度和可追溯性 —— 从而使去中心化生态系统的内部运作可供任何用户访问和验证。

智能合约的生命周期

智能合约的生命周期可以分为五个主要步骤,从编写代码到在区块链上最终确定其状态。

  1. 创建:生命周期从开发人员编写智能合约代码开始。此代码定义了合约的逻辑、函数和数据结构,所有这些都决定了合约在执行时的行为。一旦代码最终确定,它将被编译为字节码,该字节码与目标区块链的虚拟机兼容(例如,以太坊网络的以太坊虚拟机)。
  2. 部署:编译后,字节码通过交易部署到区块链。此部署交易为智能合约分配一个唯一的合约地址,该地址源自部署者的地址和交易 nonce。部署后,合约的代码变得不可变,并永久存储在区块链的状态中。将创建一个区块头以封装合约的地址及其关联的代码,从而正式在网络上发布合约。
  3. 用户交互:部署后,用户可以通过将交易发送到其唯一地址来与智能合约交互。每笔交易都指定要调用的函数(method_called())和任何必要的参数。这些交易进入区块链的待处理交易池,等待网络节点验证。交易payload(包括合约地址、方法和参数)构成了交互的基础,并决定了合约将执行的特定操作。
  4. 验证:网络验证者或矿工从池中选择交易,并在其节点上执行指定的合约代码。每个节点都在沙盒环境中运行相同的合约逻辑,以确保整个网络的一致结果。多个节点独立执行合约,产生结果(表示为 f1、f2、...、fn)。然后比较这些结果以验证共识;如果各个节点的输出匹配,则认为交易有效。此共识机制可确保执行具有确定性,从而维护网络可靠性和完整性。
  5. 最终状态更新:验证后,由交易产生的最终状态将被提交到区块链。更新区块头以包括经过验证的结果,从而反映区块链不可变账本中智能合约的新状态。此状态更新完成了交易生命周期,并且区块链现在拥有合约在交互后状态的准确、防篡改记录。

智能合约生命周期中最关键的阶段是创建过程。必须确保它不包含任何错误,这些错误可能会导致一旦部署就损失数百万甚至更多的资金。

智能合约的主要优势

智能合约为去中心化应用带来了许多优势,以传统系统无法轻易比拟的方式提高了效率、安全性和信任度。以下是一些主要优势:

1. 自动化和效率

智能合约可自动化复杂的工作流程,并消除交易处理中对手动干预的需求。通过在满足特定条件后立即执行预定的逻辑,它们可以显着提高效率、缩短执行时间并最大程度地减少人为错误。这种自动化还消除了对人为信任的依赖,因为智能合约会完全按照编程的方式执行。因此,传统上需要多个中介机构或冗长的审批步骤的流程可以得到简化,从而使金融和业务运营能够更快、更一致地进行。

2. 降低成本

智能合约通过消除中介机构来降低与金融交易相关的运营成本。传统的银行和金融机构通常会收取可观的费用来处理交易和提供增值服务。相比之下,智能合约利用区块链技术来最大程度地降低这些成本。区块链上的交易费用通常远低于传统费用,并且某些区块链协议允许进行 gas 补贴或费用抽象,在这种情况下,交易发送者可能不会承担任何直接成本。这种成本效益对于跨境交易尤其有利,在跨境交易中,中介费用和延迟会大大减少。

3. 增强安全性

智能合约受益于区块链固有的不可变性,这确保一旦部署合约,就无法对其进行更改或篡改。这种不可变性与加密安全相结合,可提供强大的保护,防止欺诈和未经授权的修改。此外,智能合约可以结合加密技术来启用隐私功能,例如零知识证明,在这种情况下,仅公开必要的数据,同时保持数据的机密性。但是,默认情况下,大多数智能合约数据都是透明的,从而使任何人都可以审计和验证交易。这种透明性通过使恶意行为更容易被检测到来增强安全性。

4. 信任和可靠性

智能合约独立于中心化机构运作,提供了一个去中心化的、无需信任的系统,在这种系统中,预定义的规则可以自主执行,而不会受到外部干扰。这种去中心化消除了传统系统中常见的单点故障,从而降低了遭受攻击和操纵的风险。虽然智能合约具有固有的风险,但是谨慎的开发实践和安全审计可以帮助缓解这些问题。一个主要的优势是智能合约的可预测性:可以在部署之前模拟和测试它们的结果,从而使用户能够以很高的可靠性来预测结果。这种可预测性可以增强信任,因为参与者可以依靠整个合约交互过程中一致、透明的行为。

常见的智能合约类型

智能合约在区块链生态系统中扮演着独特的角色,提供专门的功能来驱动去中心化应用程序并实现复杂的交互。以下是一些最广泛使用的智能合约类型:

1. 代币合约

代币合约是区块链资产的基础,代表了以太坊等平台上的同质化代币(例如,ERC-20)和非同质化代币(NFT,例如,ERC-721)。关键标准包括:

  • ERC-20(同质化代币):用于可互换代币,如加密货币和实用代币,ERC-20 合约标准化了诸如 transfer()approve()transferFrom() 等函数,以确保在应用程序之间的一致性。
  • ERC-721(非同质化代币):这些代币是唯一且不可分割的,使其成为数字收藏品、艺术品和产权的理想选择。ERC-721 合约管理所有权、可转让性和元数据,从而确保每个代币都具有独特的属性。
  • ERC-1155(多代币标准):该标准允许单个合约管理同质化和非同质化代币,从而提高了需要多种资产类型(如游戏和 DeFi)的应用程序的效率。ERC-1155 合约支持批量转账,从而降低了 gas 成本并促进了复杂的资产交互。

代币合约为数字资产建立了一个一致的基础,从而实现了跨钱包、交易所和去中心化应用程序的广泛互操作性。

2. 治理合约

治理合约通过启用链上投票机制来增强去中心化组织(尤其是 DAO)的能力。代币持有者可以提出协议更改、对决策进行投票以及影响资金分配。这些合约通常包含投票权重(与代币持有量成比例)和法定人数要求,从而确保决策代表大多数人。一旦达到共识阈值,治理合约将自动执行或计划提议的更改,从而实施透明度和社区驱动的治理。

3. 质押合约

质押合约允许用户锁定代币以换取奖励,通常用于权益证明(PoS)网络和 DeFi 协议。这些合约管理存款、奖励计算和处罚。在 PoS 网络中,质押合约通过要求验证者质押代币来保护网络,如果他们恶意行事,这些代币将面临风险。在 DeFi 中,质押合约激励流动性提供,向锁定资产在协议中以支持其功能的用户分配奖励。

4. 借贷合约

借贷合约是 DeFi 的基础,允许用户借出资产以获取利息或通过提供抵押品来借入资产。这些合约管理抵押、利率和清算:

  • 借贷:用户存入资产以赚取利息,利息根据资产的供需情况累积。该合约会汇集这些资产,并允许其他用户针对该池进行借款。
  • 借款:用户可以通过存入抵押品来借入资产。合约强制执行超额抵押,这意味着抵押品的价值必须超过借入的金额。如果抵押品价值低于某个阈值,合约将触发清算流程以收回资金。

这些合约消除了中介机构,从而使金融服务更易于访问和更具效率。

5. 收益耕作合约

收益耕作 合约允许用户通过向 DeFi 平台提供流动性来赚取额外奖励。用户可以将资产存入这些合约,然后这些合约用于协议内以产生收益。收益耕作合约通常以治理代币或协议特定代币的形式提供奖励,从而激励用户将资产锁定在流动性池质押合约中。此模型鼓励流动性提供,增强协议稳定性,并允许用户在去中心化金融生态系统中最大化其回报。

6. Oracle 合约

Oracle 合约将智能合约与链下数据连接起来,从而使它们能够与外部信息交互,例如实时资产价格、体育赛事比分和天气数据。区块链在本质上是孤立的,因此 Oracle 充当受信任的中介,向智能合约提供经过验证的数据。Oracle 通常会聚合来自多个来源的数据以确保准确性,从而支持依赖于动态、真实世界信息的合约。Oracle 对于 DeFi、保险以及任何需要可靠链下数据的应用程序至关重要。

7. 归属合约

归属合约管理在指定时间范围内发布代币,通常用于向团队成员、投资者或社区参与者分配代币。这些合约会锁定代币,并根据预定义的计划逐步释放它们,这些计划可以包括悬崖期,然后是逐步解锁。归属合约通过防止立即销售代币来调整激励措施,从而培养对项目的长期承诺。

8. 投票合约

投票合约有助于实现安全、透明的链上投票。它们广泛用于 DAO 和去中心化治理系统中,可在链上不可变地记录每次投票,从而确保结果无法被篡改。投票合约支持各种投票模型,包括加权投票(与代币持有量成比例)、单项选择、多项选择和匿名投票。此设置可确保可验证的投票过程,从而反映了社区的实际偏爱。

9. GameFi 合约

GameFi(游戏金融)合约通过启用资产所有权、奖励分配和游戏内经济来为基于区块链的游戏经济提供动力。GameFi 合约的关键功能包括:

  • 游戏内资产管理:GameFi 合约管理游戏内资产的所有权和转让,这些资产通常表示为 NFT。玩家可以跨不同的游戏和平台拥有、交易或使用这些资产。
  • 奖励机制:这些合约处理边玩边赚的机制,玩家通过实现里程碑、参与活动或为游戏生态系统做出贡献来赚取加密货币或代币。奖励直接分配到玩家的钱包,从而创建一个去中心化的游戏经济。
  • 市场:GameFi 合约通常会促进游戏内市场,玩家可以在其中购买、出售或交易物品,从而为虚拟资产带来真实的经济价值。这些合约可以与外部 NFT 市场交互,从而扩大游戏内资产的覆盖范围和实用性。

GameFi 合约将游戏与去中心化金融相结合,从而实现了创新的、由玩家驱动的经济,从而激励了虚拟世界中的参与和资产所有权。

智能合约安全

由于智能合约可在去中心化平台上自动化关键的金融和运营流程,因此它们的安全性至关重要。与传统软件不同,智能合约一旦部署就不可变,这意味着无法像常规应用程序那样修补任何漏洞或错误。这种不可变性在增强信任的同时,也提高了安全性的风险,因为缺陷可能会导致不可逆转的后果,包括财务损失、数据泄露或被利用的攻击。本节深入探讨了保护智能合约所需的基本原则和高级技术,解决了常见的漏洞和预防措施,以降低去中心化环境中的风险。

常见的智能合约漏洞

以下是一些最关键的漏洞,其中包含解释和真实案例研究。

1. 重入攻击

当恶意合约在初始调用完成之前重复调用目标合约中的易受攻击的函数时,会发生重入攻击。这种攻击通常使攻击者能够通过递归方式重新进入同一函数来耗尽资金或破坏合约状态。

  • 机制:在重入攻击中,如果合约在更新其内部状态之前将资金发送到外部地址,则接收者可以回调合约并再次触发同一函数。可以重复此过程,从而使攻击者可以通过绕过正确的状态更新来耗尽资金。
  • 真实案例:最著名的重入攻击是 Ethereum 上的 2016 DAO 黑客攻击,导致了 6000 万美元的损失。攻击者重复触发一个 withdraw 函数,该函数在更新余额之前发送资金,从而使递归调用能够耗尽资金。

2. 闪电贷攻击

闪电贷是无抵押贷款,必须在单笔交易中偿还。攻击者利用闪电贷来操纵 DeFi 协议,方法是暂时抬高或降低资产价格以获取未经授权的利润。

  • 机制:闪电贷允许攻击者借入大量资金,并为单笔交易操纵市场状况。通过利用闪电贷,攻击者可以影响去中心化平台上资产的价格,从而创造套利机会或强制清算。
  • 真实案例:在 2021 年 10 月,Cream Finance 遭受了 1.3 亿美元的 闪电贷攻击。攻击者借入了大量资产来操纵价格 Oracle,并通过利用抵押不足的贷款来耗尽资金,从而导致了当时最大的 DeFi 损失之一。

3. 未经检查的外部调用

当合约在不验证响应的情况下调用外部地址时,会发生未经检查的外部调用。如果被调用的合约失败,这种疏忽可能会导致不完整的交易、逻辑中断或意外状态。

  • 机制:当合约使用低级调用(calldelegatecallsend)而不检查返回值时,它会冒着如果外部调用失败则继续使用有缺陷的逻辑的风险,从而导致意外的结果。
  • 真实案例:2017 Parity Wallet 黑客攻击是由未经检查的调用漏洞引起的。由于 有缺陷的委托调用,攻击者能够在已部署的钱包合约上执行 initWallet 函数,从而允许未经授权的访问,并最终冻结价值 1.5 亿美元的 Ethereum。

4. 拒绝服务 (DoS)

DoS 攻击 的目的是通过利用 gas 限制或阻止特定函数来使智能合约的某些部分无法访问。攻击者通常使用这种策略来破坏涉及大型数据结构或依赖于共享资源的函数。

  • 机制:攻击者可以通过添加大量数据或强制执行耗 gas 的操作来使合约超载。例如,如果合约迭代地址列表以处理付款,则攻击者可以添加过多的条目来消耗 gas,从而导致函数失败。
  • 真实案例:在 2020 Harvest Finance 黑客攻击中,攻击者操纵了代币价格并使用交易使合约超载,从而导致该协议遭受了重大损失。攻击者利用了 gas 限制以及对操作缺乏适当的速率限制。

5. 访问控制问题

当函数未受到适当限制时,就会出现访问控制问题,从而允许未经授权的用户执行合约中的敏感操作。

  • 机制:如果合约缺乏足够的访问控制,则任何人都可以执行特权函数,如 withdraw 或 selfdestruct,从而可能导致未经授权的访问和资金损失。
  • 真实案例:在 2024 年 10 月,Radiant Capital 在攻击者注入恶意软件以拦截交易批准、操纵 Safe{Wallet} 数据并控制 LendingPoolAddressesProvider 合约进行未经授权的更新后,损失了超过 5000 万美元。Extractor 等实时监控工具本来可以自动检测到异常情况,从而有可能防止 BNB 链损失 180 亿美元

6. 抢跑和夹三明治攻击

当攻击者监视内存池中待处理的交易,并以更高的 gas 费提交他们的交易以首先被处理时,就会发生抢跑攻击。在三明治攻击中,攻击者在用户的交易前后放置买入和卖出订单,以操纵资产价格以获取利润。

  • 机制:在三明治攻击中,攻击者首先发出买入订单以抬高价格,从而允许用户以抬高的价格执行其交易,然后出售以获取利润。抢跑利用价格滑点和时机来获得有利结果。
  • 真实案例:Uniswap 经历了多次三明治攻击,攻击者在交易价值较高的代币周围操纵代币的价格。在 2020 年,由于攻击者进行周围交易导致的意外价格变化,一位 Ethereum 用户在 Uniswap 上的一次三明治攻击中损失了数千美元。

7. Oracle 操纵攻击

Oracle 操纵攻击 利用了智能合约对外部数据源(如价格馈送或事件结果)的依赖。攻击者会操纵 Oracle 以向合约馈送错误的信息,从而导致不正确的计算或意外的行为。

  • 机制:攻击者可以通过在低流动性交易所或池中创建临时市场波动来利用价格 Oracle。这种改变后的价格会馈送到 Oracle 中,从而允许攻击者根据错误数据操纵操作。
  • 真实案例:在 2020 年 11 月,Compound 在一次 Oracle 操纵攻击中成为了目标。攻击者影响了 Uniswap 上的 DAI 价格,从而影响了 Compound 的价格馈送。这导致了不正确的清算和数百万美元的损失。

8. Self-Destruct 和 Delegatecall 漏洞

selfdestruct 函数可以永久删除合约,如果未受到适当限制,可能会被滥用。不正确地使用 delegatecall 还可以使调用者的上下文中执行任意代码,从而允许攻击者控制存储和状态。

  • 机制selfdestruct 从区块链中删除合约,而 delegatecall 允许合约在其自己的存储上下文中执行另一个合约的代码。不正确地使用任一函数都可能导致失去控制或资金访问权限。
  • 真实案例:2017 Parity Wallet 黑客攻击涉及滥用 delegatecall,该滥用使攻击者能够控制钱包的逻辑并最终删除合约。此事件冻结了超过 1.5 亿美元的 Ethereum。

9. 逻辑和业务逻辑漏洞

逻辑漏洞源于有缺陷的合约逻辑或与预期业务规则的错位,从而导致意外的行为和财务损失。

  • 机制:当合约的函数或激励措施与项目的目标未正确对齐时,就会出现逻辑漏洞。例如,奖励分配中的错误、错误的提款限制或配置错误的计算可能会导致重大损失。
  • 真实案例:在 2021 年,Thorchain 平台由于其路由合约中的一个逻辑缺陷而遭受了 770 万美元的漏洞利用,该缺陷允许攻击者绕过检查并在每次交易中获得多次奖励。业务逻辑疏忽导致了资金的快速消耗。

最佳实践

为了构建和维护安全的智能合约,必须在开发、部署和持续管理过程中纳入安全措施。以下是一些基本的最佳实践:

1. 进行定期的安全审计

由外部信誉良好的公司执行的安全审计对于在部署之前检测漏洞至关重要。专业的审计人员会对合约代码执行深入分析,审核逻辑,识别漏洞,并提供一份包含建议修复的详细报告。定期的审计,尤其是在重大发布或升级之前,可确保合约在不断发展的同时保持安全。

2. 建立清晰的安全策略和指南

定义安全策略,该策略概述了编码标准、漏洞处理程序和开发实践。为团队建立安全编码指南,详细说明了有关函数、访问控制和测试标准的具体规则。此外,指定合约升级、管理控制和其他特权功能的角色和权限,以防止未经授权的更改。

3. 实施故障保护和紧急控制

实施诸如可暂停合约之类的故障保护机制,该机制使管理员能够在发生可疑活动或主动攻击时暂停运营。添加暂停或紧急停止功能使团队能够在问题升级之前解决问题,从而最大程度地降低损失风险。像 OpenZeppelin 的 Pausable 库之类的框架提供了以简单的方式纳入这些控制的方法。

4. 通过漏洞赏金计划来激励安全研究

通过提供漏洞赏金计划来鼓励更广泛的安全社区识别潜在的漏洞。像 HackenProof 这样的平台允许项目奖励独立的安全研究人员,以负责任地报告错误。赏金激励白帽黑客查找可能会未被检测到的问题,从而提高安全性,而无需直接的内部资源成本。

5. 限制特权角色并要求多重签名批准

对于诸如升级、资金转移或管理任务之类的关键操作,请限制具有访问权限和多重签名钱包使用的用户数量。多重签名设置要求多个受信任方批准交易,从而增加了一层额外的安全性和责任。这降低了未经授权的访问、内部威胁和单点故障的风险。

6. 制定并实施严格的测试策略

测试对于在开发周期的早期识别潜在的漏洞至关重要。采用一项策略,该策略要求进行严格的单元测试、集成测试和 模糊测试,以评估合约在正常和意外情况下的行为。测试极端情况、高压力方案以及与外部合约的交互,以确保合约的稳定性和可靠性。

7. 记录代码并保持透明的沟通

对合约代码、体系结构和功能的清晰而详尽的文档记录使开发人员、审计人员和社区可以更轻松地理解和评估安全风险。在发生安全事件或重大更新时,与社区保持透明的沟通,以建立信任并确保用户了解所采取的措施。

8. 事件响应和链上监控

将事件响应计划与实时监控相结合,以有效地解决安全威胁。虽然通过 Etherscan 等工具进行手动监控是一种选择,但采用现成的解决方案(如 Extractor)可以通过自动检测、预防和根本原因分析来简化流程,从而确保更快、更全面的威胁管理。

审计工具

审计工具在通过自动执行部分审核过程并有效地检测常见问题来识别漏洞和增强智能合约安全方面起着至关重要的作用。但是,它们只是完整智能合约审计过程的一部分,后者依赖于人类的专业知识来解释结果,分析复杂逻辑并验证发现结果。

用于漏洞分析的关键技术包括静态分析、模糊测试和形式验证,它们共同构成了全面可靠审计的基础。

  • 静态分析 (Static Analysis):在智能合约中,静态分析涉及分析合约的源代码或字节码。顾名思义,静态分析是在合约部署到任何区块之前进行的。这种类型的分析可以比作对代码执行的调试。静态分析的主要目标是识别合约中的逻辑错误和不安全的编码实践,防止漏洞在合约上线后被利用。符号执行 (symbolic execution) 是静态分析中另一种常用的技术。符号执行背后的逻辑是模拟程序执行,使用符号值代替特定的输入,从而捕获运行时可能发生的约束和分支。总而言之,符号执行的主要目的是探索程序执行中可能的路径和分支。虽然它最初可能看起来与漏洞检测没有直接关系,但应该注意的是,漏洞也源于程序中由特定输入触发的特定分支。静态分析预计不会发现以前未定义的发现。然而,值得一提的是,静态分析是一种广泛使用且有效的方法,不仅在智能合约分析中,而且在其他领域也是如此,特别是在识别已知问题方面。虽然静态分析是全面的并且可以快速产生结果,但它经常会受到误报和漏报的影响,这可能是一个缺点。
  • 运行时验证 (Runtime Verification):运行时验证是另一种用于动态分析的方法。它以两种不同的方式运行。第一种也是最常见的方法是监控合约在网络上的行为,识别并拒绝潜在的有害交易。此方法的功能类似于为智能合约设计的 IDS/IPS 系统。第二种方法是将保护代码嵌入到合约中。虽然运行时验证可能很强大,但有时可能会产生误报(将良性行为标记为恶意)或漏报(未检测到恶意行为)。仔细调整验证参数和规则对于平衡安全性和可用性至关重要。过于严格的验证可能会扰乱正常的合约功能,而过于宽松的参数可能会允许某些攻击绕过检测。
  • 模糊测试 (Fuzzing):在传统的模糊测试中,程序使用随机输入执行,以收集有关它的信息。智能合约的模糊测试遵循相同的逻辑。模糊测试方法通常按如下方式工作:
1. 检查智能合约的 ABI 或字节码,以收集有关其函数接受的值的信息。除非使用黑盒模糊测试方法,否则此步骤适用。
2. 根据上一步的输出,为合约的函数生成有效输入。然后可以对这些输入进行各种突变,使它们随机化。
3. 使用所有生成的值执行合约,并分析结果。从结果中识别漏洞并呈现给用户。

根据不同的技术,模糊测试主要有三种方法:黑盒 (black-box),白盒 (white-box) 和灰盒 (gray-box) 模糊测试。

  • 黑盒模糊测试 (Black-Box Fuzzing):在这种方法中,测试是在完全随机的输入下进行的,而没有任何关于合约的先验知识(例如它的函数或它可以接受的输入)。目的是通过使用完全随机的输入来发现合约中的漏洞。虽然这种方法更实用,并且比其他方法产生更快的结果,但它也更基本。此外,在发现新分支、代码覆盖率和结果有效性方面,它落后于同行。
  • 白盒模糊测试 (White-Box Fuzzing):这种方法与黑盒模糊测试相反。在这里,收集关于合约的信息,并基于这些信息生成输入。这个过程包括使用符号和真实输入连续运行合约,以了解其约束和分支。然后使用根据这些要求生成的输入来测试合约。虽然这种方法比黑盒方法提供更广泛的覆盖范围,但为每个分支定义约束和合适的输入可能会延长测试过程。
  • 灰盒模糊测试 (Gray-Box Fuzzing):灰盒模糊测试结合了前面提到的两种方法的元素。因此,它的结果通常是两者的平均值。与黑盒模糊测试不同,灰盒模糊测试在对程序有一定了解的情况下生成输入,但这种理解不如白盒方法中的详细。为了覆盖所需的范围,灰盒模糊器使用一种称为轻量级检测技术 (lightweight instrumentation)。
  • 形式化验证 (Formal Verification):形式化验证是一种用于检查设计是否具有其预期属性的方法,与智能合约无关。这些检查通常使用定理证明器或数学方法执行。在智能合约中,形式化验证通常评估以下属性:功能一致性,运行时安全性,可靠性和鲁棒性。两种流行的形式化验证方法脱颖而出:定理证明和程序验证。

    • 在定理证明方法中,合约及其预期值被编码为数学公式。基于合约的公理和推理规则,从这个编码中推导出证明。
    • 另一方面,程序验证通常涉及将智能合约的源代码转换为验证工具使用的编程语言。然后使用这些工具中的证明引擎分析转换后的代码。

关于智能合约安全的更多资源 (Further Resources on Smart Contract Security)

对于任何希望保护其智能合约的人来说,遵守生态系统中的最佳实践是明智的。通过像 Hacken 的 智能合约安全指南 (Smart Contract Security Guideline) 这样的资源,最常见的智能合约漏洞 (Most Common Smart Contract Vulnerabilities) 的摘要,智能合约审计指南 (Guide to Auditing Smart Contracts) 以及 审计工具的评论 (Review of Auditing Tools),你将很好地保护你的合约。

智能合约很棒,但它们必须是安全的!(Smart Contracts Are Great, But They Must Be Secure!)

智能合约为 Web3 格局带来了变革性的潜力,为各个领域带来了无需信任的自动化交易的新时代。它们在没有中介的情况下执行协议的能力已经解锁了一系列应用,从金融到治理,展示了它们的力量和多功能性。然而,与任何强大的工具一样,智能合约需要严格的安全方法。通过遵循已建立的最佳实践并利用安全指南和审计工具等资源,可以降低风险并提高合约的完整性。

  • 原文链接: hacken.io/discover/what-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
hacken
hacken
江湖只有他的大名,没有他的介绍。