Вызывать функцию смарт-контракта из Java-приложения без необходимости слушать события
Как я понял, мы должны использовать TransactionReceipt, если мы хотим извлечь события..
TransactionReceipt transactionReceipt = contract.someMethod(
<param1>,
...).send();
но как быть, например, если у меня есть функция с именем "register" и мне нужно много учетных записей, чтобы зарегистрировать себя, вызвав функцию register.
как я могу определить учетные записи (много учетных данных), если TransactionReceipt не имеет параметров для (из которых учетная запись, лимит газа,.. и т. д.).
Еще одна вещь, которую я вызвал функцию "register", используя TransactionReceipt следующим образом:
TransactionReceipt transactionReceipt = contract.register("John",BigInteger.valueOf(101)).send();
но эта ошибка появляется:
Error processing transaction request: Error: Exceeds block gas limit
Спасибо
1 ответ
Как я понял, мы должны использовать TransactionReceipt, если мы хотим извлечь события..
TransactionReceipt
это не единственный способ слушать события. Вы также можете настроить наблюдаемый фильтр:
contract.someEventObservable(startBlock, endBlock).subscribe(event -> ...);
TransactionReceipt
хороший способ получить доступ к событиям, генерируемым для одной конкретной транзакции. Все события, сгенерированные во время транзакции, включаются в квитанцию. Однако, если вы хотите обрабатывать события в целом по нескольким транзакциям и / или использовать фильтры, вы хотите использовать наблюдаемый фильтр. Там целый раздел о фильтрах событий с примерами здесь.
как я могу определить учетные записи (много учетных данных), если TransactionReceipt не имеет параметров для (из которых учетная запись, лимит газа,.. и т. д.).
Если я правильно понимаю этот вопрос, вы хотите знать, как обрабатывать раздел событий TransactionReceipt
? Web3j предоставляет вспомогательный метод в экземпляре контракта, который будет обрабатывать журналы от TransactionReceipt
,
EventValues eventValues = contract.processEVENT_NAMEEvent(transactionReceipt);
Замените EVENT_NAME на тип интересующего вас события. Любая информация, относящаяся к вашей учетной записи, которая вам нужна для идентификации нужного вам события (адрес, имя и т. Д.), Должна быть включена в само событие.
РЕДАКТИРОВАТЬ: На основании вашего комментария, похоже, я неправильно понял эту часть вашего вопроса. Я оставлю свой предыдущий ответ здесь на случай, если он будет полезен для обработки событий, и рассмотрю ваш вопрос ниже.
После создания экземпляра контракта (либо через deploy
или же load
), вы можете изменить лимит газа и цену на газ. У обоих есть сеттеры в родительском классе оболочки. Поэтому вы можете повторно использовать одну и ту же оболочку для вызова различных функций в вашем контракте, используя соответствующие параметры газа для этой конкретной функции.
Тем не менее, вы не можете изменить основной Credentials
(по крайней мере, не без подкласса или изменения сгенерированной оболочки). Для разных учетных данных создайте разные объекты-оболочки, используя .load
,
но эта ошибка появляется:
Error processing transaction request: Error: Exceeds block gas limit
Я не могу помочь с этим, не видя контракт и код, используемый для вызова функции.