---
title: "@stdlib/stoppable"
description: 提供允许停止合同的 traits ，这对紧急或维护模式非常有用
---

提供[traits](/zh-cn/book/types#composite-types)，允许停止[合约](/zh-cn/book/contracts)。 适用于应急或维护模式。 需要来自 [`@stdlib/ownable`](/zh-cn/ref/stdlib-ownable) 的 [`Ownable{:tact}`](/zh-cn/ref/stdlib-ownable#ownable)trait。 该trait只管理合约中的一个标记 `stopped`，处理停止状态必须在合约本身中完成。

要使用该库，请导入 `@stdlib/stoppable`：

```tact
import "@stdlib/stoppable"; // this would automatically import @stdlib/ownable too!
```

## Traits

### Stoppable

[Trait](/zh-cn/book/types#composite-types) `Stoppable{:tact}` 实现了一个接收者，用于接收所有者可以发送的 [Message](/zh-cn/book/structs-and-messages#messages) 消息 "Stop"。它还实现了 `stopped(){:tact}` [getter 函数](/zh-cn/book/functions#getter-functions)，如果合约已停止则返回 `true{:tact}`（否则返回 `false{:tact}`），并提供了私有（非 getter）函数 `requireNotStopped(){:tact}` 和 `requireStopped(){:tact}`。

源码:

```tact
@interface("org.ton.stoppable")
trait Stoppable with Ownable {
    stopped: Bool;
    owner: Address;

    fun requireNotStopped() {
        throwUnless(TactExitCodeContractStopped, !self.stopped);
    }

    fun requireStopped() {
        require(self.stopped, "Contract not stopped");
    }

    receive("Stop") {
        self.requireOwner();
        self.requireNotStopped();
        self.stopped = true;
        self.reply("Stopped".asComment());
    }

    get fun stopped(): Bool {
        return self.stopped;
    }
}
```

示例用法：

```tact /Stoppable/
import "@stdlib/ownable";
import "@stdlib/stoppable";

contract MyContract with Stoppable {
    owner: Address;
    stopped: Bool;

    init(owner: Address) {
        self.owner = owner;
        self.stopped = false;
    }
}
```

### Resumable

`Resumable{:tact}` [trait](/zh-cn/book/types#composite-types) 扩展了 [`Stoppable{:tact}`](#stoppable) trait，允许恢复 [合约](/zh-cn/book/contracts) 的执行。

源码:

```tact
@interface("org.ton.resumable")
trait Resumable with Stoppable {
    stopped: Bool;
    owner: Address;

    receive("Resume") {
        self.requireOwner();
        self.requireStopped();
        self.stopped = false;
        self.reply("Resumed".asComment());
    }
}
```

用法示例：

```tact /Resumable/
import "@stdlib/ownable";
import "@stdlib/stoppable";

contract MyContract with Resumable {
    owner: Address;
    stopped: Bool;

    init(owner: Address) {
        self.owner = owner;
        self.stopped = false;
    }
}
```

## 资料来源

- [stoppable.tact](https://github.com/tact-lang/tact/blob/61541b7783098e1af669faccd7d2334c10981c72/stdlib/libs/stoppable.tact)
