# Как создать транзакцию и отправить ее на блокчейн
Все события на блокчейне представлены в виде транзакций. Например:
- транзакция данных записывает информацию в хранилище данных аккаунта;
- транзакция перевода отправляет заданное количество токенов с одного аккаунта на другой.
В Waves предусмотрено множество типов транзакций, см. раздел Тип транзакции. Набор полей транзакции зависит от ее типа.
Подтверждение транзакции
В Waves каждая транзакция отправлена с какого-либо аккаунта. Транзакция, отправленная с обычного аккаунта (без установленного скрипта), должна содержать подтверждение — цифровую подпись отправителя. (Смарт-аккаунты и dApp могут устанавливать собственные правила верификации исходящих транзакций.) Подробнее см. в разделе Подтверждение транзакциии.
Есть два способа сгенерировать подтверждение транзакции:
- Если приложение отправляет транзакции от вашего имени, вы можете использовать свою секретную фразу (seed) или закрытый ключ для подписания транзакций. Этот способ описан в подразделе Подписание с помощью секретной фразы ниже.
- Если приложение отправляет транзакции от имени разных пользователей, не следует запрашивать у них секретную фразу или закрытый ключ. Вместо этого используйте официальное приложение-кошелек — например, разработанное командой WX Network. Этот способ описан в подразделе Подписание от имени пользователя ниже.
Комиссия за транзакцию
Транзакции в Waves очень дешевые, но не бесплатные. В каждой транзакции должна быть указана комиссия не менее минимальной. Минимальные комиссии представлены в разделе Комиссия за транзакцию.
💡 На Testnet пользователи могут пополнять баланс WAVES с помощью Testnet Faucet.
Процесс
Чтобы поместить транзакцию в блокчейн:
- Заполните поля транзакции.
- Подпишите транзакцию: сгенерируйте подтверждение и добавьте его к транзакции.
- Отправьте транзакцию на ноду Waves.
Вы можете отправить транзакцию на свою собственную ноду или одну из нод с публичным API:
- Testnet: https://nodes-testnet.wavesnodes.com
- Mainnet: https://nodes.wavesnodes.com
Нода проверяет валидность транзакции. Если проверка прошла успешно, транзакция помещается в очередной сгенерированный блок, в противном случае транзакция отвергается блокчейном. (Транзакции вызова скрипта и транзакции обмена могут быть добавлены на блокчейн, даже если результат выполнения dApp-скрипта или скрипта ассета был неудачным, за такие транзакции взимается комиссия.)
# Подписание с помощью секретной фразы
# С помощью JavaScript
Используйте библиотеку waves-transactions
. Для генерации подписи используется секретная фраза (seed) аккаунта. Если комиссия за транзакцию не указана, она рассчитывается автоматически.
Описание функций приведено в документации библиотеки на Github.
import { broadcast } from "@waves/waves-transactions";
import { data, transfer } from "@waves/waves-transactions";
const nodeUrl = 'https://nodes-testnet.wavesnodes.com';
const seed = 'insert your seed here';
// Транзакция данных: добавляет записи в хранилище данных аккаунта-отправителя
const records = [
{ key: 'integerVal', value: 1 },
{ key: 'booleanVal', value: true },
{ key: 'stringVal', value: 'Lorem ipsum dolor sit amet' }
]
const dataTx = data({ data: records }, seed); // Создание и подписание транзакции данных
broadcast(dataTx,nodeUrl).then(resp => console.log(resp));
// Транзакция перевода: отправляет 1 WAVES на заданный адрес
const money = {
recipient: '3N1HYdheNiiTtHgi2n3jLAek6N3H4guaciG',
amount: 100000000 // Фактическое количество ассета нужно умножить на 10^decimals
}
const transferTx = transfer(money, seed); // Создание и подписание транзакции перевода
broadcast(transferTx,nodeUrl).then(resp => console.log(resp));
# С помощью Python
Используйте библиотеку PyWaves, разработанную сообществом Waves. Класс Address
предназначен для операций в блокчейне. Подробнее см. в документации библиотеки на Github.
import pywaves as pw
myAddress = pw.Address(seed='insert your seed here')
data = [{'type':'string', 'key': 'stringVal', 'value':'Lorem ipsum dolor sit amet'},
{'type':'integer', key: 'integerVal', value: 1 },
{'type':'boolean', key: 'booleanVal', value: true }]
myAddress.dataTransaction(data)
myAddress.sendWaves(recipient = pw.Address('3P8pGyzZL9AUuFs9YRYPDV3vm73T48ptZxs'),
amount = 100000000)
# Подписание от имени пользователя
# С помощью JavaScript
Используйте библиотеку Signer
вместе с библиотеками ProviderWeb
и ProviderCloud
, разработанными командой WX Network. Провайдер открывает окно, в котором пользователь может подтвердить транзакцию. Затем провайдер генерирует подтверждение транзакции.
Если комиссия за транзакцию не указана, она рассчитывается автоматически.
Полное описание приведено в документации Signer.
Пример:
import { Signer } from '@waves/signer';
import { ProviderWeb } from '@waves.exchange/provider-web';
// Инициализация библиотеки
const signer = new Signer({
NODE_URL: 'https://nodes-testnet.wavesnodes.com'
});
signer.setProvider(new ProviderWeb());
// Транзакция данных: добавляет записи в хранилище данных аккаунта-отправителя
const records = [
{ key: 'integerVal', value: 1 },
{ key: 'booleanVal', value: true },
{ key: 'stringVal', value: 'Lorem ipsum dolor sit amet' }
]
const dataTx = signer
.data({ data: records })
.broadcast();
dataTx.then(resp => console.log(resp));
console.log('Data tx: ' + dataTx);
// Транзакция перевода: отправляет 1 WAVES на заданный адрес
const money = {
recipient: '3N1HYdheNiiTtHgi2n3jLAek6N3H4guaciG',
amount: 100000000,
}
const transferTx = signer
.transfer(money)
.broadcast();
transferTx.then(resp => console.log(resp));