Определение ошибки контракта с помощью Soroban Assembly Script SDK

Определение ошибки контракта с помощью Soroban Assembly Script SDK
Содержание
  1. Контрактный кодекс
  2. Составление договора
  3. Запуск The Contract в песочнице
  4. Закрытие

Привет! В своем предыдущем посте я уже показывал, как использовать Soroban AssemblyScript SDK для хранения и получения данных в простом смарт-контракте, а теперь мы добавим обработчик ошибок в этот контракт с помощью Soroban Assembly Script SDK.

Мы рассмотрим, как определить и сгенерировать ошибку для смарт-контракта Soroban с помощью AssemblyScript SDK, что позволит вызывающей стороне контракта понять и обработать ошибку. В этом примере будет показана функция failWithErrorCode() из модуля context, предоставляемого библиотекой as-soroban-sdk.

Контрактный кодекс

Код контракта будет аналогичен моему предыдущему посту с дополнительным кодом для обработки ошибок. Давайте погрузимся в код:

import { RawVal, toU32, fromU32 } from 'as-soroban-sdk/lib/value';
import * as ledger from 'as-soroban-sdk/lib/ledger';
import * as context from 'as-soroban-sdk/lib/context';

В этом разделе добавлены дополнительные модули context. Эти модули предоставят нам функциональность для определения и обработки ошибок.

enum ERR_CODES {
  MAX_REACHED = 1
};

export function increment(): RawVal {
  let data = "COUNTER";
  var counter = 0;
  var max = 5;

  if (ledger.hasDataFor(data)) {
    let dataObj = ledger.getDataFor(data);
    counter = toU32(dataObj);
  }

  counter++;

  if (counter > max) {
    context.failWithErrorCode(ERR_CODES.MAX_REACHED);
  }

  ledger.putDataFor(data, fromU32(counter));
  return ledger.getDataFor(data);
}

Код определяет перечисление ERR_CODES для представления возможных кодов ошибок. Он имеет единственный код ошибки: MAX_REACHED, указывающий на то, что счетчик достиг своего максимально допустимого значения, а переменная max - это максимально допустимое значение. Функция increment работает аналогично предыдущему контракту, проверяет данные счетчика в хранилище, увеличивает их и проверяет, превышает ли новый счетчик максимально допустимый (установленный на 5). Если да, то транзакция завершается неудачей и возвращает код ошибки с помощью функции context.failWithErrorCode. В противном случае она обновляет данные COUNTER в бухгалтерской книге новым значением счета, преобразованным обратно в RawVal с помощью fromU32. Возвращается окончательное значение счета из бухгалтерской книги.

Далее создайте файл contract.json в директории проекта, этот файл содержит метаданные для контракта.

{
	"name": "Store and Retrieve Data Contract (Error Handling)",
	"version": "0.1.0",
	"description": "example",
	"host_functions_version": 29,
	"functions": [
		{
			"name": "increment",
			"arguments": [],
			"returns": "u32"
		}
	]
}

Перед компиляцией контракта нам нужно отредактировать файл asconfig.json вашего проекта. Замените его содержимое на следующее:

{
	"extends": "as-soroban-sdk/sdkasconfig",
	"targets": {
		"release": {
			"outFile": "build/release.wasm",
			"textFile": "build/release.wat"
		},
		"debug": {
			"outFile": "build/debug.wasm",
			"textFile": "build/debug.wat"
		}
	}
}

Файл asconfig.json используется компилятором AssemblyScript (asc) для определения конфигурации вашего проекта.

Составление договора

Сначала вам нужно скомпилировать его в WebAssembly. Для этого выполните следующую команду :

npx asc assembly/index.ts --target release

Теперь в каталоге build/ вы должны увидеть два новых файла: release.wasm и release.wat.

Запуск The Contract в песочнице

Давайте запустим контракт, чтобы проверить, работает ли он, мы запустим контракт с помощью `soroban-cli в песочнице, используя следующую команду:

soroban contract invoke --wasm build/release.wasm --id 1 --fn increment

Вы должны получить результат:

1

Запустите его несколько раз, и на 6-м запуске вы получите такой результат:

error: HostError Value: Status(ContractError(1))

Ошибка
Ошибка

Закрытие

Этот пример демонстрирует, как определить и обработать ошибку в смарт-контракте soroban с помощью Soroban AssemblyScript SDK. Зная точный код ошибки, вызывающая сторона контракта будет знать, что не так с контрактом или вызовом. С этой основой вы сможете перейти к созданию более продвинутых и многофункциональных смарт-контрактов на платформе Soroban. Счастливого соробанинга!