Перейти к основному содержимому

Запись в сеть

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

Введение

Это руководство разъяснит вам запись данных в блокчейн TON. Вы научитесь:

  • Делать транзакции
  • Переводить TON и NFT

Настройка окружения

Сначала посетите страницы установки и установите Node.js и npm для вашей ОС. Проверьте, что установка корректна, выполнив следующие команды:

node -v
npm -v

Версии node и npm должны быть по крайней мере v20 и v10 соответственно.

Настройка проекта

Давайте настроим структуру нашего проекта:

  1. Создайте новый каталог для проекта
  2. Инициализируйте проект Node.js
  3. Установите необходимые зависимости
  4. Инициализируйте конфигурацию TypeScript.

Для этого выполните эти команды в терминале:

mkdir writing-to-ton && cd writing-to-ton
npm init -y
npm install typescript ts-node @ton/ton @ton/core @ton/crypto
npx tsc --init

Для запуска скриптов используйте следующую команду:

npx ts-node script.ts

Отправка TON

Простейшее взаимодействие между двумя аккаунтами в блокчейне TON — это передача монеты TON. Процесс включает подготовку и подписание транзакции, а затем отправку её в блокчейн.

Обычная передача будет выглядеть следующим образом:



предупреждение

В отличие от раздела Чтение из сети, в следующих примерах понадобится ключ Toncenter API. Его можно получить с помощью следующего руководства.

Реализация

Создать новый файл 1-send-ton.ts:

1-send-ton.ts
import { mnemonicToWalletKey } from "@ton/crypto";
import { comment, internal, toNano, TonClient, WalletContractV3R2, WalletContractV4, WalletContractV5R1 } from "@ton/ton";
import { SendMode } from "@ton/core";

async function main() {
// Initializing tonClient for sending messages to blockchain
const tonClient = new TonClient({
endpoint: 'https://testnet.toncenter.com/api/v2/jsonRPC',
apiKey: 'YOUR_API_KEY', //acquire it from: https://t.me/toncenter
});

// Using mnemonic to derive public and private keys
// ATTENTION! Replace on your own mnemonic 24-word phrase that you get from wallet app!
const mnemonic = "swarm trumpet innocent empty faculty banner picnic unique major taste cigar slogan health neither diary monster jar scale multiply result biology champion genuine outside".split(' ');
const { publicKey, secretKey } = await mnemonicToWalletKey(mnemonic);

// Creating wallet depending on version (v5r1 or v4 or V3R2), uncomment which version do you have
const walletContract = WalletContractV5R1.create({ walletId: { networkGlobalId: -3 }, publicKey }); // networkGlobalId: -3 for Testnet, -239 for Mainnet
//const walletContract = WalletContractV4.create({ workchain: 0, publicKey });
//const walletContract = WalletContractV3R2.create({ workchain: 0, publicKey });

// Opening wallet with tonClient, which allows to send messages to blockchain
const wallet = tonClient.open(walletContract);

// Retrieving seqno used for replay protection
const seqno = await wallet.getSeqno();

// Sending transfer
await wallet.sendTransfer({
seqno,
secretKey,
messages: [internal({
to: wallet.address, // Transfer will be made to the same wallet address
body: comment('Hello from wallet!'), // Transfer will contain comment
value: toNano(0.05), // Amount of TON, attached to transfer
})],
sendMode: SendMode.PAY_GAS_SEPARATELY | SendMode.IGNORE_ERRORS,
});
}

main();

Использование API_KEY в данном случае позволяет получить доступ к функциональности TON через endpoint. Запустив этот скрипт, мы аутентифицируемся в нашем кошельке через пару публичный/приватный ключ, созданную из мнемонической фразы. После подготовки транзакции мы отправили её в TON, в результате чего кошелёк посылает самому себе сообщение с текстом 'Hello from wallet!'.

Продвинутый уровень

В большинстве сценариев SendMode.PAY_GAS_SEPARATELY | SendMode.IGNORE_ERRORS будет работать, но если вы хотите понять глубже, продолжите чтение на странице Рецепты режимов сообщений.

Выполните этот пример, используя следующую команду:

npx ts-node 1-send-ton.ts

Ожидаемый результат

Перейдите в Tonviewer и вставьте свой адрес в строку поиска. Вы должны увидеть перевод TON с комментарием 'Hello from wallet!'.

Отправка NFT

Невзаимозаменяемые токены (NFT) — это активы вроде произведения искусства, цифрового контента или видео, которые были токенизированы с помощью блокчейна. В TON NFT представлены набором смарт-контрактов:

  • NFT Collection: хранит информацию о коллекции NFT.
  • NFT Item: хранит информацию о конкретном NFT, которым владеет пользователь.

Чтобы отправить NFT, мы должны сначала обзавестись им. Самый простой способ это сделать — создать и развернуть свой собственный NFT с помощью TON Tools. Обратите внимание, что адрес владельца NFT должен быть адресом вашего кошелька, чтобы вы могли выполнять операции над ним.

Основная операция стандарта NFT в TON — передача. На самом деле это изменение адреса владельца в хранимых данных NFT на нового владельца: адрес другого контракта, который после этого сможет осуществлять операции с этим экземпляром NFT.

подсказка

Смотрите раздел «Акторы и роли» для более концептуального описания.

Реализация

Создать новый файл 2-send-nft.ts:

2-send-nft.ts
import { mnemonicToWalletKey } from "@ton/crypto";
import { Address, beginCell, comment, internal, toNano, TonClient, WalletContractV5R1 } from "@ton/ton";
import { SendMode } from "@ton/core";


async function main() {
const tonClient = new TonClient({
endpoint: 'https://testnet.toncenter.com/api/v2/jsonRPC',
apiKey: 'YOUR_API_KEY', //acquire it from: https://t.me/toncenter
});

// Using mnemonic to derive public and private keys
// ATTENTION! Replace on your own mnemonic 24-word phrase that you get from wallet app!
const mnemonic = "swarm trumpet innocent empty faculty banner picnic unique major taste cigar slogan health neither diary monster jar scale multiply result biology champion genuine outside".split(' ');
// Remember that it should be mnemonic of the wallet that you have made an owner of NFT

const { publicKey, secretKey } = await mnemonicToWalletKey(mnemonic);
const walletContract = WalletContractV5R1.create({ walletId: { networkGlobalId: -3 }, publicKey });
const wallet = tonClient.open(walletContract);
const seqno = await wallet.getSeqno();

const nftTransferBody = beginCell()
.storeUint(0x5fcc3d14, 32) // opcode for nft transfer
.storeUint(0, 64) // query id
.storeAddress(wallet.address) // address to transfer ownership to
.storeAddress(wallet.address) // response destination
.storeBit(0) // no custom payload
.storeCoins(1) // forward amount - if >0, will send notification message
.storeMaybeRef(comment('Hello from NFT!'))
.endCell();

//The one that you have acquired from https://ton-collection-edit.vercel.app/deploy-nft-single
const nftAddress = Address.parse('YOUR_NFT_ADDRESS');
// Sending NFT transfer
await wallet.sendTransfer({
seqno,
secretKey,
messages: [internal({
to: nftAddress,
body: nftTransferBody,
value: toNano(0.05),
})],
sendMode: SendMode.PAY_GAS_SEPARATELY | SendMode.IGNORE_ERRORS,
});
}
main();

Запустить этот пример, используя следующую команду:

npx ts-node 2-send-nft.ts

Ожидаемый результат

Перейдите в Tonviewer и вставьте свой адрес в строку поиска. Вы должны увидеть передачу NFT с комментарием 'Hello from NFT!'.

Следующий шаг

Теперь, когда вы научились писать данные в блокчейн TON, пришло время перейти к следующему этапу — разработке своих смарт-контрактов. Сначала вам нужно настроить свою среду разработки с помощью необходимых инструментов и библиотек.

Нажмите на кнопку ниже, чтобы начать:

Настройка среды разработки

Was this article useful?