Запись в сеть
В предыдущем разделе вы узнали, как читать данные из блокчейна TON. Теперь давайте рассмотрим, как записывать их.
Введение
Это руководство разъяснит вам запись данных в блокчейн TON. Вы научитесь:
- Делать транзакции
- Переводить TON и NFT
Настройка окружения
Сначала посетите страницы установки и установите Node.js и npm для вашей ОС. Проверьте, что установка корректна, выполнив следующие команды:
node -v
npm -v
Версии node
и npm
должны быть по крайн ей мере v20
и v10
соответственно.
Настройка проекта
Давайте настроим структуру нашего проекта:
- Создайте новый каталог для проекта
- Инициализируйте проект Node.js
- Установите необходимые зависимости
- Инициализируйте конфигурацию 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
:
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
:
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, пришло время пе рейти к следующему этапу — разработке своих смарт-контрактов. Сначала вам нужно настроить свою среду разработки с помощью необходимых инструментов и библиотек.
Нажмите на кнопку ниже, чтобы начать:
Настройка среды разработки