Встраивание в поток: Изучение FCL — 2. Передача аргументов сценариям

Резюме

После работы с кодом в этой заметке вы будете знать, как:

  • Передавать простые аргументы — Int , String и т.д.
  • Передача сложных аргументов — массивы и словари.
  • Передача сложных структур — массивов словарей и т.д.

Ранее в разделе «Изучаем FCL»

В прошлых постах мы узнали, как отправлять основные сценарии в Cadence на выполнение. В этой статье я покажу вам, как передавать различные типы аргументов.

Для этого и всех следующих примеров мы будем использовать Codesandbox, чтобы упростить процесс.

Шаг 1 — Установка

Добавьте "@onflow/fcl": "1.0.0" в качестве зависимости в ваш проект.

Шаг 2 — Настройка

Как и в прошлый раз, мы импортируем необходимые методы и настроим FCL:

import { query, config } from "@onflow/fcl";
const api = "[https://rest-testnet.onflow.org](https://rest-testnet.onflow.org/)";
config().put("accessNode.api", api);
Войдите в полноэкранный режим Выход из полноэкранного режима

Шаг 3 — Передача целых чисел

passIntegers передаст два целых числа в качестве аргументов простому скрипту в Cadence, который вернет их сумму.

const passIntegers = async () => {
// Aquí almacenaremos el código que queremos ejecutar.
// Podemos ponerlo en la misma línea que pasamos el método "query"
// pero se ve mas simple de esta manera.
const cadence = pub fun main(a: Int, b: Int): Int{
       return a + b     
};

// A pesar de que ambos argumentos son números, tenemos que pasarlos como String.
const a = (5).toString();
const b = (12).toString();
const args = (arg, t) => [arg(a, t.Int), arg(b, t.Int)];

// "query" pasará código Cadence y los argumentos para acceder a un nodo para ejecutarse y retornará el resultado
// lee más acerca del método "query" en la documentación de FCL:
// [https://docs.onflow.org/fcl/reference/api/#query](https://docs.onflow.org/fcl/reference/api/#query)
const result = await query({ cadence, args });
console.log({ result }); 
};
Войдите в полноэкранный режим Выход из полноэкранного режима

Шаг 4 — Пройдите несколько различных типов

passMultipleDifferentTypes будет передавать аргументы String, Bool, UFix64 и Address.

const passMultipleDifferentTypes = async () => {
  const cadence = `
    pub fun main(a: String, b: Bool, c: UFix64, d: Address): Address{
      return d
    }
  `;

  const a = "Hello";
  const b = true;
    // Todos los valores numericos tienen que ser pasados como Strings, recuerdas? :)
  const c = "42.0";
    // Las direcciones también deberían ser pasadas como Strings.
  const d = "0x01";

  // No todos los tipos son los mismos como especificamos en nuestro codigo en Cadence.
  const args = (arg, t) => [arg(a, t.String), arg(b, t.Bool), arg(c, t.UFix64)];

  const result = await query({ cadence, args });
  console.log({ result }); 
};
Войдите в полноэкранный режим Выход из полноэкранного режима

Шаг 5 — Передача массива

МетодpassArray передает массив строк и возвращает одну из них.

const passArray = async () => {
  const cadence = `
    pub fun main(a: [String]): String{
      return a[1]
    }
  `;

  const a = ["Hello", "Cadence"];
    // El tipo del argumento esta compuesto por t.Array y t.String
  const args = (arg, t) => [arg(a, t.Array(t.String))];

  const result = await query({ cadence, args });
  console.log({ result }); //
};

Войдите в полноэкранный режим Выход из полноэкранного режима

Шаг 6 — Пройти словарь

МетодpassDictionary передает словарь в качестве аргумента, а затем возвращает значение одного из полей словаря. Ключи такого словаря будут иметь тип String, а значения — тип Int.

const passDictionary = async () => {
    // En este ejemplo pasaremos un diccionario de Cadence como argumento.
    // Las llaves seran de tipo String y los valores de tipo Int.
  const cadence = `
    pub fun main(a: {String: Int}): Int?{
      return a["amount"]
    }
  `;

    // Los diccionarios deben ser representados como listas de pares de clave y valor.
    // Nótese que aquí deberiamos pasar un valor numérico como String 
  const a = [{ key: "amount", value: "42" }];
    // Para nuestro caso el tipo del diccionario esta compuesto de t.Dictionary, t.String y t.Int
  const args = (arg, t) => [
    arg(a, t.Dictionary({ key: t.String, value: t.Int }))
  ];

  const result = await query({ cadence, args });
  console.log({ result }); //
};
Войдите в полноэкранный режим Выход из полноэкранного режима

Шаг 7 — Передача сложных аргументов

МетодpassComplex продемонстрирует, как передать список словарей в качестве аргумента. Концептуально это комбинация типов Arrays и Dictionary.

Наконец-то

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

(async () => {
  console.clear();
  await passIntegers();
  await passMultipleDifferentTypes();
  await passArray();
  await passDictionary();
  await passComplex();
})();
Войдите в полноэкранный режим Выход из полноэкранного режима

Когда пыль осядет, в истории консоли вы увидите следующее.

{result: "17"}
{result: "0x0000000000000001"}
{result: "Cadence"}
{result: "42"}
{result: "1337"}
Войдите в полноэкранный режим Выход из полноэкранного режима

Практикуйтесь в передаче различных типов аргументов, это должно стать для вас обычным делом в будущем.

Полный код можно найти на Codesandbox здесь https://codesandbox.io/s/dev-to-fcl-script-arguments-knpuel.

Увидимся в следующий раз! 👋

Ресурсы

Другие ресурсы, которые могут быть вам полезны:

  • Документация Flow — https://docs.onflow.org/ — Более подробная информация о блокчейне Flow и о том, как с ним взаимодействовать.
  • Портал Flow Portal — https://flow.com/ — Ваш шлюз в Flow.
  • FCL JS — https://github.com/onflow/fcl-js — Исходный код и возможность внести свой вклад в библиотеку FCL JS.
  • Cadence — https://docs.onflow.org/cadence/ — Введение в Cadence.
  • Codesandbox — https://codesandbox.io — Классный текстовый редактор для создания прототипов в браузере.

Это перевод второй статьи из серии Build on Flow | Learn FCL, написанной Максимусом Старка.

Оцените статью
Procodings.ru
Добавить комментарий