Простой смарт-контракт на funC

[email protected]

New member
Сообщения
14
Реакции
3
Простой смарт-контракт на funC, который при каждом внешнем сообщение увеличивает счетчик в памяти на 1:

test.fc:
Код:
() recv_external(slice in_msg) impure {
 slice persistent_data = get_data().begin_parse();
 int counter = persistent_data~load_uint(8);
 counter += 1;
 set_data(begin_cell().store_uint(counter, 8).end_cell());
}
Особенностью функций runvm является то, что она в качестве "точек входа для исполнения" считает только recv_internal и main, но не recv_external. Поэтому в коде выше меняем recv_external на main.
Компилируем ./func -SPA -R -o test.fif stdlib.fc test.fc , получаем test.fif.

Чтобы протестировать код смарт-контракта необходимо эмулировать persistent storage и проверить как его будет изменять вызов контракта.

Для этого к получившемуся test.fif мы добавим немного кода:

  1. АСМ-код записываем в константу code
  2. Создаём ячейку с одним единственным 8-битным числом (это наша эмуляция памяти контракта) и запишем ее в константу storage
  3. Создаём пустой слайс который эмулирует входящее сообщение (оно в нашем коде никак не используется) и запишем его в константу message
  4. Вызываем runvm передав ей message, code и storage
  5. Распечатаем результат выполнения контракта: exit_code и обновленное состояние памяти контракта (counter должен увеличиться на 1).
Итоговый test.fif выглядит так:

Код:
"Asm.fif" include

// automatically generated from `stdlib.fc` `t2.fc`
PROGRAM{
... ASMCODE ...
}END>s constant code
<b 0 8 u, b>  constant storage
<b b> <s constant message
message code storage runvm

constant updated_storage
constant exit_code
."Exit code " exit_code . cr
."Updated storage: " cr updated_storage <s csr. cr
При желании можно дописать второй вызов runvm и получить на выходе уже 2
 
Сверху