Построение на Flow | Learn FCL — 15. Как добавлять и отзывать открытые ключи


Предисловие

Одной из проблем, с которой вы можете столкнуться, когда вам нужно подписать большое количество транзакций, является невозможность подписать более одной транзакции по счету в одном блоке. Это происходит потому, что роль Proposer используется для предоставления nounce, который будет обновлен на ключе счета только после того, как транзакция будет запечатана.

Решение — нужно добавить больше ключей 🔑✨!

Обзор

После изучения кода в этой статье вы будете знать:

  • как обнаружить открытые ключи на аккаунте с помощью Flow View Source
  • как добавить новый PublicKey с заданным весом

Ограничения кошелька

Хотя Blocto или Lilico не позволят вам использовать ключ с другим индексом — кроме 0 — в некоторых случаях все еще ценно добавить открытый ключ, который вы можете использовать программно для автоматизации некоторых задач. Ключ с полным весом даст вам доступ к хранилищу аккаунта и возможность манипулировать им.

Расследование

Прежде чем мы продолжим, давайте проверим наш текущий счет на Flow View Source — 0x5593df7d286bcdb8

😅 Учитывая, сколько раз был запущен Codesandbox, вы, вероятно, увидите здесь несколько ключей.

Вы должны увидеть хотя бы один ключ с weight равным 1000 (полный вес).

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

💡Вы можете пойти и сделать форк своей работы из предыдущей статьи, так как это будет в основном то же самое 🙂

Добавьте пакеты "@onflow/fcl", elliptic и sha3 в качестве зависимостей.

Шаг 2 — Создание подписывающего устройства

Вы можете скопировать/вставить содержимое файла signer.js из предыдущей статьи или следовать инструкциям и создать новый.

Шаг 3 — Настройте FCL

В этом примере мы не будем использовать кошельки — считайте это домашним заданием 😉 — поэтому в нашем конфиге нужен только url узла доступа:

config({ "accessNode.api": "https://rest-testnet.onflow.org" });
Войти в полноэкранный режим Выйти из полноэкранного режима

Шаг 4 — Реализация addPublicKey

Давайте сделаем новую функцию addPublicKey, которая будет:

  • принимать PublicKey как строку,
  • подготавливать транзакцию для передачи открытого ключа и weight в качестве аргументов
  • подпишет и отправит вышеупомянутую транзакцию в сеть.

Процесс аналогичен тому, как мы готовили транзакции в предыдущей статье:

const addPublicKey = async (publicKey) => {
  const cadence = `
  transaction(publicKey: String, weight: UFix64) {
    prepare(signer: AuthAccount) {
      let bytes = publicKey.decodeHex()

      let key = PublicKey(
        publicKey: bytes,
        signatureAlgorithm: SignatureAlgorithm.ECDSA_P256
      )

      var clampledWeight = weight
      // weight should be in range 0 to 1000
      if(clampledWeight > 1000.0){
        clampledWeight = 1000.0
      }

      signer.keys.add(
        publicKey: key,
        hashAlgorithm: HashAlgorithm.SHA3_256,
        weight: clampledWeight
      )
    }
  }
  `;

  // List of arguments
    const weight = (0).toFixed(1) // zero weight keys are perfectly fine for Proposer role
  const args = (arg, t) => [
    arg(publicKey, t.String),
    arg(weight, t.UFix64)
  ];

  // Roles
  const proposer = signer;
  const payer = signer;
  const authorizations = [signer];

    // Execution limit
    const limit = 1000

  // "mutate" method will return us transaction id
  const txId = await mutate({
    proposer, payer, authorizations,
    cadence, args, limit
  });

    // Then we subscribe to status updates and return, when it's sealed
  return tx(txId).onceSealed();
};
Вход в полноэкранный режим Выйти из полноэкранного режима

Шаг 5 — Реализация revokePublicKey

Еще одна функция, которую мы хотели бы подготовить, это revokePublicKey. Она подготовит и отправит транзакцию, которая отменит ключ на аккаунте:

const revokePublicKey = async (keyIndex) => {
  const cadence = `
    transaction(keyIndex: Int){
      prepare(signer: AuthAccount){
        signer.keys.revoke(keyIndex:keyIndex)
      }
    }
  `;
  const args = (arg, t) => [arg(keyIndex.toString(), t.Int)];

  const proposer = signer;
  const payer = signer;
  const authorizations = [signer];

    const limit = 1000;

  // "mutate" method will return us transaction id
  const txId = await mutate({
    cadence, args, limit,
    proposer, payer, authorizations
  });

    // Then we subscribe to status updates and return, when it's sealed
  return tx(txId).onceSealed();
};
Вход в полноэкранный режим Выход из полноэкранного режима

Наконец —

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

(async () => {
  console.clear();

  // PublicKey doesn't need to be unique, so we are gonna use exactly the same one
  // that already exist on account. This way we can control it with the same private key.
  const key =
    "790a6849decbc179e9904f7f601fbd629f1687f371484998ceb8c587303e05ae4f859c7aa91f8493642de1039039d2da9650b4b7d9d44d2486e7a2adabf602bc";

  // Uncomment this block to add public key
  /*
  const txDetails = await addPublicKey(key);
  console.log({ txDetails });
  */

  // Uncomment this block to revoke key
  /*
  const txDetails = await revokePublicKey(2);
  console.log({ txDetails });
  */
})();
Войти в полноэкранный режим Выход из полноэкранного режима

Когда пыль осядет, в вашей консоли должен появиться вывод, показывающий, что транзакция успешно обновила ваш счет:

txDetails: {
    blockId: "b9ddfac94c968864ca369ec890e8025c0144375f334bd0e2ddea1965b175fc82",
    status: 4,
    statusString: "SEALED",
    statusCode: 0,
    errorMessage: "",
    events: Array(4),
    0: Object {
        type: "flow.AccountKeyAdded"
        transactionId: "fa2640f428a3317b656196ef7f069a744b2455569e492f8112d37abca31e273d"
        transactionIndex: 0
        eventIndex: 0
        data: Object
    },
    1: Object,
    2: Object,
    3: Object,
}
Вход в полноэкранный режим Выход из полноэкранного режима

Проверка Flow View Source покажет, что теперь есть несколько ключей, которые можно использовать:

Если вы откомментируете блок использования revokePublicKey и подождете выполнения, вы сможете увидеть, что ключ помечен как отозванный.

💡 Обратите внимание, что ключи не удаляются, а отменяются — вы больше не сможете использовать этот ключевой индекс на этой учетной записи 🤷♂️.

Надеюсь, эта статья была для вас полезной. И если вы прошли через это вместе с нами — вы стали сильнее! 💪

До следующего раза 👋

Ресурсы

  • Полный исходный код — https://codesandbox.io/s/dev-to-15-add-public-key-cvfho2
  • Cadence Docs — Add Key — https://docs.onflow.org/cadence/language/accounts/#add-account-keys
  • Cadence Docs — Revoke Key — https://docs.onflow.org/cadence/language/accounts/#revoke-account-keys

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

  • Flow Docs Site — 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 — удивительная браузерная IDE, позволяющая быстро создавать прототипы.

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