4 April 2022
AR
15:56
Alexander Ruliov
Эх, вот так вот я взял и наврал людям. Спасибо за уточнение.
ИК
15:57
Игорь Коняхин
In reply to this message
Спасибо за уточнение.
Я видел этот объект, но не понял: как он при переменной длине работает без тегов?
T
15:57
TON Дев Чат
In reply to this message
Я тоже не вполне прав, OutListNode юзается в crypto/block/transaction.cpp:L1083, однако исключительно для "внешней" валидации вида, колво действий в списке из этого объекта не получают.
ИК
16:00
Игорь Коняхин
In reply to this message
Т.е. если я пишу парсинг, то я не могу полагаться на первый бит, чтобы определить, достигнут ли конец списка
T
16:02
TON Дев Чат
In reply to this message
Заметьте, что в конструкторе не OutList ~n, а OutList n. Т.е. мы знаем значение n на момент (де)сериализации
16:04
Соответственно у Outlist 0 строго один конструктор (empty)
ИК
16:04
Игорь Коняхин
О, тонко!
Тогда вопрос по тестам tonlib: где взять это n?
T
16:04
TON Дев Чат
У OutList 1 строго один конструктор (не эмпти)
16:06
In reply to this message
Вопроса не понял
ИК
16:07
Игорь Коняхин
Ошибся, вопрос по тестам tonCLI
16:08
Вторые тест-функции tonCLI (которые получают результат работы и должны его проверить) получают параметр cell actions. Если он имеет тип OutList n, то как понять n?
T
16:12
TON Дев Чат
In reply to this message
Ну в ноде crypto/block/transaction.cpp:L1055-L1077 можно подсмотреть что делается: мы смотрим ячейку и по длине в битах/рефам определяем дошли ли до конца списка. Если нет - спускаемся в реф.
ИК
16:22
Игорь Коняхин
In reply to this message
Страница не найдена
Можно, пожалуйста полную ссылку
16:23
In reply to this message
Т.е. в случае actions можно проверить slice_reft(), и оно должно быть либо:
а) 0 - список пуст
б) 2: предыдущий узел списка и непосредственно сообщение
T
16:25
TON Дев Чат
In reply to this message
+
ИК
16:27
Игорь Коняхин
Но я ведь правильно понимаю, что если бы OutList n был бы частью другого определения, например:
list1:(OutList n1) list2:(OutList n2)

и мы видим slice_reft() == 1, то, не зная n1 или n2, нельзя однозначно сказать, к list1 или list2 относится ссылка (так как n1 может быть == 0, а OutList 0 ничего не хранит)
?
T
16:33
TON Дев Чат
In reply to this message
ТЛ-Б так устроен, что там не может быть неоднозначных выраженией. Впрочем тут поскольку n1 и n2 без тильд, то и без чтения slice_ref должно быть понятно где сколько рефов
ИК
16:37
Игорь Коняхин
In reply to this message
Но ведь верно, что они однозначные только со знанием n1 и n2?
Иначе можно закодировать (псевдокод)
.store(OutList 0).store(OutList 5)

и
.store(OutList 5).store(OutList 0)

и, не зная длины, при парсинге будет не ясно, пустой список первый или второй
16:39
Даже более строго:
.store(OutList 0).store(OutList 5)
кодирует тоже самое, что:
.store(OutList 5).store(OutList 0)
и для однозначного восстановления, нужно знать хотя бы одну длину
T
16:39
TON Дев Чат
In reply to this message
Да без знаничя n1 и n2 нельзя распарсить. Но это абсолютно не странно: n1 и n2 - часть типа.
Это все равно что говорить, что нельзя распарсить ^Cell если не знать, что там тип MsgAddress
ИК
16:40
Игорь Коняхин
In reply to this message
Всё, значит я правильно понимаю:)
Спасибо!
Тогда просто кажется логичным в toncli вместе с actions передавать ещё n_actions
16:42
Нашёл в плагине для IntelliJ ошибку подсветки
16:42
Или в FunC переводы строк на что-то влияют?
AP
16:44
Andrew Python
In reply to this message
плагин пока что эти конструкции не любит, скоро починят)
ИК
16:44
Игорь Коняхин
А, стоп
Он даже на одной строке подсвечивает, а этот код уже оттестирован и работает
16:44
In reply to this message
Ок, понял
16:45
А плагин кроме подсветки ничего не делает?
IntelliSense нет?
16:47
Deleted Account
In reply to this message
+
AP
16:47
Andrew Python
In reply to this message
там вроде надо, чтобы в папке лежал stdlib (но это не точно)
ИК
16:48
Игорь Коняхин
In reply to this message
Сейчас попробую, потому что мои функции/переменные он всё-таки видит
16:51
In reply to this message
Да
У меня stdlib.fc лежал по умолчанию (task-1-playground) в "func", скопировал его в папку с тестами и подсказки завезлись
Спасибо!
k
16:51
k1ber psix
In reply to this message
Вы бота пилите, за которого предоплату взяли?)))
ИК
16:54
Игорь Коняхин
Чтобы показались подсказки после . ("cs."), мне нужно ввести хотя бы первую букву функции и вручную нажать Ctrl+пробел.
Это особенность плагина или причуды IntelliJ?
Это же очень неудобно!
AP
16:56
Andrew Python
In reply to this message
AP
16:57
Andrey Pfau
In reply to this message
https://t.me/intellijton_chat
не совсем понял про что речь, мож там подобнее описать?
ИК
17:03
Игорь Коняхин
Записал видос, отослал
AP
17:08
Andrey Pfau
In reply to this message
Спасибо, респект 👍
ИК
17:24
Игорь Коняхин
Пустая cell == null
?
17:25
Другими словами (или это другой вопрос?)
cell_null? (a)
проверяет ячейку на пустоту или null это отдельная тема?
AP
17:31
Andrew Python
А почему в stdlib некоторые штуки закомментированы?
https://github.com/newton-blockchain/ton/blob/master/crypto/smartcont/stdlib.fc#L74:L79
AP
17:33
Andrey Pfau
In reply to this message
у этмх функций своя имплиминтация на уровне компилятора с оптимизациями
17:33
чтобы функции не перезаписывались из stdlib.fc
AP
17:34
Andrew Python
In reply to this message
странно но ладно, спасибо)
T
17:36
TON Дев Чат
In reply to this message
В зависимости от переменной записывать биты можно командой LDU и LDUX. Если бы load_uint определялся бы в stdlib это бы форсило использование LDUX и во многих случаях удлиняло бы очень распространенные операции
ИК
17:41
Игорь Коняхин
Всё-таки: где брать валидные адреса контрактов для тестов?
17:42
Правильно, что можно взять любые 8 бит, чтобы не начинались с "00" и затем к ним приписать любые 256?
V
17:42
Vitaly
хеш от чего-то
17:43
чаще всего от какой-то уникальной пары значений
17:43
в примере nft если покопаться можно найти
ИК
17:43
Игорь Коняхин
Слишком сложно с учётом временных ограничений
Хотелось бы просто 4-5 конкретных значений
V
17:43
Vitaly
как они например адреса nft создают
17:44
ну тогда технически как угодно
AP
17:44
Andrew Python
In reply to this message
ИК
17:46
Игорь Коняхин
In reply to this message
Спасибо, то что надо
17:54
() recv_internal (int balance, int msg_value, cell in_msg_full, slice in_msg_body)

Мне для теста нужно вручную сформировать стек с четырьмя этими параметрами?
AP
17:55
Andrew Python
In reply to this message
да
ИК
17:56
Игорь Коняхин
Почему вообще параметры у recv_internal не фиксированные?
В первом задании это:
() recv_internal(slice in_msg)

а во втором:
() recv_internal (int balance, int msg_value, cell in_msg_full, slice in_msg_body)

Как виртуальная машина узнает какие параметры передавать?
P
18:00
Placeholder
In reply to this message
Метод берет со стэка верхние n элементов просто.
TP
18:00
Tim Pavlov
In reply to this message
Так вм же не передает их сама, ты когда интернал сообщение отправляешь сам ставишь значения в контракте
ИК
18:02
Игорь Коняхин
In reply to this message
Т.е. recv_internal можно объявлять как одно из:
() recv_internal ()
() recv_internal (slice in_msg_body)
() recv_internal (cell in_msg_full, slice in_msg_body)
() recv_internal (int msg_value, cell in_msg_full, slice in_msg_body)
() recv_internal (int balance, int msg_value, cell in_msg_full, slice in_msg_body)

и функция просто берёт со стека верхние значения как параметры?
P
18:02
Placeholder
In reply to this message
Ну да.
ИК
18:03
Игорь Коняхин
In reply to this message
Нет же
Ты отправляешь
send_raw_message(msg, 0x64);

А тут тебе приходит не просто
() recv_internal (cell in_msg_full)

А аж с четырьмя параметрами, т.е. выходит, что это виртуальная машина их добавляет
18:04
In reply to this message
😭😭😭😭😭😭😭😭😭😭😭😭😭😭
TP
18:04
Tim Pavlov
In reply to this message
Ну это подарок тебе просто)
ИК
18:05
Игорь Коняхин
In reply to this message
А если моя тестируемая функция не трогает balance и msg_value, то, насколько я понимаю, FIFT код и не будет трогать их со стека и должно быть нормально, если я их в своём тесте не передам
Так?
TP
18:05
Tim Pavlov
Я кстати не совсем понимаю, баланс в контексте этого сообщения - это баланс отправителя или баланс контракта?
18:06
In reply to this message
Ну не совсем, функция то принимает их
P
18:06
Placeholder
In reply to this message
верно
С
18:07
Сергей
Ребят, а сталкивался ли кто-то с тем, что контракт отклоняется при попытке заминтить NFT?
18:07
Для коллекции
ИК
18:07
Игорь Коняхин
In reply to this message
Спасибо, немножко разобрался
С
18:07
Сергей
Вот просто обратно возвращаются 0.05 Ton и всё
ИК
18:08
Игорь Коняхин
In reply to this message
Контракт - 20 строчек
Тест контракта - 100+ строчек
😭😭😭😭😭
AP
18:09
Andrew Python
In reply to this message
баланс - баланс контракта, включающий msg_value (принятую сумму)
P
18:09
Placeholder
In reply to this message
100? Ну это если только успешные сценарии покрывать 😁
TP
18:10
Tim Pavlov
In reply to this message
Спасибо большое
AP
18:10
Andrew Python
In reply to this message
контракт 40 строчек, тесты 400 строчек)
TP
18:12
Tim Pavlov
In reply to this message
У меня один только тест 4 на 500, кажется....
Может и больше...
18:12
Там этот копипаст дебильный
18:12
Было бы прикольно если бы можно было в тестах хотя бы функции делать для генерации данных повторяющихся
P
18:13
Placeholder
In reply to this message
Можно. Надо inline method_id добавить
AP
18:13
Andrew Python
In reply to this message
+
TP
18:14
Tim Pavlov
А какой ему method_id давать? Или не важно?
P
18:14
Placeholder
Просто method_id
18:14
Без скобок
TP
18:14
Tim Pavlov
In reply to this message
Понял, спасибо
18:15
А чего репутацию не повысили?)
P
18:15
Placeholder
Я пария)
ИК
18:16
Игорь Коняхин
А как slice'ы из hex'а создавать?
begin_cell().store_uint(0xc79ef4a2d9f62e3524589863b094, 240).end_cell().begin_parse();

Это самое короткое?
А если бы у меня была hex-строка, которая не влезает в uint?
D
18:16
Daniil
Что это за тип адреса?)
A
18:19
Andrei
In reply to this message
slice my_slice() asm "x{deadbeef} PUSHSLICE";
В новой версии func добавили слайс-литералы, но её ещё не замерджили, видимо
ИК
18:20
Игорь Коняхин
In reply to this message
Спасибо
TP
18:24
Tim Pavlov
In reply to this message
Это круто
ИК
18:24
Игорь Коняхин
In reply to this message
А мне in_msg_full нужно сформировать ровно так, как оно попадёт на стек?
Или виртуальная машина проведёт стандартные манипуляции по замене адреса?

Вопрос к чему: обычно для посылки сообщения мы используем:
begin_cell().store_uint(0x18, 6)...
и виртуальная машина заменяет пустой адрес (5 и 6 бит) на адрес отправителя.

Для тестов я могу подготовить полное сообщение также?
Виртуальная машина произведёт замену?
Или мне нужно в этот раз самому установить адрес?
TP
18:24
Tim Pavlov
In reply to this message
Надо формировать самому
ИК
18:25
Игорь Коняхин
😭😭😭😭😭
TP
18:25
Tim Pavlov
Когда делаешь тесты, как я понял, имитируется работа просто
18:25
Всё на тебе
ИК
18:26
Игорь Коняхин
In reply to this message
Спасибо, пойду формировать
TP
18:27
Tim Pavlov
In reply to this message
Давай, удачи)
D
18:27
Daniil
In reply to this message
Кто-нибудь поможет?(
И что вообще за fee_recipient?
ИК
18:29
Игорь Коняхин
А нет что-ли чего-нибудь вроде для сохранения содержания ячейки инлайн
.store_cell(c)

?

Нужно делать:
.store_slice(c.begin_parse())

?
18:30
Либо
.store_builder(b)

?
18:31
Иначе приходится вначале создавать ячейку, а затем её сразу парсить:
cell address1 = begin_cell().store_uint(4, 3).store_uint(35, 8).store_uint(11111, 256).end_cell();

cell in_msg_full = begin_cell() ....
.store_slice(address1.begin_parse())
AP
18:37
Andrew Python
In reply to this message
в tvm есть примитивы для соединения билдеров
https://ton.org/docs/tvm.pdf#page=97
только их надо самому описать
D
18:37
Daniil
Только что задеплоил нфт, а в коллекции на tonscan она не появилась(
A
18:38
Andrei
In reply to this message
+
Сделайте ПР в стдлиб, чтобы каждый раз самому не описывать)
ИК
18:39
Игорь Коняхин
In reply to this message
Вот это
• CF17 — STBR (b b0 – b00), concatenates two Builder s

?
AP
18:39
Andrew Python
In reply to this message
там таких пр надо наделать... все quiet version описать надо
и все reverse тоже надо добавить
18:40
In reply to this message
или это или просто STB
ИК
18:41
Игорь Коняхин
STB, насколько я понял в обработном порядке их соединяет
18:41
builder store_builder(builder a, builder b) inline asm "STBR";

Правдоподобно?
AP
18:42
Andrew Python
In reply to this message
Норм)
18:43
In reply to this message
у меня в каждом задании такие приколы по несколько штук
ИК
18:43
Игорь Коняхин
Мне на самом деле пока что для тестов
18:44
У меня ещё тест для задания 2 в процессе фабриковки
18:50
Есть примитивы, чтобы сравнить builder'ы или cell'ы напрямую?
Или нужно вначале преобразовать в slice?
18:52
Я ведь в правильном порядке кладу параметры для тестов?
tuple stack = unsafe_tuple([balance, msg_value, in_msg_full, in_msg_body]);
return [0, stack, address3, get_c7(), null()];
Вершина стека в unsafe_tuple справа?
c
18:55
cryshado
In reply to this message
Есть там че то EQLSL… или тип того
18:55
В tvm.pdf смотри
18:55
Слайсы сравнивает
18:55
Напрямую вроде нет
A
18:55
Andrei
In reply to this message
Ячейки можно по хешу сравнить
18:55
Он для ячеек дёшево вычисляется
ИК
18:55
Игорь Коняхин
In reply to this message
Для слайсов прямо в задании дана функция:
int equal_slices (slice a, slice b) asm "SDEQ";
A
18:56
Andrei
slice_data_equal? в фансишном стиле бы было, конечно
ИК
18:57
Игорь Коняхин
In reply to this message
Интересно
Я в данном случае имел в виду сравнения для тестов, т.е.
производительность не важна
удобность важна
c
18:57
cryshado
In reply to this message
Ну по хешу
18:57
В фифте hashu
TP
18:57
Tim Pavlov
In reply to this message
ну тут только слайсы
18:57
но хэши лучше
18:57
в этом плане
A
19:00
Andrei
In reply to this message
Название кстати сбивает с толку, так как сравниваются только данные, но не рефы
AP
19:01
Andrew Python
In reply to this message
int cell_equal? (cell a, cell b) asm "HASHCU SWAP HASHCU EQUAL";
готово)

upd: чекнул, работает
ИК
19:01
Игорь Коняхин
Итак
Первое приближение решения и теста (причём без всех проверок) готовы - интересно сколько часов придётся теперь это дело заводить
19:01
In reply to this message
Отлично
19:02
hashcu он считает с учётом ссылок на ячейки?
AP
19:04
Andrew Python
In reply to this message
🤔как будто бы да
https://ton.org/docs/tvm.pdf#page=29 вот тут внизу
upd: не понятно ни..чего
ИК
19:08
Игорь Коняхин
Чтобы сохранить слайс по ссылке, нужно вначале сделать из него cell?

.store_ref(begin_cell().store_slice(s).end_cell())
A
19:10
Andrei
In reply to this message
Да
19:12
In reply to this message
Да
ИК
19:12
Игорь Коняхин
In reply to this message
Спасибо
19:15
Как в FunC присвоить значение глобальной переменной?

C:\users\nns20\Development\TON\contest-1\tests\2_tests.fc:28:25: error: `;` expected instead of `=`

global builder address1 = begin_cell().store_uint(4, 3).store_uint(35, 8).store_uint(1111, 256);

Мне нужна только глобальная константа, т.е. значение задано сразу и известно на этапе компиляции
TP
19:16
Tim Pavlov
In reply to this message
в объявлении глобальной переменной ее нельзя инициализировать, это можно сделать только в функциях самого контракта
ИК
19:17
Игорь Коняхин
В toncli есть-какая-нибудь функция, которая выполняется ДО всех тестов, чтобы можно было там провести инициализацию?
AP
19:18
Andrew Python
Сделай просто инлайн функции вместо переменных)
ИК
19:19
Игорь Коняхин
Хм, как вариант
19:20
Либо в самом первом тесте вызвать свою функцию init, но это немножко костыль
ИК
19:36
Игорь Коняхин
В FunC есть перегрузка функций?
Я могу объявить:
cell to_cell(builder b);
cell to_cell(slice s);

и чтобы затем
.to_cell()

преобразовывалось в нужную функцию в зависимости от типа слева?
A
19:42
Andrei
Нет
ИК
19:42
Игорь Коняхин
:(
19:43
Удалось завести, так что решение и тест скопировались!
19:43
Теперь нужно разбираться по существу
19:44
(Только хотел задать вопрос, но понял, что сам запутался в TL-B схемах OutList)
19:51
In reply to this message
А вот вопрос про пустой cell и null - актуален
19:54
In reply to this message
Я так понял, что null и пустой cell - разные вещи, но как тогда проверить ячейку на пустоту?
A
19:55
Andrei
null это отдельное значение
19:55
In reply to this message
Да
19:55
Можно сравнить хеш ячейки с пустой)
19:55
А можно превратить в слайс и проверить слайс на пустоту
ИК
19:55
Игорь Коняхин
In reply to this message
Для тестов сделаю так
20:00
Как в toncli узнать на какой строчке свалился тест?
У меня все коды ошибок указаны разные, но сейчас я дошёл до кода ошибки 9, который я нигде не использовал
AT
20:00
Andrey Tvorozhkov
In reply to this message
Это системная ошибка твм
20:00
В доке есть tvm exit codes
ИК
20:01
Игорь Коняхин
А как узнать строчку?
У меня, например, есть несколько мест с
cs.end_parse();

где я поручаю .end_parse() сгенерировать ошибку, если слайс не пуст
20:02
Даже если знать, что значит код, се равно нужна конкретная строчка
om
20:04
oxxxy miron
ребят привет, а ктонить знает как в тестовой сети тона можно получить монеты?
ИК
20:05
Игорь Коняхин
om
20:05
oxxxy miron
спасибо, это понятно, а как побольше меня интересует
AT
20:06
Andrey Tvorozhkov
In reply to this message
Дамп стека
ИК
20:07
Игорь Коняхин
Это в toncli делается?
Он же после ошибки не останавливается в интерактивном режиме, а завершает работу
AT
20:08
Andrey Tvorozhkov
In reply to this message
Не, в смарте
20:08
dump_stack()
ИК
20:08
Игорь Коняхин
In reply to this message
А где?
Я же не знаю, где ошибка?
Или нужно каждый раз бинарным поиском искать строчку?
AT
20:09
Andrey Tvorozhkov
In reply to this message
Можно включить вербоуз
20:10
Есть вербоуз твм оп, есть вербоуз с дампом стека
20:10
Всеж для людей сделано)
ИК
20:11
Игорь Коняхин
Нашёл про verbose упоминание
https://github.com/disintar/toncli/blob/master/docs/advanced/func_tests.md
но не сказано, какой командой его включить
AT
20:12
Andrey Tvorozhkov
ИК
20:13
Игорь Коняхин
In reply to this message
🙏 Спасибо!
Читал этот текст день-два назад, но мозг не всё сразу запоминает
TP
20:17
Tim Pavlov
а можно как-то перевести slice в cell?
ИК
20:17
Игорь Коняхин
In reply to this message
Я ведь так понимаю, что -v1 -v2 показывают пошагово исполнение тестируемого контракта, а не самих тестов?
20:18
In reply to this message
Проблема именно с самими тестами
20:20
Один из выходов, который я вижу - заменить все
cs.end_parse();

на
throw_unless(137, cs.slice_empty?())

и везде прописать разные коды,
но выглядит не супер элегантно
SO
20:23
Sash Osh
В корректности отправки send_raw_message (что формат сообщения вверный) никак не убедиться офчейн (с toncli)?
ИК
20:24
Игорь Коняхин
Я спрашивал
Похоже нужно самому писать тест с ручным разбором, где можно совершить те же ошибки и в результате не их не словить:(
SO
20:26
Sash Osh
In reply to this message
С ручным разбором чего, того что ты сам собрал до этого?
ИК
20:26
Игорь Коняхин
Да:(
Собрал в решении
Разобрал в тесте
SO
20:30
Sash Osh
Я собрал автомат. Он стреляет? Не знаю, но я разобрал, все детали были на месте)
AT
20:30
Andrey Tvorozhkov
In reply to this message
Да
AP
20:30
Andrew Python
In reply to this message
да, можно написать тесты, но финально всё равно лучше ончейн прогнать
AT
20:30
Andrey Tvorozhkov
In reply to this message
Убедиться, оно в с5 записывает
20:30
In reply to this message
Тогда только дампинг стека
20:31
Мб завезем -v 3 / -v 4 для тестов
AP
20:31
Andrew Python
In reply to this message
оно запишет, если в send_raw_message положить невалидную ячейку? да и send mod новичкам нужно руками потрогать)
SO
20:31
Sash Osh
In reply to this message
т.е. если какой-то косяк в send_raw_message в c5 не попадает?
A
20:35
Andrei
In reply to this message
Попадет
TP
20:37
Tim Pavlov
In reply to this message
какой-то примитив может?
SO
20:43
Sash Osh
Если говорится, что "подписана ячейка", как проверить подпись? check_signature дать хеш ячейки (cell_hash)? или check_data_signature дать слайс ячейки, будет ли это один результат? Есть рекомендации по тестированию подписей?
TP
20:49
Tim Pavlov
когда мы делаем
store_slice
- мы заносим все содержимое слайса в создающуюся клетку? мы потом можем после этого достать значение из слайса, который заносим, как если бы не было этого промежуточного этапа?
A
20:49
Andrei
In reply to this message
Первое надо вызвать от хеша ячейки
20:50
In reply to this message
Да, да.
TP
20:50
Tim Pavlov
In reply to this message
замечательно, спасибо
AP
20:51
Andrew Python
In reply to this message
Функция получения хеша ячейки получает же хеш всего дерева?
SO
20:52
Sash Osh
In reply to this message
Судя по доку, да.
AP
20:53
Andrew Python
+ в доке написано, что HASHSU отдаёт такой же результат, как и HASHСU
ИК
21:07
Игорь Коняхин
In reply to this message
Ха-ха-ха
+
Прекрасная аналогия
Я рад, что я не один вижу в этом проблему
21:09
In reply to this message
Ждём
Пока что буду исключения видать вручную
throw_unless(137, cs.slice_empty?())
DV
21:12
Dan Volkov
Всем привет!
Обновили расширение для VS Code, появился контекстуальный автокомплит и поиск по символам в файлике.

Фидбек приветствуется)

https://marketplace.visualstudio.com/items?itemName=tonwhales.func-vscode
SO
21:16
Sash Osh
In reply to this message
👍 класс
21:17
In reply to this message
The FunC Language Server server crashed 5 times in the last 3 minutes. The server will not be restarted.
ИК
21:17
Игорь Коняхин
In reply to this message
+
21:18
У меня постоянно такая же ошибка была ещё на предыдущей версии
DV
21:19
Dan Volkov
In reply to this message
Открой Debug -> Output -> в выпадающем списке выбери FunC
21:19
Что за платформа?
SO
21:21
Sash Osh
In reply to this message
Error: ENOENT: no such file or directory, open '\c%3A\Users\alexo\.vscode-insiders\extensions\tonwhales.func-vscode-0.1.0\server\node_modules\web-tree-sitter\tree-sitter.wasm'
failed to asynchronously prepare wasm: RuntimeError: abort(Error: ENOENT: no such file or directory, open '\c%3A\Users\alexo\.vscode-insiders\extensions\tonwhales.func-vscode-0.1.0\server\node_modules\web-tree-sitter\tree-sitter.wasm'). Build with -s ASSERTIONS=1 for more info.
RuntimeError: abort(Error: ENOENT: no such file or directory, open '\c%3A\Users\alexo\.vscode-insiders\extensions\tonwhales.func-vscode-0.1.0\server\node_modules\web-tree-sitter\tree-sitter.wasm'). Build with -s ASSERTIONS=1 for more info.
21:22
Видимо, что-то с путями.
DV
21:22
Dan Volkov
In reply to this message
Винда?
SO
21:22
Sash Osh
ну да
DV
21:22
Dan Volkov
Исправлю скоро
ИК
21:24
Игорь Коняхин
In reply to this message
Тоже самое, также винда
AT
21:34
Andrey Tvorozhkov
In reply to this message
https://github.com/disintar/toncli/tree/dev в дев ветке обновление которое это реализует
A
21:38
Andrei
In reply to this message
Да
ИК
21:51
Игорь Коняхин
В FunC есть возможность include/require/import другой FunC файл?
AP
21:51
Andrey Pfau
нет(
AT
21:54
Andrey Tvorozhkov
In reply to this message
В тонкли просто укаазываешь порядок
21:54
ИК
21:59
Игорь Коняхин
Обнаружил такую ошибку:

C:\users\nns20\Development\TON\contest-1\tests\my.fc:1:1: error:  is not a type identifier
;; Slice literals

Видимо вызвана UTF-шнягой и тем, что вначале данного файла есть пара лишний байт (Visual Studio Code показывает "UTF-8 with BOM")
21:59
Перекодировал файл в просто UTF-8 и ошибка ушла
22:01
In reply to this message
Работает
Превосходно
Спасибо
22:08
In reply to this message
Выглядит правильно, но затестил и выкидывает ошибку 7 (Type check error. An argument to a primitive is of incorrect value type)
22:14
Правда функция из задания 2
int slice_data_equal? (slice a, slice b) asm "SDEQ";

Даёт ту же ошибку
22:18
Вообще совершенно не понятно как так: я перепроверил - FunC не даёт передать в функцию другой тип
A
22:19
Andrei
In reply to this message
эта не должна давать
22:19
In reply to this message
такое может быть, если у ассемблерной вставки неправильно расставлены типы аргументов или возвращаемых значений
ИК
22:20
Игорь Коняхин
In reply to this message
Я перепроверял
Если закоментировать соответствующую строчку, то ошибки нет
A
22:20
Andrei
In reply to this message
ну или сама вставка некорректная, когда там больше одной команды
ИК
22:21
Игорь Коняхин
In reply to this message
Да, но тут вообще казалось бы максимально простая функция, где два аргумента одного типа, и единственная команда сразу их обрабатывает
A
22:21
Andrei
In reply to this message
А других вставок нет? Может аргументы неправильного типа на самом деле. Вообще разное может быть, тут так гадать сложно)
ИК
22:23
Игорь Коняхин
Проверил
Других вставок нет
A
22:24
Andrei
"Asm.fif" include

x{123} x{456} <{ SDEQ }>s runvmcode .s

Работает
22:24
Это на фифте скрипт
22:25
Ну не ясно в общем
22:26
Можете попробовать поискать минимальный пример, на котором оно не работает, и прислать
ИК
22:28
Игорь Коняхин
In reply to this message
Кажется нашёл причину
Я в генерации данных первого теста вызывал функцию init().

Так вот, оказывается в toncli глобальные переменные от функции к функции теряются, и в функции-проверке результаты первого теста глобальные переменные были неинициализированными.

Также оказалось, что FunC не null-safe язык:(
22:29
Выходит, что мне в начале каждой-каждой функции теста нужно вызывать init()
AP
22:30
Andrew Python
In reply to this message
я проверил, работает правильно
и слово data в названии функции было лишнее) там же всё дерево проверяется
ИК
22:31
Игорь Коняхин
In reply to this message
Да я уже разобрался в общей проблеме: один из slice/cell был = null
22:31
Вернее, неинициализирован - не знаю, равно ли это null
22:34
Когда мы в тестах toncli получаем cell actions, там уже "пофикшенные" TVM сообщения?

Т.е. TVM уже поработала над тем, чтобы заменить адрес отправителя на "правильный"?
22:35
Тот кусок, который 5-6-ой биты из .store_uint(0x18, 6)
A
22:35
Andrei
In reply to this message
вряд ли
22:35
TVM не фиксит, оно потом на action phase фиксится блокчейном. Но локального этого не происходит, если только Андрей @tvorogme не подумал об этом отдельно)
AT
22:37
Andrey Tvorozhkov
In reply to this message
Ну не то чтобы не подумал))
22:38
Не написал - точно)
22:38
(жду ващи PR :))
A
22:38
Andrei
А у тебя же вроде был парсинг сообщения на фифте. По идее это не так сложно добавить)
22:38
In reply to this message
Ага)
AT
22:39
Andrey Tvorozhkov
Там уже 41 звездочка, уже точно не стыдно PR делать)))
22:39
(шучу)
22:39
In reply to this message
Да)
P
22:41
Placeholder
In reply to this message
А какой должен быть правильный адрес отправителя у сообщения из тестовых данных?
ИК
22:41
Игорь Коняхин
In reply to this message
Проверил - да, там остаются два нуля
22:41
In reply to this message
Хороший вопрос
Например тот, на который шло исходное сообщение
22:41
Либо какой-нибудь внешний конфиг
22:42
slice ito_slice(int i, int len) inline method_id {
return begin_cell().store_int(i, len).end_cell().begin_parse();
}

Громоздко, но работает и слаба богу
A
22:44
Andrei
inline method_id это какое-то бессмысленное сочетание
AT
22:45
Andrey Tvorozhkov
In reply to this message
no
22:45
Это для тестов
A
22:45
Andrei
хмм то есть чтобы оно и в мапе было, и инлайнилось?
AT
22:46
Andrey Tvorozhkov
In reply to this message
У тебя у тестов айдишники от 0 ...
22:46
И они парсятся фифтом
22:46
ну точнее в обратном порядке (9, 8, 7 ..., 0)
22:46
Вот как до 0 дойдем - останавливаемся
22:46
а все остальные функции для внутр. использования
22:47
Поэтому нужет method_id
A
22:47
Andrei
а, ну ок
22:47
ясно понятно
AT
22:47
Andrey Tvorozhkov
:)))
22:47
Прикольно придумали
22:47
ничего не скажешь
22:47
)
ИК
22:48
Игорь Коняхин
In reply to this message
Есть ли возможность в тестах toncli не терять глобальные переменные от теста к тесту?
22:48
И в идеале иметь какую-нибудь функцию main/init, которая вызывается перед всеми тестами
22:49
Есть какие-то вещи, которые нужно передавать от генерации теста к проверке теста
22:49
В контексте второй задачи это как минимум адрес владельца
22:49
но таких вообще говоря полно
23:03
In reply to this message
И я так понимаю все штуки, связанные с количеством пересланных денег и комиссией также остаются "как есть", без про-патчивания?
AT
23:04
Andrey Tvorozhkov
Без
ИК
23:07
Игорь Коняхин
In reply to this message
Кажется, удалось дописать все проверки и всё завести. Ура!
Всего около 100 строчек на 1 тест ко второй задаче
AT
23:13
Andrey Tvorozhkov
In reply to this message
Понимаю)
23:13
Ничего, после контеста завезем все стандартные штуки
23:13
В либу
23:13
И будет в сто раз проще)
TP
23:14
Tim Pavlov
In reply to this message
весь файл теста столько занял? или только один кейс?)
ИК
23:16
Игорь Коняхин
У меня весь файл == один кейс,
но там около половины строчек пусты,
но плюс к этому файлу я ещё общие функции пишу в отдельном, личном библиотечном файле
23:17
Но у меня проверяется всё-всё-всё (кажется), даже те вещи, в которых чтобы налажать, нужно сознательно лишний код написать
23:19
Первая фаза - вообще всё собрать, чтобы оно работало, дальше уже можно порефакторить
23:19
Будет больше библиотечного кода, но короче и читаемее тесты
RD
23:20
Ruslan Dorofeev
All Hi
23:20
Фифт рулит
ИК
23:35
Игорь Коняхин
Пусть у нас есть 100 монет, мы получаем internal сообщение с 60 монетами, и отсылаем сообщение с 10 монетами. Пускай fee составляет 4 монет.

Я правильно понимаю значения mode?

mode = 0: наш кошелёк (100+60-10 = 150 монет), ушло дальше (10-4 = 6 монет)

mode = 1: наш кошелёк (100+60-10-4 = 146 монет), ушло дальше (10 монет)

mode = 64: наш кошелёк (100-10 = 90 монет), ушло дальше (60+10-4 = 66 монет)
(другими словами, если мы делаем .store_grams(0), то mode = 64 никогда не изменит наш баланс)

mode = 65: наш кошелёк (100-10-4=86 монет), ушло дальше (60+10 = 70 монет)

mode = 128: наш кошелёк (0 монет), ушло дальше (100+60-4 = 156 монет), число 10 игнорируется и ни на что не влияет

Так?
TP
23:43
Tim Pavlov
image_2022-04-04_23-43-29.png
Not included, change data exporting settings to download.
181.4 KB
23:43
это ошибка в тесте или в контракте?
23:43
не могу понять
23:43
добавил пару inline method_id функций и что-то поломалось
DV
23:51
Dan Volkov
In reply to this message
А вроде была готовая инструкция?
AP
23:53
Andrew Python
In reply to this message
Для сравнения ячеек вроде нету, найдешь - сообщи)
ИК
23:54
Игорь Коняхин
Я и для сравнения слайсов не нашёл (только для сравнения битов слайсов)
AP
23:55
Andrew Python
In reply to this message
Для сравнения слайсов можно в этой переписать хеш на слайсы
23:56
Будет и слайсы на всю глубину дерева сравнивать
ИК
23:56
Игорь Коняхин
Да я уже
5 April 2022
NM
00:00
Nikita Misharin
Немного издалека вопрос, но допустим у нас одна ячейка ссылается на другую. И мы читаем первую cell, когда там заканчиваются биты, как то автоматички начинается считывание последующей ячейки или нужно руками ref читать?
ИК
00:00
Игорь Коняхин
In reply to this message
Нужно вручную
00:00
Если заканчиваются биты, но ты пытаешься продолжить их читать, получишь исключение
NM
00:03
Nikita Misharin
In reply to this message
То есть load_ref и продолжаем читать, верно?
ИК
00:04
Игорь Коняхин
Почти
Нужно будет снова сделать .begin_parse(), а также не забыть перезаписать переменную, из которой читаешь
cs = cs
.load_ref()
.begin_parse();
AP
00:06
Andrey Pfau
In reply to this message
Гений в чат по криптовалюте кидать рефералку банка
00:06
Это звучит как анекдот
TP
00:06
Tim Pavlov
не просто в чат по криптовалюте, а в чат для разработчиков тона)
AP
00:07
Andrey Pfau
Я обобщил)
TP
00:07
Tim Pavlov
не, просто если уточнять, то еще эпичнее это всё)
NM
00:07
Nikita Misharin
In reply to this message
Понял, спасибо. Не очень конечно, у меня тут не помещается все в один cell и я пытаюсь понять, я ли накосячил или это задачка со звездочкой
00:22
In reply to this message
мой косяк
Л
00:38
Логово Разраба
In reply to this message
так он чистый
ИК
01:48
Игорь Коняхин
Тело сообщения:
body:(Either X ^X) = MessageRelaxed X;

может быть в отдельной ячейке

То, что поступает в
() recv_internal (int balance, int msg_value, cell in_msg_full, slice in_msg_body) {

параметр in_msg_body ведь всегда будет нужным телом сообщения?
"in" сокращённо от "incoming", а не от "inplace"? :)
Д
02:23
Данил
Есть где-нибудь инструкция для новичков, как создать смарт контракт?
NM
02:31
Nikita Misharin
In reply to this message
TP
02:51
Tim Pavlov
так и не получилось встроить функции в toncli тест, выдает исключение stack underflow. в чем может быть причина?
02:53
вот такое исключение, если что
NM
03:01
Nikita Misharin
In reply to this message
У меня такое было когда в tuple данных для теста передавал только одно значение вместо четырех
TP
03:02
Tim Pavlov
In reply to this message
ну в тесте сам тапл я возвращаю хороший, он так орет только когда есть какая-то сторонняя функция, которую вызываю. Я уже обернул тело функции тупо в ковычки, типа блок со своим стеком - то же исключение....
ИК
03:06
Игорь Коняхин
В условии задания 3: Manager == Owner?
ИК
05:31
Игорь Коняхин
toncli на каждый тест выдаёт три строчки:
[ 3][t 0][2022-04-05 02:26:47.6313859][vm.cpp:558]      steps: 98 gas: used=6644, max=9223372036854775807, limit=9223372036854775807, credit=0
[ 3][t 0][2022-04-05 02:26:47.6316385][vm.cpp:558] steps: 54 gas: used=2735, max=1000000000, limit=1000000000, credit=0
[ 3][t 0][2022-04-05 02:26:47.6318017][vm.cpp:558] steps: 210 gas: used=14692, max=9223372036854775807, limit=9223372036854775807, credit=0
INFO: Test [third_1a] status: [SUCCESS] Gas used: [2735]


Согласно
https://github.com/disintar/toncli/blob/master/docs/advanced/func_tests.md
я так понял, что первая строчка соответствует функции генерации данных теста, а третья - функции проверки результата работы, и т.е. сколько в них израсходовано газа - не важно.
Верно?
SE
06:35
Scr Ezhik
Всем привет ✋🏽
Я вот только начал изучать funC и решил принять участие в Смарт Челендже.

Можете подсказать почему некоторые методы вводятся, а вот в основной функции их не используют, хотя они там нужны?
AT
07:41
Andrey Tvorozhkov
In reply to this message
Да
07:45
In reply to this message
Если вы только начинаете - лучше использовать тонкли
07:46
In reply to this message
(Да и если вы супер крутой фифт фанкси разраб, на самом деле тоже) :)
A
08:07
Aleша
всем привет, у кого то на маке были проблемы с установкой toncli? пишет нету доступов до func, хотя доступы все выдал
08:07
и в билде для мака нету папки fift
РБ
08:34
Роман Барбье
In reply to this message
дай права на папку
A
08:35
Aleша
In reply to this message
дак дал)
РБ
08:36
Роман Барбье
путь полностью с именем файла попробуй
08:50
Deleted Account
collection.json может кто-то пример дать ?
P
09:30
Pi
In reply to this message
А как сам тонкли запустить та? На винде, все сделал по инструкции через командную строку, а тонкли та как запустить?
OB
09:55
Oleg Baranov
подскажите плиз, изначальный (пустой) сторедж контракта это null или пустой cell begin_cell().end_cell() ?
10:23
Deleted Account
как должен выглядеть csv файл для деплоя нфт?

https://github.com/tondiamonds/ton-nft-deployer/
AP
11:17
Andrey Pfau
In reply to this message
ID,owner написано же
11:30
Deleted Account
Можете пж рассказать конкретно (с примерами!) в чем все же различие Non-bounceble и Bounceble кошельков?! Спасибо заранее...
А
11:45
А.
Привет всем! Может кто-то помочь разобраться с валидаторами? Сколько мне нужно тона, чтобы был свой собственный узел ?
РБ
11:50
Роман Барбье
In reply to this message
где то 300 000 тона
А
11:50
А.
Мне только что про 10к писали
11:50
В другой группе какой-то
I
11:50
Isaac
Врут
А
11:50
А.
Админы сказали, что где-то есть статья
11:50
Но где - я не нашёл
11:51
А
11:52
А.
Спасибо
11:52
А есть какая-то статистика по заработку ?
11:52
Типо вот какой приход будет с 350к тона в день
I
11:53
Isaac
Читать статьи научись, потом задавать вопросы
А
11:53
А.
Принял, щас сделаю
12:35
Deleted Account
А зачем toncli при деплое, делает копию проекта в папку в либами?
AT
12:38
Andrey Tvorozhkov
In reply to this message
Чтобы с этого кошелька отправлять деньги на новые контракты
AR
12:39
Alexander Ruliov
In reply to this message
Плюсую, я ожидал что оно всё в текущей папке сохранит, а не унесёт непонятно куда текущую папку частично.
AP
12:40
Andrey Pfau
In reply to this message
Кстати да, лучше делать временную папку рядом
12:40
build какой нибуть с выхлопными файлами
AR
12:40
Alexander Ruliov
Хотя кейс когда ты контракт из гита чужой выкачал в таком случае ерунду тоже делать будет, сохраняя на месте. Я бы флаг в проекте или деплое какой сделал.
AT
12:44
Andrey Tvorozhkov
In reply to this message
Так нельзя
12:44
Еще раз, для того, чтобы работало все красиво и без проблем - нужно иметь контракт кошелька внутри toncli, из которого toncli может отправлять сам деньги и сообщения
12:45
Это очень удобно когда ты деплоешь по 50 контракто в день, тебе не нужно в каждый отправлять деньги. Ты 1 раз кидаешь на кошелек тонкли большую сумму и забываешь про это
12:46
In reply to this message
Текущую папку оно никуда не уносит
12:46
Оно один раз при запуске создает wallet в конфиг папке
12:53
Deleted Account
То есть в гайде, проект который мы создаем (toncli start wallet) - это вообще не относится к тому, что создается рядом с конфигом? При деплое, тонкли создаст свой якобы кошелек чтоли, рядом с конфигом? Немного не понятно...
12:55
Я только начал изучать, поэтому вопросов много, сорян ) И как понять 'из которого toncli может отправлять сам деньги и сообщения' - то есть все контракты будут создаваться от адреса сгенерированного тонкли чтоль?
13:00
И скажите пож разницу между Non-bounceable и Bounceable - на примере) че вкуриваю чучуть ))
P
13:00
Placeholder
In reply to this message
Для того, чтобы контракт задеплоился, на его non-bounceable адрес нужно отправить небольшую сумму на оплату storage fee. Вот эта сумма переводится с деплоимент кошелька
13:02
In reply to this message
Bounceable — при переводе на адрес, по которому не задеплоен контракт, средства вернутся отправителю. Non-bounceable — не вернутся. Возможно, есть что-то еще какая-то разница, не знаю.
СВ
13:06
Сергей В
А можно с помощью тестов toncli проверить содержание того что отправилось в send_raw_message ?
P
13:09
Placeholder
In reply to this message
Можно. В этом чате уже обсуждалось. В клетке actions, которая передается в тест, это содержимое регистра c5, есть список отправляемых сообщений. Лэяут этого типа где-то выше по чату тоже писали.
СВ
13:13
Сергей В
In reply to this message
спс, поищу
P
13:14
Placeholder
In reply to this message
in_msg_body — всегда тело сообщения, независимо от того, по ссылке оно или inplace
ИК
14:19
Игорь Коняхин
In reply to this message
Это хорошо)
SO
14:20
Sash Osh
Каким образом (де)сериализуются списки? Например, сказано, что actions это сериализованный список, как его распарсить?
ИК
14:22
Игорь Коняхин
Простыми словами
Actions =
^Previous action
4 определённых байт
8 бит mode
^ message
14:22
Я вчера с этим намучался
14:23
"4 определённых байт" нужно глянуть в TL-B - я так сходу не помню
D
14:23
Daniil
В каком формате нужно пихать адрес в fee_recipient в файл с коллекцией?
T
14:26
TON Дев Чат
In reply to this message
маловероятно что 8 байт, скорее 4 байта тега?
ИК
14:27
Игорь Коняхин
In reply to this message
Точно
Исправил
8 hex цифр
14:27
Deleted Account
Здравствуйте! Ребята, что нужно новичку, чтобы начать разрабатывать контракты на ТОН? Я почти ничего не знаю о блокчейне в принципе, но очень интересна эта тема. Может, какая-то книга есть? Я только на джаве немного умею. Извините за тупые вопросы.
T
14:28
TON Дев Чат
In reply to this message
SO
14:28
Sash Osh
In reply to this message
а где есть описание этого формата?
SO
14:35
Sash Osh
спс 👍
ИК
14:56
Игорь Коняхин
В третьей задаче:
> The initial address memorizer storage contains owner address ...

Manager == Owner?
РБ
15:02
Роман Барбье
In reply to this message
seems so
ИК
15:02
Игорь Коняхин
Да, другой интерпретации я тоже не вижу, но се равно смущает
P
15:27
Placeholder
Куда почитать про трату газа до и после ACCEPT? Выгоднее акцептить сообщение сразу после проверки подписи, или после всех проверок?
ИК
15:29
Игорь Коняхин
Во второй задаче:
> In particular for each message A (except messages from owner itself) such contract should ...

Формально говоря, поведение для сообщений от owner неопределённо. Что делать для сообщений от owner?

Я так понимаю, имелось в виду:
> In particular for each message A (if and only if message is not from owner) such contract should ...

Даже в таком случае, если от owner - игнорировать или кидать исключение?
AP
15:34
Andrew Python
In reply to this message
А вот интересно на счёт исключения. Если кидать исключение, то баланс контракта можно пополнить только перед деплоем. Если игнорировать, то owner может пополнить баланс контракта в любое время.
15:35
А storage fee вычитается из принятой суммы, если send_raw_message c модом 64?
T
15:37
TON Дев Чат
In reply to this message
До и после акцепта траты газа абсолютно одинаковы (просто меняется тот кто платит)
P
15:37
Placeholder
In reply to this message
Как я понял при mode = 64 (и store_grams(0) )отправитель платит за все, с баланса контракта ничего не списывается.
ЕС
15:38
Егор Ставский
Добрый день
Кто-нибудь, подскажите по первому шагу установки toncli
Перехожу по ссылке из инструкции
https://github.com/newton-blockchain/ton/actions?query=branch%3Amaster+is%3Acompleted
А куда дальше? Что именно скачивать? Нужен пребилд на mac (intel)
И куда его потом поместить надо?
AT
15:40
Andrey Tvorozhkov
In reply to this message
15:40
In reply to this message
ЕС
15:41
Егор Ставский
In reply to this message
Спасибо большое! А располагать где угодно?
AT
15:46
Andrey Tvorozhkov
In reply to this message
Не понял вопроса) Просто где-нибудь :)
ЕС
15:47
Егор Ставский
In reply to this message
Ок, спасибо ещё раз)
P
15:49
Placeholder
In reply to this message
Если траты газы до акцепта оплачиваются не с баланса контракта, то что мешает поставить accept_message после всех операций в методе и не платить ничего?
TP
15:50
Tim Pavlov
In reply to this message
наоборот, траты за вычисления идут с баланса смарт контракта до акцепта, после него уже идут с отправителя сообщения. Там при акцепте gas credit ставится на 0 и с него начинают списывать
15:50
поэтому чем раньше акцепт вызовется - тем лучше
P
15:53
Placeholder
In reply to this message
Как с отправителя сообщения, если это external message?
AR
15:54
Alexander Ruliov
В случае external message я так понимаю если не accept'ить, то результат выполнения выбрасывается и газ не тратится. Или внешние сообщения как и методы требуют наличия какого-то адреса у вызывающего?
P
15:57
Placeholder
In reply to this message
Блокчейн по айпи тебя вычислит и счет по почте пришлет
TP
15:59
Tim Pavlov
In reply to this message
так при экстернале отправитель же должен платить газ за вычисления отправитель сообщения, разве нет?
ты же когда платеж делаешь - газ платишь ты, а не контракт токена
T
15:59
TON Дев Чат
In reply to this message
Я не очень понятно пояснил. Это не так работает:
1) до акцепта газ-лимит установлен равным gas-credit в случае экстернала и баланс_сообщения/стоимость_газа в случае интернал сообщения
2) в любом случае баланс сообщения сразу плюсуется к балансу контракта (на время контракта это "его" деньги)
3) если контракт сделал accept то газ-лимит устанавливается равным баланс_контракта/стоимость_газа.
4) в конце транзакции стоимость газа вычитается с баланса контракта ( в случае internal сообщения без accept'а на стороне контракта, максимум с контракта спишут баланс входящего сообщения, которое мы приплюсовали ранее)
5) если сообщение внешнее, а acceptа сообщения не было - транзакция в блок не включается.
16:01
Поэтому за все внешнее сообщение которое контракт акцептнул он заплатит. Как за операции до непосредственно акцепта, так и за операции после. Стоимость одних и тех операций до и после тоже будут одинаковы
AP
16:02
Andrew Python
In reply to this message
ок, теперь понятно, почему акцепт после всех проверок делают
P
16:04
Placeholder
In reply to this message
Теперь понятнее, спасибо. Значит, если я что-то положу в словарь (и потом в c4) и после этого кину исключение, не дойдя до акцепта, при получении следующего сообщения, в словаре этих данных не будет, так как они не записаны в блок?
TP
16:05
Tim Pavlov
In reply to this message
есть commit, можно его использовать. тогда данные сохранятся вне зависимости от выброшенных исключений
T
16:05
TON Дев Чат
In reply to this message
Да, это сообщение вообще никуда не дойдет: любая нода (в том числе и валидатор) его отбросит
16:10
In reply to this message
commit немного про другое: он про сохранение c4 и с5 регистров в случае неотловленых экцепшнов в computation фазе, против ошибок в action фазе, например неверных сообщений он не спасает. А с газом он ничего не делает
TP
16:13
Tim Pavlov
In reply to this message
понял, спасибо
ИК
16:31
Игорь Коняхин
In reply to this message
Можно, пожалуйста, уточнение по задачам
16:31
In reply to this message
Например, по задаче 2
16:31
У меня возможно черезчур формальные вопросы, и я сам это обычно не люблю, но поскольку всё будет тестироваться автоматически, то малейшие расхождения между замыслами авторов и одной из возможных интерпретаций условий могут привести к провалу решения
P
16:43
Placeholder
In reply to this message
Суть вопроса в том, какой должен быть код возврата, если адрес отправителя совпадает с адресом владельца?
NM
16:44
Nikita Misharin
In reply to this message
Если бы был throw, было явно сказано
AP
16:46
Andrew Python
In reply to this message
ахахахах почитай условие 5 задачи
ИК
16:48
Игорь Коняхин
In reply to this message
Если адрес отправителя совпадает с адресом владельца, то какой из пяти вариантов:
а) Обработать также, как и с других адресов (это судя по всему не имелось в виду, но формально условие не запрещает)
б) Проигнорировать, завершиться без ошибки
в) Завершиться с ошибкой = кинуть исключение
г) Либо "б", либо "в", но не "а"
д) Поведение не определено, поэтому можно делать, что угодно и таких тестов не будет
Формально верно "д", но был ли в этом замысел авторов?
СВ
16:48
Сергей В
Насчет 5й задачи, можно как-то в тесте .fc подписать данные ? :)
P
16:49
Placeholder
In reply to this message
в тесте нельзя, тут уже отвечали. или внешними средствами как-то, или закоментить проверку подписи на время тестов..
NM
16:49
Nikita Misharin
In reply to this message
Так, ну ладно, согласен. Я просто исходил, что если явно не указано throw, то можно игнорить
ИК
16:50
Игорь Коняхин
Много тонкостей
Вот, например, в задаче 3:
Предположим ты получил сообщение:
+ 32 бита с op=1
+ 64 бита с query_id
+ valid MsgAddress
+ немного мусора в конце

Т.е. префикс соответствует описанию, но есть немного мусора в конце и из-за этого всё сообщение целиком описанию не соответствует.

Как с этим быть?
СВ
16:50
Сергей В
In reply to this message
ага, я тоже так подумал потому что не нашел у TVM инструкций для подписи :)
T
16:50
TON Дев Чат
In reply to this message
The aim of two owner wallet is to create smart-contract which send messages then and only then both owners (represented by public keys) authorized it.
P
16:51
Placeholder
In reply to this message
Это из пятой задачи, а Игорь спрашивает про 2
AP
16:52
Andrew Python
In reply to this message
я бы просто этот valid MsgAddress записал
(точнее я так и сделал)
ИК
16:53
Игорь Коняхин
In reply to this message
Это про пятую задачу
Ну тут опять же: замысел понятен, но ведь тестирование автоматическое, поэтому важно в точности соответствовать тестам.
Если бы контракты проходили бы ручную оценку, где участники могли бы обосновать осмысленность тех или иных решений/ограничений, то была бы другая история.
T
16:53
TON Дев Чат
Любое поведение которое не определено - не проверяется
16:54
In reply to this message
мусор в конце не подпадает под определение
when contract get internal message from Manager with 32-bit unsigned op equal to 1 [more on op's here](https://ton.org/docs/#/howto/smart-contract-guidelines?id=internal-messages)
followed by some 64-bit unsigned query_id,
followed by valid MsgAddress, it should store obtained address in the storage.
16:56
In reply to this message
а если что-то не подпадает под определение, то when address memorizer get any other message it should throw
ИК
17:02
Игорь Коняхин
In reply to this message
Доподленно не понятно, как интерпретировать with?
а) "starts with", мусор в конце допустим
б) "with and only with", мусор в конце недопустим
в) Просто "with", т.е. где-то по сообщению можно найти все три куска (op, query_id, msg_address) в любом порядке с возможным мусором между ними.

Вариант "в" разумеется абсурден, но формально не исключён. Я же его привёл чтобы показать, что какой из вариантов "а" или "б" имелся в виду - не однозначно
17:05
In reply to this message
> не подпадает под определение
К сожалению, "не подпадает" тоже читается неоднозначно.
"Не подпадает":
а) "Не соответствует", мусор в конце недопустим
б) "Не специфицируется", мусор в конце допустим
17:07
Я не пытаюсь придраться, просто в естественных языках (русский/английский) очень много неоднозначных моментов, и я лишь хочу уточнить, что имелось в виду
17:16
Deleted Account
In reply to this message
Актуально
EG
17:38
Egor Georgievskii
Добрый день, вопрос по задаче 4 контеста. Какого порядка ожидается размер хранилища? Условно говоря, можно придумать разные оптимальные лейауты в памяти для size=50 и size=50000, и в таком виде не очень понятно, для каких именно условий оптимизировать затраты по газу?
РБ
17:47
Роман Барбье
In reply to this message
всё что в условии ты видишь
T
17:47
TON Дев Чат
In reply to this message
Ок, ждите уточнение сегодня. Вероятно условия будут ослаблены (все разночтения в пользу участников).
Об уточнении будет объявлено как в прошлый раз.
ИК
17:48
Игорь Коняхин
In reply to this message
👍
РБ
17:50
Роман Барбье
In reply to this message
Игоречек, где ты там вообще мусор нашел ?
17:51
32 бита 64 квери и адрес
ИК
17:51
Игорь Коняхин
Ну вот будет в конце теста
.store_uint(185333423424123, 240)

вот и мусор
AP
17:56
Andrew Python
In reply to this message
В 4-ом задании с op=2 тоже может быть мусор в конце)
P
17:57
Pepeg
👋 Пустой recv_internal, который был добавлен чтобы запустить тесты нужно убрать из окончательного файла или можно оставить?
T
18:01
TON Дев Чат
In reply to this message
без recv_internal'а файл не скомпилится
P
18:01
Pepeg
In reply to this message
Спасибо, думал мб вы сами будете добавлять перед стартом тестов
OB
18:14
Oleg Baranov
А в 5 задаче сообщения могут приходить паралельно?
Например 3 разных сообщения от 1 владельца ждут подтверждения от 2 владельца.
Или пока второй владелец не подтвердит сообщение пеервого - первый не сможет отпраивть новое?
T
18:17
TON Дев Чат
In reply to this message
Могут идти параллельно
OB
18:18
Oleg Baranov
In reply to this message
понял, спасибо
AP
18:19
Andrew Python
Кстати, а кошелёк, как в пятом, потом будет где-то использоваться?) я бы хотел такой с интерфейсом
Д
18:32
Данил
Во всех тон кошельках в адресе только 48 символов? Или может быть больше или меньше?
MS
18:45
Mikhail Sytchev
глупый вопрос, но...
18:45
в ТОНе не принято хешем транзакции делиться?
18:45
с тем кому пересылал
18:46
https://tonwhales.com/explorer
https://ton.sh/

не предоставляют поиска по транзакции
c
18:46
cryshado
In reply to this message
Ну че то не принято, хотя должно быть принято)
OO
18:47
Oleg Oskolsky
In reply to this message
tonscan.org и ton.cx позволяют делиться ссылками на транзакцию.
ИК
18:47
Игорь Коняхин
Оказывается, если в toncli объявить глобальные переменные не вначале файла, то может тест может крашиться с мутным сообщением:
[ 1][t 0][2022-04-05 15:45:36.2451927][Fift.cpp:67]     top: tuple
level 1: [in append:] ... <continuation 000002718F13CB50> "list" <continuation 000002718F13CAC0> @ dup null? not { <continuation 000002718F1C66D0> } { <continuation 000002718F1C6A00> } cond "list_cnt" <continuation 000002718F13CAC0> @ 1 + tuple **HERE** "list" <continuation 000002718F13CAC0> !

level 2: <while loop condition:> { dup null? not <literal of type 11> @ 1 = xor }
level 3: <text interpreter continuation>
[ 1][t 0][2022-04-05 15:45:36.2454141][fift-main.cpp:204] Error interpreting file `C:\Users\nns20\AppData\Local\Temp\tmptzwjbnu1.fif`: tmptzwjbnu1.fif:76: while:stack underflow
MS
18:48
Mikhail Sytchev
In reply to this message
https://tonscan.org/ только что чекнул, только адреса ищет
18:49
https://explorer.toncoin.org/ тут нашел
18:49
но тут какой-то комбайн с воркчейнами, шардами
18:50
чот как-то не юзерфрендли))
ИК
18:54
Игорь Коняхин
Обнаружил, что строчка типа:
(slice aa, slice bb, slice cc, slice dd, slice ee, int ff) = gg();


вызввает мутную python ошибку:
lvalue expression constructor is 9
fatal: cannot compile lvalue expression with unknown constructor


FunC не умеет так из функции распаковывать кортежи?
AP
18:56
Andrew Python
In reply to this message
умеет
AP
18:56
Andrey Pfau
In reply to this message
вообще умеет
18:56
In reply to this message
а что из себя метод gg представляет?
ИК
18:57
Игорь Коняхин
(slice, slice, slice, slice, slice, int) third_1b_params() inline method_id {
init();
return (address_1, address_2, address_3, address_4, address_5, 8912341234);
}
18:58
address_x - гломальные переменные, инициализируемые в init
19:01
Тьфу
Нашёл!
19:01
Уже были гломальные переменные с тем же именем
19:01
Но сообщение об ошибке в данном случае очень неинформативное
19:01
In reply to this message
Т.е. были грубо говоря глобальные переменные 'aa', 'bb' и т.п.
19:15
In reply to this message
Также мутные ошибки если объявить функции слегка не в том порядке.
Мой файл (псевдокод):

функция a() { ... }
функция b(f) {
f();
}
функция c() {
b(a);
}

Вот если функция 'b' была бы ДО функции 'a', несмотря на то, что она её использует не напрямую, а через параметр, то выходит такое мутное сообщение:

[ 1][t 0][2022-04-05 16:11:18.2779279][Fift.cpp:67]     top: untuple
level 1: [in append:] "list_cnt" <continuation 0000021806A1DBD0> "list" <continuation 0000021806A1DBD0> "list" <continuation 0000021806A1D600> @ dup null? not { <continuation 0000021806AAA510> } { <continuation 0000021806AAAC90> } cond **HERE** "list_cnt" <continuation 0000021806A1D600> @ 1 + tuple "list" <continuation 0000021806A1D600> !
level 2: <literal of type 11> <literal of type 11> append **HERE** <literal of type 11> <literal of type 11> append
level 3: <while loop condition:> { dup null? not <literal of type 11> @ 1 = xor }
level 4: <text interpreter continuation>
[ 1][t 0][2022-04-05 16:11:18.2781274][fift-main.cpp:204] Error interpreting file `C:\Users\nns20\AppData\Local\Temp\tmpqkinvthu.fif`: tmpqkinvthu.fif:76: while:tuple size mismatch
19:27
Как проверить то, что не было сгенерированно никаких сообщений?
19:28
Я пытался проверить ячейку на пустоту:
cell_empty?(actions)
но получаю ошибку с кодом 7 (Type check error. An argument to a primitive is of incorrect value type)
19:30
int cell_empty?(cell c) inline method_id {
return c.begin_parse().slice_empty?();
}
19:41
Да тут похоже даже сам dump_stack валиться:
{
dump_stack();
throw(338);`
...

не доходит до throw, и падает с ошибкой:
#DEBUG#: stack(4 values) : ??? 102 C{F816E4052CD4BD65094E80CC077F3B8D1FADD6D8C0C5E09DF7FFE0ED34909920} [ 0][t 0][2022-04-05 16:39:30.9055964][refcnt.hpp:288]      Check `ptr && "deferencing null Ref"` failed

При этом у данной функции 6 параметров, а показывает, что на стеке только 4 значения
19:46
Если поместить непосредственно в тест, который не получает сообщений:
_ third_1b_check(int exit_code, cell data, tuple stack, cell actions, int gas) method_id(11) {
dump_stack();
throw(335);
...

то показывает, что на стеке 5 значений, но се равно падает с ошибкой:
#DEBUG#: stack(5 values) : 102 C{F816E4052CD4BD65094E80CC077F3B8D1FADD6D8C0C5E09DF7FFE0ED34909920} [0] [ 0][t 0][2022-04-05 16:43:39.6687026][refcnt.hpp:288]      Check `ptr && "deferencing null Ref"` failed
19:48
А если поместить dump_stack в тест который по факту получает сообщения, то вообще выходит всего-лишь три значения:
#DEBUG#: stack(3 values) : 0 C{465696C8DCF7130470F5D57E32459726C537E45682863A38159EFD3F51530C1C} C{5A0750CCF6132DA7CD2FFB182F092381598D24AADF23E8D78EB4AFFCC67E2E83}
Но в этот раз он не падает
19:49
Что вообще там происходит?
ИК
20:08
Игорь Коняхин
Есть вообще какие-нибудь функции debug'а помимо dump_stack?

Можно как-нибудь сделать:
print(actions)

?
Y
20:12
Y
In reply to this message
~dump есть
ИК
20:14
Игорь Коняхин
In reply to this message
О, спасибо
Так уже лучше!
Можно всё на разных строчках в нужном порядке печатать, а не в кучу
20:15
Было выяснено, что да: даже просто:
actions~dump();


приводит к:
#DEBUG#: s0 = [ 0][t 0][2022-04-05 17:13:28.3422267][refcnt.hpp:288]    Check `ptr && "deferencing null Ref"` failed


и к прекращению выполнения
20:16
@tvorogme
В toncli, похоже, проблемы, если actions пустой, но пытаешься его трогать
Y
20:18
Y
In reply to this message
пустая ячейка и null() - разные значения
попробуй cell_null?() либо просто null?()
ИК
20:18
Игорь Коняхин
Пробовал и то, и то - оба false
NF
20:22
Nik Fedorov
Попробуйте ~dump(actions);
AP
20:22
Andrew Python
Если попробовать "сфоткать" пустой actions, то получается:
#DEBUG#: stack(1 values) : C{[ 0][t 0][2022-04-05 17:22:12.317588758][refcnt.hpp:288]   Check `ptr && "deferencing null Ref"` failed
ИК
20:23
Игорь Коняхин
In reply to this message
То же самое
AT
20:24
Andrey Tvorozhkov
In reply to this message
Это очень давняя проблема)
20:24
И она не в тонкли
AP
20:25
Andrew Python
А как быть? оно и не парсится и не чекается и не null()
AT
20:26
Andrey Tvorozhkov
Можно фифтом поправить
20:26
Наверное
AP
20:26
Andrew Python
я кажется придумал) буду пробовать
ИК
20:31
Игорь Коняхин
In reply to this message
А что в фифте есть?
У меня были идеи насчёт проверки значения на cell, но не нашёл таких примитивов
20:31
In reply to this message
Пиши как там закончится
AT
20:32
Andrey Tvorozhkov
In reply to this message
В рантестс надо положить пустую клетку, если с5 неадекватный :)
ИК
20:39
Игорь Коняхин
In reply to this message
Т.е. исправить исходники toncli?
А где можно файл run_tests найти?
Мне windows поиск ничего не находит
20:41
Вероятно нужно поправить вот эту строчку, сделать что-то с клеткой
ИК
20:43
Игорь Коняхин
Это ведь в конце концов тот же самый fift код: если не работает в функции теста, то вряд ли будет по другому работать в запускателе теста
AT
20:43
Andrey Tvorozhkov
Fift ! = tvm
20:44
Но есть такая вероятность, что там тоже не сработает
20:44
Тогда надо пофиксить исходники тона
AP
21:02
Andrew Python
In reply to this message
int actions_empty?(cell a) inline asm "TRY:<{ CTOS DROP 0 PUSHINT }>CATCH<{ DROP -1 PUSHINT }>";

upd: наконец-то научился юзать try-catch в тоне
upd2: правильная версия с TRYARGS
int actions_empty?(cell a) inline asm "<{ CTOS DROP 0 PUSHINT }>CONT <{ DROP -1 PUSHINT }>CONT 1 1 TRYARGS";
AT
21:06
Andrey Tvorozhkov
In reply to this message
О, ты крут
ИК
21:06
Игорь Коняхин
In reply to this message
Спасибо 🤝👍💪
Ты официально фифт-маг 🧙
21:06
У меня была мысль про обработку исключений, но я как-то вообще не думал, что тут бывает try/catch
AP
21:07
Andrew Python
In reply to this message
я знал что есть, но не знал как юзать
ИК
21:08
Игорь Коняхин
У меня в голове уже назревало решение в скрипте тестера, вот в этой строчке:
https://github.com/disintar/toncli/blob/6aa101f43e31f1bd17d064a1f80149c123adf7be/src/toncli/modules/fift/run_test.fif.template#L177
дописать условие, что если код выхода = 7, и потрачено строго определённое количество газа (проверка actions должна быть самой первой строчкой), то считать тест пройденным успешно
😅
AT
21:16
Andrey Tvorozhkov
In reply to this message
0_о
21:16
Если код выхода > 1 сообщения не отправляются
21:16
Даже если они в с5
21:16
Там же фазы выполнения
ИК
21:17
Игорь Коняхин
In reply to this message
И всё-таки не совсем, что-то он лишнее берёт со стека:
  int imp = actions_empty?(actions);
imp~dump();

var ccs = data.begin_parse();
ccs~impure_touch();

throw(80);

Из-за первых двух строчек, в следующих двух возникает ошибка, и до throw(80) не доходит
AP
21:18
Andrew Python
In reply to this message
🤔
ИК
21:18
Игорь Коняхин
Возникает ошибка 2 - stack underflow
21:19
Не нужен в самом начале dup?
AP
21:19
Andrew Python
Так фанси сам дюпать должен, если actions потом используется
ИК
21:19
Игорь Коняхин
Хм, логично
21:20
Возможно в catch, drop лишний, так как "предположительно" cell потратился, а слайс не создался
AP
21:21
Andrew Python
Возможно...
21:21
Чекни без дропа
ИК
21:21
Игорь Коняхин
Я добавил твой actions_empty? в тест, где поступают сообщения, и там всё норм
AP
21:23
Andrew Python
Можно сделать функцию actions_normalize в toncli
21:24
На этих же try-catch
c
21:24
cryshado
собрались дебагеры, раньше код в уме дебажили и норм
ИК
21:24
Игорь Коняхин
Не должно быть 0 pushint в обратном порядке?
В tvm.pdf все числа идут после pushint
AP
21:25
Andrew Python
In reply to this message
Не, надо как раз наоборот) чекни любой fift-asm исходник контракта
NF
21:29
Nik Fedorov
Как сформировать сообщение так, чтобы оно дошло до recv_internal с четырьмя параметрами?
() recv_internal (int balance, int msg_value, cell in_msg_full, slice in_msg_body) {


У меня даже вот так, ничего не выводит.
;; testable
() recv_internal (int balance, int msg_value) {
~dump(balance);
~dump(msg_value);
}


Что-то в тесте я делаю не то.
;; Set message that our wallet will send
cell message_to_send = begin_cell()
.store_int(123, 32)
.store_int(234, 32)
.end_cell();
ИК
21:29
Игорь Коняхин
In reply to this message
@n1kfedorov
Такой список параметров нельзя ^
21:31
tuple stack = unsafe_tuple([balance, msg_value, in_msg_full, in_msg_body]);
21:32
Сообщения идут от контракта к контракту, а твоя функция вызывается с параметрами на стеке
c
21:32
cryshado
In reply to this message
у тебя сообщение не соотвествует структуре сообщения
NF
21:32
Nik Fedorov
спасибо!
ИК
21:33
Игорь Коняхин
Ну и с отправкой сообщений тебе придётся изрядно попотеть, чтобы разобраться: https://ton.org/docs/#/smart-contracts/messages
c
21:33
cryshado
In reply to this message
AP
21:39
Andrew Python
In reply to this message
перепроверил в обоих случаях правильно работает
(и пустой и не пустой)
ИК
21:39
Игорь Коняхин
У тебя он не последней строчкой используется?
AP
21:40
Andrew Python
In reply to this message
почти...)
ИК
21:41
Игорь Коняхин
Попробуй в самом начале:

  int imp = actions_empty?(actions);
imp~dump();

var ccs = data.begin_parse();
ccs~impure_touch();

throw(80);
21:44
Deleted Account
https://testnet.ton.sh/address/kQAs-4nc3ocCHsXULrFOlrPIoBNxVTTYbtFzJzAhr6Q62-5Y

toncli при создании кошелька отправляет 2 транзы (верхние по ссылке) на якобы мой адрес в каком то другом виде? Это не Non-bounce и не Bounce ... что это за адрес?
AP
21:49
Andrew Python
🤔
21:49
ломает всё что видет
ИК
21:50
Игорь Коняхин
А в TVM ещё не все примитивы есть?
Я пытался сделать:
int actions_empty?2(cell c) inline asm "XLOADQ SWAP DROP";
но получаю
[ 1][t 0][2022-04-05 18:50:26.1311399][Fift.cpp:67]     top: <text interpreter continuation>
level 1: <continuation 00000155A6BDA2F0>
level 2: <text interpreter continuation>
[ 1][t 0][2022-04-05 18:50:26.1312733][fift-main.cpp:204] Error interpreting file `C:\Users\nns20\AppData\Local\Temp\tmppauq4gsy.fif`: task3_tests.fif:510: XLOADQ:-?
AP
21:50
Andrew Python
In reply to this message
я тоже пытался это)
AT
21:52
Andrey Tvorozhkov
Вот это жизнь началась. В дев чате обсуждают твм оп :))
21:52
Раньше такое и не снилось :)))
AP
21:57
Andrew Python
кароче надо понять как юзать TRYARGS
21:57
тогда всё норм должно быть
T
22:00
TON Дев Чат
In reply to this message
скорее в Asm.fif его нет (и можно добавить)
c
22:02
cryshado
In reply to this message
Его нет. Можно добавить. У XLOADQ оп код 0xd73b
ИК
22:10
Игорь Коняхин
Добавил в
C:\Users\nns20\AppData\Roaming\Python\Python310\site-packages\toncli\lib\fift-libs\Asm.fif

Не сработало
Та же ошибка
SO
22:23
Sash Osh
В toncli написано что не реализовано "Gas auto calculation for store & deploy", а contest1 будет считаться еще какой-то газ кроме того, что считают тесты toncli?
DV
22:43
Dan Volkov
Создали группу для пользователей расширений под VS Code

https://t.me/vscode_ton
T
22:46
TON Дев Чат
To elucidate fine details the additional clarifications were added:
https://github.com/ton-blockchain/func-contest1/commit/6b6e0cbdafc10e377154ea96631c6933b3ff851d
Bot for submissions will be announced tomorrow.
AP
22:57
Andrew Python
In reply to this message
Сделал)
int actions_empty?(cell a) inline asm "<{ CTOS DROP 0 PUSHINT }>CONT <{ DROP -1 PUSHINT }>CONT 1 1 TRYARGS";
S
23:05
Ste 🇨🇭
Уважаемые разработчики, я хочу спросить вас, возможно ли разработать расширение Safari для кошелька TON, такое как расширение Chrome, для пользователей Apple.
Заранее спасибо.
AP
23:06
Andrey Pfau
In reply to this message
Сделайте)
AT
23:08
Andrey Tvorozhkov
In reply to this message
Оно уже в PR лежит к основному кошельку
ИК
23:08
Игорь Коняхин
In reply to this message
Прекрасно!
S
23:16
S
Ребята, кто шарит в роботе валидаторов сети? Готов заплатить за частную консультацию!
Интересует:
2 validation session и все про ето
настройка и поддержание валидатора
цикли валидации
как часто начисляется доход и тому подобное

Кто достаточно компетентен в этих вопросах, пожалуйста напишите в лс, там все обсудим и договоримся за оплату
ИК
23:28
Игорь Коняхин
Я верное понимаю, что вызов set_data(), если сообщение было успешно обработано, также попадает в actions?
NM
23:35
Nikita Misharin
А легально делать throw(0) глубоко в if бранчах?
c
23:37
cryshado
In reply to this message
да
23:37
In reply to this message
out actions да
NM
23:37
Nikita Misharin
In reply to this message
спасибо 🙏
ИК
23:38
Игорь Коняхин
In reply to this message
Спасибо, буду иметь в виду
V
23:43
Vladimir
Всем привет. Ребят, есть те кому интересно было бы поработать в команде над проектами связанными с NFT на TON? Есть несколько идей которые хотелось бы реализовать, думал сам изучу программирование и напишу смартконтракт, но прошел курс по ассемблеру и понял, что я ничего не понял. Исходя из этого принял решение найти в команду программиста который заинтересован работать над интересными проектами. Кому интересно пишите в ЛС, Условия сотрудничества обсудим.
СВ
23:45
Сергей В
А когда будет бот доступен для загрузки заданий, он сразу будет показывать результат тестов? А то не охота получить 0 из 5 и узнать об этом во время оглашения результатов 😂
AP
23:46
Andrew Python
In reply to this message
Вообще-то так и будет...
6 April 2022
ИК
00:02
Игорь Коняхин
Если б сразу был результат, то нафиг я б тесты писал - это самая сложная часть
c
00:03
cryshado
In reply to this message
могли бы сразу запилить интерактивный плейграунд-чекер, куда пихаешь контракт, и он говорит выполнил ли ты задание
00:03
или дать тесты на фифте
00:03
контест по func, а тесты это скучная рутина
ИК
00:05
Игорь Коняхин
Ну тут двояко:
Да, тесты в том виде, в котором они есть сейчас - сложно и скучно, но при этом стоит помнить, что при реальной работе тебе также нужно писать тесты самому
c
00:06
cryshado
In reply to this message
это понятно, но для контеста нужно было помимо описания задач дать тесты, описание может быть не всегда точным
00:06
в контексте контеста это скучная рутина)
ИК
00:34
Игорь Коняхин
Как тестировать контракт с функцией now()?
00:35
Также где-то выше писали, что на FunC нельзя делать подписи!
А как тогда их в результате всё-таки тестировать?
AR
00:35
Alexander Ruliov
In reply to this message
import ed25519

# private: 925ead45b48e2db183bff9ae782230e952495ba95fd3bcf6ca0debb981a18cb801f33ee69d38cba5c759f34570964291ba06ef594092a83f036fb26ee0715a19
# public: 01f33ee69d38cba5c759f34570964291ba06ef594092a83f036fb26ee0715a19
# ^ в комменте вторая пара ключей на всякий

PRIVATE = bytes.fromhex(
'35a18e5c796bfa7c22b9dbd4cb57ce990da253ea6d40c7c4ef00040685c5eeb2' +
'd9ac7c0682a097dbe84a53df6a72a11135be337b71445a056406a37cc024cd0a')
PUBLIC = bytes.fromhex('d9ac7c0682a097dbe84a53df6a72a11135be337b71445a056406a37cc024cd0a')

signing_key = ed25519.SigningKey(PRIVATE)

sign = signing_key.sign(bytes.fromhex(hex(98831049219504741011544657337442627844289035555318487676891727858432755918071)[2:]), encoding='hex')

print(sign[0:64])
print(sign[64:])
00:36
In reply to this message
tuple my_get_c7() impure asm "c7 PUSH";
[[int, int, int, int, int, int, int, (int), slice, int, [cell, cell]]] inner_get_c7() impure asm "c7 PUSH";
() set_c7(tuple value) impure asm "c7 POP";

() my_change_current_time(int time) impure method_id {
[int a1, int a2, int a3, int a4, int a5, int a6, int a7, (int) a8, slice a9, int a10, [cell, cell] a11] = inner_get_c7().unsafe_tuple().car();
set_c7(unsafe_tuple([[a1, a2, a3, time, a5, a6, a7, a8, a9, a10, a11]]));
}


🤪

(но может быть не такой tuple, там в первом тесте 10 значений, а не 11, юзай со второго 🙂 )

И я там вроде в десятом и ещё каком-то значении не тот тип написал, но асму пофиг)
ИК
00:40
Игорь Коняхин
In reply to this message
Спасибо
Дважды:)
Буду разбираться
00:49
Со словарями:
если мы сохранили dict_set, то читать нужно dict_get, а
если мы сохранили dict_set_ref, то читать нужно dict_get_ref
?

Нет такого, что dict_get читает оттуда, где есть данные (=в зависимости от того, какой функцией записали)?
AR
01:17
Alexander Ruliov
In reply to this message
Вряд ли, типы ведь разные.
01:18
У меня другой вопрос про словари, какие у них ограничения на длину слайса?
РБ
01:39
Роман Барбье
In reply to this message
84
DV
01:45
Dan Volkov
In reply to this message
обновили расширение, сейчас должно пофиксться
ИК
01:46
Игорь Коняхин
In reply to this message
Серьёзно?
Т.е. 256-битный int можно, а 256-битный слайс нельзя?
A
01:59
Andrei
In reply to this message
Можно вплоть до 1023 бит
ИК
02:06
Игорь Коняхин
In reply to this message
О, так лучше
А сколько можно хранить как значения словаря?
Пусть длина ключа, например, 256 бит (случайное число от балды).

Насколько я понимаю, если мы используем .dict_set_ref, то можно сослаться на абсолютно любую ячейку, а что если используется .dict_set? Сколько мета-информации хранится в ячейке? Только 256 бит ключа (и есть место для 1023-256 бит данных) или там что-то ещё есть, что занимает место?
A
02:15
Andrei
In reply to this message
Хороший вопрос. На самом деле там с одной стороны используются оптимизации для хранения ключа, позволяющие сэкономить место, с другой есть и мета-информация. Видимо в худшем случае это 2 бита на конструктор + 9 (log 257, округленный вверх) бит на длину хранящейся части ключа + 256 бит на сам ключ
ИК
02:17
Игорь Коняхин
In reply to this message
О, неплохо, спасибо
A
02:20
Andrei
In reply to this message
На самом деле там ещё есть такая тонкость, что могут извне подсунуть хешмапу, в которой намеренно выбран плохой способ сериализации ключа и тогда будет 1 бит на конструктор + 257 бит на унарную запись длины + 256 бит на ключ. Но видимо любое изменение значения из TVM сделает уже норм сериализацию и поэтому в силе то, что выше писал
ИК
02:52
Игорь Коняхин
In reply to this message
Да мне к счастью нужно только самому словарь составлять
М
03:13
Местный
Друзья продайте плиз немного бнб на газ не хватает ((( около Доллара
ИК
05:27
Игорь Коняхин
У меня с каждой задачей эволюционирует архитектура тестов
05:27
В FunC большое количество глобальных переменных (29) может сломать работу?
05:42
Например, код:
key3 = uto_slice(0x66e6d6994c559aa9e8a946abc1feb128d7b7ef5e3cc568240cbf4d5c93668565, key_len);
~dump(key3);
key4 = uto_slice(0x96949133dbe5122b14fe6bc0449170e59bad5dbca927363b2118f8ab4734bd5c, key_len);
~dump(key4);
key5 = uto_slice(0xa3c3128c49472822b5d21f18f1165581dba82c09d4ab7bd3a482cd2eefde9924, key_len);
~dump(key5);
key6 = uto_slice(0xdbab551d6e14cdf1f3f628c03f27a3484df7062e59bd9131a2114b405f224e40, key_len);
~dump(key6);

Даёт нормальный вывод:
#DEBUG#: s0 = CS{Cell{004066e6d6994c559aa9e8a946abc1feb128d7b7ef5e3cc568240cbf4d5c93668565} bits: 0..256; refs: 0..0}
#DEBUG#: s0 = CS{Cell{004096949133dbe5122b14fe6bc0449170e59bad5dbca927363b2118f8ab4734bd5c} bits: 0..256; refs: 0..0}
#DEBUG#: s0 = CS{Cell{0040a3c3128c49472822b5d21f18f1165581dba82c09d4ab7bd3a482cd2eefde9924} bits: 0..256; refs: 0..0}
#DEBUG#: s0 = CS{Cell{0040dbab551d6e14cdf1f3f628c03f27a3484df7062e59bd9131a2114b405f224e40} bits: 0..256; refs: 0..0}
05:44
Но стоит сразу после функции init (в которой содержится код выше) поставить ~dump:
init();
~dump(key5);


Так посреди (!) dump'ов появляется пустой вывод:
#DEBUG#: s0 = CS{Cell{004066e6d6994c559aa9e8a946abc1feb128d7b7ef5e3cc568240cbf4d5c93668565} bits: 0..256; refs: 0..0}
#DEBUG#: s0 = ()
#DEBUG#: s0 = CS{Cell{004096949133dbe5122b14fe6bc0449170e59bad5dbca927363b2118f8ab4734bd5c} bits: 0..256; refs: 0..0}
#DEBUG#: s0 = CS{Cell{0040a3c3128c49472822b5d21f18f1165581dba82c09d4ab7bd3a482cd2eefde9924} bits: 0..256; refs: 0..0}
#DEBUG#: s0 = CS{Cell{0040dbab551d6e14cdf1f3f628c03f27a3484df7062e59bd9131a2114b405f224e40} bits: 0..256; refs: 0..0}
05:47
В любом случае, у меня сейчас ошибка:

[ 3][t 0][2022-04-06 02:46:05.5831700][vm.cpp:558]      steps: 131 gas: used=10840, max=9223372036854775807, limit=9223372036854775807, credit=0
[ 1][t 0][2022-04-06 02:46:05.5839593][Fift.cpp:67] top: untuple
level 1: [in run-test:] ... "temp-prev-c5" <continuation 0000021FD006D090> 2 tuple 11 tuple 1 tuple 17 runvmx 0= not { <continuation 0000021FD1B235E0> } if 5 untuple **HERE** dup null? { <continuation 0000021FD1B22BC0> } if "gas-limit" <continuation 0000021FD006CEB0> "c7" <continuation 0000021FD006CEB0> "c4" <continuation 0000021FD006CEB0> "stack" <continuation 0000021FD006CEB0> "function" <continuation 0000021FD006CEB0> "test" <continuation 0000021FD006CEB0> ...
level 2: drop <literal of type 11> @ <literal of type 11> @ get-test run-test **HERE** <literal of type 11> @ swap <literal of type 11> ! swap <literal of type 11> !
level 3: <while loop condition:> { dup 0> }
level 4: <text interpreter continuation>
[ 1][t 0][2022-04-06 02:46:05.5840910][fift-main.cpp:204] Error interpreting file `C:\Users\nns20\AppData\Local\Temp\tmpbjrz4_ql.fif`: tmpbjrz4_ql.fif:195: while:not a tuple


которую я пока не могу устранить
05:54
Разумеется, init() impure inline method_id
05:55
Внутри - ~dump работает, а снаружи как-будто всё едет, и оно как-то переставляется местами
05:56
Хотя функция inline, так что вроде бы вообще разницы не должно быть написать ~dump вконце внутри или снаружи
06:28
Deleted Account
In reply to this message
Help me
КВ
09:13
Кирилл Вихарев
Друзья, можете в меня кинуть информацией по поводу TON Payments? может есть описание функций или типовых сценариев?
k
11:31
k1ber psix
In reply to this message
Вы так и не вышли со мной на связь, уважаемый!
Напоминаю, предоплата была внесена... Вы мне сами называете какие-то сроки, что свяжетесь со мной, и потом не связываетесь! Объяснитесь пожалуйста...
F
11:32
F
In reply to this message
Свои личные разборки пожалуйста в личных сообщениях
k
11:36
k1ber psix
In reply to this message
Добрый день. У вас с вероятностью 99.9%, мошенник сидит в чате, а вы про какие-то личные разборки мне пишите... Который взяв предоплату, сам называет сроки, и на связь не выходит. Может стоит разобраться в вопросе и со стороны администрации? А то как то не демократично и не по христиански парни. Зашёл получить помощь в чате, нашел вроде как даже исполнителя, а по факту кинули на 150тончиков.
А
11:45
Андрей
In reply to this message
> мошенник сидит в чате
То же мне новость) Они есть везде, и прежде чем отправлять деньги нужно осознавать кому отправляете и знать о рисках. Но это все оффтоп
DU
11:48
Denis Usachev
Это уже какая-то мыльная опера
11:48
А не чат разработки
F
11:50
F
@kiBERpsih, @and3561, @denisusachev
Мут за оффтоп
В
12:04
Вова
Привет, что возвращает функция ассемблера SDEQ? Если слайсы не равны, то возвращает 0, а если равны, то -1, правильно понял?
AP
12:07
Andrew Python
In reply to this message
Да, правильно
В
12:07
Вова
Спасибо, понял
AR
12:26
Alexander Ruliov
In reply to this message
Я тоже баг с поломанным стеком вчера ловил, как в if'ах флаги менял, от которых эти if'ы зависели. Так и не понял, что произошло, вынес кусок в функцию, прошло =\

Соррян, пример не записал, может попозжа.
T
12:39
TON Дев Чат
In reply to this message
Пока обнаружен баг если тело условия - пустое. Такого рода IF:<{ }> фифт код. Поскольку появление такого условия как правило само по себе ошибка - мы пока не правим, чтобы не было сомнений в версии библиотек у участников: поправим после конкурса.
AP
12:44
Andrey Pfau
In reply to this message
Если в intellij-ton сделать пустые if как ошибкой это будет правильным решением чтобы избежать таких ситуаций, я верно понимаю?
T
12:45
TON Дев Чат
In reply to this message
Нет, не нужно
1) Asm.fif будет скоро поправлен
2) пустое тело может получиться при непустом коде (если этот код можно убрать при оптимизации).
P
12:55
Pepeg
Подскажите на примере
LDDICT  (s – D s′)
второе в стеке (s') - это то, что осталось от слайса же?
12:57
И оно будет в s0 лежать, а не s1?
AP
12:57
Andrew Python
Да, всё верно.
P
13:11
Pepeg
А при старте тестов с флагом -v2 после каждой инструкции выводится стек, и последний элемент в нем - это s0 ведь?
13:11
execute LDDICT
[ 85208338799662122639103126216355732827322384173773517984715357586254948655441 80716348486207496276731076897282147363587090687123560087104282620509894221332 CS{Cell{010a62475ae340} bits: 0..40; refs: 0..1} C{E26FC89C284099627BC70384A49E436985FB758FD6499C611B4B06CDA7699447} CS{Cell{0101c0} bits: 1..1; refs: 1..1} ]
execute DROP
[ 85208338799662122639103126216355732827322384173773517984715357586254948655441 80716348486207496276731076897282147363587090687123560087104282620509894221332 CS{Cell{010a62475ae340} bits: 0..40; refs: 0..1} C{E26FC89C284099627BC70384A49E436985FB758FD6499C611B4B06CDA7699447} ]
SO
13:16
Sash Osh
Какой самый быстрый способ склеить два слайса в один?
AP
13:21
Andrew Python
In reply to this message
Если просто, то билдер>положить слайсы>ячейка>слайс.
Если положить 2 слайса в словарь, то https://ton.org/docs/#/func/stdlib?id=dict_set_builder
SO
13:22
Sash Osh
In reply to this message
я думал, может без ячейки как-то можно
SD
13:25
Sergey Dzhunusov
Привет. А можно в локальном запуске создать кошелек, чтобы на него приходили сообщения, которые отправил твой Контакт и чекать, что оно туда пришло. Если через тесты toncli вообще отлично
P
13:28
Pepeg
In reply to this message
в клетку actions записывается все, немного выше вроде бы писали про это
SD
13:30
Sergey Dzhunusov
In reply to this message
SD
13:34
Sergey Dzhunusov
In reply to this message
Спасибо, тут куда понятнее
AP
13:35
Andrew Python
In reply to this message
Только не забудьте кастомную проверку добавить. А то там ломается немного)
https://t.me/tondev/63428
P
13:41
Pepeg
Я так понял, что асм вставки должны полностью соответствовать сигнатуре функции и не должны оставлять после себя никакого мусора.
Это я правильно же понял?
13:42
cell sldreftodict(slice x) asm "LDREFRTOS NIP LDDICT DROP";

cell sldreftodict(slice x) asm "LDREFRTOS SWAP LDDICT DROP";
по сути одно и то же, но у второго остается мусор из-за свапа 🤔
AP
13:45
Andrew Python
In reply to this message
Да, а то остальное поломается
13:46
Как вчера, сначала заюзал просто TRY, но оказалось что он ломает стек и надо юзать TRYARGS
P
13:47
Pepeg
Довольно интересно оказалось про инструкции читать)
AP
13:48
Andrew Python
Довольно интересно писать что-то кастомное, когда stdlib'a не хватает)
AT
13:51
Andrey Tvorozhkov
In reply to this message
Я кстати понял что не понял зачем вы это делаете
13:51
c5 работает только когда exit code success
13:52
Ну экшн фаза работает*
13:52
А в таком случае там с5 валидный
13:52
Даже если нет сообщений
AP
13:54
Andrew Python
Хмммммм
13:55
Я когда тестил, у меня exit code 37 был
13:55
Но всё равно не должно же ломаться)
13:56
Можно невалидный actions в toncli заменять на пустой? Через тот же tryargs
AT
13:56
Andrey Tvorozhkov
In reply to this message
Да, думаю надо)
ИК
14:25
Игорь Коняхин
In reply to this message
Вопрос актуален:
В FunC большое количество глобальных переменных (29) может сломать работу?
Если да, лечится ли это как-то?
AP
14:34
Andrew Python
In reply to this message
Я делал максимум 14, всё работало нормально
P
14:38
Pepeg
https://ton.org/docs/#/smart-contracts/tvm_overview?id=tvm-state
Control registers - (see below) speaking in simple terms up to 16 variables which may be directly set and read during execution
возможно оно 🤔
14:40
глобалы всегда были злом, видимо и здесь тоже
AR
14:47
Alexander Ruliov
Глобальные переменные я так понимаю это сахар просто и они так же на стеке хранятся, ибо больше негде (или есть?)

И судя по доке TVM, опкоды для работы со стеком максимум на глубину 16 смотрят, т.е. чтобы выше что-то забрать, нужно в tuple сложить доступный стек, взять что нужно, а потом вернуть как было. Надеюсь компилятор что-то такое делает))
14:53
ᅠ ᅠ
Привет всем! Ребят подскажите пожалуйста по созданию NFT . На сколько сложно это делается и какие вложения требуются? как я понимаю это просто набор картинок за которые люди платят реальные деньги (криптовалюту) или я ошибаюсь?
14:58
In reply to this message
"NFT, также уникальный то́кен — вид криптографических токенов, каждый экземпляр которых уникален и не может быть обменян или замещён другим аналогичным токеном, хотя обычно токены взаимозаменяемы по своей природе. " если его создают на платформе TON , то как это понять?
H
15:01
Hartmann D.
Пабло, приятно, что вы к нам присоединились, но это чат сугубо для технических вопросов и ответов. Рекомендую вам все-таки начать с гугла и/или других ресурсов для начинающих. Спасибо за понимание.
NM
15:04
Nikita Misharin
In reply to this message
Вот хороший ресурс для начинающих кстати. Крайне рекомендую: https://www.youtube.com/playlist?list=PLUl4u3cNGP63UUkfL0onkxF6MYgVa04Fn
15:07
ᅠ ᅠ
In reply to this message
Спасибо за культурный ответ, но информация в гугле размытая, специально ищу знающих людей , чтобы объяснили простым языком. https://vc.ru/crypto/358356-kak-sozdayutsya-nft-proekty-na-blokcheyne-ton тут к примеру объясняется что от куда и куда, но основная суть для чего создаются NFT не понятна, просто заработок? или есть какое-то реальное применение ?
15:08
In reply to this message
благодарю
15:09
In reply to this message
жаль всё на англ.
O0
15:11
Object 0
In reply to this message
ctrl+c - ctrl+v в google translate
AR
15:14
Alexander Ruliov
In reply to this message
Можно сделать телеграм-чатик, где модератором становится тот, кто владеет таким токеном. И бот автоматически переназначает модератора когда видит, что контракт записал себе в данные имя нового модератора))

Какое применение придумаете, такое и будет. Люди вот угорают и играют в лотерею "перепродай обезьянку пока её цена не стала равна нулю".
ИК
15:15
Игорь Коняхин
In reply to this message
Яндекс браузер вроде бы уже умеет прямо переводить видео
A
15:15
Andrei
In reply to this message
Нет, они хранятся в c7 регистре.

Нет, можно смотреть и дальше 16 записей, просто это дороже
ИК
15:17
Игорь Коняхин
In reply to this message
Я вот действительно минуту назад сократил количество глобальных переменных до 13 и проблема не ушла
init();
slice kkk = key2;
~dump(kkk);

по прежнему
#DEBUG#: s0 = ()

а не присвоенное ранее значение
AR
15:18
Alexander Ruliov
In reply to this message
О, не заметил XCHG, который на 255 дальности бьёт, ок. Про регистр спасибо, не знал. Однако оттуда похоже тоже дорого доставать, в доке вижу только операцию взятия четвёртого элемента, это максимум три переменных задёшево.
MS
15:59
Mikhail Sytchev
Ребят, подскажите по флоу отправки остатков на внешние кошельки

я так понимаю что адрес в сети ТОН имеет 3 представления: HEX, Bounceable, Non-bounceable

Юзверь пользуясь cryptobot-ом, или приложением Ton Wallet получает Bounceable версию адреса, которой делится с другим пользователем/сервисом.

Я представляю сервис(криптокошелек), получаю от пользователя его Bounceable адрес, делаю на него перевод через mytonctlr. Т.к. это был Bounceable адрес, но по умолчанию он не активен, то моя транзакция конечно же зафейлилась (списав с меня граммы на исполнение контракта).

Получается мне надо слать на Non-bounceable версию. А это моя задача каждый раз проверять статус кошелька реципиента и понимать он active/inactive перед отправкой?
16:00
или есть какие-то флаги отправки, которые сами разрулят эту ситауцию?
AP
16:01
Andrey Pfau
Поздравьте меня, я наконец то сделал ADNL клиент с получением времени на лайт-сервере:
ИК
16:01
Игорь Коняхин
Очень неинформативные ошибки пока что:
2222.uto_slice(2)

(2222 не влезает в 2 бита)
пораждает ошибку:

[ 3][t 0][2022-04-06 12:59:31.2461165][vm.cpp:558]      steps: 18 gas: used=1343, max=9223372036854775807, limit=9223372036854775807, credit=0
[ 1][t 0][2022-04-06 12:59:31.2469192][Fift.cpp:67] top: untuple
level 1: [in run-test:] ... "temp-prev-c5" <continuation 00000214DA8E8010> 2 tuple 11 tuple 1 tuple 17 runvmx 0= not { <continuation 00000214DA97A700> } if 5 untuple **HERE** dup null? { <continuation 00000214DA97A850> } if "gas-limit" <continuation 00000214DA8E8130> "c7" <continuation 00000214DA8E8130> "c4" <continuation 00000214DA8E8130> "stack" <continuation 00000214DA8E8130> "function" <continuation 00000214DA8E8130> "test" <continuation 00000214DA8E8130> ...
level 2: drop <literal of type 11> @ <literal of type 11> @ get-test run-test **HERE** <literal of type 11> @ swap <literal of type 11> ! swap <literal of type 11> !
level 3: <while loop condition:> { dup 0> }
level 4: <text interpreter continuation>
[ 1][t 0][2022-04-06 12:59:31.2470736][fift-main.cpp:204] Error interpreting file `C:\Users\nns20\AppData\Local\Temp\tmpwbq6iik3.fif`: tmpwbq6iik3.fif:195: while:stack underflow
16:02
Долго искал
16:02
Но это ещё и не та ошибка, которая была вчера, так как эту я занёс пока обрезал/упрощал код, и изначально её не было
16:10
In reply to this message
Кажется нашёл!

var zhuk = 
begin_cell()
.store_zeros(1000)
.store_uint(1, 24)
.end_cell();
zhuk~impure_touch();


порождает ту же самую ошибку ^
и это, по моим тонким расчётам, то что было вчера: ячейка переполняется, но в результате показывает ошибку "stack underflow"
A
16:18
Aleша
In reply to this message
Привет, разобрался как отдебажить hile:stack underflow?
ИК
16:19
Игорь Коняхин
Отдебажить?
Никак
Методом бинарного поиска: удаляешь половину кода и смотришь, работает или нет. Если нет - удаляешь ещё половину и т.д.
В конце у тебя остаётся так мало кода, что ты уже не представляешь где может быть проблема, но последовательное удаление в конце-концов даёт эффект
A
16:22
Aleша
да вот у меня тут 5 строк)
16:26
Deleted Account
Ребята кто шарит в языке FunC на что он похож и сложный ли вообще?
ИК
16:26
Игорь Коняхин
Где можно узнать про раздачу Биткоинов от Дурова?
A
16:27
Aleша
😄😄
СВ
16:28
Сергей В
In reply to this message
если сравнивать с чем?
ИК
16:28
Игорь Коняхин
In reply to this message
Ну похож на С
Сам язык не сложный
Но из-за того, что средства разработки пока-что на очень начальной стадии, и вообще вся экосистема низкоуровневая, разработка на нём сложна, но если ты для контеста, то первую задачу, думаю, успеешь сделать
AP
16:30
Andrew Python
In reply to this message
на Arduino он похож)
ИК
16:31
Игорь Коняхин
In reply to this message
Ну, например, из-за того, что нет конкретного сообщения в чём ошибка, то пару элементарных ошибок я искал много часов
16:33
Deleted Account
In reply to this message
Вообще есть смысл изучать сырой язык? Есть идея, команда но не можем принять решение на каком блокчейне делать.
NM
16:34
Nikita Misharin
In reply to this message
Ну имхо контракты — самая простая часть продукта, так что это не важно. Портировать можно быстро
ИК
16:35
Игорь Коняхин
In reply to this message
Сам язык (вроде бы) не сырой, но средства разработки очень ограниченные.
Но ты имей в виду, что я сравниваю условно с Unity/C#, Web/React/TypeScript, т.е. с высокоуровневыми штуками. Я не особо знаю, как дела в других блокчейнах.
В любом случае есть две стороны: на новых технологиях сложнее разработка, но зато ты будешь одним из первых.
16:37
In reply to this message
Лол, у меня тест начинается с:
[int, tuple, cell, tuple, int] fourth_1a_data() method_id(0) {
throw(800);


и при этом я се равно не получаю исключения, а всё ту же ошибку while:stack underflow
16:38
Deleted Account
In reply to this message
Большое спасибо за ответы.
G
16:44
Graber
Всем привет! Что нужно вставлять в secret key метода Transfer в https://github.com/tonwhales/ton? 24 слова или что?
ИК
16:48
Игорь Коняхин
In reply to this message
Тьфу!
После очередного удаления 90% строчек файла, оказалось, что throw() в тестах, введённый для отлавливания мутных ошибок, сам порождает такую же мутную ошибку!
Пошёл восстанавливать файл из бекапа в очередной раз
16:50
Не, не завелось
😭😭😭😭😭
Пошёл делать бинарный поиск по удалению кода в очередной раз
AP
16:53
Andrew Python
In reply to this message
Записки одинокого программиста)
P
16:56
Placeholder
Личный блог Игоря)
(Все в порядке, пока онтопик)
A
17:00
Aleша
In reply to this message
stack то как победил? где был косячело?
ИК
17:07
Игорь Коняхин
В очередной раз нашёл!
Оказалось, (несмотря на то, что выше писали про 14 глобальных переменных) что нельзя делать больше 8 инициализаций глобальных переменных.
После того как удалил все инициализации кроме первых 8, тест заработал. 9-ая инициализация была:
valid_until_2 = 22222;

т.е. там явно не могло бы ошибки.
Причём непосредственно объявления глобальных переменных я не удалял чтобы оно заработало
P
17:10
Placeholder
In reply to this message
Ну если не инициализированы, значит и не используются, значит для TVM их и нет. Очень не хватает хотя бы констант.
ИК
17:11
Игорь Коняхин
In reply to this message
Там ни у одном из этих случаев, стек в результате был ни при чём. Я как раз и говорю об неинформативных (и запутывающих) сообщениях об ошибках.
A
17:11
Aleша
In reply to this message
а что было если не стек?
17:12
как то фифт вообще дебажится?
17:13
[Fift.cpp:67] top: dup вот это видимо строка в фифт?
ИК
17:13
Игорь Коняхин
In reply to this message
1) При сериализации число не умещалось в указанное количество бит
2) При сериализации ячейка переполнялась (максимум можно 1023 бита)
3) throw в генераторе теста
4) 9+ глобальных переменных
😭😭😭😭😭
17:13
In reply to this message
Это оно так всегда показывает
A
17:14
Aleша
In reply to this message
строка всегда одна?
ИК
17:14
Игорь Коняхин
Не знаю, я не лез в исходники
A
17:14
Aleша
In reply to this message
спасиб за инфу оч ценно
ИК
17:14
Игорь Коняхин
In reply to this message
Ну у меня та же
A
17:15
Aleша
хм
17:15
я думал может хоть как то через фифт будет понятно
17:15
а он реально на одной строке падает
V
17:40
Vyacheslav Flok
Народ, только погружаюсь в тему.
Читаю доку, чтоб распарсить вхоядщее сообщение, не понимаю, что такое contract balance и message balance.
Предполагаю, что message balance - это какой-то входящий бюджет монет, которые я могу рассылать в исходящих сообщениях. Это так?
А что тогда из себя представляет contract balance?

Дока, на которой туплю: https://ton.org/docs/#/smart-contracts/tvm_overview?id=initialization-of-tvm
ИК
17:44
Игорь Коняхин
За каждым адресом числиться сколько то денег - это contract balance
AP
17:45
Andrew Python
In reply to this message
message balance - это сколько пришло в этой транзакции.
contract balance - весь баланс контракта (включая принятый message balance)
На исходящие можно тратить весь баланс
ИК
17:45
Игорь Коняхин
message balance - сколько приходит во входящем сообщении
V
17:45
Vyacheslav Flok
Спасибо!
ИК
17:47
Игорь Коняхин
Что делает "PUSHINT" и подобные операторы?
Там же во всех примерах FIFT'а можно просто писать выражения:
5 6 + 7 8 + *

Сам факт числа ведь уже пушит его на стек!

Не нужно ведь делать:
5 pushint 6 pushint + 7 pushint 8 pushint + *
K
17:47
Konstantin 🤖
?
🏆 TON Contests 06.04.2022 17:45:11
Participant of FunC contest may submit their solution to @ton_contests_bot.

Before submitting your solution, please make sure that you checked the added clarifications in contest repository.

Note, upon successfull submition you should get "Your submission has been accepted" message.
Upon successfull re-submition you should get "Your previous submission has been replaced with new one" message.
ИК
17:48
Игорь Коняхин
In reply to this message
Вопрос к тому - зачем в данном коде "pushslice"?
AP
17:48
Andrew Python
In reply to this message
В фифте не надо, а в fift-asm надо)
ИК
17:49
Игорь Коняхин
А когда мы делаем:
() f() asm "**************"

Там получается именно Fift-Asm код?
AP
17:50
Andrew Python
In reply to this message
именно
17:50
который потом через asm.fif переделается в команды для tvm
P
17:51
Pepeg
9 PUSHPOW2
- это получается PUSH 2^9 = 512
А в доке указано PUSHPOW2 xx + 1, (quietly) pushes 2xx+1 for 0 ≤ xx ≤ 255.
что за xx + 1?
17:51
т.е. откуда здесь +1, в скомпиленом фифт(asm?) коде вроде бы 512 пушится 🥲
ИК
17:52
Игорь Коняхин
In reply to this message
А почему тогда именно в таком порядке:
x{deadbeef} PUSHSLICE

?

Там же во всей документации tvm.pdf вначале идёт команда и только затем аргумент
AP
17:53
Andrew Python
In reply to this message
потому что фифту так понятнее, и так сделали в asm.fif
ИК
17:54
Игорь Коняхин
Типа легче написать интерпретатор на FIFT'е
AP
17:54
Andrew Python
логичнее же (для фифта) когда идут все аргументы, а потом сама функция
17:56
Точнее даже не так. По другому в фифте просто не сделать
EG
17:59
Egor Georgievskii
Подскажите, какой самый дешевый способ создать массивов cell-ов констаной длины? не класть же из в dict
ИК
18:02
Игорь Коняхин
In reply to this message
Насколько сырая/готовая сложная/простая эта штука?
Я раздумываю, не написать ли часть тестов для контеста на JavaScript'е.
Там реализованы все нужные примитивы:
.store_uint
.store_slice

и т.п.?
NM
18:02
Nikita Misharin
In reply to this message
Я пишу, мне норм. Не разобрался только с парсингом словарей. Для 4 интеграционно тестил
18:03
Газ считает для успешных запросов
DV
18:04
Dan Volkov
In reply to this message
Там точно такой же вм
NM
18:05
Nikita Misharin
In reply to this message
Ну и собственно отдельный кайф интеграционные тесты, так как storage сохраняется после исполнения
NA
18:06
Narek Abovyan
In reply to this message
Там ровно такая же вмка как на настоящих валидаторах
?
18:07
𝐻𝒾𝓉𝒶𝓈𝓅
Hi, Only Russian?
AP
18:07
Andrew Python
In reply to this message
ИК
18:09
Игорь Коняхин
In reply to this message
Отлично
Мой вопрос был больше про передачу значений на VM, и получение значений из VM.
Они ведь преобразуются из/в JavaScript объекты?
Другими словами, я сам код теста пишу на TypeScript'е, составляю на TypeScript сообщение и потом полученное сообщение в виде JavaScript объекта, преобразуется в вид, подходящий для VM.
Или как это работает?
NA
18:10
Narek Abovyan
все так
18:10
Можешь тесты открыть посмотреть, там примерчики есть
18:11
ну вот, например
18:11
Или вот
A
18:16
Andrei
In reply to this message
Первое слово кладет на стек фифта слайс во время генерации байткода, второе вставляет в собираемый TVM-код команду положить этот слайс на стек ТВМ уже в рантайме
ИК
18:17
Игорь Коняхин
In reply to this message
invokeGetMethod('test', .....

не
invokeGetMethod(72549, .....

а именно просто 'test'

Это революционно!

Спасибо, буду пробовать
18:19
In reply to this message
О, теперь понял полностью
18:21
@smartnik @Narek
Там есть возможность подписывать данные для тестов?
Либо встроенная, либо (поскольку это JavaScript) какая-нибудь библиотека, совместимая с подписями для ТОНа
ИК
18:32
Игорь Коняхин
Благодарю, буду изучать
18:38
In reply to this message
А где примеры?
Я обошёл всю папку https://github.com/Naltox/ton-contract-executor
и не нашёл
18:40
Есть возможность код импортировать из стороннего файла:
import source from './source.fif';

?
18:46
In reply to this message
А зачем вам фифт?
ИК
18:47
Игорь Коняхин
In reply to this message
Расширение для VS Code (во всяком случае у меня) работает лучше, чем для IntelliJ, например, всегда предлагаются все доступные функции/переменные,
но оба расширения пока что ещё сыроватые, например, ни там, ни там не показывается список параметров функции (после открытия "(" скобки)
18:48
In reply to this message
Ошибся, имел в виду:
import source from './source.fc';
DV
18:48
Dan Volkov
In reply to this message
факт, это скоро будет тоже
NA
18:48
Narek Abovyan
In reply to this message
Нет, нельзя
ИК
18:48
Игорь Коняхин
In reply to this message
Спасибо
18:49
In reply to this message
Понял
Я знаю, что можно импорт настраивать в WebPack loaders, но это нужно как-то заморачиваться, и я не супер хорошо шарю в конфигах
NF
18:51
Nik Fedorov
Как правильно разобрать actions в тесте? Исходящее сообщение положил в ячейку через store_ref?

_ test_example(int exit_code, cell data, tuple stack, cell actions, int gas) method_id(1) {
throw_if(100, exit_code != 0); ;; test need to be passed

var as = actions.begin_parse();
var ref = as~load_ref();
var refs = ref.begin_parse();

~dump(refs);
}


Но слайс при проверке остаётся пустой
#DEBUG#: s0 = CS{Cell{0000} bits: 0..0; refs: 0..0}
ИК
18:53
Игорь Коняхин
In reply to this message
@n1kfedorov ^
ветка про разбор Actions
18:54
Слайс пустой, так как в списке нет больше элементов
Если в списке действий только одно (исходящее сообщение), то так и должно быть
SD
19:08
Sergey Dzhunusov
А как можно подписать сообщения и сгенерить public + private ключи, которые примет функция check_signature?
ИК
19:19
Игорь Коняхин
In reply to this message
@ser398 ^
Выше отвечали
SD
19:19
Sergey Dzhunusov
In reply to this message
Спасибо. Я искал по другим функциям
ИК
19:20
Игорь Коняхин
In reply to this message
Либо если JavaScript'ом ^
AP
19:31
Andrey Pfau
In reply to this message
Откройте ишьюс, добавим
ИК
19:34
Игорь Коняхин
In reply to this message
Скопировал код со страницы README:
https://github.com/Naltox/ton-contract-executor/blob/main/README.md


Попробовал запустить:
node experiment.js


Но получил ошибку:
PS C:\Users\nns20\Development\TON\contest-1> node experiment.js
node:internal/errors:465
ErrorCaptureStackTrace(err);
^

Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'ton-contract-executor' imported from C:\Users\nns20\Development\TON\contest-1\experiment.js
...


Команду:
yarn add ton-contract-executor

выполнял,

и в проекте это сохранилось:
"name": "contest-1",
"packageManager": "yarn@3.2.0",
"type": "module",
"dependencies": {
"ton-contract-executor": "^0.4.0"
},
AP
19:34
Andrey Pfau
Просто я сам не пишу смартконтракты, поэтому я не могу видеть даже очевидных проблем. Но почему то никто не пишет ишьюсы
NA
19:35
Narek Abovyan
In reply to this message
Так модуль то установите
ИК
19:36
Игорь Коняхин
In reply to this message
Я же уже сделал
yarn add ton-contract-executor
NA
19:36
Narek Abovyan
Ну это не ошибка либы
19:36
У вас нода ругается, что не может найти модуль
ИК
19:39
Игорь Коняхин
Нужно оказывается, отдельно вызвать:
npm install
19:41
In reply to this message
Но вот теперь уже похоже что-то с либой:
'C:\Users\nns20\Development\TON\contest-1\node_modules\ton-compiler\bin\macos\func' is not recognized as an internal or external command,
operable program or batch file.
C:\Users\nns20\Development\TON\contest-1\node_modules\ton-contract-executor\dist\vm-exec\vm-exec.js:147
throw ex;
^

Error: Command failed: C:\Users\nns20\Development\TON\contest-1\node_modules\ton-compiler\bin\macos\func -PS -o C:\Users\nns20\AppData\Local\Temp\tmp-11968-N8t4v0UWWWR9 C:\Users\nns20\Development\TON\contest-1\node_modules\ton-compiler\funclib\stdlib.fc C:\Users\nns20\AppData\Local\Temp\tmp-11968-QFTCDo77XVcT
at checkExecSyncError (node:child_process:828:11)
at Object.execSync (node:child_process:899:15)
at executeFunc (C:\Users\nns20\Development\TON\contest-1\node_modules\ton-compiler\dist\index.js:145:11)
at C:\Users\nns20\Development\TON\contest-1\node_modules\ton-compiler\dist\index.js:185:21
at step (C:\Users\nns20\Development\TON\contest-1\node_modules\ton-compiler\dist\index.js:52:23)
at Object.next (C:\Users\nns20\Development\TON\contest-1\node_modules\ton-compiler\dist\index.js:33:53)
at fulfilled (C:\Users\nns20\Development\TON\contest-1\node_modules\ton-compiler\dist\index.js:24:58) {
status: 1,
signal: null,
output: [ null, null, null ],
pid: 14924,
stdout: null,
stderr: null
}

Node.js v17.8.0


у меня Windows, а не MacOS, но она как будто пытается использовать Mac'овские файлы
NA
19:41
Narek Abovyan
О, да, там под капотом модуль который функ компилит
19:42
Он под мак вроде только собран
VK
19:43
Vladislav Kibenko
@Narek ты vm-exec.wasm из чего собирал?
NA
19:44
Narek Abovyan
Из тона
ИК
19:44
Игорь Коняхин
In reply to this message
К этому есть какие-то простые решения?
Его легко пересобрать или даже пытаться не стоит?
NA
19:44
Narek Abovyan
In reply to this message
Ну там еще свой софт поверх немного
ИК
19:45
Игорь Коняхин
@smartnik у тебя тоже Мак?
VK
19:45
Vladislav Kibenko
In reply to this message
Этот "софт", как я понимаю, тоже на плюсах, да?
NA
19:45
Narek Abovyan
In reply to this message
Слушай без понятия, на винде сто лет не сидел
19:45
In reply to this message
Да, конечно
ИК
19:45
Игорь Коняхин
In reply to this message
А на Ubuntu?
VK
19:45
Vladislav Kibenko
In reply to this message
А исходников нет нигде случаем чтобы увидеть из чего именно WASM собран?
NA
19:46
Narek Abovyan
Тоже, но под него должно быть можно собрать
19:46
In reply to this message
Ща скину
19:47
Кстати можно попробовать компайлер функа на wasm собрать тоже
VK
19:47
Vladislav Kibenko
In reply to this message
Огонь. Будет круто если в репозитории своём укажешь из чего собираешь. Это чтобы другие пользователи убедились что там всё безопасно + могли доработать, если надо
19:47
In reply to this message
С этой целью и спрашиваю
NA
19:47
Narek Abovyan
Но вообще у меня нативный биндинг к ноде раз в сто быстрее работает чем васм
19:48
In reply to this message
Да надо заняться, руки не доходят
СВ
19:48
Сергей В
In reply to this message
А как называется расширение?
ИК
19:49
Игорь Коняхин
In reply to this message
СВ
19:49
Сергей В
In reply to this message
Благодарю :)
NM
19:58
Nikita Misharin
In reply to this message
Ага
ИК
19:59
Игорь Коняхин
А я уж раскатал губу, что буду тесты на TypeScript'е писать ...
Либо нужно пересаживаться срочно на Mac, но он у меня старенький + Windows удобнее конечно
NM
19:59
Nikita Misharin
In reply to this message
У меня мак early 2015 😀
ИК
20:00
Игорь Коняхин
In reply to this message
У меня Mac 2014-го, а комп прошлогодний)
AP
20:01
Andrey Pfau
Продублирую сюда
AP
20:01
Andrey Pfau
AP
Andrey Pfau 06.04.2022 19:40:51
Убедительная просьба всем кто пользуется плагином intellij-ton:

Прошу если вы видите проблему то открывайте ишьюс на гитхабе. я НЕ ПИШУ смартконтракты на тоне и поэтому не могу видеть очевидных проблем. Не нужно в разных чатах писать что intellij-ton плохой и тд, раз уж понимаете какие в нем недостатки или наоборот есть идеи по улучшению открывайте ишьюс.

Накипело просто...
ИК
20:20
Игорь Коняхин
https://wallet.ton.org/ ведь официальный кошелёк?
Плюс-минус надёжно там открыть кошелёк онлайн?
AT
20:24
Andrey Tvorozhkov
In reply to this message
Оно все на фронтенде работает
ИК
20:30
Игорь Коняхин
In reply to this message
Так, я взял папку ton-win64-binaries, полученную во время установки toncli, и скопировал её содержимое на место папки macos.
Стал ли я мелочиться и копировать только пару файлов (func.exe, fift.exe)? - нет, фундаментальные проблемы требуют фундаментальных решений!

И оно запустилось!

Раскатываю губу по новой:)
NA
20:33
Narek Abovyan
👍
ИК
20:37
Игорь Коняхин
В ТОНе ведь дешёвые транзакции?
Кто-нибудь может перевести капельку ТОНа, чтобы убедиться, что кошелёк по факту работает?
EQDPDWTfBsnlGYxyhDq0vhSq-LvKqVN8ZIup_jSFrhOVjgGJ

Я всё (минус комиссии) переведу обратно
20:37
Или есть какой-нибудь просто способ купить ТОН по карте? :)
A
20:37
Andrei
И даже в два раза больше :)
AP
20:39
Andrey Pfau
In reply to this message
ИК
20:40
Игорь Коняхин
In reply to this message
Попробую
До этого пробовал @wallet, но те в конце отказались принимать оплату
AP
20:43
Andrey Pfau
In reply to this message
В @cryptobot p2p
NM
20:44
Nikita Misharin
In reply to this message
Отправил тебе 1 ton
ИК
20:45
Игорь Коняхин
In reply to this message
Вернул 0.99 ... надеюсь:)
NM
20:46
Nikita Misharin
In reply to this message
👍
ИК
20:46
Игорь Коняхин
In reply to this message
Спасибо:)
V
21:34
Vyacheslav Flok
processing fees - это то, что я собираю руками по гайду https://ton.org/docs/#/smart-contracts/fees?id=tvm-instructions-cost и вгоняю как хардкод, или же это как-то можно узнать прямо в рантайме и подставить в код?

если руками хардкодить - это ж с ума сойти можно)
T
21:43
TON Дев Чат
In reply to this message
Пока опкодов для рантайма (узнать газлимиты/потраченный газ) нет. Планируется добавить (но не первоочередное)
V
21:47
Vyacheslav Flok
просто хочется чуть ли не решение контеста спросить. та часть заданий, где есть условие пересылки «incoming value minus processing fees».
верно ли, что mode = 64 у исходящего сообщения с store_grams(0) сам посчитает, сколько gram надо передать дальше по цепочке?

upd: а ещё, кажется, в доках рассинхрон есть: где-то store_grams, где-то store_coins
A
21:48
Andrei
In reply to this message
Это сломает возможность виртуализации в TVM, которую обещали в доках, поскольку можно будет по потраченному газу понять, запускают ли нас нативно или в рамках другого кода.
21:49
Хотя наверное можно более аккуратно сделать
TP
21:57
Tim Pavlov
In reply to this message
у меня такое если объявлять функции
inline method_id
. В чем может быть проблема? если я объявляю какие-то функции, которые хочу просто использовать в други тестовых функций
A
21:57
Andrei
In reply to this message
Просто это нарушит инвариант, что поведение при запуске континуэйшна определяется исключительно его параметрами (по модулю возможного out of gas)
ИК
21:59
Игорь Коняхин
In reply to this message
@timpavlov11 возможно это ^
других вариантов у меня нет
TP
22:00
Tim Pavlov
In reply to this message
всмысле?
ИК
22:01
Игорь Коняхин
Т.е. может быть проблема из сообщения на которое я сослался (передача функций в качестве параметра)
22:16
In reply to this message
Поднимаю вопрос про mode ^

Пусть у нас есть 100 монет, мы получаем internal сообщение с 60 монетами, и отсылаем сообщение с 10 монетами. Пускай fee составляет 4 монет.

Я правильно понимаю значения mode?

mode = 0: наш кошелёк (100+60-10 = 150 монет), ушло дальше (10-4 = 6 монет)

mode = 1: наш кошелёк (100+60-10-4 = 146 монет), ушло дальше (10 монет)

mode = 64: наш кошелёк (100-10 = 90 монет), ушло дальше (60+10-4 = 66 монет)
(другими словами, если мы делаем .store_grams(0), то mode = 64 никогда не изменит наш баланс)

mode = 65: наш кошелёк (100-10-4=86 монет), ушло дальше (60+10 = 70 монет)

mode = 128: наш кошелёк (0 монет), ушло дальше (100+60-4 = 156 монет), число 10 игнорируется и ни на что не влияет

Так?
NA
22:18
Narek Abovyan
In reply to this message
Mode 64 попробует отослать всегда буквально сколько пришло минус за газ
ИК
22:19
Игорь Коняхин
In reply to this message
Даже если мы сами к сообщению припишем:
.store_grams(10)

?
NA
22:19
Narek Abovyan
Ну плюс это значение да
V
22:21
Vyacheslav Flok
In reply to this message
вот бы такое в официальную документацию)
офигенная таблица так-то
ИК
22:21
Игорь Коняхин
In reply to this message
Т.е. я в своём списке всё правильно расписал?
A
22:23
Andrei
In reply to this message
Бывают разные fee (gas и fwd), их нужно различать
NA
22:25
Narek Abovyan
In reply to this message
Примерно да, но есть интересный кейс.
Скажем если ты отправляя сообщения потратил какую-то часть денег, которые тебе пришли из входящего сообщения и в конце попытаешься отправить 0 монет с флагом 64 - как думаешь, что будет?
ИК
22:26
Игорь Коняхин
In reply to this message
Пришло A, потратил B, уйдёт A-B
?
NA
22:26
Narek Abovyan
Нет
22:26
Попытается уйти ровно сколько пришло минус за газ
22:26
Соответственно упадет т.к. не хватает денег
ИК
22:27
Игорь Коняхин
А куда ещё можно потратить кроме как на газ?
NA
22:27
Narek Abovyan
Отправить сообщение
22:27
Ну представь ты отправляешь несколько сообщений и в конце с помощью мод 64 хочешь остаток вернуть
ИК
22:28
Игорь Коняхин
... и тогда он попытается вернуть не "остаток", а "приход-газ"?
22:28
Т.е. мы будем в убытке
NA
22:28
Narek Abovyan
Именно
ИК
22:29
Игорь Коняхин
In reply to this message
Понял, спасибо
SD
23:15
Sergey Dzhunusov
In reply to this message
А откуда мод 64 понимает сколько нам пришло? Или он берет это stored in_msg? (и следовательно два раза послать не получится?)
NA
23:18
Narek Abovyan
Ну да
SD
23:19
Sergey Dzhunusov
In reply to this message
спасибо, но как такое научиться понимать. Я читал https://ton.org/docs/#/smart-contracts/messages и там про режимы и газ вообще не написано
NA
23:22
Narek Abovyan
In reply to this message
Мне пришлось покопаться в исходниках валидатора
SD
23:24
Sergey Dzhunusov
А если ничего не послать, то уйдет на твой баланс, да?
NA
23:24
Narek Abovyan
не понял
SD
23:24
Sergey Dzhunusov
Ну тебе пришло сообщение. Ты прочел и не послал ничего в ответ. Что с грамами, которые пришли
NA
23:25
Narek Abovyan
На баланс тебе капнули
23:25
Минус за газ
m
23:32
m
JS SDK. Подскажите пожалуйста, какая максимальная длинна строки payload у транзакции? Зависит ли она от других параметров? (Не смог найти в доке).
23:36
ᅠ ᅠ
In reply to this message
интересно как , нужно вникнуть поглубже в эту тему
23:37
In reply to this message
гугл субтитры есть , но тоже на англ. я его понимаю, но в некоторых моментах тупить начинаю )
7 April 2022
ИК
00:17
Игорь Коняхин
@Narek а если выполнение контракта крашится не вручную с помощью throw, а само собой, например чтением за границей слайса, то ton-contract-executor кидает исключение?

Я получаю:
Error: Cant execute vm: cannot serialize a null cell reference into a bag of cells

вместо результата с type == 'failed'
NA
00:18
Narek Abovyan
Ну это может он в stderr логает
00:18
Залогай результат
ИК
00:20
Игорь Коняхин
In reply to this message
Полное сообщение:
C:\Users\nns20\Development\TON\contest-1\node_modules\ton-contract-executor\dist\vm-exec\vm-exec.js:147
throw ex;
^

Error: Cant execute vm: cannot serialize a null cell reference into a bag of cells
at SmartContract.runContract (C:\Users\nns20\Development\TON\contest-1\node_modules\ton-contract-executor\dist\executor\SmartContract.js:71:19)
at async SmartContract.sendInternalMessage (C:\Users\nns20\Development\TON\contest-1\node_modules\ton-contract-executor\dist\executor\SmartContract.js:100:19)
at async testShort (file:///C:/Users/nns20/Development/TON/contest-1/js/tests_1.ts:43:15)
at async file:///C:/Users/nns20/Development/TON/contest-1/js/tests_1.ts:76:1

Node.js v17.8.0


Сам результат, возвращаемый .sendInternalMessage недоступен, так как кидается исключение
NA
00:23
Narek Abovyan
А ну это до еще до запуска падает видимо
00:23
Какой-то кривой cell передаете
ИК
00:26
Игорь Коняхин
In reply to this message
Не, если в контракте стоит ручной throw_if, то всё работает.
А вот если оно падает "автоматически", то выходит такое исключение ^
NA
00:27
Narek Abovyan
Интересно, можешь скинуть пример для воспроизведения?
ИК
00:34
Игорь Коняхин
In reply to this message
Потестировал
Минимальный пример - сделать контракт, который кидает отрицательное исключение:
() recv_internal(slice in_msg) impure {
throw(-3);


Это порождает то же ^ исключение
00:36
По идее, cell underflow exit code = 9, но если я кидаю throw(9) вручную, то всё норм
NA
00:38
Narek Abovyan
Спасибо! Посмотрю
AP
00:59
Andrew Python
In reply to this message
Интересно, а заданиях эти коды равны? Типо если контракт выйдет по cell underflow - это будет равно "exit code > 0"?
SO
01:07
Sash Osh
In reply to this message
должен быть код ошибки запрещенного использования зарезервированных кодов ошибки, делать throw c этим кодом будет запрещено категорически 🤔
Д
01:07
Данил
Какой эксплорер имеет меньше всего ограничений в api?
NA
01:23
Narek Abovyan
In reply to this message
разлил 0.4.1
01:23
должно помочь
ИК
01:29
Игорь Коняхин
In reply to this message
Уже лучше
Теперь не кидает исключение, но все последующие (успешные) вызовы sendInternalMessage возвращают ровно на 500 газа больше
NA
01:29
Narek Abovyan
🤔
01:29
Часть которая касается газа я не трогал
F
01:42
Ferrari Apple
Всем привет, такой вопрос, а есть ли способ узнать по адресу кошелька TON все его NFT в разных контрактах и мету этих NFT следовательно, или всё таки обязательно нужно ещё использовать адресс контракта чтобы получить его NFT? И что для этого лучше использовать в случае веба, API какие-то есть уже для этого?
NM
01:46
Nikita Misharin
In reply to this message
Короче у меня такая ошибка была(serialize null), когда сгенеренный message выходил за рамки 1023 битов. Учитывая, что у тебя потратилось на 500 газа больше, явно создалась лишняя ячейка
ИК
01:49
Игорь Коняхин
In reply to this message
Не, речь о первой задаче, там без шансов на случайное создание лишней ячейки.
Ну и toncli тесты прекрасно проходят
NM
01:52
Nikita Misharin
In reply to this message
Тогда 🤷‍♂️ Жаль конечно, ровно 500 газа идеально подходило к гипотезе
TP
01:58
Tim Pavlov
In reply to this message
первый ref пропусти, он отсылает к предыдущему action-у, а предыдущий - пустой, если у тебя только один action в списке
ИК
02:09
Игорь Коняхин
64-bit `valid_until` unixtime


Может быть ведь любым unsigned int 64-битным значением?
Нет хитростей, что некоторые времена могут быть слишком большими?

Или это вообще signed int и отрицательные числа нужны для поддержки времён до 1970 года?
02:12
@Narek @smartnik А sendInternalMessage автоматически выбирает, сделать ли тело inplace или ссылкой на отдельную ячейку?
Я не нашёл соответствующих опций
TP
03:32
Tim Pavlov
In reply to this message
будет большой - будет exception
03:32
не парься
03:33
In reply to this message
писали это uint 64
03:33
такой вопрос, где находится функция get_prev_c4? у меня в тесте их нет
OM
03:53
OU MING
Hello,sir. Asia Endpoint of tonpool is abnormal now? we cant check the hashrate in bot
ИК
04:30
Игорь Коняхин
In reply to this message
Она есть только в функции-генерации-данных
В функции-проверке её нет
TP
04:31
Tim Pavlov
надо было просто обновить toncli либы, все нормально теперь)
04:31
ну как, относительно...
ИК
04:56
Игорь Коняхин
In reply to this message
Редко (2 раза из 2000+) во время sendInternalMessage такое исключение:
Error: Cant execute vm: invalid bag-of-cells last cell #0: end offset 2 is different from total data size 130
at SmartContract.runContract (C:\Users\nns20\Development\TON\contest-1\node_modules\ton-contract-executor\dist\executor\SmartContract.js:71:19)
at async SmartContract.sendInternalMessage (C:\Users\nns20\Development\TON\contest-1\node_modules\ton-contract-executor\dist\executor\SmartContract.js:100:19)
at async testSet (file:///C:/Users/nns20/Development/TON/contest-1/js/tests_4.ts:113:12)
at async file:///C:/Users/nns20/Development/TON/contest-1/js/tests_4.ts:275:3

но к ней я вряд ли смогу подобрать минимальный пример
05:15
Deleted Account
Почему тонкли просит отправить именно на non-bble адрес?
ИК
06:29
Игорь Коняхин
А нет способа создать пустую ячейку напрямую?
Обязательно нужно делать
begin_cell().end_cell()

?
A
06:40
Aleша
видимо нет
06:41
это код везде
ИК
08:09
Игорь Коняхин
In reply to this message
Можно, пожалуйста, куда-нибудь продублировать решения в виде .zip
Я что-то потыкал в WSL, кое-как создал .tar, и даже получил Your submission has been accepted, но что-то уверенности в данном файле нет
AP
08:21
Andrey Pfau
In reply to this message
Потому что если отправишь на bounceable то монеты обратно вернутся
08:22
Deleted Account
In reply to this message
Отправлял, происходит в точности все тоже самое, что и при отправке на non-bble
08:23
То есть фактически я вообще не ощущаю ни единой разницы между ними... так зачем это? Может кто-то внятно и детально объяснить?! Или все так же ничего не понимают в этом моменте?))
СВ
08:43
Сергей В
In reply to this message
Если я правильно понимаю, чтоб задеплоить смарт контракт, на его счету должны быть монеты, но если их отправить на баунсебл адрес, то они вернуться обратно на кошелек. По этому надо отправлять на нон-баунсебл чтоб они «привязались» к этому адресу
08:43
Deleted Account
In reply to this message
Не возвращаются обратно 🤷‍♂️
08:43
Все спокойно деплоится.
А
09:10
Андрей
In reply to this message
Потому что ваш кошелек игнорирует эти флаги и принудительно выставляет non-bouncable
AT
09:11
Andrey Tvorozhkov
In reply to this message
Да, именно так
09:14
Deleted Account
То есть non-bble кошель, нужен только для деплоя? Дальше он вообще для чего то нужен?

Я просто хочу понять зачем этот лес?)) в какой ситуации, я могу не захотеть, чтобы мой кошелёк принимал средства?
AT
09:19
Andrey Tvorozhkov
In reply to this message
Нет, почитайте про баунс флаг
YM
09:39
Yo Man
Всем доброе утро, подскажите пожалуйста. Я установил расширение на IDEA и теперь хочу протестить свое решение, как это сделать?
YM
09:51
Yo Man
In reply to this message
Благодарю
OB
10:42
Oleg Baranov
а с тестнетом все ок? че то уже 10 минут контракт висит не инициализированым в тонкли
AP
10:45
Andrew Python
In reply to this message
В винде же из коробки есть tar (Windows 10 17063+)
А
10:54
А
Ребят стоит ли изучить solidity перед FunC? Про солидити ресурсов больше, но тут писали что FunC имеет отличия, и похож на язык C.

Сорян если глупый вопрос, посмотрел чат, вроде об этом не затронули тему.
AP
10:58
Andrey Pfau
зачем учить солидити чтобы потом переучиваться на FunC? Сразу изучай FunC
AP
10:59
Andrew Python
In reply to this message
++ Тут легче заходить с пустой головой.
А
11:02
А
In reply to this message
Ок, спасибо
A
11:14
Aleша
подскажите формулу как рассчитать fees related to processing?
11:14
или руками каждую операцию рассчитывать и вычитать?
AP
11:16
Andrew Python
In reply to this message
Для этого есть send mode. https://ton.org/docs/#/func/stdlib?id=send_raw_message
A
11:17
Aleша
In reply to this message
а увидел спасиб
s
11:29
sepеzho.copy
привет, а есть TON вайтпепер на русском?)
AP
11:31
Andrew Python
In reply to this message
s
11:31
sepеzho.copy
спасибо большое)
OB
11:39
Oleg Baranov
а подскажите плиз по 5 задаче, pack_data должна только вернуть cell или еще set_data нужно сделать?
SE
12:05
Scr Ezhik
Привет ✋🏽 всем
Подскажите в файле participant.json
В username, что за логин писать?
AP
12:09
Andrew Python
In reply to this message
Тот, который ты хочешь видеть в таблице участников/победителей.
https://t.me/toncontests_chat/1761
P
12:10
Placeholder
In reply to this message
Хороший вопрос. Теперь я тоже сомневаюсь, что имелось в виду.
SE
12:10
Scr Ezhik
In reply to this message
Спасибо
AP
12:12
Andrew Python
In reply to this message
Ну мне чел ответил, что нужно просто вернуть cell, а админы его не поправили. https://t.me/toncontests_chat/1323
OB
12:13
Oleg Baranov
In reply to this message
окей, спасибо
12:13
In reply to this message
спасибо)
SE
12:16
Scr Ezhik
В чем разница 0х64 от 64 в send_raw_massage?
AP
12:17
Andrey Pfau
In reply to this message
0x64 - это 100
64 - это 64
СВ
12:17
Сергей В
In reply to this message
0x это 16цатиричная система исчесления
обычные цифры это десятичная
SE
12:26
Scr Ezhik
А в чем прикол, что method функции не используются в основных функциях?
Я не очень понял этот момент, то есть, от меня хотят чтоб я туда их ввел?
P
12:34
Placeholder
In reply to this message
Если над ними ;;testable, должно быть написано, зачем они нужны. Если нет, то можешь не использовать.
SE
12:37
Scr Ezhik
То есть, если есть testable я должен использовать method функции, Правильно понял?
x
12:38
xxffwwoqqzz
Добрый день

That means that if, for instance, your message body size is 900 bits long you can not to store it in the same cell with the message header. Indeed, in addition to message header fields, total size of the cell will be more than 1023 bits and during serialization there will be cell overflow exception.

In this case, instead of 0 that stands for "inplace message body flag (Either)" there should be 1 and message body should be stored in reference cell.

Т.е. если я хочу сохранить какой-то cлайс как ссылку, то при формировании сообщения я должен написать вот так?

.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1)
.store_uint(1, 1)

Или это не играет большую роль и можно оставить просто
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
?
ИК
12:40
Игорь Коняхин
In reply to this message
Насколько я понимаю, последний бит - именно конструктор к Either X ^X, и если ты хочешь выбрать ^X, то нужно поставить 1
(но это не точно)
AP
12:40
Andrew Python
Но это если всё тело в отдельной ячейке. А если оно начинается в этой, то наверное не надо?
P
12:41
Placeholder
In reply to this message
Не, ;; testable — те, что будут проверяться. Значит они должны быть и работать в соответствии с условиями задачи. Остальные можно использовать, можно не использовать.
x
12:41
xxffwwoqqzz
In reply to this message
тоже так думаю, но вот смущает это Either, будто оно работает и так, и так, но зачем тогда писать, что нужно менять последний бит на 1 🤔
ИК
12:42
Игорь Коняхин
In reply to this message
Ой, точно ... кажется
SE
12:42
Scr Ezhik
In reply to this message
Понял, спасибо 👌
x
12:43
xxffwwoqqzz
In reply to this message
Меня как раз интересует сохранить что-то в виде ссылки на другую ячейку
P
12:46
Pepeg
Either'a же нет в func, и в билдере есть store_ref()
x
12:48
xxffwwoqqzz
In reply to this message
Понимаю, я о другом
SA
12:51
Sergey Antonichev
In reply to this message
Выглядит так, что это последний бит как раз указывает на то, откуда читать тело сообщения
0 - читай дальше из этой же ячейки
1 - тело в виде отдельной ячейки лежит по ссылке
Верно понимаю?
P
12:51
Pepeg
А, все понял, да действительно странно 🤔
12:52
In reply to this message
скорее первый вариант в случае ссылки, как раз последний бит для этого и используется
SA
12:53
Sergey Antonichev
In reply to this message
+ похоже, можно просто сделать
.store_uint(1, 1 + 4 + 4 + 64 + 32 + 1 + 1)
x
13:09
xxffwwoqqzz
Спасибо, кажеться понял разницу
SA
13:24
Sergey Antonichev
Интересно, а accept_message должен присутствовать в каждом контракте контеста? Или это не тестируется? Или только в последнем?
ИК
13:49
Игорь Коняхин
In reply to this message
Только в последнем, только в тех случаях, когда ты хочешь, чтобы транзакция прошла успешно и попала на блокчейн
SA
13:54
Sergey Antonichev
In reply to this message
То есть просто пересылка сообщений(кому-то или просто обратно) не считается транзакцией?
13:55
In reply to this message
Если внутри чейна
ИК
13:56
Игорь Коняхин
Для internal сообщений всё как-то мутнее с accept_message, я не шарю
SA
14:00
Sergey Antonichev
Ну задания как бы намекают, что что accept нужен только в последнем 🤔
x
14:01
xxffwwoqqzz
Вопрос по тому, как работает load_msg_addr. Я правильно понимаю, что она берет какой-то слайс, бежит по нему и возвращает первый попавшейся адрес в нём?
P
14:03
Placeholder
In reply to this message
Никуда не бежит. Адрес должен быть в начале
AP
14:05
Andrew Python
надеюсь после контеста чужой код покажут
14:05
некоторые моменты интересно кто как сделал
x
14:05
xxffwwoqqzz
In reply to this message
Понял, спасибо
SA
14:06
Sergey Antonichev
In reply to this message
думаю, после контеста можно будет просто попросить код =)
AP
14:07
Andrew Python
In reply to this message
и свой показать)
SA
14:07
Sergey Antonichev
In reply to this message
Ага
Соберемся тут в чатике и будем друг другу свой код показывать :В
x
14:08
xxffwwoqqzz
In reply to this message
Ещё один вопрос. В документации написано, что эта функция returns both this prefix s' and the remainder s'' of s as slices.

s'
это выходит адресс, а s'', всё, что идёт после адреса?
P
14:08
Placeholder
да
x
14:10
xxffwwoqqzz
In reply to this message
Спасибо огромное
СВ
14:23
Сергей В
А результаты по "TON Smart Challenge" будут в течении недели оглашены?
x
14:30
xxffwwoqqzz
In reply to this message
Вероятно, что да
14:36
Вопрос по написанию тестов с toncli. Как можно захардкодить адресс в FunC? Хочу написать тесты для смарт-контракта используя toncli. Нужно сделать фейковое сообщение, которое будет содержать в себе какой-то адресс.

Насколько я понимаю, то адресс это slice, но как мне превратить, например, вот этот адресс EQAyPDNoPgx7_-DTvAlWo1gGLCsCQR57J-1GFODuUPA8InLC в слайс?

Или это не так делаеться?
V
14:37
Vyacheslav Flok
In reply to this message
«how tf it works» driven development
ИК
14:37
Игорь Коняхин
In reply to this message
Валидные адреса можно получить так:
;; slice address1 = begin_cell().store_uint(4, 3).store_uint(wc, 8).store_uint(addr, 256).end_cell();
address_none = begin_cell().store_uint(0, 2).bto_slice();

address_1 = begin_cell().store_uint(4, 3).store_uint(10, 8).store_uint(111, 256).bto_slice();
address_2 = begin_cell().store_uint(4, 3).store_uint(20, 8).store_uint(2222, 256).bto_slice();
address_3 = begin_cell().store_uint(4, 3).store_uint(30, 8).store_uint(33333, 256).bto_slice();
address_4 = begin_cell().store_uint(4, 3).store_uint(40, 8).store_uint(444444, 256).bto_slice();