Установка и использование платформы

Создание и отправка транзакций при помощи JS SDK

Принципы создания транзакции

Вызов любой транзакции осуществляется при помощи функции Waves.API.Transactions.<ИМЯ_ТРАНЗАКЦИИ>.<ВЕРСИЯ_ТРАНЗАКЦИИ>.

Например, так выглядит вызов транзакции для перевода токенов 3 версии:

const tx = Waves.API.Transactions.Transfer.V3(txBody);

txBody – тело транзакции, содержащее необходимые параметры. К примеру, для вышеуказанной транзакции Transfer оно может выглядеть так:

const tx = Waves.API.Transactions.Transfer.V3(txBody);

{
  "sender": "3M6dRZXaJY9oMA3fJKhMALyYKt13D1aimZX",
  "password": "",
  "recipient": "3M6dRZXaJY9oMA3fJKhMALyYKt13D1aimZX",
  "amount": 40000000000,
  "fee": 100000
}

Тело транзакции можно оставить пустым и заполнить необходимые параметры позднее при помощи обращения к переменной, в которую возвращается результат функции вызова транзакции (в примере – переменная tx):

const tx = Waves.API.Transactions.Transfer.V3({});
tx.recipient = '12afdsdga243134';
tx.amount = 10000;
//...
tx.sender = "3M6dRZXaJY9oMA3fJKhMALyYKt13D1aimZX";
//...
tx.amount = 40000000000;
tx.fee = 10000;

Такой способ вызова транзакции позволяет более гибко производить числовые операции в коде и пользоваться отдельными функциями для определения тех или иных параметров.

Транзакции 3, 13, 14 и 112 используют текстовое поле description, а транзакции 4 и 6 – текстовое поле attachment. Сообщения, отправляемые в этих полях транзакций, перед отправкой необходимо перевести в формат base58. Для этого в JS SDK предусмотрены две функции:

  • base58.encode – перевод текстовой строки в формат base58;

  • base58.decode – обратная расшифровка строки в формате base58 в текст.

Пример тела транзакции с применением base58.encode:

const txBody = {
  recipient: seed.address,
  assetId: '',
  amount: 10000,
  fee: minimumFee[4],
  attachment: Waves.tools.base58.encode('Examples transfer attachment'),
  timestamp: Date.now()
}

const tx = Waves.API.Transactions.Transfer.V3(txBody);

Внимание

При вызове транзакций при помощи JS SDK вам требуется заполнить все необходимые параметры тела транзакции, кроме type, version, id, proofs и senderPublicKey. Эти параметры заполняются автоматически при генерации пары ключей (keyPair).

Описание параметров, входящих в тело каждой транзакции, см. в разделе Описание транзакций.

Отправка транзакции

Для отправки транзакции в сеть посредством JS SDK используется метод broadcast:

await tx.broadcast(seed.keyPair);

Этот метод вызывается после создания транзакции и заполнения ее параметров. Результат его выполнения может быть присвоен переменной для отображения результата отправки транзакции в сеть (в примере – переменная result):

try {
    const result = await tx.broadcast(seed.keyPair);
    console.log('Broadcast PolicyCreate result: ', result)
} catch (err) {
    console.log('Broadcast error:', err)
}

Ниже приведен полный листинг вызова транзакции перевода токенов и ее отправки:

const { create: createApiInstance, MAINNET_CONFIG } = require('..');
const nodeFetch = require('node-fetch');

const nodeAddress = 'https://hoover.welocal.dev/node-0';
const seedPhrase = 'examples seed phrase';

const fetch = (url, options = {}) => {
  const headers = options.headers || {}
  return nodeFetch(url, { ...options, headers: {...headers, 'x-api-key': 'wavesenterprise'} });
}

(async () => {
  const { chainId, minimumFee, gostCrypto } = await (await fetch(`${nodeAddress}/node/config`)).json();

  const wavesApiConfig = {
    ...MAINNET_CONFIG,
    nodeAddress,
    crypto: gostCrypto ? 'gost' : 'waves',
    networkByte: chainId.charCodeAt(0),
  };

  const Waves = createApiInstance({
    initialConfiguration: wavesApiConfig,
    fetchInstance: fetch
  });

  const seed = Waves.Seed.fromExistingPhrase(seedPhrase);

  const txBody = {
    recipient: seed.address,
    assetId: '',
    amount: 10000,
    fee: minimumFee[4],
    attachment: Waves.tools.base58.encode('Examples transfer attachment'),
    timestamp: Date.now()
  }

  const tx = Waves.API.Transactions.Transfer.V3(txBody);

  try {
    const result = await tx.broadcast(seed.keyPair);
    console.log('Broadcast transfer result: ', result)
  } catch (err) {
    console.log('Broadcast error:', err)
  }

})();

Примеры вызова и отправки других транзакций см. в разделе «Примеры использования» Дополнительные методы, доступные при создании и отправке транзакции

Помимо метода broadcast, для отладки и определения параметров транзакции доступны следующие методы:

  • isValid – проверка тела транзакции, возвращает 0 или 1;

  • getErrors – возвращает строковый массив, содержащий описание ошибок, допущенных при заполнении полей;

  • getSignature – возвращает строку с ключом, которым была подписана транзакция;

  • getId – возвращает строку с идентификатором отправляемой транзакции;

  • getBytes – внутренний метод, который возвращает массив байт для подписания.

Смотрите также