Как проверить One Time Witness при выдаче уникальных полномочий в Sui

Обычный witness подтверждает, кто может создать значение типа. Для выдачи уникального полномочия библиотеке важно также убедиться, что определяющий модуль не сможет создать второй экземпляр.

Проверьте специальный witness при выдаче

Модуль permit объявляет тип без полей и параметров, названный по модулю прописными буквами и имеющий только drop. При публикации инициализатор получает его экземпляр. Обобщённая библиотека с ограничением T: drop должна проверить witness во время исполнения перед выдачей полномочий.

module example::permit;

public struct PERMIT has drop {}

fun init(witness: PERMIT, _ctx: &mut TxContext) {
    assert!(sui::types::is_one_time_witness(&witness), 0);
}

Используйте witness в единственной операции

Передайте witness по значению конструктору полномочий. Если API принимает лишь ссылку, тот же экземпляр можно заимствовать повторно внутри транзакции. Проверьте библиотеку с обычным типом, имеющим drop: отказ должен произойти до создания привилегированного объекта.

Источники