7 April 2022
ИК
14:37
Игорь Коняхин
Я спрашивал несколько дней назад:)
14:38
Как преобразовать конкретный адрес в FunC представление - не знаю
x
14:39
xxffwwoqqzz
In reply to this message
Вау, спасибо огромное!
SA
14:39
Sergey Antonichev
In reply to this message
bto_slice - это что за зверь такой? Что-то из секретных документов?
ИК
14:40
Игорь Коняхин
In reply to this message
Это у меня образовалась своя FunC мини-библиотека на 250 строчек
slice bto_slice(builder b) inline method_id {
return b.end_cell().begin_parse();
}
AP
14:41
Andrew Python
Можете скинуть инфу, как подписать ячейку для тестов? Тут где-то точно было, найти не могу
SE
14:41
Scr Ezhik
Participant.json должен в архиве tar находится?
ИК
14:41
Игорь Коняхин
In reply to this message
@pyAndr3w если Python'ом ^
14:42
На JavaScript - пакет ed25519
AP
14:42
Andrew Python
In reply to this message
спасибо
SA
14:42
Sergey Antonichev
In reply to this message
Ох как же жаль, что раньше я этого сообщения не видел
Даже страшно вспоминать, как я делал адреса для тестов
АЩ
14:43
Алексей Щербаков
А как вообще узнать о том что эти конкурсы анонсируются?
14:43
Я в 2019 узнал за два дня до конца и сейчас
SA
14:43
Sergey Antonichev
In reply to this message
Мне телеграм втыкал сообщение о контесте последним сообщением во всяких каналах
ИК
14:44
Игорь Коняхин
In reply to this message
Ох был бы у меня ответ на этот вопрос
x
14:44
xxffwwoqqzz
In reply to this message
Т.е. чтобы всё было без сторонних библиотек, то вот так код должен выглядеть?

slice fake_address_1 = begin_cell().store_uint(4, 3).store_uint(10, 8).store_uint(111, 256).end_cell().begin_parse()
ИК
14:44
Игорь Коняхин
Да
x
14:44
xxffwwoqqzz
In reply to this message
АЩ
14:44
Алексей Щербаков
In reply to this message
А, понятно, я последнюю неделю старался вообще публичные каналы не открывать 😀
x
14:45
xxffwwoqqzz
In reply to this message
Спасибо)
V
14:45
Vyacheslav Flok
In reply to this message
интересно, как это на красивых языках можно было бы записать
T
14:58
TON Дев Чат
In reply to this message
К слову, существует экспериментальная версия funC где есть расширенные литералы слайсов (и интов)
https://github.com/starlightduck/docs/commit/fd724c49067969a6ddcef30967502fa70036e9b4
Можно будет писать
"EQAyPDNoPgx7_-DTvAlWo1gGLCsCQR57J-1GFODuUPA8InLC"a
Но это не для контеста (на контесте только ванильный фанси)
АЩ
14:59
Алексей Щербаков
Для юнит-тестов явно не хватает функционала
T
15:00
TON Дев Чат
In reply to this message
в оф.доке есть такое https://ton.org/docs/#/func/stdlib?id=send_raw_message
ИК
15:03
Игорь Коняхин
Что значит exit_code = 11?
На странице:
https://ton.org/docs/#/smart-contracts/tvm_exit_codes
такого нет
AP
15:03
Andrew Python
In reply to this message
tvm.pdf страница 60
V
15:04
Vyacheslav Flok
In reply to this message
я б сказал так, что это не так наглядно, как пачка конкретных примеров таблицей
x
15:09
xxffwwoqqzz
In reply to this message
ждём релиз 👀🔥
T
15:11
TON Дев Чат
In reply to this message
После конкурса можете поделиться кодом, который вызывает эту ошибку? Мы когда доку делали проверяли и не нашли чтобы хоть что-то вызывало Excno::unknown поэтому и исключили из доки, может и зря.
ИК
15:12
Игорь Коняхин
In reply to this message
Уже нашёл
Я вызывал несуществующую функцию, так как загружал код контракта для другой задачи 😅
Запускал через ton-contract-executor
AP
15:14
Andrew Python
In reply to this message
Огромное спасибо!)
всё работает как надо
ИК
15:16
Игорь Коняхин
В пятой задаче ведь нужно объявить пустой recv_internal просто для того чтобы скомпилилось? Это норма?
AT
15:17
Andrey Tvorozhkov
In reply to this message
да
ИК
15:17
Игорь Коняхин
Понял, спасибо
V
15:23
Vyacheslav Flok
а чем руководствовались, когда в качестве маркера успеха udict_get?() решили выбрать значение -1?
как-то неконсистентно с exit-кодами tvm и в целом с общемировой практикой маркировки успеха/ошибок
ИК
15:24
Игорь Коняхин
-1 в бинарном представлении: 11111111111111... (='1' * 257)
и используется в TON везде в качестве значения True
V
15:27
Vyacheslav Flok
In reply to this message
логично. спасибо за объяснение
x
15:28
xxffwwoqqzz
Как можно в тестах в toncli получить сообщение которое отправляет смарт-контракт?

Есть такая сигнатура у теста

_ test_1(int exit_code, cell data, tuple stack, cell actions, int gas) method_id(1)

Если я правильно понимаю, то все сообщения, которые будет отсылать смарт-контракт находяться в ячейке actions. Но как их можно от туда достать?
ИК
15:29
Игорь Коняхин
In reply to this message
^
A
15:43
AntonIX
А комментарии к платежу в кошельках это и есть internal messages?
СВ
15:45
Сергей В
In reply to this message
это наверное данные после основного тела сообщения
15:45
P
15:46
Placeholder
In reply to this message
Комментарий к платежу пишется msgBody
СВ
15:47
Сергей В
In reply to this message
про extra_currencies, что это такое?
если каке-то другие токены это Jetton со своим смарт контрактом
это какие-то монеты из возможных других воркченов? которых пока нет?
AP
15:50
Andrew Python
До accept_message лимит же в 10к?
P
15:51
Placeholder
тут все правильно. это тэг addr_std$10 плюс 0 в Maybe anycast. Просто записано непривычно мб
T
15:54
TON Дев Чат
In reply to this message
Это нативные токены (не жеттоны) их пока можно игнорировать (считать, что extra_currencies всегда пустой словарь)
СВ
15:55
Сергей В
In reply to this message
но в будущем там что-то будет? :)
или уже депрекейтед?
T
15:55
TON Дев Чат
In reply to this message
Будет
P
15:56
Placeholder
In reply to this message
В доках написано конфигурируемый. Я тоже видел, что 10к, но наверное, здесь же, в этом чате
СВ
15:56
Сергей В
In reply to this message
блин столько всего интересного 😁
V
15:56
Vyacheslav Flok
а как создать пустой слайс?
AP
15:57
Andrew Python
In reply to this message
или через ячейку (делаешь ячейку и открываешь её) или через asm
V
15:58
Vyacheslav Flok
In reply to this message
через ячейку вроде бы дорого. попробую через asm, спасибо
AP
15:58
Andrew Python
In reply to this message
если в контракте, то да, через asm
D
16:04
Dmitry
In reply to this message
что то удалили новость на канале
да и сайт на wix не внушает доверия
d
16:18
don_corleone
Помогите ,не могу по второму заданию определиться : send the message B to owner with body which contains address of A's sender followed by A's message body in reference (child cell)., нужно по ссылке in_msg_full, или slice in_msg_ в сообщении отправлять?
V
16:20
Vyacheslav Flok
если я правильно интерпретирую названия, то A’s message body - это in_msg_body. То есть именно часть без «заголовков».
d
16:22
don_corleone
In reply to this message
смущает что в задании идет .store_ref(in_msg_full) , a если отправлять in_msg_body то уже через .store_slice(in_msg_body)
V
16:23
Vyacheslav Flok
задание полно ошибок, которые и просят в конкурсе поправить
A
16:23
Aleша
кто как проверял на еще что то в сообщении? Note, tests will not cover cases when messages contain valid op=2, query_id and then something else (that means that participants may handle such messages at their discretion
16:23
в слайсе
d
16:23
don_corleone
+ в описании reference
16:24
In reply to this message
по qury_id тоже непонятно будет проверка в тестах?
V
16:24
Vyacheslav Flok
In reply to this message
так. тогда предлагаю забыть, что я сказал. я засомневался)
16:25
может лучше в чат контеста вопрос задать? https://t.me/toncontests_chat
A
16:26
Aleша
In reply to this message
qury_id?
d
16:27
don_corleone
In reply to this message
точно спасибо, поробую поиском, если нет прошу
TP
16:39
Tim Pavlov
такой вопрос по 5 заданию: проверка по кол-ву запросов(чтобы было не больше 10 в минуту) должна осуществляться после всех проверок? или до, даже если пришел запрос только с одной подписью?
SA
16:43
Sergey Andreev
In reply to this message
А она обязательная? Я вот не понимаю, написано
«It is acceptable to ignore…”
То есть по желанию можно игнорировать такие запросы? Почему должно возникнуть такое желание, если это усложняет код?Или это обязательное условие?
TP
16:44
Tim Pavlov
ну типа что это уменьшит нагрузку на контракт
SA
16:44
Sergey Antonichev
In reply to this message
кмк это больше похоже на доп информацию, которая может дать подсказку к оптимизации
TP
16:44
Tim Pavlov
а accept_message вообще что-то жрет по газу?
SA
16:46
Sergey Antonichev
In reply to this message
Скорее всего - это ведь несколько операций
Но эксперты могут дать более надежный ответ =)
TP
16:48
Tim Pavlov
а сообщения с одной подписью не подходят под условие запросов, которые можно проигнорить? типа их нельзя игнорить, если с подписями все нормально?
SA
16:48
Sergey Andreev
А проверку на valid_until надо делать только как при сохранении первого запроса, так и при получении второго?
AR
16:50
Alexander Ruliov
In reply to this message
Так и в запросах не относящихся к этому :)
V
16:54
Vyacheslav Flok
есть переменные типа int key, cell valid_until_dict.

(slice until_slice, int exist) = valid_until_dict~udict_get?(256, key)

при компиляции получаю ошибку.
cannot implicitly assign an expression of type (slice, int) to a variable or pattern of type (cell, ??68) in modifying method udict_get? : cannot unify type cell with slice
(slice until_slice, int exist) = valid_until_dict~udict_get?(256, key);

чяднт не и что за тип ??68 ?
вроде сигнатура сходится с той, что я применяю
(slice, int) udict_get?(cell dict, int key_len, int index)
AR
16:55
Alexander Ruliov
In reply to this message
Заюзайте точку вместо тильды, геттер не мутирует клетку.
V
16:56
Vyacheslav Flok
In reply to this message
спасибо!
SA
16:58
Sergey Andreev
Что значит if the same request is sent the second time it should be ignored? Это значит, можно выйти с любым кодом, но не делать accept_message? Или это значит, что не надо посылать msg_to_send, но сделать accept_message()?
TP
17:00
Tim Pavlov
In reply to this message
не, не надо акцептить
SA
17:00
Sergey Andreev
In reply to this message
Спс
17:00
А код выхода должен быть ненулевым? Или все равно?
AR
17:00
Alexander Ruliov
In reply to this message
Если такое же внешнее сообщение пришло, то можно ничего не делать, т.к. данные не изменятся и сообщений никаких не отправится.

Выше где-то говорили, что для внешних сообщений отсутствие акцепта и throw это одно и то же, ибо в блокчейн не сохранится.
SA
17:01
Sergey Andreev
In reply to this message
Круто, спасибо
AR
17:02
Alexander Ruliov
Эх, а я в итоге проленился вчера-позавчера и даже отправлять не буду :(

Может в следующий раз, было весело))

На выходных попробую чутка тулов для более удобного тестирования и, если повезёт, то и для дебага чего попробую сделать (выглядит не сильно сложным машину времени запилить, чтобы сгенерить html'ку, где по выполнению асма можно пройтись, смотря на стек/инспектируя клетки). Или опять проленюсь))
E
17:02
E
Всем привет!) пытаюсь разобраться с тоном, пока тяжело идёт, после других блокчейнов.
Хочу выпустить коллекцию, чтобы люди могли чеканить ее.
Ниже источник поможет это сделать?
https://github.com/tondiamonds/ton-nft-deployer

Или если можно - пришлите плиз гайды именно по nft
TP
17:05
Tim Pavlov
а почему можно игнорить те сообщения, которые валидны более чем на одну минуту? какой тогда срок оптимальный? чтоб в течении минуты пришла вторая подпись?
AR
17:07
Alexander Ruliov
In reply to this message
Так условия придумали.

А в реальном мире с временем и количеством запросов есть проблема с тем, что это внешние сообщения, а не внутренние, за которые платил бы отправитель.

Если ты один из владельцев этого кошелька и второй владелец тебе насолил и не хочет отдавать тебе монеты, ты можешь заспамить контракт сообщениями и сжечь весь баланс контракта комиссиями за обработку внешних сообщений/хранением запросов на год вперёд))
TP
17:07
Tim Pavlov
In reply to this message
понял, спасибо
ИК
17:13
Игорь Коняхин
It is acceptable to ignore requests which are valid for more than 1 minute

now() ведь обычное Unix время в секундах?

Т.е. могу просто проверить:
if (valid_until > now() + 60) throw(20);

?
A
17:17
Andrei
Да
17:17
Лучше throw_if использовать
ИК
17:19
Игорь Коняхин
Да, я обычно использую throw_if,
так написал для наглядности
По сути ведь верно?
A
17:24
Alex
очень жаль, что не удалось поучаствовать в конкурсе для новичков(
17:24
до 8 апреля
17:25
будут еще подобные?
СВ
17:30
Сергей В
In reply to this message
ну репа называется func-contest1
так что может будет 2 :)
Y
17:31
Y
In reply to this message
не слишком ли дорого выходит по кредиту лукап делать
SA
17:32
Sergey Antonichev
In reply to this message
Буду признателен, если развернешь мысль в форме, понятной смертным)
OB
17:39
Oleg Baranov
а сколько газа в кредит дается, там фикс величина?
P
17:46
Pepeg
У кого сколько газа вышло в 5 задаче при полной проходке? Примерно хотяб
У меня сначала 10к было, но пересмотрел хранение и до 6 спустил 🥲
СВ
17:48
Сергей В
In reply to this message
6 это с ?
It is acceptable to ignore requests which are valid for more than 1 minute as well as not accept more than 10 requests per minute.
A
17:48
Andrei
In reply to this message
10к
OB
17:48
Oleg Baranov
In reply to this message
спасибо
P
17:48
Pepeg
In reply to this message
Я это условие не понял и поэтому принимал все равно
17:51
Точнее, я хотел узнать сколько газа у кого вышло, если все данные введены правильно и recv_external проходит весь путь вплоть до accept_message и выхода из функции
СВ
17:52
Сергей В
просто если его учитывать, то это надо еще данные писать и считать время и попытки :)
not accept more than 10 requests per minute.
SA
18:15
Sergey Andreev
Какой селектор у recv_external?
18:15
1?
SA
18:16
Sergey Antonichev
In reply to this message
-1
SA
18:16
Sergey Andreev
In reply to this message
Спасибо
E
18:41
E
скажите, пожалуйста, а есть тестовая сеть ton, где можно получить бесплатные toncoins?
AK
18:42
Andrey Kravchenko
In reply to this message
BM
18:50
Borys Minaiev
А я правильно понял, что разница между
check_data_signature(cell.begin_parse(), ...)
и
check_signature(cell_hash(cell), ...)
в том, что второй учитывает ссылки на другие ячейки, а первый считает только хеш от данных?

И в 5м задании предполагается, что подписан должен быть весь Request целиком с учетом msg_to_send?
x
18:58
xxffwwoqqzz
Как во время тестов получить сообщения, которые были отправлены через send_raw_message?
19:00
In reply to this message
Мой смарт-контракт использует send_raw_message, чтобы отправить сообщение. Хочу написать для него тесты, но не могу найти как в тестах получать сообщение, которые отправляются. У кого-то есть примеры как это сделать?
BM
19:01
Borys Minaiev
In reply to this message
Можно смотреть на actions. Там будет первая ссылка на пустую ячейку, а вторая с запросом, который ты послал (вроде бы).
SA
19:03
Sergey Antonichev
In reply to this message
так и есть
x
19:03
xxffwwoqqzz
In reply to this message
А как манипулировать с ссылками в ячейках? Можно, пожулайста, линк на соответствующие функции из stdlib или мб даже примеры? Не догоняю как оно работает в FunC
P
19:05
Placeholder
In reply to this message
load_ref() store_ref(cell c)
DP
19:05
Dmitriy P
Пытаюсь запустить file.fc
() main() {
int hello = 1;
hello~dump();
}
Через
toncli fc build one.fc && toncli f run one.fif
Вывод пустой
Что я делаю не так?
P
19:09
Placeholder
In reply to this message
Как минимум, нигде не используется эта hello, поэтому компилятор ее пропустит.
DP
19:10
Dmitriy P
In reply to this message
А как же hello~dump(); ?
ИМ
19:12
Илья Михеев
In reply to this message
Ну, у вас не будет запускаться main()
ИК
19:12
Игорь Коняхин
In reply to this message
Там сложно в первый раз это делать
За два часа не факт, что успеешь
19:13
In reply to this message
но если что, вот я об этом спрашивал несколько дней назад
E
19:13
E
А кто-нибудь из присутствующих делал уже минт коллекций?
SA
19:13
Sergey Antonichev
In reply to this message
Где-то в доках встречал приблуду, блокирующую вырезание неиспользуемых переменных компилятором
Может быть ~touch такое делает, но я не уверен
P
19:15
Placeholder
In reply to this message
Ах да. Должен положить на стэк, вывести дамп и дропнуть.
DP
19:15
Dmitriy P
Результата всё равно нема
int main() {
int hello = 1;
hello~impure_touch();
hello~dump();
return hello;
}
19:16
In reply to this message
Почему?
У нее не просто так же id 0...
SA
19:19
Sergey Antonichev
In reply to this message
А она вообще запускается? как запускаешь?
DP
19:20
Dmitriy P
In reply to this message
1) toncli fc build one.fc && toncli f run one.fif
2) func -SPA ../func-contest1/stdlib.fc one.fc | FIFTPATH=$TON/lib/fift fift
P
19:21
Placeholder
а в one.fif что получилось? там 1 пушится на стэк?
x
19:22
xxffwwoqqzz
In reply to this message
Понял, спасибо. Я думал, что тут ещё что-то есть, кроме них. Значит я просто немножко криворукий)
DP
19:23
Dmitriy P
А если убрать main или recv_internal (они взаимозаменяемы), то fift крашится
func прорабатывает нормально, что ожидаемо
x
19:23
xxffwwoqqzz
In reply to this message
Просто интересно попробовать сделать контракты :) интересно будет посмотреть решения
DP
19:24
Dmitriy P
In reply to this message
one.fif:

"Asm.fif" include
// automatically generated from `../func-contest1/stdlib.fc` `one.fc`
PROGRAM{
DECLPROC main
main PROC:<{
//
1 PUSHINT // hello
s0 DUMP // hello
}>
}END>c
ИК
19:24
Игорь Коняхин
In reply to this message
Учитывая оставшееся время, забей на тест actions, лучше перепроверить код
AT
19:25
Andrey Tvorozhkov
In reply to this message
Так нужно ран вм добавить
19:26
Билд только собирает asm
19:26
А run запускает фифт
19:26
Но у вас в фифте просто континуэйшн (как модно выражаться) лежит
19:26
Почитайте в доке по фифте про runvmcode
19:27
Просто в конец фифта его добавьте, должно сработать)
DP
19:28
Dmitriy P
In reply to this message
А где такой есть?
Не могу найти
19:30
In reply to this message
Error interpreting file `one.fif`: one.fif:11: runvmcode:not a cell slice
x
19:38
xxffwwoqqzz
In reply to this message
спасибо, попробую так
DP
E
19:46
E
In reply to this message
Коллеги))
SA
19:51
Sergey Antonichev
In reply to this message
Надеюсь, что нет
E
19:51
E
In reply to this message
Почему надеешься?)
SA
19:52
Sergey Andreev
известно что-то про то, когда будут результаты?
SA
19:52
Sergey Antonichev
In reply to this message
Этот вопрос, я думаю, выходит за рамки Dev chat =)
19:53
In reply to this message
Писали вроде, что зависит от количества участников
также(вроде) писали, что планируют завтра объявить дату подведения итогов
SA
19:54
Sergey Andreev
In reply to this message
Спасиб
А
19:54
Артем
Ребят привет, хочу посоветоваться если в мире дева я полный начинающий лошара. Но очень заинтересовала тема разработки в сфере блокчейнов, особенно хочется поработать и разобраться с ton. С чего лучше начать, и к чему в целом можно прийти и заниматься в будущем если разобраться как работать со смарт контрактами в ton
SA
19:57
Sergey Andreev
In reply to this message
Имхо, начинать с тона — не самая лучшая идея
SA
19:57
Sergey Antonichev
In reply to this message
Хочется ответить, что начинать лучше всего с Computer science, но, кажется ты что-то другое подразумевал в вопросе
без него вряд ли удастся нормально работать с бч и тем более ТОН
SA
19:57
Sergey Andreev
Лучше начать с эфира
А
19:58
Артем
т.е начать сначала учить солидити и питон например ?
AP
19:59
Andrey Pfau
In reply to this message
плохой совет
19:59
вредный и очень плохой, осуждаю
А
19:59
Артем
🙈
SA
19:59
Sergey Andreev
In reply to this message
Начинать входить в блокчейн
AP
20:00
Andrey Pfau
как минимум подходы к написанию смарт контрактов на эфире и в тоне КОРДИНАЛЬНО разные
20:00
надо будет потом переучиваться
20:00
лучше сразу начать с тон
DP
20:00
Dmitriy P
In reply to this message
Лучше не питон, у него слишком другая идеология написания кода
Что угодно си-подобное
Открываешь википедию и смотришь чем вдохновлен язык, если есть Си - подходит
SA
20:00
Sergey Andreev
In reply to this message
Солидити гораздо проще
AP
20:00
Andrey Pfau
In reply to this message
проще != лучше
SA
20:00
Sergey Andreev
Если не писал на низкоуровневых языках
20:01
In reply to this message
А новичку надо лучше? Мне кажется, надо проще
AP
20:01
Andrey Pfau
In reply to this message
проще.- это выстрел в ногу
SA
20:01
Sergey Antonichev
In reply to this message
Или можно упороться и научиться lisp-у =DDD
А
20:01
Артем
Я писал на с++ в институте)
AP
20:01
Andrey Pfau
лучше иметь золотую середину
SK
20:01
Steve Korshakov
Кто-нибудь через HTTP апи дергал гет-методы со слайсами в аргументах?
А
20:01
Артем
и в целом базовые азы программирования знаю
SA
20:02
Sergey Andreev
In reply to this message
Тогда можно сразу начинать с написания байткода под твм)
AP
20:03
Andrey Pfau
хватит утрировать, осуждаю
СВ
20:03
Сергей В
In reply to this message
или паскалю
AP
20:03
Andrey Pfau
надо искать золотую середину
DP
20:03
Dmitriy P
In reply to this message
Ага, или вообще на ассемблере сразу
SA
20:04
Sergey Andreev
Я согласен, что эфир это совершенно другое, но для понимания, что вообще значит разработка в блокчейне, он подходит идеально. В инете полно обучающих материалов по эфиру + солидити простой в начале. Обучающих материалов по тону почти нет
А
20:05
Артем
А в целом можете подсказать чем занимается человек, который умеет работать и разрабатывать в ton. Это работа в каких-то кампаниях, или частных проектах? Все интересно, но представления 0))
SA
20:05
Sergey Antonichev
In reply to this message
нуачо
мне эти развлечения с lisp и asm под i8080 в универе помогли сейчас разобраться с тем, что происходит вообще =В
SA
20:05
Sergey Andreev
In reply to this message
Ничем, потому что таких компаний почти нет))
SA
20:06
Sergey Antonichev
In reply to this message
плюсую
тоже бы с удовольствием прочитал =)
SA
20:06
Sergey Andreev
Есть эксперты по поиску проектов под тон? Насколько сложно найти что-то нормальное?
СВ
20:08
Сергей В
не думаю что сегодня есть дофига предложений на рынке, сейчас тон в формате стартапа, кто хочет тот пробует что-то замутить на нем
А
20:09
Артем
понял, А есть те кто работает блокчейн разработчиком, или как это правильно называется?) Просто интересно как вообще искать работу в этой нише
V
20:10
Vyacheslav Flok
In reply to this message
Если понравилось, рекомендую игрушку shenzhen io
DP
20:10
Dmitriy P
In reply to this message
Вот такое работает; руками заменил c в конце на s и дописал runvmdict .s
"Asm.fif" include
// automatically generated from `/home/nixi/.config/toncli/func-libs/stdlib.func` `/home/nixi/work/Mini/ton/playground/one.fc`
PROGRAM{
DECLPROC main
main PROC:<{
//
1 PUSHINT // hello
s0 DUMP // hello
}>
}END>s
runvmdict .s
Осталось понять почему такое не получается сразу при выводе
20:11
In reply to this message
Переходи на GuixOS 😄
SA
20:12
Sergey Antonichev
In reply to this message
А я и не говорил, что этот опыт сам по себе мне был особенно приятен 🙂
Так что лучше останусь на макоси
20:13
In reply to this message
Спасибо
Гляну. Вдруг понравится =В
NM
20:24
Nikita Misharin
Фух, засабмитил. Всем спасибо. Было весело
20:25
Особенно @Narek 🙏
СВ
20:50
Сергей В
а есть простой способ из секретной фразы получить приватный ключ ?
ИК
21:04
Игорь Коняхин
Ничего себе сообщений поприбавилось!
Я думал тут контест обсуждают ближе к концу, а тут оказывается вообще независимые темы. Тут все всё прямо заранее сделали? :)
SA
21:05
Sergey Antonichev
In reply to this message
Ну я засабмитился часа 4 назад и просто решил перстать сочинять(и работать, наконец, работу =D)
ИК
21:05
Игорь Коняхин
Я успел сделать в пятой сборку мусора, но предварительные тесты показывали, что со сборкой мусора тратится больше газа, а дальнейшие тесты я провести не успел, так что я её в посылке закомментировал
21:06
In reply to this message
Разве можно участвовать в соревновании и не кранчить до последней минуты? 😅
SA
21:06
Sergey Antonichev
In reply to this message
Хехе
Я тоже сегодня переделывал сборку мусора =)
21:06
In reply to this message
Мне хватило кранча по ночам ;)
AP
21:07
Andrew Python
Ограничитель на 10 запросов сделали?
SA
21:08
Sergey Antonichev
Неа
Я подумал, что он нафиг не нужен
От этого количества запросов я оттолкнулся, чтобы сборщику правило сделать
21:09
типа 10 запросов пришло - можно коллектить
ИК
21:09
Игорь Коняхин
In reply to this message
Нет, не было времени + не понятно, как это газо-незатратно проверять. Я ограничился:
throw_if(78, valid_until > now() + 60);
SA
21:10
Sergey Antonichev
игнорим запросы, которые истекают больше, чем через минуту + 10 запросов в минуту
Так что, когда запросов в сумме(зааксепшеных) становится 10 - подбираем за собой
как-то так
21:10
In reply to this message
Есть ощущение, что газонезависимо этого не сделать ;)
SE
21:10
Scr Ezhik
Кто нибудь знает, будет разбор задач?
ИК
21:11
Игорь Коняхин
In reply to this message
Я открою свой репозиторий с решениями и тестами, когда разрешат
Y
21:11
Y
In reply to this message
забыл разкоментить строку с проверкой на время) примерно такую как раз
SE
21:11
Scr Ezhik
In reply to this message
Найс👌
SA
21:11
Sergey Antonichev
In reply to this message
Можно было попробовать разве что дешево сделать через упорядоченное хранение хвостовым списоком. Но тут тоже хитро надо делать, чтобы было упорядочено
Эффективно можно было сделать, как в задаче 4, но я решил, что хранить второй словарь для этого так себе польза
ИК
21:12
Игорь Коняхин
In reply to this message
Если, конечно, выяснится, что у меня всё норм
Иначе придётся всё удалить с позором
AP
21:12
Andrew Python
181 участник) думал будет меньше
ИК
21:13
Игорь Коняхин
Фига себе!
181 посылка!
От кого?
Я думал будет штук 10, максимум 20-30
Тут всего-то человек несколько что-то обсуждало. Где все тихо сидели?
ИК
21:13
Игорь Коняхин
?
🏆 TON Contests 07.04.2022 21:11:57
The TON Smart Challenge 1 is now over!

We received 181 submissions. Thanks to all participants.

The results will be next week.
SA
21:14
Sergey Antonichev
In reply to this message
Ну вот я вообще узнал об этом чате случайно только сегодня (спасибо @pyAndr3w кстати ) =)
Y
21:14
Y
есть причина почему невозможно дешево преобразовать билдер в слайс?
ИК
21:15
Игорь Коняхин
In reply to this message
Вот так и зарабатывается репутация
SA
21:15
Sergey Antonichev
In reply to this message
лол)
AK
21:15
Andrey Kravchenko
In reply to this message
Аналогично, пришлось в срочном порядке переделывать :)
SA
21:17
Sergey Antonichev
На самом деле здесь действительно много полезностей было
Например, формирование адресов - я кучу времени потратил на это, и в итоге сделал такое уродливое решение, что аж стыдно😅
Спасибо всем, кто помогал и делился знаниями
SA
21:19
Sergey Andreev
Кому-то кстати удалось собрать компилятор и ноду на m1?
21:19
Я пытался-пытался, но потом забил и пересел на винду)
SA
21:20
Sergey Antonichev
In reply to this message
Вот я так же сделал
только даже не пытался =D
ИК
21:20
Игорь Коняхин
Хотелось бы выразить благодарность всему чату за многократную помощь, боюсь всех поимённо перечислять, чтобы никого не забыть:) Без чата фиг бы я ушёл дальше первого задания. Как люди решали задания, не задавая вопросы, я не представляю!

Отдельное спасибо:
@tvorogme за toncli
@Narek за ton-contract-executor (это видимо самая недооценённая штука, которой мне стоило начать пользоваться раньше)
@andreypfau за плагин для IntelliJ
@dvlkv за плагин для VS Code
EP
21:21
Evgeniy Pronyagin
Друзья всем привет! Есть задача, готов заплатить.

Нужно сделать скрипт, из вдух методов:
1) В метод передается сид фраза, он генерит ключ от аккаунта
2) В метод передается адрес, сумма, memo, ключ, и он отправляет средства с кошелька на указаный адрес

Должно запускаться из консоли и возвращать инфу об успехе ил ошибку.

Пишите в личку кто готов сделать, и за сколько
SA
21:21
Sergey Antonichev
> ton-contract-executor
А можно тем, кто не вкурсе, про это поподробнее?))
АЩ
21:22
Алексей Щербаков
Да, тут не все с самого начала ))
AP
21:22
Andrew Python
In reply to this message
На каком яп? если я на паскале сделаю, ты ж никуда не прикостылишь
ИК
21:22
Игорь Коняхин
In reply to this message
Это чтобы писать тесты как белый человек, на TypeScript'е, а не на FunC
NM
21:22
Nikita Misharin
In reply to this message
Тесты на js позволяет писать
SA
21:22
Sergey Andreev
In reply to this message
На func)))
SA
21:22
Sergey Antonichev
О_О
Так можно было ?!
21:22
🥲
NM
21:22
Nikita Misharin
In reply to this message
У тебя в итоге на винде запустилось?
NA
21:22
Narek Abovyan
In reply to this message
😂
SA
21:23
Sergey Antonichev
А я сидел на func тесты писал =_____=
ИК
21:23
Игорь Коняхин
In reply to this message
@smartnik да ^
NA
21:23
Narek Abovyan
Я наверное соберу компайлер на wasm
OO
21:23
Oleg Oskolsky
In reply to this message
Гении обычно не часто пишут в чатах.
NA
21:23
Narek Abovyan
Чтобы можно было спокойно где угодно запускать вообще
EP
21:25
Evgeniy Pronyagin
In reply to this message
)) nodejs, pyton
NM
21:26
Nikita Misharin
In reply to this message
Можно будет посмотреть есть ли корреляция между сообщениями в чате и результатом
EP
21:26
Evgeniy Pronyagin
In reply to this message
А на фортране сможешь? 😂
ИК
21:26
Игорь Коняхин
In reply to this message
Мне кажется, у меня всех больше сообщений за время соревнования 😅
SA
21:26
Sergey Antonichev
In reply to this message
Сдалется мне, что тот, кто надежно может в фортран, вообще в принципе преисполнен дзеном
И в деньгах не нуждается
EP
21:27
Evgeniy Pronyagin
In reply to this message
100% )
ИК
21:27
Игорь Коняхин
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: invalid bag-of-cells last cell #3: end offset 147 is different from total data size 275
NM
21:27
Nikita Misharin
In reply to this message
Да
SA
21:28
Sergey Antonichev
Кто-то садился уже писать обычный код?
У меня одного теперь комменты начинаются везде с ;; ? =D
АТ
21:28
Андрей Турбин
In reply to this message
Алгол рулит!
SA
21:29
Sergey Andreev
In reply to this message
А ещё . и ~ перед вызовами)
ИК
21:29
Игорь Коняхин
In reply to this message
Кто-нибудь понял, почему Дурову захотелось именно `;;`для комментов?
Кажется очень странным
SA
21:29
Sergey Andreev
Бтв удобная штука
NA
21:29
Narek Abovyan
In reply to this message
Пока не понимаю откуда это честно говоря
АЩ
21:30
Алексей Щербаков
In reply to this message
Когда на кириллице пишешь получается жж
21:31
Deleted Account
In reply to this message
🐝
NF
21:34
Nik Fedorov
это значит мозги шевелятся
ИК
21:36
Игорь Коняхин
Я сейчас, кажется, начинаю понимать, что задачу 5 решил слишком "по олимпиадному", в стиле "n <= 100 000"
T
21:36
TON Дев Чат
In reply to this message
сериализация ячеек хромает, там под капотом тонвеб или от тонвейлсов либа?
NM
21:37
Nikita Misharin
In reply to this message
ton whales
ИК
21:44
Игорь Коняхин
In reply to this message
Давайте следующее соревнование на взлом TON-смарт-контрактов!

Я участвовал в CTF, где была секция по Ethereum, взломал все 5 заданий, по ходу многое узнал, и было очень весело:)

Большинство уязвимостей смарт-контрактов на Solidity к TON-у неприменимы, но наверняка найдутся и другие интересные!
NA
21:45
Narek Abovyan
In reply to this message
Тонвейлс
21:46
Кстати на днях поправили там багу при сериализации, надо в тонвеье тоже поправить
21:46
Короче невозможно бок собрать в котором больше 256 айтемов
T
21:50
TON Дев Чат
In reply to this message
Это уже в работе
NA
21:54
Narek Abovyan
Класс!
ИК
22:00
Игорь Коняхин
In reply to this message
Уже можно делиться решениями или пока ещё нет?
AR
22:12
Alexander Ruliov
In reply to this message
Не вижу в правилах запрета делиться решениями и во время проведения)
Р
22:15
Русский TON
Друзья! Поздравляем всех участников TON Smart Challenge с завершением конкурса.

Если среди вас есть желающие продолжить развитие экосистемы TON и принять участие в разработке масштабных продуктов и сервисов — напишите нам в @faqbot.

Среди наших проектов: Валидатор ton.cat, эксплорер tonscan.org, @RichCatsNFT и многие другие.

Интересные и нетривиальные задачи, свободный график и лучше условия.

🐱
P
22:37
Placeholder
Использовал ли кто-нибудь valid_until как префикс ключа словаря в 4, чтобы удаление оптимизировать, типа? Мне зашла в голову такая шальная мысль, но я ее отбросил. Но может, кто-то попробовал?
AT
22:37
Andrey Tvorozhkov
In reply to this message
😂
ИК
22:37
Игорь Коняхин
In reply to this message
Я так делал
TP
22:37
Tim Pavlov
In reply to this message
да, я так сделал
ИК
22:37
Игорь Коняхин
Я лох
TP
22:37
Tim Pavlov
реально работает
22:37
-2000 газа
22:37
за фильтрацию трех значений
22:38
с 4 значениями уже -3к
22:38
вообще
ИК
22:38
Игорь Коняхин
In reply to this message
Вот я как раз об этом и вспоминал, когда писал, что решил "по олимпиадному" ^
22:39
При 500+ транзакциях в базе контракта се равно оказалось выгоднее ничего не выкидывать
TP
22:40
Tim Pavlov
всмысле? не убирать значения?
AP
22:40
Andrew Python
In reply to this message
Это которые "non-fixed length keys"? Или я не понял
TP
22:41
Tim Pavlov
In reply to this message
не, как я понял имеется в виду фиксированую дату использовать
ИК
22:41
Игорь Коняхин
In reply to this message
Не, просто фиксированные 32 бита valid_until использовать как первый ключ для базы данных
TP
22:41
Tim Pavlov
а с non-fixed length key я так и не понял прикола, уже не хватило времени разобрать
AP
22:42
Andrew Python
In reply to this message
🤔
22:42
Фулл код бы посмотреть
ИК
22:43
Игорь Коняхин
In reply to this message
Да, я прямо намерено добавил в тестах "успешные вбросы" чтобы базу заполнить, но чё-то чистка оказывалась слишком дорогой, либо у меня какая-то скрытая лажа в решении/тестах
TP
22:44
Tim Pavlov
я вообще потом захотел бинарно поделить время, чтобы сделать SubDict примитив, но там надо было много додумывать решение
22:45
идеей было преобразовать 64 битное время в 40 битное представление: каждую цифру можно было бы представить как отдельное число и сделать по ним фильтрацию легко
22:45
можно было бы добавить что-то типа "время последней чистки"
22:45
и вычислить базовый ключ, из него взять SubDict
22:45
но мороки много
22:45
и бинарные операции очень дорогие
АЩ
22:47
Алексей Щербаков
Как вы все это тестировать собираетесь? Текущас схема тестирования - прям адская боль, т.к. языку не хватает дополнительных примитивов даже для того чтобы адрес сформировать без танцев с бубном
22:48
Я вот попробовал и проклял компилятор за пробелы
TP
22:49
Tim Pavlov
In reply to this message
для четвертого задания адреса не нужны были, но и я поздно узнал про get_prev_c4)
22:51
кстати, только что заметил, что у меня в объявлении recv_external в возвращаемом типе стоит не (), а ()) ...
22:51
как думаете, проверяющие не придерутся?
22:51
или минус задание можно считать?)
АЩ
22:51
Алексей Щербаков
Да, примеров и документации явно не хватает.
Некоторые вещи приходилось искать так
TP
22:52
Tim Pavlov
все равно тесты очень помогли, если бы не они, руками было бы очень тяжело все проверять
AP
22:52
Andrew Python
In reply to this message
Тесты работают? Тогда всё норм
TP
22:52
Tim Pavlov
они работали, но я потом немного подчищал и видимо случайно нажал)
AP
22:52
Andrew Python
Хотя говорили не трогать входящие и отдаваемые данные
TP
22:52
Tim Pavlov
там прям будет ошибка компиляции, тк по сути неверный синтаксис
22:53
In reply to this message
я просто потестировал через ton-contract-executor, а он не возвращает c4, он работает только с возвращаемыми значениями
22:53
и я постоянно менял с () на (cell)
22:53
чтобы потестить
22:53
и видимо в один раз мистайпнул)
AP
22:54
Andrew Python
Жалко если минус задание
АЩ
22:54
Алексей Щербаков
А я 5-ый слишком поздно начал делать и не успел
TP
22:54
Tim Pavlov
реально жалко, очень много потратил времени
АЩ
22:54
Алексей Щербаков
Первые 4 делались прям на тестах
22:54
А 5-ый для тестов не хватало возможностей
TP
22:56
Tim Pavlov
In reply to this message
очень тяжело было с тестами к 5 из-за ключей и подписей генерировать кейсы
ИК
22:56
Игорь Коняхин
In reply to this message
Не понял, твою проблему
Я ничего никогда не менял
TP
22:56
Tim Pavlov
чтобы при этом тело было одинаковым, то есть сам хэш, но пара ключей разная
22:56
In reply to this message
я когда принимал с invokeGetMethod результат - он просил именно чтобы был возврат
АЩ
22:56
Алексей Щербаков
In reply to this message
На func такого не было, а еще с чем-то разбираться уже времени нету
TP
22:56
Tim Pavlov
наверное в этом и проблема)
22:57
я не слал external message
22:57
я делал invokeGetMethod
22:57
и поэтому приходилось менять
22:57
потому что я сам строил тело сообщения
ИК
22:57
Игорь Коняхин
In reply to this message
Так там же в задании по умолчанию с возвратом:
cell pack_data(int public_key1, int public_key2)
TP
22:57
Tim Pavlov
это да, а вот recv_external там ()
22:57
и contract-executor ругался на это
22:57
когда я хотел прочитать результат функции
22:58
потому что он был undefined
АЩ
22:59
Алексей Щербаков
Вобщем для тестов нужно что-то еще + какой-то механизм отладки
TP
23:00
Tim Pavlov
мне кажется func в принципе не очень хорошо подходит для тестов, ведь там функционал специально для смарт контрактов
23:00
и типа писать тесты, где нужен внешний функционал, типа генерация пары ключей и подписи - он под это просто не заточен
АЩ
23:00
Алексей Щербаков
In reply to this message
Да у него нет дополняющих примитивов
TP
23:00
Tim Pavlov
и ton-contract-executor помог в 5 задании
АЩ
23:00
Алексей Щербаков
Проверку подписи сделать можно, а подписать нет
TP
23:01
Tim Pavlov
тк там js и можно подключить либы какие угодно
ИК
23:01
Игорь Коняхин
In reply to this message
И в 4-ом, и вообще помог бы везде, если бы я раньше начал его использовать:)
TP
23:01
Tim Pavlov
тем не менее, @tvorogme, спасибо большое за возможность тестировать код)
EP
23:04
Evgeniy Pronyagin
Ктонибудь знает как сгенерить себе красивый адрес кошелька?
23:05
Deleted Account
In reply to this message
NA
23:06
In reply to this message
Это супер долго будет работать
23:07
Deleted Account
In reply to this message
Да, это правда
AR
23:11
Alexander Ruliov
Может ли контракт прочитать данные другого контракта?
NA
23:12
Narek Abovyan
Нет
АЩ
23:12
Алексей Щербаков
In reply to this message
А зачем такое может понадобится?
ИК
23:13
Игорь Коняхин
Чтобы не слать сообщения запросы-ответы туда-сюда
EP
23:14
Evgeniy Pronyagin
In reply to this message
пасиб!
AR
23:14
Alexander Ruliov
In reply to this message
Ну вот хочу я, например, продать доступ к своему контракту, у которого есть обработчик, который записывает себе в данные ключ его нового владельца, после чего я теряю доступ.

Для этого я мог бы сделать контракт, куда покупатель шлёт монеты, а контракт перечисляет их мне только если за час видит, что там теперь новый владелец и это покупатель, иначе возвращает обратно.
23:15
А иначе я не могу никак без посредника секюрно такой доступ передать, ну либо не придумал)
EP
23:15
Evgeniy Pronyagin
In reply to this message
🙏
АЩ
23:16
Алексей Щербаков
In reply to this message
А зачем вам передавать доступ если вы можете создать новый смартконтракт?
23:17
И наконец самое важное - зачем всю логику пихать инчейн?
AR
23:18
Alexander Ruliov
In reply to this message
За тем же, почему нельзя новый NFT такой же создать. Вдруг там тот самый ну очень красивый vanity адрес :)
23:20
In reply to this message
Чтобы посредник продажи не мог уйти и с монетами и с ассетами, либо покупатель остаться без монет.
АЩ
23:21
Алексей Щербаков
In reply to this message
За эту возможность вы и платите транзакционными издержками - бесплатный сыр только в мышеловке
EP
23:21
Evgeniy Pronyagin
In reply to this message
мм посмотрел, для v4 еще нет реализации
NA
23:22
Narek Abovyan
Чего, оно для чего угодно вообще
AR
23:31
Alexander Ruliov
О, ведь даже имея приватный ключ контракта, если у контракта нет такого обработчика внешних сообщений, которое заставило бы его отправить определённое внутреннее, от его адреса любых внутренних сообщений нельзя отправить?

Тогда нормально, передать доступ к другому контракту, который поддерживает такую передачу можно :), продающий контракт будет ждать вполне определённого сообщения с нужного адреса и если оно пришло, значит доступ передан.

*ушёл майнить адреса*
23:33
Хмм, всё равно вопрос. Когда сообщение отправляешь, там любой исходящий адрес можно подставить. Он ведь в итоге всё равно устанавливается на адрес отправителя, нельзя подделывать исходящие адреса?
ИК
23:37
Игорь Коняхин
In reply to this message
В TON у контрактов нет встроенных приватных ключей.
Поддержка шифрования с открытым ключом закладывается на уровне кодов конкретных контрактов.
AR
23:38
Alexander Ruliov
In reply to this message
Оооо, вообще хорошо, спасибо.
AT
23:39
Andrey Tvorozhkov
In reply to this message
Если говорить про реальную жизнь, это не частый юзкейс
23:39
Проверять подписи
23:39
Основная идея, что ты юзаешь интерналы
23:39
А там ты адресу доверяешь
ИК
23:40
Игорь Коняхин
In reply to this message
> которое заставило бы его отправить определённое внутреннее, от его адреса любых внутренних сообщений нельзя отправить?
Нельзя
Только то, что написано в коде
AT
23:43
Andrey Tvorozhkov
In reply to this message
Кстати, еще когда будет какой-нибудь stdlibtest все будет в 600 раз проще чем на конкурсе
23:43
Базовых функций действительно нехватало (ну долго просто их писать)
TP
23:43
Tim Pavlov
In reply to this message
было бы круто
AT
23:43
Andrey Tvorozhkov
С другой стороны было оч много времени
AP
23:44
Andrey Pfau
если мне будет совсем нефиг делать я портирую https://github.com/andreypfau/curve25519-kotlin
и сделаю curve25519-func
SK
23:44
Steve Korshakov
зачем?
AP
23:44
Andrey Pfau
для тестов же
23:44
ввыше написали
23:45
что приватники нельзя генерить встроенными средствами
SK
23:45
Steve Korshakov
приватник потому что это любая последовательность цифр
ИК
23:45
Игорь Коняхин
Честно говоря, пока сам FunC, как язык, такой ограниченный, тесты на нём, пусть и с большей библиотекой функций, будут очень сильно проигрывать тестам на нормальном языке программирования
TP
23:45
Tim Pavlov
In reply to this message
блин, а есть же rand в func, это возможно
AP
23:45
Andrey Pfau
он есть
AT
23:46
Andrey Tvorozhkov
In reply to this message
Имхо это не так
SK
23:46
Steve Korshakov
слышу знакомые возгласы что кто-то хочет писать тесты на фанке
SA
23:46
Sergey Antonichev
In reply to this message
+
AK
23:56
Andrey Kravchenko
In reply to this message
Еще бы инструкцию как задеплоить найденный адрес 😊
SA
23:59
Sergey Antonichev
In reply to this message
В этом вопросе скорее интересно, кто как решал вопрос с заменой значения
8 April 2022
TP
00:00
Tim Pavlov
In reply to this message
Я не делал удаление, совпадения заносил в новый словарь, показалось что так быстрее
SA
00:00
Sergey Antonichev
In reply to this message
Когда тебе в тот же ключ нужно записать другое value
При этом ведь еще и valid_until может прийти другой
TP
00:00
Tim Pavlov
Но у меня не было тестов с большим объемом данных
00:01
In reply to this message
О, для совпадений в valid_until я добавил seqno
00:01
Получается ключ у всех все равно разный
00:01
Даже если в одно время пришли
SA
00:04
Sergey Antonichev
In reply to this message
У меня получилось так, что две записи в словаре с valid_until могли указывать на один и тот же ключ в словаре данных
Поэтому прикручивал к данным еще и valid_until и при чистке проверял, совпадают они или нет
Хотя сейчас понимаю, что можно было дешевле сделать по данным, если бы реализовал что-то вроде счетчика ссылок 🥲
ИК
00:09
Игорь Коняхин
Я не понимаю, о чём вы говорите:)
У меня словарь словарей
Первый словарь по valid_until
Второй (вложенный) словарь по хешу
SA
00:09
Sergey Antonichev
In reply to this message
Мы про 4 таск
А ты видимо про 5
00:12
In reply to this message
Если же ты тоже про 4, то хотелось бы твоё решение чуть приоткрыть
Потому что пока не выкупаю фишки 😅
ИК
00:14
Игорь Коняхин
Ну у меня в четвёртом почти оригинальное решение, только один словарь со значением valid_until+payload вместо двух отдельных как было изначально
SA
00:15
Sergey Antonichev
In reply to this message
Прогуливаешься по всем значениям во время очистки?
ИК
00:16
Игорь Коняхин
Да
00:16
Ну у меня сутки назад ещё была не начата 5-ая задача, так что были другие приоритеты
00:18
На самом деле и мыслей как-то не возникло
Когда пишешь с чистого листа, как 5ую, легче свободно думать
SA
00:25
Sergey Antonichev
In reply to this message
То есть у тебя на каждое принятое сообщение получается два лукапа по словарю, верно?
ИК
00:26
Игорь Коняхин
В 5-ой или 4-ой?
SA
00:27
Sergey Antonichev
В 5
ИК
00:28
Игорь Коняхин
Да
Всегда два чтения и две записи
SA
00:32
Sergey Antonichev
Понял, спасибо
AP
00:40
Andrew Python
In reply to this message
Тоже самое 😅 "оригинально" получилось
Р
09:14
Русский TON
Друзья! Поздравляем всех участников TON Smart Challenge с завершением конкурса.

Если среди вас есть желающие продолжить развитие экосистемы TON и принять участие в разработке масштабных продуктов и сервисов — напишите нам в @faqbot.

Среди наших проектов: Валидатор ton.cat, эксплорер tonscan.org, @RichCatsNFT и многие другие.

Интересные и нетривиальные задачи, свободный график и лучше условия.

🐱
AP
09:16
Andrey Pfau
Найс подбор сотрудников
x
09:49
xxffwwoqqzz
Интересно, а можно использовать метамаск в качестве кошелька для TON? 🤔
SA
09:51
Sergey Andreev
In reply to this message
Я думаю, нет. Тон же не евм- совместимый
x
09:59
xxffwwoqqzz
In reply to this message
Так вот почему можно так много сетей разных использовать в нём, но не, например, солану. Я думал, что там любая сеть подходит. Спасибо
AT
10:58
Andrey Tvorozhkov
In reply to this message
Так он rpc юзает
10:59
Какая разница evm / tvm
x
11:10
xxffwwoqqzz
In reply to this message
Вероятно, что в вызове методов смарт-контрактов/отправке транзакции и т.д. Например, нашел пару вопросов про Solana и Metamask. Solana не может быть в метамаске, по той причине, что метамаск работает только с EVM совместимыми штуками
AT
11:12
Andrey Tvorozhkov
In reply to this message
🤔
11:12
Кажется если ты юзаешь RPC тебе все равно
11:12
Но мб там подписи по умному сделаны
11:13
Короче добавить тон в меамаск это решаемая задача. Не знаю примут ли PR, но технически это возможно
SA
11:22
Sergey Andreev
In reply to this message
вопрос был скорее о том, можно ли в текущей версии мм добавить тон в сети
AT
11:27
Andrey Tvorozhkov
In reply to this message
А, я видимо не понял. Но нет
11:27
на самом деле тон экстеншн круче
11:27
Как и всё в тоне))
11:28
Там чисто ванильный js и всё прям по красоте
NN
11:28
Nick Nekilov
In reply to this message
кек
AT
11:28
Andrey Tvorozhkov
Спасибо @tolyayanot за это
11:28
In reply to this message
Ну, не такой популярный и расхайпеный
11:28
Но всё впереди)
VP
11:29
Vlad Parabellum
Здравствуйте, подскажите на тоне есть мем токены? А кросс-чейны?
SA
11:30
Sergey Andreev
In reply to this message
а в тоне есть что-то типа ерс20? По идее в func все для этого есть
x
11:44
xxffwwoqqzz
In reply to this message
к стати, про тон екстеншин, сейчас есть какой-то способ залогиниться в приложении через тон екстеншин, как через, например, метамаск?
AT
11:45
Andrey Tvorozhkov
In reply to this message
11:45
уже 2 недели как можно :)
x
11:49
xxffwwoqqzz
In reply to this message
обалдеть 🔥
11:49
In reply to this message
спасибо!)
AP
12:57
Andrey Pfau
понимаю
ИМ
13:03
Илья Михеев
In reply to this message
так ссылка может еще в виде nft?
AP
13:04
Andrey Pfau
In reply to this message
🥲
АЩ
13:08
Алексей Щербаков
Так можно рекурсивно продавать
AR
14:05
Alexander Ruliov
In reply to this message
Оно то есть, но стандарт похоже усложнить придётся, чтобы комиссии за сторадж требовать с владельцев токенов, если таки захочется в одном контракте хранить данные о всех владельцах)
VC
14:12
Vadim Chepel
Всем привет!
подскажите, в тон возможно выпустить свою крипту? где можно информацию об этом посмотреть (я не разраб, в гитхабе ниче не пойму))
ИМ
14:13
Илья Михеев
In reply to this message
думаю для выпуска крипты надо стать разрабом
AP
14:14
Andrey Pfau
In reply to this message
можешь токен выпустить в сети ТОН, пользы больше будет
14:14
хотя это тоже сомнительно
VC
14:15
Vadim Chepel
возможно не так сформулировал - я и имею ввиду - возможно ли выпустить свои токены проекту в сети тон?
AP
14:16
Andrey Pfau
да
VC
14:16
Vadim Chepel
In reply to this message
а в чем сомнение?)
14:17
In reply to this message
подскажи плиз где информацию взять?
NM
14:25
Nikita Misharin
Нашел только вот это https://github.com/cod1ng-studio/TRC20
Не знаю кстати насколько это реально стандарт
VE
14:29
V E
In reply to this message
вот же пример стандарта жетонов https://github.com/ton-blockchain/token-contract/tree/main/ft
NM
14:36
Nikita Misharin
In reply to this message
Ну я надеялся что меня как раз поправят, если что, спасибо
VC
14:37
Vadim Chepel
Спасибо за информацию)
VE
14:41
V E
In reply to this message
https://github.com/ton-blockchain/TIPs/issues/74
а тут описание стандарта
NM
14:42
Nikita Misharin
In reply to this message
Спасибо 👍
AP
16:07
Andrey Pfau
накотил получение блока из сети в реальном времени на чистом котлине без тонцентра/нативных либ
SK
16:08
Steve Korshakov
In reply to this message
подписка или пулинг?
AP
16:08
Andrey Pfau
там же для получения блока функция:
liteServer.getMasterchainInfo = liteServer.MasterchainInfo;
16:08
я по кд получаю результат
SK
16:09
Steve Korshakov
так подписка или пулинг?
AP
16:09
Andrey Pfau
    var lastBlock: LiteServerMasterchainInfo? = null
while (isActive) {
val currentBlock = liteClient.getMasterchainInfo()
if (currentBlock != lastBlock) {
lastBlock = currentBlock
println("[${Instant.now()}] $currentBlock")
}
delay(1000)
}
SK
16:09
Steve Korshakov
ну да пулинг
AP
16:10
Andrey Pfau
ну а о какой подписке речь идёт если я уже тебе ответ на вопрос дал
16:10
In reply to this message
что там просто функция
SK
16:10
Steve Korshakov
ну вообще лайтклиент вроде как стримает изменения
16:10
и умеет их трекать
16:10
но функции снаружи нет да
ИК
18:53
Игорь Коняхин
Есть какой-нибудь простой интерфейс кошелька типа
https://wallet.ton.org/
но для тестовой сети?
AR
18:55
Alexander Ruliov
In reply to this message
ИК
18:55
Игорь Коняхин
In reply to this message
О, прекрасно, спасибо!
Я пробовал test.wallet.ton.org
AR
19:13
Alexander Ruliov
Можно ли в рантайме узнать глубину стека, либо узнать, пуст ли стек?
И
19:14
Иван
size?
AR
19:15
Alexander Ruliov
О, DEPTH есть, прекрасно.

Хочу попробовать таки научиться дёргать выполнение контракта, а после его выполнения костыльным инспектором напечатать весь стек, все клетки, все регистры, а потом весь этот вывод попарсить джаваскриптом, лол.
F
19:47
F
In reply to this message
Выглядит красиво)
А можно на код глянуть или пока секрет?)
AP
19:48
Andrey Pfau
на гитхабе у меня
19:50
я пока ещё делаю, но залил предварительный код
19:50
я хочу блокчейн эксплорер сделать в IDE прям
19:51
вот тут код глянуть можно
NA
19:52
Narek Abovyan
In reply to this message
Жесть, зачем?
AR
19:53
Alexander Ruliov
In reply to this message
Там выше кто-то эксплорер в IDE хочет, а я хочу тесты на js писать, а не на func)
SK
19:54
Steve Korshakov
In reply to this message
Тык уже все есть
NA
19:54
Narek Abovyan
охх
19:54
Пользуйтесь
F
19:54
F
In reply to this message
Спасибо)
AR
19:57
Alexander Ruliov
In reply to this message
$ node main.js 
/bin/sh: 1: /home/ruliov/projects/ton/ton-contract-executor-example/node_modules/ton-compiler/bin/macos/func: Exec format error
/home/ruliov/projects/ton/ton-contract-executor-example/node_modules/ton-contract-executor/dist/vm-exec/vm-exec.js:147
throw ex;
^

Error: Command failed: /home/ruliov/projects/ton/ton-contract-executor-example/node_modules/ton-compiler/bin/macos/func -PS -o /tmp/tmp-20936-KPp4q2QVJzRN /home/ruliov/projects/ton/ton-contract-executor-example/node_modules/ton-compiler/funclib/stdlib.fc /tmp/tmp-20936-hHJBbyc3rsIl
at checkExecSyncError (child_process.js:616:11)
at Object.execSync (child_process.js:652:15)
19:57
Попользовался))
19:58
... причём я сейчас на убунте, а не на макоси =/
NA
19:58
Narek Abovyan
Я скоро компайлер тоже под wasm соберу и проблем не будет
19:58
А так - можно ему напрямую ячейку с кодом и данными передавать
19:58
Тогда проблем не будет
SK
20:17
Steve Korshakov
In reply to this message
Может его облачным сделать? Тогда будет верификация сразу
NA
20:18
Narek Abovyan
Да можн
P
21:31
Pepeg
https://github.com/newton-blockchain/ton/blob/master/crypto/smartcont/stdlib.fc
А почему здесь некоторые функции закомменчены?
Заметил, когда в идее автокомплит настраивал 🤔
AP
21:33
Andrey Pfau
In reply to this message
У этих функций есть оптимизация на уровне компилятора, поэтому они по умолчанию уже есть
ИК
21:48
Игорь Коняхин
Решения всех 5 заданий с тестами
https://github.com/nns2009/TON-FunC-contest-1

Решения в папке func
Тесты toncli (задачи 1, 2, 3) - в папке tests
Тесты на TypeScript (задачи 1, 4, 5) - в папке js
21:48
In reply to this message
SK
21:49
Steve Korshakov
In reply to this message
рекомендую просто Jest юзать для тестов
21:49
там красиво можно и снапшоты делать и тд
AT
21:49
Andrey Tvorozhkov
In reply to this message
А зачем в 4 тесты на js?
ИК
21:50
Игорь Коняхин
А как ещё просто тестировать десятки тысяч добавлений и запросов?
AT
21:50
Andrey Tvorozhkov
🧐
ИК
21:50
Игорь Коняхин
Тут опять же: если бы раньше открыл для себя ton-contract-executor, то у меня на JS были бы вообще все тесты
AT
21:51
Andrey Tvorozhkov
In reply to this message
Ну у тебя в коде же рандома нет, каждый процесс занимает одинаковое кол-во шагов
SK
21:51
Steve Korshakov
а при чем тут тесты и рандом?
AT
21:52
Andrey Tvorozhkov
In reply to this message
Кажется 1 тест или 3к тестов - не очень важно
21:52
В данной ситуации
ИК
21:52
Игорь Коняхин
Вот, например, как выглядит запуск тестов для первой задачи:
await testGet();
await testAdd(7);
await testAdd(20);
await testShort(40, 31);
await testAdd(103);
await testAdd(4009);
await testGet();
await testAdd(50003);
await testAdd(600600);
await testGet();
await testAdd(7000004);
await testAdd(80000003);
await testShort(20, 7);
await testAdd(900000002);
await testGet();
await testShort(0, 1);


В toncli на каждую такую отдельную короткую строчку пришлось бы написать 6 длинных
AT
21:53
Andrey Tvorozhkov
Короче непонятно зачем. Я верю, что нужно уметь строить DAG из тестов при чем использую с5 и разные контракты
SK
21:54
Steve Korshakov
а в фанке можно будет сделать toMatchInlineSnapshot?
21:54
когда запуск теста автоматом вставляет тебе прямо в код нужный снапшот?
AT
21:54
Andrey Tvorozhkov
In reply to this message
Это в разработке сейчас (история со снапшотами)
NA
21:55
Narek Abovyan
In reply to this message
Причем тут DAG?
AT
21:55
Andrey Tvorozhkov
In reply to this message
Ну у тебя граф сообщений
21:55
Между контрактами
21:55
Хочется проверять не один смарт
21:55
А всё сразу
SK
21:55
Steve Korshakov
это разные тесты - один юнит другой интеграционный
AT
21:55
Andrey Tvorozhkov
In reply to this message
д
NA
21:56
Narek Abovyan
In reply to this message
Я слабо понимаю как вы тестируете в func получение сообщений
ИК
21:56
Игорь Коняхин
@tvorogme

Вот так выглядит запуск теста на toncli:
[int, tuple, cell, tuple, int] test_example_data() method_id(1000) {
return add_message_test(10, 32, 0);
}
_ test_example(int exit_code, cell data, tuple stack, cell actions, int gas) method_id(1001) {
add_message_check(exit_code, data, 10);
}


А вот так ровно того же теста на JavaScript'е:
await testAdd(10);


Есть разница? :)
NA
21:56
Narek Abovyan
Прямо cell builder-ом собираете сообщение?
21:57
А если я хочу сообщение от рандомного адреса потестить например
SK
21:57
Steve Korshakov
In reply to this message
ну на тайпскрипте +- тоже самое было бы
NA
21:57
Narek Abovyan
Да, но там хоть строчки есть, примитивы для адресов, etc
21:57
А если в контракте ключики есть?
SK
21:57
Steve Korshakov
ну хотя да
ИК
21:57
Игорь Коняхин
In reply to this message
Отличие в том, что на JS уже есть библиотека, которая базовые вещи составляет
АЩ
21:57
Алексей Щербаков
In reply to this message
Никак. Я например проверял что у меня есть два cell ref в случае отправки и 0 в случае не отправки
21:58
За реальный такой юнит тест я бы руки оторвал на ревью 🤣
NA
21:58
Narek Abovyan
А исходящие сообщения можно тестировать в func?
SK
21:58
Steve Korshakov
имхо тестирование func внутри func несет еще риск баги в компиляторе
ИК
21:58
Игорь Коняхин
In reply to this message
Да, но нужно actions руками распаршивать
Я намучался, но преуспел
АЩ
21:59
Алексей Щербаков
In reply to this message
В теории да, но на практике без отладчика и визуализатора cell’ов с ума сойдешь
SK
21:59
Steve Korshakov
уже несколько раз сталкивался что страныне вещи происходят
NA
21:59
Narek Abovyan
In reply to this message
прямо в функе?
21:59
жесть какая-то
АЩ
21:59
Алексей Щербаков
In reply to this message
Это что такое
AT
21:59
Andrey Tvorozhkov
In reply to this message
Странные вещи отлавливаются и фиксятся
21:59
В целом все работает как надо
SK
21:59
Steve Korshakov
In reply to this message
AT
21:59
Andrey Tvorozhkov
In reply to this message
Да
NA
21:59
Narek Abovyan
In reply to this message
Каким образом?
AT
21:59
Andrey Tvorozhkov
Можно тестировать всё c5 / c7 / c4
22:00
И крутить вертеть
22:00
In reply to this message
с5
SK
22:00
Steve Korshakov
In reply to this message
там исходящее просто записывается в регистр
ИК
22:00
Игорь Коняхин
In reply to this message
Да
(int, cell) extract_single_message(cell actions) impure inline method_id {
;; ---------------- Parse actions list
;; prev:^(OutList n)
;; #0ec3c86d
;; mode:(## 8)
;; out_msg:^(MessageRelaxed Any)
;; = OutList (n + 1);
slice cs = actions.begin_parse();
throw_unless(1010, cs.slice_refs() == 2);

cell prev_actions = cs~load_ref();
throw_unless(1011, prev_actions.cell_empty?());

int action_type = cs~load_uint(32);
throw_unless(1013, action_type == 0x0ec3c86d);

int msg_mode = cs~load_uint(8);
throw_unless(1015, msg_mode == 64); ;; !!! check msg_mode

cell msg = cs~load_ref();
throw_unless(1017, cs.slice_empty?());

return (msg_mode, msg);
}


Можно менее громоздко, используя много примитивов, которые я написал, но это старый код
NA
22:00
Narek Abovyan
понятно, ладно
АЩ
22:00
Алексей Щербаков
In reply to this message
Ну не все джаваскрипт программисты.
Мне бы удобнее было бы на java юнит тесты писать
22:01
Более того там и отладчик есть
SK
22:01
Steve Korshakov
In reply to this message
jest кажется самое простое что есть для юниттестов, в джаве даже и не снилась такая простота
AT
22:01
Andrey Tvorozhkov
In reply to this message
Да все нормально там
22:01
In reply to this message
Вот пример
22:01
Просто либы нужно сделать
AP
22:01
Andrey Pfau
In reply to this message
ты то на джаве хоть видел как юнит тесты делаются?)
22:01
там аналогично
АЩ
22:02
Алексей Щербаков
In reply to this message
Да, иначе это конечно жесть полная
SK
22:02
Steve Korshakov
ну что может быть проще чем
`
descrive('test', () =>{
it('should 2+2', () => {
...
});
));
`
AT
22:02
Andrey Tvorozhkov
In reply to this message
Согл, тяжеловато
22:02
С другой стороны было много времени :)
22:02
Систему тестов всю я написал за 3-4 дня
АЩ
22:02
Алексей Щербаков
Я еще задачи вечерами после работы делал - так это вообще адски
AT
22:03
Andrey Tvorozhkov
+ 2 дня на исправления и улучшения позже
ИК
22:03
Игорь Коняхин
In reply to this message
А я, кстати, так и не понял: ты из организаторов или участников? :)
P
22:03
Pepeg
Every program must have a function with id 0, that is main or recv_internal function.
main функция в каком случае вообще используется? Я так понимаю как standalone приложение
АЩ
22:04
Алексей Щербаков
In reply to this message
Кто-нибудь ведь напишет да
P
22:04
Pepeg
И кто-то книжку про фифт скидывал, а я теперь найти ее не могу, можете поделиться еще раз 😁
A
22:05
Andrei
In reply to this message
Вы можете вместо recv_internal выбрать имя main, ничего не изменится. Но вообще да, main обычно не для контрактов, а для каких-то других приложений (на ум кроме экспериментов/тестов ничего не приходит)
AP
22:06
Andrey Pfau
In reply to this message
@Test
void test2plus2() {
// ...
}
22:06
так на джаве
SK
22:06
Steve Korshakov
ты забыл public static final class =)
AP
22:07
Andrey Pfau
это не нужно
АЩ
22:07
Алексей Щербаков
In reply to this message
Кстати а джавовских тестов не планируется?
AP
22:07
Andrey Pfau
в плане?
АЩ
22:07
Алексей Щербаков
Я не только для себя прошу
P
22:07
Pepeg
In reply to this message
Спасибо
АЩ
22:08
Алексей Щербаков
У ton есть апи для джавы
AP
22:08
Andrey Pfau
ну делайте тесты на джаве, кто мешает
АЩ
22:08
Алексей Щербаков
Вот если бы было апи для запуска смарт-контрактов на джаве - это автоматически дало возможность запускать юнит-тесты
ИК
22:08
Игорь Коняхин
In reply to this message
AP
22:09
Andrey Pfau
In reply to this message
а, в этом плане
22:09
ну это в процессе
P
22:09
Pepeg
In reply to this message
И вам спасибо 👍🏻
22:09
только не совсем джава, а котлин, но из под джавы тоже можно будет вызывать
АЩ
22:10
Алексей Щербаков
In reply to this message
Ну да, это же как бы по сути даст универсальный интерфейс к виртуальной машине и как следствие возможность многие вещи сделать более логичными
AP
22:11
Andrey Pfau
в далёком будущем если мне совсем скучно будет у меня есть желание переписать вм под котлин для таких нужд)
22:11
мы сейчас не говорим о целесобразности, это просто моя хотелка
АЩ
22:11
Алексей Щербаков
Понятно
EP
22:40
Evgeniy Pronyagin
Подскажите плиз, сеть тон берет какое-то fee с входщей транзакции? с исходящей все понятно. а вот с входящей не очень. Есть некое fwd_fee в in_msg.
Спрашиваю потому что не могу добиться того чтобы сходился баланс по всем транзакциям в кошельке у меня и в блокчейне.
Делаю сумму входящих транзакций - сумму исходящих - storage_fee - other_fee
Но цифры не сходятся полностью
SK
22:40
Steve Korshakov
разберешься - расскажешь, в тоне куча разных фи
EP
22:40
Evgeniy Pronyagin
кайф )
ИК
22:48
Игорь Коняхин
В ТОНе возможно совершить транзакцию, имея только приватный ключ?
(без публичного ключа, а также без адреса отправителя)
AP
22:51
Andrey Pfau
In reply to this message
по приватнику можно публичный сгенерировать
ИК
22:53
Игорь Коняхин
Хорошо
Попробую найти, как это делается в tonweb
P
23:06
Pepeg
В func можно как-то разделить код на файлы?
func --help ничего такого нет, но есть в fift --help флаг -L
AT
23:06
Andrey Tvorozhkov
In reply to this message
Да
23:06
В тонкли просто указываешь порядок файлов в yml
23:06
В команде - просто несколько файлов передаешь
23:06
Последовательность роляет
P
23:07
Pepeg
In reply to this message
окей, спасибо
9 April 2022
ИК
00:00
Игорь Коняхин
In reply to this message
Оказалось, что можно сделать это вот так:
import nacl from 'tweetnacl';
const keyPair = nacl.sign.keyPair.fromSecretKey(secretKey)


а потом оказалось, что публичный ключ - просто вторая половина приватного 😅
AP
00:01
Andrey Pfau
Ну так правильно
00:02
Ты по приватному ключу сгенерировал пару
00:02
Приват-публичный
00:02
И достал публичный из пары
ИК
00:02
Игорь Коняхин
А можно было сделать просто: secretKey.slice(32)
AP
00:05
Andrey Pfau
In reply to this message
Приватный ключ всего 32 байта длиной, ты видимо что-то не то достал
SK
00:05
Steve Korshakov
разные представления, иногда он есть а иногда его нет
ИК
00:06
Игорь Коняхин
In reply to this message
Я доставал:
const keyPair = await tonMnemonic.mnemonicToKeyPair(mnemonic);
keyPair.secretKey

и оно даёт 64 байта
АЩ
00:06
Алексей Щербаков
In reply to this message
Ну если посмотреть исходники - там же по-другому:
Открытый из приватного получается через crypto_scalarmult_base
00:07
In reply to this message
Это же внутреннее представление
SK
00:07
Steve Korshakov
это разные представления - часть либ кладут его а часть нет, первые 32 байта публичные если 64 байта
AP
00:07
Andrey Pfau
In reply to this message
Значит это баг, оно так не должно работать. Приватный ключ всегда 32 байта
SK
00:07
Steve Korshakov
нет не баг
ИК
00:07
Игорь Коняхин
In reply to this message
Ну вот если давать nacl.sign.keyPair.fromSecretKey все 64 байта, то он просто оставляет 32 последних (я пробовал их менять, и изменения переносятся)
AP
00:07
Andrey Pfau
In reply to this message
По RFC ключ всегда 32 байта
АЩ
00:08
Алексей Щербаков
Тебе нужно отдельно получить private key и public key. Внутреннее состояние - это 64 бита там оба ключа
AP
00:08
Andrey Pfau
Так что не соблюдение стандарта == не правильное поведение
SK
00:08
Steve Korshakov
In reply to this message
какому еще RFC?
00:09
а при чем тут SSH?
АЩ
00:09
Алексей Щербаков
In reply to this message
Попробуй подсунуть 32 байта и рандомные.
Мне кажется что он считывает только 32, а остальные игнорирует
AP
00:09
Andrey Pfau
Ой не тот
АЩ
00:09
Алексей Щербаков
In reply to this message
Речь идет о Ed25519
SK
00:10
Steve Korshakov
вообще ничего там про хранение ключей нет
AP
00:10
Andrey Pfau
In reply to this message
Там есть
00:11
То что ключи это 32 байт всегда
SK
00:11
Steve Korshakov
я тебе говорю нет стандарта
AP
00:11
Andrey Pfau
In reply to this message
Есть стандарт RFC8032
SK
00:11
Steve Korshakov
и что?
AP
00:11
Andrey Pfau
Ты не прав и несёшь дичь, при этом продолжая спорить
00:12
In reply to this message
По стандарту должно быть так и не иначе
SK
00:12
Steve Korshakov
в NACL никогда не было 32 байтного ключа
AP
00:12
Andrey Pfau
Key Generation The private key is 32 octets (256 bits, corresponding to b) of cryptographically secure random data. See [RFC4086] for a discussion about randomness.
SK
00:13
Steve Korshakov
и как это связано с хранением?
AP
00:13
Andrey Pfau
In reply to this message
5.1.2. Encoding

All values are coded as octet strings, and integers are coded using
little-endian convention, i.e., a 32-octet string h h[0],...h[31]
represents the integer h[0] + 2^8 * h[1] + ... + 2^248 * h[31].
SK
00:14
Steve Korshakov
это сериализация точки
AP
00:14
Andrey Pfau
In reply to this message
Точка это и есть приватный ключ
SK
00:14
Steve Korshakov
00:14
в NACL всю жизнь было так
AP
00:15
Andrey Pfau
Ну у недожабьихскриптеров всегда через жопу сделано. В приватном ключе не должно быть конкатенации с публичным ключем
00:16
По стандарту ключ 32 байтный
SK
00:16
Steve Korshakov
чувак
00:16
это ссылка на NACL
00:16
плюсовая либа что написана тем кто создал 25519
00:16
какой джаваскрипт?
00:16
бернштейн сила
00:17
а RFC появился спустя почти 10 лет
AP
00:17
Andrey Pfau
In reply to this message
И кто создал 25519?)
SK
00:17
Steve Korshakov
бернштейн
00:17
это супер известная тема и это единственно канонически открытый процесс был подбора параметров
AP
00:17
Andrey Pfau
Как ты думаешь для чего стандарты придумали?
00:18
Просто чтобы на него болт клали или чтобы все привести к общему виду?
00:18
То что это сделано в какой то либе это не означает что это так и должно быть
SK
00:18
Steve Korshakov
какой-то?
AP
00:18
Andrey Pfau
Это не авторитет
SK
00:18
Steve Korshakov
это самая известная и важная либа в мире о_О
AP
00:18
Andrey Pfau
Авторитет - RFC
00:19
Если бы rfc не было, тогда да , можно ссылаться на это
SK
00:20
Steve Korshakov
да но оно было написано спустя 10 лет после создания NaCL
AP
00:20
Andrey Pfau
И что?
00:20
Это не означает что в nacl правильно сделано
00:20
И если ты говоришь что это плюсовая либа
00:20
То там скорее всего структура аозвращается
00:21
Где первая часть это приват а второй публичник
SK
00:21
Steve Korshakov
нет, это идея NaCL
AP
00:21
Andrey Pfau
Тогда да логично
SK
00:21
Steve Korshakov
ничего кроме байтов нигде нет
AP
00:22
Andrey Pfau
Это бессмысленный спор какой то
00:22
Нужно ссылаться на rfc
00:22
Он для этого и сделан
SK
00:23
Steve Korshakov
нет, есть NaCL который и используют и это супер странно что в каком-то левом RFC написано иначе и типа что надо переделывать все это? NaCL и есть стандарт
00:23
RFC тысячи разных и они противоречат друг другу это никогда не было "авторитетом"
AP
00:25
Andrey Pfau
In reply to this message
Это всегда первостепенный источник
00:25
Хватит нести чушь
VK
00:26
Vudi Kingyru
😆
RT
00:27
R T
Нужон один непротиворечивый RFC ☝🏽
AP
00:30
Andrey Pfau
А в чем противоречивость конкретно этого RFC?
00:31
Только аргументировано а не радужный бред из манямирка
SK
00:32
Steve Korshakov
а с чем он должен противоречить?
00:33
если выпустили RFC для TLS 1.3 это не значит что 1.2 надо срочно подводить под 1.3
00:33
если кто-то написал RFC как хранить ключи то это не значит что системы написанные до него - это говно с палками
00:34
"However, many RFCs are informational or experimental in nature and are not standards."
00:35
приведенный RFC и не стандарт и даже не собирался им быть
AP
00:40
Andrey Pfau
А то что даже в нашем любимом тоне ключи тоже в 32 байта как и приватные так и публичные вообще не смущает?
SK
00:41
Steve Korshakov
а то что в телеграме используется режим AES который существует в одной PDFке на весь интернет - не смущает? это все ничего не значит
AR
00:57
Alexander Ruliov
RFC, строго говоря, это не стандарт, а черновик/предложение/утверждение что оно работает/должно/может работать так. Оно и расшифровывается как Request for Comments.

А то что люди им следуют это просто совпадение.

Более того, и стандартам можно не следовать, еcли осознаёшь риски и видишь в этом профит. Если облажаешься, сам и виноват.
ИК
01:41
Игорь Коняхин
Пытаюсь осуществить перевод с помощью tonweb.
Кто-нибудь знает, с чем может быть вызван автоматический возврат средств обратным платежом?
KK
01:45
Kis Kevin
Hi I sent Toncoin without comment and now the coin was lost, can you help me?
A
01:58
Andrei
In reply to this message
bounced сообщения скорее всего
ИК
01:58
Игорь Коняхин
Тут мне подсказали, что кошелёк неинициализирован
I
03:34
Ihor
Всем привет, помогите сделать билд на M1 процессоре.
Уже много чего перепробывал, но тщетно. Может кто сталкивался и решил проблему? А то судя по поиску в чате все просто свичнулись на винду.

cmake version 3.22.2
TP
03:36
Tim Pavlov
In reply to this message
ты когда git clone делал сделала git clone —recursive?
03:36
он не может найти third-party, судя по сообщениям
03:36
скорее всего ты подмодули не стянул
I
03:36
Ihor
In reply to this message
Да, делал по этой инструкции
https://github.com/disintar/toncli/blob/master/docs/apple_m1_compile_fix.md
TP
03:37
Tim Pavlov
а ошибка в разделе Fixing rocksdb не твой случай?
03:38
судя по всему ошибка в rocksdb как раз
03:38
попробуй исправить по инструкции там
I
03:39
Ihor
Сорри, хз что такое rocksdb
Где инструкцию найти?
TP
03:39
Tim Pavlov
та там же, по той же ссылке что ты скинул
03:39
второй пункт "Fixing rocksdb"
03:39
это как раз third-party в котором у тебя ошибка
I
03:48
Ihor
Думал, что ошибка была из-за того, что я в директории third-party/rocksdb делал билд, а нужно было в корне: ton/

Удалил проект, склонировал ещё раз с рекурсией, фиксанул rocksdb и сделал билд в корне.

Ошибка аналогичная, только вместо C++ теперь C компилятор ругается)
03:49
Может наоборот, пропустить второй пункт?)
TP
03:50
Tim Pavlov
In reply to this message
да не, если была ошибка, значит не надо было
I
03:50
Ihor
Есть идеи куда двигаться?
TP
03:51
Tim Pavlov
сейчас предположу
03:51
вообще билд надо делать из ton/build
03:51
не знаю даст ли это плоды, но ты попробуй
I
03:52
Ihor
Ну там mkdir build есть в команде
03:52
Потом cd build
TP
03:52
Tim Pavlov
понял, вижу
03:52
тогда все хорошо
03:54
так, в варнинге к cmake он пишет что у тебя sdk для content developer-а отсутствует, типа папка не существует
I
03:55
Ihor
Может рутом запустить?
TP
03:55
Tim Pavlov
xcrun --show-sdk-path
- что это показывает?
I
03:56
Ihor
/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk
TP
03:56
Tim Pavlov
поставь этот путь вместо /Applications/Xcode.app/ бла бла бла
03:57
CC="clang -mcpu=apple-a14" CXX="clang++ -mcpu=apple-a14" cmake .. -DCMAKE_BUILD_TYPE=Release -DTON_ARCH= -Wno-dev -DOPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl@3 -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/
вот в этой инструкции поменяй
03:57
и попробуй снова
I
03:59
Ihor
CC="clang -mcpu=apple-a14" CXX="clang++ -mcpu=apple-a14" cmake .. -DCMAKE_BUILD_TYPE=Release -DTON_ARCH= -Wno-dev -DOPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl@3 -DCMAKE_OSX_SYSROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX12.1.sdk

Полетело, командир! Благодарю! Продвигаюсь дальше
TP
03:59
Tim Pavlov
пошел билд?)
I
04:02
Ihor
Компилятор говорит, что всё гуд
-- Build files have been written to: /Users/useName/Git/ton/ton/build

Но в инструкции указано, что должны быть файлы в папке crypto

func: build/crypto/func
fift: build/crypto/fift
lite-client build/lite-client/lite-client

Но их нету, там только эти
04:02
Так должно быть?
TP
04:03
Tim Pavlov
надо потом в ton/build сделать cmake —build .
04:03
он тогда соберет все cmake-и в нормальные исполняемые файлы
I
04:09
Ihor
Походу в инструкции ошибка. Там указано что файлы будут тут:

func: ton/build/crypto/func
fift: ton/build/crypto/fift
lite-client: build/lite-client/lite-client


А они на самом деле тут:

func: ton/crypto/func
fift: ton/crypto/fift
lite-client: ton/build/lite-client/
(и тут кстати нету подпапки lite-client)
TP
04:13
Tim Pavlov
да, есть такое, но ничего страшного
04:14
не забудь в эти папки задать environment variable или что-то типа того(не знаю есть ли в маке), чтобы удобнее работать из любой директории
I
04:15
Ihor
Ну что такое env файлы я знаю, но что ты имеешь ввиду - не понял. Я так понял, что их нужно запихнуть сюда: /usr/local/bin и тогда toncli будет доступен глобально. Я правильно понял?
TP
04:18
Tim Pavlov
можно и так
I
04:19
Ihor
Чёт у меня нету этого пути /usr/local/bin

Созадать? Или есть бест практис?
TP
04:19
Tim Pavlov
но ты можешь оставить их в этой папке и в env добавить пути к ton/build/crypto папке и ton/build/lite-client
04:19
In reply to this message
да тут как тебе удобно, я на ubuntu просто пути внес и все
04:20
и если потом будешь делать ребилд - не придется ничего менять
I
04:46
Ihor
In reply to this message
tg_image_543487653.jpeg
Not included, change data exporting settings to download.
23.1 KB
Правильно пути в env добавил?
Вот мой printenv
TP
04:47
Tim Pavlov
Там есть что-то типа переменной Path?
I
04:49
Ihor
In reply to this message
tg_image_2321358814.jpeg
Not included, change data exporting settings to download.
33.4 KB
Да, $PATH, но она дичь выдаёт:
TP
04:51
Tim Pavlov
Да не, все правильно: там пути в которых ищутся файлы, если ты полный путь не указал. Пути разделены ‘:’
04:51
In reply to this message
Надо эти пути добавить туда, разделяя их ‘:’
I
04:54
Ihor
/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/usr/Git/ton/ton/build/lite-client:/usr/Git/ton/ton/crypto

Tak? (исправил)
AP
05:22
Andrey Pfau
In reply to this message
В OpenSSL, Java BouncedCastle, GoLang Stdlib, BoringSSL, rust ed25519-dalek
(Список могу дальше продолжать, это только то, что я нашел)

Везде в этих либах приватный ключ - 32 байта. Не знаю что ты про "nacl самая важная криптолиба" говоришь, я про него только от тебя впервые услышал, а openssl практически везде используется.

То что в какой то недо-либе сделано через жопу не делает ее центром земли и общепринятым стандартом. Приватный ключ не должен содержать публичный вообще, это не правильно. Он должен вычисляться по приватнику, а не хранится в нем конкатенацией
VL
06:04
Vladimir Lebedev
In reply to this message
+
AP
06:08
Andrey Pfau
In reply to this message
Опять враньё про AES IGE (который используется в mtproto), полно статей. Где "единственная pdf на весь интернет"?
06:09
Он даже в openssl есть
СВ
09:09
Сергей В
В разных смартконтрактах по разному объявляются параметры recv_internal. Где то первым стоит баланс, потом msg_value, где-то нет баланса. Как это работает?:)
SK
09:29
Steve Korshakov
In reply to this message
Это все не научные статьи. Когда я работал в телеге и как раз это реализовывал то существовало буквально один пейпер(вроде на сайте стенфорда), но прямо в процессе первых пары месяцев оно пропало с сайта как только телеграм начал его использовать. Приходилось бегать и искать его что бы понять как его реализовывать.
SK
10:10
Steve Korshakov
In reply to this message
Параметры идут через стек и задом наперед, так что при желании первые параметры можно пропускать
СВ
10:15
Сергей В
In reply to this message
Понял, спасибо
AP
11:06
Andrey Pfau
In reply to this message
нашел где пиариться
ИМ
11:07
Илья Михеев
In reply to this message
+, немного не тот чат
SG
13:11
Serge Grigorenko
Пытаюсь вызвать из tonweb геттер для контракта https://github.com/ton-blockchain/token-contract/blob/jettons/ft/jetton-minter.fc#L98. В самой имплпементации tonweb этот геттер пока еще не доабавили увы.
slice get_wallet_address(slice owner_address) method_id {
(int total_supply, slice admin_address, cell content, cell jetton_wallet_code) = load_data();
return calculate_user_jetton_wallet_address(owner_address, my_address(), jetton_wallet_code);
}


В качестве параметра owner_address идет тип slice, но не пойму как правильно сгенерировать адрес в виде slice и отправить его через tonweb?
Код такой:
const ownerAddress = new tonweb.Address(ownerAddress).toString(true, true, true)
const result = await this.httpProvider.call2(
jettonMinterAddress.toString(true, true, true),
"get_wallet_address",
[["slice", ownerAddress]],
)

Пробовал по-всякому передавать ownerAddress: в base64 кодировать или вообще создавать ячейку, туда писать адрес, после чего ее преобразовывать к строке, но все не работает.
SK
13:18
Steve Korshakov
In reply to this message
Привет
13:18
Там бага и это невозможно
13:18
На стороне тонцентра
13:18
Мы уже сделали PR
SG
13:22
Serge Grigorenko
Отлично, спасибо, тогда ждем
СВ
14:36
Сергей В
А где можно почитать к каком виде сообщения доставляются до валидатора?
Catchain Consensus эта пдфка про это как раз?
D
15:38
Daniil
Есть верстальщики в чате? Надо одну страницу сверстать, плачу 2 тон
x
17:49
xxffwwoqqzz
Добрый день. Допустим я нигодняй, который хочет угнать какую-то информацию из внутреннего хранилища смарт-контракта. Могу ли я получить те же данные, что и через get_data()?
NA
17:50
Narek Abovyan
они публичны для всех
x
17:53
xxffwwoqqzz
In reply to this message
Т.е. внутренние данные смарт-контракта никак не шифруються? Как я могу получить их?
AT
17:54
Andrey Tvorozhkov
In reply to this message
Дизассемблер
NA
17:54
Narek Abovyan
In reply to this message
getAccountState
17:54
In reply to this message
причем тут дизассемблер? Речь не про код же
AT
17:54
Andrey Tvorozhkov
In reply to this message
А, сорри, да
ИК
17:54
Игорь Коняхин
In reply to this message
Да, вообще весь блокчейн публичен
AT
17:54
Andrey Tvorozhkov
Чет подумал про код
17:54
🙈
x
17:56
xxffwwoqqzz
In reply to this message
Спасибо. А есть какой-то способ зашифровать данные внутри смарт-контракта? Или можно как-то сохранить какие-то важные данные внутрь смарт-контракта? Пароль какой-то условно
NA
17:57
Narek Abovyan
In reply to this message
ну взять и зашифровать перед тем как положишь в блокчейн
ИК
17:57
Игорь Коняхин
In reply to this message
Только своим кодом вручную
AR
17:58
Alexander Ruliov
In reply to this message
Приватные данные в контракте тоже могут виртуально быть, если они опубликуются внутри контракта в будущем.

Можно, например, сделать контракт сессии в покер, где будут хэши карт на столе и рук каждого игрока.

Затем при финише партии приходит внешнее сообщение с зёрнами рандома для стола и игроков которые должны открыть свои руки и деньги победителю уходят только в том случае, если все хэши сойдутся :)
SK
17:58
Steve Korshakov
это интересно
ИК
17:59
Игорь Коняхин
In reply to this message
Пароль - нельзя
А вот: [salt, hash(password + salt)] - можно (кажется, нужно обдумывать по конкретной ситуации)
NA
18:00
Narek Abovyan
In reply to this message
почему нельзя то
18:00
зашифровал сохранил
ИК
18:00
Игорь Коняхин
Ну т.е. опять же: всё публично, вся ответственность за безопасность данных - на тебе
NA
18:00
Narek Abovyan
вопрос где ключи от него будут лежать
AR
18:00
Alexander Ruliov
И зачем в контракте зашифрованные данные, если чтобы расшифровать их контракту нужно отправить ключи, т.е. сделать данные публичными)
NA
18:01
Narek Abovyan
если тебе расшифрованные данные в самом контракте нужны - то бесполезно, да
18:01
если ты потом дешифруешь их вне чейна - то все ок
ИК
18:02
Игорь Коняхин
In reply to this message
Зависит от сценария. Если нужно, чтобы любой человек (без каких-либо ключей) мог проверить, что пароль соответствует контракту, то зашифровать нельзя, а можно, например, положить хеш
AR
18:02
Alexander Ruliov
Хотя есть кейс вроде "отправь на тот адрес такое вот сообщение, контракт возьмёт от него хэш и если сойдётся с записанным в нём, он отдаст тебе все его монеты".

Криптозакладка))
NA
18:02
Narek Abovyan
короче представь что это большая публичная база данных с хранимыми процедурами
18:02
In reply to this message
угу
x
18:03
xxffwwoqqzz
спасибо, мужики, раз хранить чувствительные данные нельзя, то не буду)
ИК
18:04
Игорь Коняхин
Кто-нибудь может объяснить работу get методов и зачем они нужны?

1) В Ethereum, смарт-контракты могут синхронно вызывать методы друг друга. В ТОН, согласно тому что писали где-то выше в чате (это, кстати, нигде в доках не описано) - нельзя. Верно?
2) Код методов хранится на блокчейне? Если да, то зачем? Его же се равно вызывать с блокчейна нельзя! Можно нужный код (чтобы он не занимал место на блокчейне) просто распространять отдельно, и вообще писать его на более высокоуровневых языках.
3) Зачем?
SK
18:05
Steve Korshakov
в тоне отправляют сообщения а не вызывают методы
ИК
18:06
Игорь Коняхин
Это я знаю. А зачем тогда методы?
AR
18:06
Alexander Ruliov
In reply to this message
Чтобы всегда был seqno который возвращает число, а раскладка данных в контракте могла быть разная.
TP
18:06
Tim Pavlov
In reply to this message
допустим тебе для обычного контракта нужно отправить перевод. Там используется seqno для защиты от double-spending. Ты должен передать этот seqno, но ты его не знаешь. Тебе надо его получить как-то и ты отправляешь get метод
SK
18:06
Steve Korshakov
In reply to this message
методы для извне для приложений
A
18:06
Andrei
In reply to this message
Они нужны, чтобы можно было оффчейн получать какие-то параметры контракта, не парся вручную его данные
ИК
18:08
Игорь Коняхин
In reply to this message
Хм
Т.е. можно получить на клиенте весь storage, вручную его распарсить и получить seqno, но тогда код будет привязан к конкретной версии кошелька.
А можно объявить в кошельке метод get_seqno, который "инкапсулирует" данный функционал
VL
18:09
Vladimir Lebedev
In reply to this message
для конвиниенса, чтобы клиенты использовали публичное апи вместо парсинга сторейджа, лэйаут которого не является публичным апи
ИК
18:09
Игорь Коняхин
In reply to this message
Из этого, я так понимаю, что код методов хранится на блокчейне. Верно?
AR
18:09
Alexander Ruliov
In reply to this message
А где код хранить?

Вообще, можно сделать контракт который умеет отправлять любые сообщения, оффчейн смотреть за тем, что ему приходит, забирать весь баланс сообщения, а потом снаружи просить отправить нужное куда хочется.

Только это уже не контракт, а рандом)
VL
18:09
Vladimir Lebedev
In reply to this message
да
ИК
18:10
Игорь Коняхин
In reply to this message
Ну если код контракта или его лейаут не являются открытыми, то по моим представлениям, к такому контракту в принципе нет доверия, и использовать его нельзя. Разве не так?
AR
18:11
Alexander Ruliov
In reply to this message
Плюс минус так.
ИК
18:11
Игорь Коняхин
Всем спасибо, кажется всё понял
VL
18:11
Vladimir Lebedev
In reply to this message
может быть множество однотипных контрактов — например, контракты нфт. они могут по-разному заполнять свой сторейдж, но при этом обязаны по стандарту иметь определённые гет-методы
A
18:12
Andrei
In reply to this message
Ну на самом деле наличие универсального интерфейса в виде гет-методов позволяет генерировать пруфы данных контракта, не присылая весь сторадж
AR
18:12
Alexander Ruliov
In reply to this message
Только гет-методы забирают весь сторадж, ибо исполняются локально)
A
18:12
Andrei
На стороне приложения можно написать кастомный парсинг, а вот на стороне лайт-сервера только гет-методы универсальны
ИК
18:13
Игорь Коняхин
In reply to this message
Но возникает разумный вопрос: а почему не разрешить контрактам дёргать get-методы друг друга?
Это было бы в большинстве случаев сильно проще и удобнее, чем посылать друг-другу запрос-ответ
A
18:13
Andrei
In reply to this message
Нет, есть вариант запуска, когда лайт-сервер исполняет их у себя, а затем присылает только использованную часть стораджа
18:13
И клиент уже перепроверяет результат
AR
18:13
Alexander Ruliov
Хмм, удобно.
A
18:14
Andrei
In reply to this message
Архитектура не позволяет. Контракты могут находится в разных шардах и у валидаторов одного шарда просто не будет инфы, необходимой для запуска гет-метода
AR
18:14
Alexander Ruliov
In reply to this message
Плюсую. Но похоже тут вопрос в простоте обеспечения консистентности/повторяемости валидации блока. Те же проблемы появляются что и с многопоточными приложениями.
ИК
18:15
Игорь Коняхин
In reply to this message
🤔 Интересно, надо будет перечитать документы Дурова
AR
18:21
Alexander Ruliov
У меня тоже пара вопросов вспомнилось)

1. Из какого параметра взять стоимость хранения? Цену газа в конфиге нашёл, а это пропустил где-то.

2. Можно ли вычислить, сколько будет стоить хранить одну запись в словаре в зависимости от его размера, длины ключей и того что я буду хранить?
AT
18:22
Andrey Tvorozhkov
In reply to this message
Есть глобал конфиги, они все в тлб описаны, вроде 21 (по памяти, но не точно)
18:22
Там 2 для мастерчейна и не для мастерчейна
18:23
In reply to this message
2) да.

В идеале расчет нужно внутрь тонкли засунуть, чтобы было понятно сколько комиссий платить
ИК
18:24
Игорь Коняхин
Почему мастерчейн дороже бейзчейна? (или наоборот?)
Технологии же ведь одинаковы?
AR
18:25
Alexander Ruliov
Думаю просто, можно ли сделать контракт Б, которому задаёшь параметры другого контракта А, а он затем счета пользователям контракта А выставляет за хранение их данных, а если просрачивают, то шлёт А мол "геймовер, сжигай данные этого пользователя, пусть молится в саппорт, чтобы ему их вернули".
18:27
In reply to this message
Когда бейзчейнов будут сотни, мастерчейну желательно не быть перегруженным всяким мусором, видимо)
ИК
18:29
Игорь Коняхин
А разве оно не должно автоматически адаптироваться, так что когда бейзчейнов будут сотни, тогда и мастерчейн становится дороже?
VL
18:29
Vladimir Lebedev
In reply to this message
мастерчейн валидируют все валидаторы, тогда как шарды воркчейнов валидируют небольшие группы валидаторов (если я правильно понимаю вайтпейпер)
AR
18:30
Alexander Ruliov
In reply to this message
Придут потом нытики "у меня там монеты были, а теперь чтобы их перевести нужно половину как комиссию заплатить".
ИК
18:30
Игорь Коняхин
In reply to this message
Тогда логично. Надо будет всё-таки перечитать whitepaper
AR
18:45
Alexander Ruliov
Ещё вопрос, есть дока по фифту? Ничего не понимаю, что там можно писать. Кода на нём вроде довольно много уже, но это почти как китайский читать и пытаться понять без словаря, что там написано то.
ИК
18:46
Игорь Коняхин
In reply to this message
Вот есть "A Brief Introduction"
https://test.ton.org/fiftbase.pdf
AR
18:47
Alexander Ruliov
In reply to this message
Спасибо, не видел такой ссылки)
AT
18:47
Andrey Tvorozhkov
@f_closer а давай мы владельцу чата все накидаем реакций, чтобы он тут их включил?))
18:47
Не хватает все же
ИК
18:47
Игорь Коняхин
+
x
18:53
xxffwwoqqzz
+
NM
18:54
Nikita Misharin
+
AP
18:56
Andrey Pfau
+
TP
18:57
Tim Pavlov
+
ИМ
18:57
Илья Михеев
-|-
AR
19:00
Alexander Ruliov
In reply to this message
Аккуратнее с дизъюнктным объединением)

С меня тоже +
x
19:12
xxffwwoqqzz
Как можно (псевдо)рандомно расспределить NFT между пользователями? Например, в контракте храниться 100 нфтишек. Пользователь может кинуть на адрес с нфтишками условно 10 тон и смарт-контракт возьмёт и отправит какую-то 1 рандомную нфтишку. Есть что-то похожее? На рынке не видел ещё такого смарт-контракта
SK
19:13
Steve Korshakov
В эфире есть
19:13
Ща у меня по моему был где-то код
19:15
179-203 строчки
19:15
Для этого хранится мапа но она большую часть времени довольно компактная
P
19:16
Pepeg
Как в фифте сохранить грамы в билдер?
Stores (serializes) an integer x in the range 0..2^128 − 1 into builder b. The serialization of x consists of a 4-bit unsigned big-endian integer l, which is the smallest integer l ≥ 0, such that x < 2^8l, followed by an 8l-bit unsigned big-endian representation of x. If x does not belong to the supported range, a range check exception is thrown.
это из описания func store_grams
не совсем понимаю что такое 8L 🤔
8 * L или что это
19:25
nanograms swap STGRAMS вроде сработало
x
19:29
xxffwwoqqzz
In reply to this message
приватный репозиторий :(
19:31
In reply to this message
тоже думал над тем, чтобы её как-то использовать, но моё решение явно не компактное
SK
19:32
Steve Korshakov
;; Allocate

randomize_lt();

int totalSize = mintLimit - total_supply;

int index = rand(totalSize);

int value = 0;




;; Pick id

(slice existing, int found) = cache.udict_get?(32, index);

if (found) {

value = existing~load_uint(32);

} else {

value = index;

}




;; Dict continuity

(slice tailValue, int foundTail) = cache.udict_get?(32, totalSize - 1);

if (foundTail) {

cache~udict_set(32, index, tailValue);

} else {

slice data = begin_cell().store_uint(index, 32).end_cell().begin_parse();

cache~udict_set(32, index, data);

}




;; Cleanup tail

cache~udict_delete?(32, totalSize);




;; Allocate token

int token_id = value + 1;
19:32
Я долго читал и разбирался как оно работает потом понял что все норм - рекомендую
AR
19:50
Alexander Ruliov
Я чот не понимаю. Если оно сначала сгенерит ноль, то token_id будет единицей. Если второй раз сгенерит ноль, то достанет ноль из словаря и тоже единица получится.
SK
19:51
Steve Korshakov
Не ноль, а len-1
AR
19:53
Alexander Ruliov
> slice data = begin_cell().store_uint(index, 32).end_cell().begin_parse();

Вот, ноль же запишет.
x
19:53
xxffwwoqqzz
In reply to this message
уже минут 15 втыкаю, пока не сильно понял как оно работает. выглядит очень страшно и круто
SK
19:55
Steve Korshakov
In reply to this message
Надо проверить может опечатка
x
19:56
xxffwwoqqzz
In reply to this message
Почему index генерируется в отрицательном диапазоне, а не в обычном?
SK
19:58
Steve Korshakov
Положительном
x
19:58
xxffwwoqqzz
In reply to this message
mintLimit не может же быть больше чем общее кол-во нфтишек, нет?
AR
19:59
Alexander Ruliov
In reply to this message
Полагаю что они динамически тут создаются и total_supply это сколько создалось.
20:02
Когда оно сгенерит index = totalSize - 1, то тоже дубль будет.

Нужно во втором if'е записывать не индекс, а totalSize - 1, а в случае если это и так totalSize - 1, то вообще ничего не писать в кеш, походу.
20:03
Тогда мы каждый ход гарантированно куда-то либо записываем totalSize - 1, либо выбираем его и больше его выбрать нельзя.
20:04
Осталось понять, есть ли bias этого рандома к концу id'шников))
SK
20:05
Steve Korshakov
да сорян
20:05
randomize_lt();
int totalSize = maxSupply - total_supply;
int index = rand(totalSize);
int value = 0;

;; Pick id
(slice existing, int found) = cache.udict_get?(32, index);
if (found) {
value = existing~load_uint(32);
} else {
value = index;
}

;; Dict continuity
(slice tailValue, int foundTail) = cache.udict_get?(32, totalSize - 1);
if (foundTail) {
cache~udict_set(32, index, tailValue);
} else {
cache~udict_set_builder(32, index, begin_cell().store_uint(totalSize - 1, 32));
}

;; Cleanup tail
cache~udict_delete?(32, totalSize);
20:05
оказалось я не закоммитил последнюю версию
20:05
bias никакого нет - тк это чутка вывернутый шаффл
20:06
и на каждом шаге точно выбираем рандомный элемент с равномерным распределением
AR
20:08
Alexander Ruliov
In reply to this message
Смотри, если рандом даст index = totalSize - 1, то оно его же и запишет в конец и когда-нибудь выдаст тот же value. Его не нужно записывать, если он выпал.
20:09
А, оно стреляет только если при первой генерации он выпал)
SK
20:09
Steve Korshakov
если он выбрал последний и аписал в конец а потом тут же удалил то никаких проблем нет
AR
20:11
Alexander Ruliov
Давай на конкретном. Всего минтится 3 токена, сейчас их ноль. Рандом выбирает индекс 2. Хвоста нет, в индекс 2 записывается значение 2. Удаляется индекс 3.

Через какое-то время рандом достаёт значение 2 из словаря, получается дубликат.
x
20:13
xxffwwoqqzz
In reply to this message
+1, меня вот этот кейс беспокоит в моём решении
AR
20:15
Alexander Ruliov
Если докинуть ещё один if в кейс с else поиска хвоста, что мы записываем не totalSize - 1 (если его, то ничего в словарь не добавлять), то вроде пофиксится.
SK
20:16
Steve Korshakov
вроде rand должен инклюзивно генерить
20:16
айдишники NFT в эфире с единицы идут а не с нуля
20:16
а не, у меня там ниже +1 делается
AR
20:17
Alexander Ruliov
Дык даже если оно инклюзивно генерит, повторка энивей в словаре окажется уже и кому-нибудь выпадет в будущем)
P
20:17
Pepeg
Через CLI можно как-то boc файл или b64 в блокчейн отправить? Я так понимаю как-то через lite-client, но особо документации не могу найти
SK
20:17
Steve Korshakov
AT
20:18
Andrey Tvorozhkov
In reply to this message
Я постарался убрать бок
20:18
Заменив на фифт
20:18
Но можно сделать простой фифт скрипт, который распакует бок
20:18
И просто его отправить
20:18
Как боди
20:19
In reply to this message
На продакшн контрактах ты хочешь не сериализацию видеть при отправлении в реальную клетку
20:19
С оп кодами и прочим
SK
20:19
Steve Korshakov
function randomIndex() internal returns (uint256) {
uint256 totalSize = TOKEN_LIMIT - totalSupply();
uint256 index = uint(keccak256(abi.encodePacked(nonce, msg.sender, block.difficulty, block.timestamp))) % totalSize;
uint256 value = 0;

if (indices[index] != 0) {
value = indices[index];
} else {
value = index;
}

if (indices[totalSize - 1] == 0) {
indices[index] = totalSize - 1;
} else {
indices[index] = indices[totalSize - 1];
}

nonce++;

return value.add(1);
}
P
20:20
Pepeg
In reply to this message
Я кажется чего-то не понимаю
Хочу отправить external_message в СК свой, для этого я в fiftе создал тело сообщения и сериализовал его в бок и base64
20:20
In reply to this message
это как?
AT
20:21
Andrey Tvorozhkov
In reply to this message
Вот не надо в бэйз 64
20:22
И сериалищовыыать не надо
20:22
Просто send —body
P
20:22
Pepeg
я тут глянул https://testnet.toncenter.com/api/v2/#/
но это видимо приколы тонцентра?
AT
20:22
Andrey Tvorozhkov
И путь до фифта
20:22
In reply to this message
Приколы тонцентра
20:23
В тонкли просто фифт передаешь в send
20:23
И оно работает
P
20:23
Pepeg
In reply to this message
спасибо, попробую
AR
20:23
Alexander Ruliov
In reply to this message
Хы, та же бажина.
SK
20:24
Steve Korshakov
не понимаю
20:24
если ты получил totalSize - 1 и потом в cache[totalsize - 1] запишешь totalSize - 1
20:24
то это хвост туда никогда ничего не дойдет
20:24
после того как ты аллоцировал у тебя totalSize уменьшается на единицу и никогда больше не выпадет - нет никакой баги
AR
20:25
Alexander Ruliov
Ааааа, он удаляется.
SK
20:25
Steve Korshakov
не удаляется
20:25
просто счетчик меняется
20:25
я потом добавил для экономии места удаление
AR
20:25
Alexander Ruliov
Всё, всё правильно :)
20:26
А не, подожди. А не, правильно всё)
SK
20:27
Steve Korshakov
да я тоже голову крутил много раз, у меня тесты написаны все
AR
20:28
Alexander Ruliov
Красивая штуковина :)
SK
20:28
Steve Korshakov
Запостил на tondev: https://tondev.org/recipes/random-nft
x
20:29
xxffwwoqqzz
In reply to this message
ого даже такое есть
SK
20:29
Steve Korshakov
ну мы начали собирать все доки в одном месте потихоньку
x
20:32
xxffwwoqqzz
In reply to this message
я дизайн очень люблю 😅 было бы круто такую основную документацию :)
x
20:59
xxffwwoqqzz
In reply to this message
ещё вопрос по этому красивому коду

можно как-то это код завернуть в одну целостную функцию как в примере на Solidity?

если я правильно понимаю представление словаря в тоне, то его не нужно сохранять, а только загружать, и вроде как загружать его не сильно дорого по газу
SK
21:00
Steve Korshakov
че?
AR
21:02
Alexander Ruliov
In reply to this message
Вроде никто не мешает принять в функцию словарь, параметры, вернуть обновлённые параметры, новый словарь и полученный индекс.
21:02
Сохранить словарь будет нужно)
x
21:03
xxffwwoqqzz
In reply to this message
не опытный разработчик, мб туплю
21:06
In reply to this message
точно туплю, спасибо 🙏
21:08
In reply to this message
смарт-контракты сложнаааа, мама памаги 😂
P
21:08
Pepeg
Что я делаю не так 😢
cannot apply external message to current state : failed to parse external message external message must begin with ext_in_msg_info$10

<b
lc_address 256 u,
address 256 u,
nanograms swap STGRAMS
b>
2 boc+>B
saveboc
21:08
ext_in_msg_info$10 src:MsgAddressExt dest:MsgAddressInt 
import_fee:Grams = CommonMsgInfo;
SK
21:09
Steve Korshakov
тонцентр отправляет гораздо лучше - опыт подсказал что нельзя просто так взять и делать отправку через лайт сервер - будет лагать
21:09
надо слать сразу на несколько лайтсерверов
21:10
иначе может тупо не дойти
AR
21:10
Alexander Ruliov
In reply to this message
А тэг 10 где?
P
21:10
Pepeg
Адреса такие
48865717417326510572597755101274591274554285053593344447155073148062282427337 
30871574573638575395419991697340249419098489764945262626281871598522621360359
21:10
In reply to this message
и так и так пробовал, мне кажется форматировать в бок не получается
ИМ
21:10
Илья Михеев
А при чем тут дев чат?
АЩ
21:11
Алексей Щербаков
Тредов не хватает как в слаке :-(
AR
21:13
Alexander Ruliov
In reply to this message
Ну и у адресов там тоже теги какие-то должны быть, а не просто биты. И у внутреннего адреса номер воркчейна ещё тоже должен быть)
VO
21:16
Valeriy Osipov
Ребят, привет, а КриптоБот чей проект, кто создатель?
АЛ
21:23
Александр Левицкий
А есть у кого внятная дока по adnl? А то я застрял на рукопожатии
SK
21:24
Steve Korshakov
а что именно нужно?
21:27
а на чем?
21:28
я видел либу одну на JS где была реализация
AP
21:28
Andrey Pfau
In reply to this message
AT
21:28
Andrey Tvorozhkov
АЛ
21:28
Александр Левицкий
Rust java js ts php
AT
21:28
Andrey Tvorozhkov
In reply to this message
^
АЛ
21:29
Александр Левицкий
In reply to this message
Спс
SK
21:31
Steve Korshakov
похоже
АЛ
21:32
Александр Левицкий
In reply to this message
Ок, благодарю
SK
22:38
Steve Korshakov
🌚
SK
22:38
Steve Korshakov
T
Tondev News 09.04.2022 22:37:57
We are launching Decentralized Ton Foundation at github where we invite everyone with to contribute their project and concentrate all small pieces of TON ecostystem and inspire collaboration between separate teams within TON Dev community! We (TonWhales) already moved some of their projects to a foundation and eventually move all work to this foundation.

We believe that our open source projects should belong to everyone.

We will make this Github organization controlled by DAO on TON network to make it truly decentralized and unstoppable.

URL is also very nice: https://github.com/ton-foundation
I
22:39
Isaac
In reply to this message
Похоже на герб каких-то секс-меньшинств.
SK
22:40
Steve Korshakov
Это кошачий анус
AP
22:40
Andrey Pfau
In reply to this message
Это вообще то анус кошки
I
22:40
Isaac
А, понял
AP
22:40
Andrey Pfau
Сук не успел(
SK
22:40
Steve Korshakov
😭
I
22:42
Ihor
In reply to this message
Мощно
AR
23:57
Alexander Ruliov
In reply to this message
Это вархаммер)
10 April 2022
ИК
00:02
Игорь Коняхин
In reply to this message
Ха-ха-ха:)
S
01:13
S
Ребята, подскажите пожалуйста, что это за Election contract. И почему у него баланс больше чем стейк у всех валидаторов?
Р
03:14
Русский TON
Друзья! Поздравляем всех участников TON Smart Challenge с завершением конкурса.

Если среди вас есть желающие продолжить развитие экосистемы TON и принять участие в разработке масштабных продуктов и сервисов — напишите нам в @faqbot.

Среди наших проектов: Валидатор ton.cat, эксплорер tonscan.org, @RichCatsNFT и многие другие.

Интересные и нетривиальные задачи, свободный график и лучше условия.

🐱
ИК
04:05
Игорь Коняхин
В TON'е storage fee начисляется за хранение данных или за создание?
Данные в блокчейне ведь постоянны, поэтому логично, чтобы создание стоило относительно дорого, а хранение - бесплатно (в любом случае не удалится), но согласно тому, что тут промелькивало, я так понимаю, что всё-таки есть storage fee за хранение в единицу времени
A
04:09
Andrei
За хранение. Данные не постоянны тут, старые блоки помнят только ахривные ноды.
04:09
Обычные ноды помнят несколько последних блоков и стейт блокчейна (совокупность стейтов всех аккаунтов + некоторая другая инфа)
04:11
Это более гибкая система: можно зарезервировать тоны для хранения данных на 100 лет вперед и получить вариант с дорогим созданием. А можно очищать мусор и экономить на этом
ИК
04:13
Игорь Коняхин
In reply to this message
Интересно и умно
Спасибо!
04:18
Ещё вопрос: почему public_key и subwallet_id не зашиваются программой-деплоером в код контракта в виде констант?

https://github.com/ton-blockchain/ton/blob/master/crypto/smartcont/wallet3-code.fc

Они никогда не меняются
Конечно, было бы не совсем эстетично, но в условиях когда каждый бит важен, кажется разумным.

Я могу предположить, что если байт-код контракта в точности одинаковый, то все тысячи экземпляров кошельков хранят его только один раз, а если бы происходило "зашитие" констант, то код был бы разным, и каждый отдельный экзепляр приходилось бы отдельно хранить.
Это так? или есть ещё причины?
г
04:21
главный человек на базаре
Вот задеплоил я nft-коллекцию по скрипту ton diamonds, а как мне в дальнейшем передавать нфт новым владельцам? Как люди их будут минтить?
A
04:22
Andrei
In reply to this message
Да, в тоне есть возможность создавать библиотеки, позволяющие избежать дублирование кода у одинаковых контрактов. Но, кажется, кошельки сейчас такую возможность не используют.
Наверное, по этой причине и по причине эстетики так не делают.
AR
04:24
Alexander Ruliov
In reply to this message
Я бы уже на этом пункте спрыгнул)))
ИК
04:34
Игорь Коняхин
In reply to this message
Понял
Тут просто раньше писали, что в ТОНе происходит автоматическая дедупликация вообще абсолютно всего, и мне кажется, что если байткод контрактов в точности одинаковый, то он тоже должен туда подпадать, но я не до конца уверен
04:34
In reply to this message
Так без этого технически никак)))
Чтобы отослать транзакцию нужен приватный ключ
04:35
Но да, нужно быть осторожным и либо изучать исходники сайта, либо (более практично) - создать отдельный кошелёк, данные которого и внести
A
04:35
Andrei
In reply to this message
Не, дедупликация ячеек происходит в рамках одного контракта
04:36
Тут опять же, разные контракты могут быть в разных шардах, поэтому автоматически такую дедупликацию не сделать
ИК
04:36
Игорь Коняхин
In reply to this message
Понял, я думал глобально всё дедуплицируется
Любопытно
AR
04:38
Alexander Ruliov
In reply to this message
Мне казалось, что если хэши сошлись, то это одна и та же клетка, а если таки коллизия — то нуегонафигтакогонебываетчтобы256битсовпали.
A
04:38
Andrei
Да, но просто физически одинаковый код с разных адресов может хранится у разных подмножеств валидаторов
04:38
И без дупликации никак)
04:39
Но когда всего один шард (как сейчас), то да, скорее всего во внутренностях ноды они дедуплицируются. Но storage fee всё равно за каждый отдельно капает
AR
04:40
Alexander Ruliov
In reply to this message
Наобманылаво какое-то)
NA
04:42
Narek Abovyan
А кто-нибудь знает что за шард 8000000000000000 в тестнете?
ИК
04:44
Игорь Коняхин
In reply to this message
Забыл тебе написать
Можешь в ton-contract-executor "открыть" (приписать "export") TypeScript типы?

Например:
export declare type ExecutionResult = FailedExecutionResult | SuccessfulExecutionResult;

(ну и остальные тоже)
Иначе приходится самому лезть в папку /node_modules/... и поправлять
NA
04:45
Narek Abovyan
Они незаэкспорчены разве?
ИК
04:45
Игорь Коняхин
Многие - нет
NA
04:45
Narek Abovyan
Ага, рил
04:45
заэкспорчу
ИК
04:46
Игорь Коняхин
In reply to this message
👍
AP
08:26
Andrey Pfau
In reply to this message
В мейннете точно такой же шард