lt (logical time)
Логическое время в TON: монотонный uint64-счётчик, заменяющий физические timestamp'ы во внутренней семантике сообщений. Аналог Lamport timestamp в распределённых системах.
Синонимы: logical time, lt ton, логическое время ton
lt (logical time) — TON-специфичная концепция логического времени: монотонный uint64-счётчик, который инкрементируется при каждой транзакции в шарде. Это аналог Lamport timestamp в распределённых системах.
Зачем нужен
Физическое время (utime / Unix timestamp) на распределённых нодах синхронизировано приблизительно (NTP-точность). Для строгой упорядоченности TON использует lt:
- Каждая транзакция имеет свой
ltиprev_lt. - Сообщения внутри транзакции упорядочены через
created_lt. - lt всегда возрастает в пределах одного аккаунта/шарда — нет коллизий, нет «одинаковых моментов».
Где встречается
В API tonapi/toncenter utime и lt часто соседствуют: utime — для UX (получено в 12:34), lt — для дедупликации и точной сортировки. При листании транзакций аккаунта корректный курсор — (lt, hash), а не utime.
Пример из ответа API
Сокращённый JSON одной транзакции из getTransactions:
{
"transaction_id": {
"lt": "48125293000003",
"hash": "9f5b...c1"
},
"utime": 1716908123,
"in_msg": { "created_lt": "48125293000002", "value": "100000000" },
"out_msgs": [
{ "created_lt": "48125293000004", "destination": "EQA..." }
]
}
Заметьте: lt в in_msg ниже, чем у транзакции; в out_msgs — выше. Каждое сообщение получает свой lt в момент создания, поэтому порядок «приходящих → исполнение → исходящие» жёстко гарантирован.
lt vs utime — когда какой использовать
| Задача | Правильное поле |
|---|---|
| «Когда транзакция случилась» в UI | utime |
| Сравнение «эта раньше или позже» | lt |
| Дедупликация в БД | (account, lt) — уникальная пара |
| Пагинация tx-истории | курсор (lt, hash) |
| Поиск конкретной операции | lt + hash |
Использовать utime для сравнения порядка — частая ошибка: внутри одной секунды могут быть тысячи транзакций, utime их «склеивает».
Логическое время в shardchain
Каждый shardchain имеет собственный отсчёт lt, не пересекающийся с другими шардами. Это не нарушает каузальность: при cross-shard сообщении принимающий шард получает created_lt отправителя, и его собственный lt просто шагает выше входящего. Так строится «happens-before» в распределённой системе TON без глобального clock.
Границы и переполнение
lt — это uint64, верхняя граница ~1.8 × 10¹⁹. При темпе 1000 транзакций в секунду на шард это ~580 миллионов лет до переполнения, так что практически — никогда.