Отслеживание на основе хешей
В этом разделе рассмотрим, как использовать хеши для отслеживания сообщений и транзакций в блокчейне. Вы узнаете, чем различаются разновидности хешей, как вычислять их и применять для верификации активности в блокчейне.
Хеши
Хеши играют ключевую роль, обеспечивая идентификацию и верификацию на всех уровнях блокчейна. Понимание того, как работает хеширование, поможет вам эффективно отслеживать транзакции, проверять сообщения и интегрировать ваши приложения с TON.
Что такое хеш?
В TON хеш — это уникальный криптографический слепок данных, вычисленный с помощью алгоритма SHA-256. У каждой ячейки, сообщения или транзакции — свой уникальный хеш, который служит цифровой подписью.
Типы хешей
Хеши в TON работают односторонним образом: исходные данные не могут быть восстановлены из хеша. Однако они детерминированы: один и тот же ввод всегда приводит к одному и тому же хешу.
Хеш тела сообщения
Хеш тела сообщения — это уникальный идентификатор содержимого сообщения. Он вычисляется из ячейки, содержащей данные сообщения.
Тело относится к полю body: (Either X ^X)
в схеме TL-B:
message$_ {X:Type} info:CommonMsgInfo
init:(Maybe (Either StateInit ^StateInit))
body:(Either X ^X) = Message X;
Давайте для примера рассмотрим тело сообщения с комментарием «Hello, TON!» и вычислим его хеш.
import { beginCell } from '@ton/core';
// Create the message body to increment the counter
const messageBody = beginCell()
.storeUint(0, 32) // op code
.storeStringTail('Hello TON!')
.endCell();
console.log('Message body hash:', messageBody.hash().toString('hex'));
Ожидаемый вывод в консоль
Message body hash: d989794fa90c9817a63a22e00554574f3c4a347dcfd2e2886980a294de15f2af
Когда полезен хеш тела сообщения:
- для проверки целостности данных
- для отладки и логирования операций
- для дедупликации сообщений в вашем приложении
Хеш полного сообщения
Полное сообщение включает не только тело, но и заголовки с метаданными, такими как отправитель, получатель, сумма и комиссии. Его хеш — уникальный идентификатор всего сообщения.
Для внутренних сообщений это соответствует структуре Message X
, определённой в этой схеме TL-B:
message$_ {X:Type} info:CommonMsgInfo
init:(Maybe (Either StateInit ^StateInit))
body:(Either X ^X) = Message X;
int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool
src:MsgAddressInt dest:MsgAddressInt
value:CurrencyCollection ihr_fee:Grams fwd_fee:Grams
created_lt:uint64 created_at:uint32 = CommonMsgInfo;
Пример:
import { storeMessage, beginCell, Address, Message } from '@ton/ton';
import { toNano } from '@ton/core';
const messageBody = beginCell()
.storeUint(0, 32) // op code
.storeStringTail('Hello TON!')
.endCell();
// Create a complete message object
const message: Message = {
info: {
type: 'internal',
dest: Address.parse('UQAi....'), // Insert recipient address
value: { coins: toNano('0.1') },
bounce: true,
src: Address.parse('UQA1....'), // Insert sender address
ihrDisabled: true,
bounced: false,
ihrFee: 0n,
forwardFee: 0n,
createdAt: 0,
createdLt: 0n,
},
body: messageBody,
};
// Get the complete message hash
const messageCell = beginCell().store(storeMessage(message)).endCell();
const fullMessageHash = messageCell.hash();
console.log('Full message hash:', fullMessageHash.toString('hex'));
Ожидаемый вывод в консоль (конкретный хеш зависит от введённого адреса):
Full message hash: 40b1477f90d702af223f15194724e0c12b51028bc622444959e155e77903b12c
Когда полезен хеш полного сообщения:
- для отслеживания конкретных сообщений в блокчейне
- при использовании TON Center API для поиска транзакций
- для проверки того, что никто не изменил сообщение