Как использовать Taquito Batch API для отправки нескольких транзакций с одним и тем же хешем

Одна из проблем, с которыми вы столкнетесь, когда начнете разрабатывать более сложные децентрализованные приложения для своих смарт-контрактов, возникает при создании нескольких новых транзакций подряд. Каждая учетная запись Tezos содержит счетчик, который увеличивается каждый раз, когда операция включается в блок в сети. Это означает, что вы не можете подделать новую транзакцию, если у вас уже есть ожидающая транзакция, или вы получите теперь печально известное сообщение об ошибке Counter 12345 already used for contract tz1...

Существуют разные сценарии, когда вы хотите отправить несколько транзакций одновременно: например, вы можете хранить в своем децентрализованном приложении каждый запрос на обновление от ваших пользователей, прежде чем просить их подтвердить их и отправить их все сразу. Такито создал Batch API, чтобы упростить процесс. Это предмет данного руководства.

Что такое пакетный API?

Taquito предоставляет простой способ создания и отправки транзакций в блокчейн, независимо от того, хотите ли вы отправить несколько tez на определенный адрес или взаимодействовать со смарт-контрактом. Каждый раз, когда учетная запись Tezos подписывает транзакцию, ее счетчик транзакций увеличивается на 1. Эта функция не позволяет пользователям отправлять две или несколько транзакций подряд, как показано в этом фрагменте кода:

/*  
* ONE OF THESE TRANSACTIONS WILL FAIL  
* AND YOU WILL GET AN ERROR MESSAGE  
*/  
const op1 = await contract.methods.interact("tezos").send();
const op2 = await contract.methods.wait([["unit"]]).send();
await op1.confirmation();
await op2.confirmation();  
/*  
* Error Message returned by the node:  
* "Error while applying operation opWH2nEcmmzUwK4T6agHg3bn9GDR7fW1ynqWL58AVRAb7aZFciD:  
* branch refused (Error:  
* Counter 1122148 already used for contract tz1VSUr8wwNhLAzempoch5d6hLRiTh8Cjcjb (expected 1122149))"  
*/

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

Как это работает?

Объект TezosToolkit предоставляет метод под названием batch. Впоследствии возвращенный объект предоставляет 6 различных методов, которые могут быть объединены в соответствии с количеством транзакций, которые необходимо отправить.

После объединения различных методов пакетных операций вместе создается одна транзакция, которая транслируется с возвращенным хешем одной операции. Что касается любой другой транзакции, созданной Taquito, вы затем ждете определенного количества подтверждений.

Метод withTransfer

Этот метод позволяет добавить к пакетным операциям передачу tez. Он принимает объект как параметр с 4 свойствами. Два из них являются обязательными: to указывает получателя перевода, а amount указывает сумму tez, которая должна быть переведена. Два других свойства являются необязательными: если mutez установлен в true, значение, указанное в amount, считается находящимся в mutez.

Метод withOrigination

Этот метод позволяет добавить создание одного или нескольких контрактов к существующему пакету операций. Он принимает объект как параметр с 4 свойствами. Свойство code является обязательным и может быть строкой, представляющей простой код Майкельсона или JSON-представление контракта Майкельсона. Объект параметра также должен включать свойство init или storage: если указано init, storage является необязательным, и наоборот. init - это начальное значение объекта хранения, которое может быть закодировано в кодировке Micheline или JSON. storage - это представление объекта хранилища в JavaScript. При желании вы также можете указать balance для вновь созданного контракта и delegate.

Метод withDelegation

Этот простой метод позволяет группировать несколько транзакций делегирования. Метод принимает объект как параметр с единственным свойством: адрес делегата.

Метод withContractCall

Этот метод может быть одним из самых полезных, поскольку он позволяет вам группировать и отправлять несколько вызовов контрактов в рамках одной транзакции. Параметр также довольно прост: он принимает функцию, которую вы бы вызывали для объекта абстракции контракта, если бы вы отправили одну транзакцию.

Метод with

Если вы предпочитаете иметь массив, содержащий объекты с различными транзакциями, которые вы хотите передать, вы можете использовать метод with. Он позволяет группировать транзакции как объекты вместо объединения вызовов функций. Используемый вами объект ожидает тех же свойств, что и параметр соответствующего метода, с дополнительным свойством kind, которое указывает тип транзакции, которую вы хотите отправить (удобное перечисление opKind экспортируется из пакета Taquito с допустимыми значениями для kind имущество).

Примечание: вы не можете выполнять вызовы контракта с помощью этого метода.

Метод send

После объединения всех необходимых операций вы должны использовать метод send для их выполнения. Этот шаг очень похож на то, что вы сделали бы для создания одной транзакции.

Как и в случае с другими операциями, созданными Taquito, метод send - это обещание, которое возвращает объект, хэш операции которого доступен в свойстве hash и где вы можете дождаться подтверждения транзакции с помощью метода confirmation (принимая в качестве параметра количество подтверждения, которые вы хотели бы получить).

Какие есть ограничения?

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

использованная литература

Также прочтите

Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик