Обработка платежей
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
На этой странице объясняется, как обрабатывать (отправлять и принимать) цифровые активы
в блокчейне TON. В основном она описывает, как работать с TON coins
, но теоретическая часть важна, даже если вы хотите обрабатывать только жетоны
.
Рекомендуется ознакомиться с Обзором обработки активов перед прочтением этого руководства.
Смарт-контракт кошелька
Смарт-контракты кошелька в сети TON позволяют внешним акторам взаимодействовать с сущностями блокчейна.
- Аутентифицирует владельца: отклоняет запросы, которые пытаются обработать или оплатить комиссии от имени лиц, не являющихся владельцами.
- Обеспечивает защиту от повторного использования: предотвращает повторное выполнение одного и того же запроса, например отправку активов в другой смарт-контракт.
- Инициирует произвольные взаимодействия с другими смарт-контрактами.
Стандартное решение для первой проблемы — криптография с открытым ключом: wallet
хранит открытый ключ и проверяет, что входящее сообщение с запросом подписано соответствующим закрытым ключом, который известен только владельцу.
Решение третьей проблемы также распространено; Как правило, запрос содержит полностью сформированное внутреннее сообщение, которое wallet
отправляет в сеть. Однако для защиты от повторного использования существует несколько различных подходов.
Кошельки на основе Seqno
Кошельки на основе Seqno используют простейший подход к упорядочиванию сообщений. Каждое сообщение имеет специальное целое число seqno
, которое должно совпадать со счетчиком, хранящимся в смарт-контракте wallet
. wallet
обновляет свой счетчик при каждом запросе, тем самым гарантируя, что один запрос не будет обработан дважды. Существует несколько версий wallet
, которые отличаются открытыми методами: возможностью ограничивать запросы по времени истечения срока действия и возможностью иметь несколько кошельков с одним и тем же открытым ключом. Однако неотъемлемым требованием этого подхода является отправка запросов по одному, поскольку любой пропуск в последовательности seqno
приведет к невозможности обработки всех последующих запросов.
Высоконагруженные кошельки
Этот тип wallet
следует подходу, основанному на хранении идентификатора непросроченных обработанных запросов в хранилище смарт-контракта. При этом подходе любой запрос проверяется на предмет дубликата уже обработанного запроса и, если обнаруживается повтор, отклоняется. Из-за истечения срока действия контракт может не хранить все запросы вечно, но он удалит те, которые не могут быть обработаны из-за ограничения срока действия. Запросы в этот wallet
можно отправлять параллельно без помех, но этот подход требует более сложного отслеживания обработки запросов.
Развертывание кошелька
Чтобы развернуть кошелек через TonLib, необходимо:
- Сгенерировать пару закрытый/открытый ключ с помощью createNewKey или его функций-оберток (пример в tonlib-go). Обратите внимание, что закрыты й ключ генерируется локально и не покидает хост-машину.
- Сформировать структуру InitialAccountWallet, соответствующую одному из включенных
wallet
. В настоящее время доступныwallet.v3
,wallet.v4
,wallet.highload.v1
иwallet.highload.v2
. - Рассчитать адрес нового смарт-контракта кошелька с помощью метода getAccountAddress. Мы рекомендуем использовать ревизию по умолчанию
0
, а также развернуть кошельки в basechainworkchain=0
для более низких комиссий за обработку и хранение. - Отправить немного Toncoin на рассчитанный адрес. Обратите внимание, что вам нужно отправлять их в режиме
non-bounce
, так как этот адрес пока не имеет кода и не может обрабатывать входящие сообщения. Флагnon-bounce
указывает, что даже если обработка не удалась, деньги не должны быть возвращены с сообщением о недоставке. Мы не рекомендуем использовать флагnon-bounce
для других транзакций, особенно при переносе больших сумм, так как механизм возврата обеспечивает некоторую степень защиты от ошибок. - Сформируйте желаемое действие, например
actionNoop
только для развертывания. Затем используйте createQuery и sendQuery, чтобы инициировать взаимодействие с блокчейном. - Проверьте контракт за несколько секунд с помощью метода getAccountState.
Подробнее в руководстве по кошельку