市值: $2.8177T 0.21%
成交额(24h): $129.977B -30.15%
恐惧与贪婪指数:

28 - 恐惧

  • 市值: $2.8177T 0.21%
  • 成交额(24h): $129.977B -30.15%
  • 恐惧与贪婪指数:
  • 市值: $2.8177T 0.21%
加密货币
话题
百科
资讯
加密话题
视频
热门加密百科

选择语种

选择语种

选择货币

加密货币
话题
百科
资讯
加密话题
视频

Solidity 中的 call、delegatecall 和 staticcall 有什么区别?

Understanding `call`, `delegatecall`, and `staticcall` is crucial for secure Solidity development, as each alters execution context, state access, and security risks differently.

2025/11/14 18:59

了解 call、delegatecall 和 staticcall 之间的区别对于 Solidity 中安全高效的智能合约开发至关重要。这些低级函数允许与其他合约或外部帐户交互,但在上下文、状态修改和执行环境方面表现不同。

称呼

1.调用函数调用另一个合约的函数,同时转发指定数量的以太币并在被调用合约的上下文中执行代码。

  1. 它使用被调用者的存储、代码和余额,这意味着任何状态更改都发生在目标合约的范围内。
  2. 当与编译时可能不知道其 ABI 的外部合约交互时,通常会使用此方法。
  3. 开发人员必须仔细处理返回数据,因为调用会返回一个指示成功或失败的布尔值以及可选的返回字节。
  4. 如果不遵循正确的检查-效果-交互模式,滥用可能会导致重入漏洞。

委托调用

1. delegatecall执行来自不同合约的代码,但保留调用者的存储、上下文和余额。

  1. 它通常用于逻辑与数据分离的代理模式,从而实现可升级的合约。
  2. 由于状态修改会影响调用合约的存储,因此在代理和实现之间对齐存储布局时需要格外小心。
  3. call不同,除非通过其他机制显式发送,否则在delegatecall期间不会传输 Ether。
  4. 安全风险包括恶意实施合约改变关键变量,例如代理中的所有权或余额。

静态调用

1. staticcall旨在调用不修改区块链状态的函数。

  1. 任何写入存储、发出事件或执行更改状态的操作的尝试都将导致调用恢复。
  2. 此功能对于安全地从外部合约读取数据非常有用,而不会带来意外副作用的风险。
  3. call一样,它在目标合约的代码中运行,但在执行时强制执行只读模式。
  4. 其主要用例包括查询代币余额、检查配额或从第三方合约检索不可变值。

常见问题

如果委托调用针对存储布局不匹配的合约,会发生什么情况?如果调用合约中的存储槽与被调用合约中的逻辑所期望的存储槽不一致,则变量可能会被错误地覆盖。例如,存储在一个槽中的地址可能会被解释为 uint256,从而导致数据损坏或未经授权的访问。

staticcall可以用来与payable函数交互吗?是的, staticcall可以针对应付函数,只要它们实际上不修改状态。然而,通过staticcall发送 Ether 是多余的,因为值传输本质上涉及状态更改,并且会导致调用失败。

为什么在某些情况下 call 被认为比 staticcall 风险更大?由于调用允许状态更改和以太传输,因此它打开了重入攻击等攻击向量。如果没有严格的输入验证和控制流管理,外部合约可能会在回调期间递归地耗尽资金。

delegatecall 是否兼容所有类型的合约升级?虽然delegatecall可以实现可升级性,但它需要仔细的设计。存储冲突、函数选择器冲突和初始化问题可能会破坏功能。透明代理和 UUPS 模式有助于减轻这些风险,但需要严格的测试和审核。

免责声明:info@kdj.com

所提供的信息并非交易建议。根据本文提供的信息进行的任何投资,kdj.com不承担任何责任。加密货币具有高波动性,强烈建议您深入研究后,谨慎投资!

如您认为本网站上使用的内容侵犯了您的版权,请立即联系我们(info@kdj.com),我们将及时删除。

相关百科

如何使用LayerZero合约执行跨链消息?

如何使用LayerZero合约执行跨链消息?

2026-01-18 13:19:39

了解 LayerZero 架构1. LayerZero 作为一种轻量级、无需许可的互操作性协议运行,无需依赖可信中介或包装资产即可实现区块链之间的通信。 2. 它利用部署在每条链上的超轻节点(ULN)来验证消息的完整性和一致性,而无需存储完整的区块链状态。 3. 核心组件包括处理消息路由的 Endp...

如何实施EIP-712进行安全签名验证?

如何实施EIP-712进行安全签名验证?

2026-01-20 22:20:26

EIP-712 概述和核心目的1. EIP-712 定义了以太坊应用程序中类型化结构化数据哈希和签名的标准。 2. 它使钱包能够在签名请求期间显示人类可读的域和消息字段,而不是原始的十六进制字符串。 3. 该规范通过域分隔符哈希引入域分离,防止跨不同 dApp 或链的签名重放。 4. 每个签名的有效...

如何通过新合约交互获得空投资格?

如何通过新合约交互获得空投资格?

2026-01-24 21:00:23

了解合约交互要求1. 大多数空投活动都要求与部署在受支持的区块链(例如以太坊、Arbitrum 或 Base)上的智能合约进行直接交互。 2. 交互通常涉及使用连接到 dApp 接口的钱包执行诸如approve() 、 stake()或mint()之类的函数。 3. 某些协议需要多种交易类型,例如将...

如何监控智能合约的安全警报?

如何监控智能合约的安全警报?

2026-01-21 07:59:57

链上监控工具1. Etherscan和Blockscout等区块链浏览器允许实时检查合约字节码、交易日志和内部调用。 2. 在信任任何链上数据之前必须确认合约验证状态——未经验证的合约存在高风险。 3. 事件日志解析可以检测异常状态变化,例如意外的代币转移或所有权修改。 4. 可以针对特定事件签名设...

如何建立自动支付合同并为其提供资金?

如何建立自动支付合同并为其提供资金?

2026-01-26 08:59:35

了解智能合约部署1. 开发者必须根据gas效率和安全性要求选择兼容的区块链平台,例如以太坊、Polygon或Arbitrum。 2. Solidity 仍然是编写支付自动化逻辑的主要语言,特别是对于定期或有条件的转账。 3. 在主网部署之前,使用 Hardhat 或 Foundry 等本地开发环境来...

如何使用 OpenZeppelin 合约构建安全的 dApp?

如何使用 OpenZeppelin 合约构建安全的 dApp?

2026-01-18 11:19:49

了解 OpenZeppelin 合约基础知识1. OpenZeppelin Contracts 是一个可重用、经过社区审核的智能合约组件库,专为以太坊和 EVM 兼容的区块链而构建。 2. 库中的每个合约都遵循严格的安全实践,包括遵守“检查-效果-交互”模式以及广泛使用访问控制修饰符。 3. 该库提...

如何使用LayerZero合约执行跨链消息?

如何使用LayerZero合约执行跨链消息?

2026-01-18 13:19:39

了解 LayerZero 架构1. LayerZero 作为一种轻量级、无需许可的互操作性协议运行,无需依赖可信中介或包装资产即可实现区块链之间的通信。 2. 它利用部署在每条链上的超轻节点(ULN)来验证消息的完整性和一致性,而无需存储完整的区块链状态。 3. 核心组件包括处理消息路由的 Endp...

如何实施EIP-712进行安全签名验证?

如何实施EIP-712进行安全签名验证?

2026-01-20 22:20:26

EIP-712 概述和核心目的1. EIP-712 定义了以太坊应用程序中类型化结构化数据哈希和签名的标准。 2. 它使钱包能够在签名请求期间显示人类可读的域和消息字段,而不是原始的十六进制字符串。 3. 该规范通过域分隔符哈希引入域分离,防止跨不同 dApp 或链的签名重放。 4. 每个签名的有效...

如何通过新合约交互获得空投资格?

如何通过新合约交互获得空投资格?

2026-01-24 21:00:23

了解合约交互要求1. 大多数空投活动都要求与部署在受支持的区块链(例如以太坊、Arbitrum 或 Base)上的智能合约进行直接交互。 2. 交互通常涉及使用连接到 dApp 接口的钱包执行诸如approve() 、 stake()或mint()之类的函数。 3. 某些协议需要多种交易类型,例如将...

如何监控智能合约的安全警报?

如何监控智能合约的安全警报?

2026-01-21 07:59:57

链上监控工具1. Etherscan和Blockscout等区块链浏览器允许实时检查合约字节码、交易日志和内部调用。 2. 在信任任何链上数据之前必须确认合约验证状态——未经验证的合约存在高风险。 3. 事件日志解析可以检测异常状态变化,例如意外的代币转移或所有权修改。 4. 可以针对特定事件签名设...

如何建立自动支付合同并为其提供资金?

如何建立自动支付合同并为其提供资金?

2026-01-26 08:59:35

了解智能合约部署1. 开发者必须根据gas效率和安全性要求选择兼容的区块链平台,例如以太坊、Polygon或Arbitrum。 2. Solidity 仍然是编写支付自动化逻辑的主要语言,特别是对于定期或有条件的转账。 3. 在主网部署之前,使用 Hardhat 或 Foundry 等本地开发环境来...

如何使用 OpenZeppelin 合约构建安全的 dApp?

如何使用 OpenZeppelin 合约构建安全的 dApp?

2026-01-18 11:19:49

了解 OpenZeppelin 合约基础知识1. OpenZeppelin Contracts 是一个可重用、经过社区审核的智能合约组件库,专为以太坊和 EVM 兼容的区块链而构建。 2. 库中的每个合约都遵循严格的安全实践,包括遵守“检查-效果-交互”模式以及广泛使用访问控制修饰符。 3. 该库提...

查看所有文章

User not found or password invalid

Your input is correct