Reentrancy

Icon Link重入保护库

重入保护库提供了一个 API 来检查并防止合约的重入。重入攻击发生在一个函数在执行过程中被外部调用,使得它可以在单个事务中被多次运行。

重入检查用于检查当前调用堆栈中是否已经调用了一个合约 ID。

重入或“递归调用”攻击可能会导致某些函数以意外的方式行为。这可以通过断言在当前事务中尚未调用合约来防止。一个示例可以在这里 Icon Link找到。

有关重入保护库的实现细节,请参阅Sway Libs 文档 Icon Link

Icon Link已知问题

虽然这可以防止单函数重入和跨函数重入攻击,但它将无法阻止跨合约重入攻击。

Icon Link导入重入保护库

要使用重入保护库,必须将 Sway Libs 添加到Forc.toml文件中,然后导入到您的 Sway 项目中。要将 Sway Libs 作为项目的依赖项添加到Forc.toml文件中,请参阅入门指南

要将重入保护库导入到您的 Sway 智能合约中,请在您的 Sway 文件中添加以下内容:

use sway_libs::reentrancy::*;

Icon Link基本功能

一旦导入,就可以通过调用以下两个函数之一来使用重入保护库:

  • is_reentrant() -> bool
  • reentrancy_guard()

Icon Link使用重入保护

一旦导入,就可以通过在您的 Sway 智能合约中调用reentrancy_guard()来使用重入保护库。以下展示了一个应用了重入保护库的 Sway 智能合约示例:

use sway_libs::reentrancy::reentrancy_guard;
 
abi MyContract {
    fn my_non_reentrant_function();
}
 
impl MyContract for Contract {
    fn my_non_reentrant_function() {
        reentrancy_guard();
 
        // my code here
    }
}

Icon Link检查重入状态

要检查当前调用者是否为重入调用者,可以调用is_reentrant()函数。

use sway_libs::reentrancy::is_reentrant;
 
fn check_if_reentrant() {
    assert(!is_reentrant());
}