Я работаю над проектом, который позволяет пользователям автоматически развертывать определенный контракт, который я создал. Для системы важно иметь возможность прослушивать определенные события (например, новую транзакцию) для ВСЕХ развернутых контрактов.
Примечание. Я использую nodejs через web3 json rpc для мониторинга событий.
Одно из возможных решений, о котором я подумал, — использовать контракт-оболочку, который туннелирует все запросы транзакций и отправляет сами события. Это позволит прослушивать только события из одного контракта, но я не нахожу это решение очень элегантным.
Есть ли эффективный и масштабируемый способ добиться этого без создания прослушивателя для каждого конкретного контракта?
Похоже, беспокойство вызывает то, что слушатели могут размножаться таким образом, что это может не масштабироваться. Насколько я знаю, нет серебряной пули, которая позволила бы одному слушателю фильтровать события, как вам нужно. Этот третий способ является вариантом двух вариантов, которые, как я понимаю, вы рассматриваете.
Рассмотрите возможность обработки транзакций так, как вы хотите, и добавьте логически централизованные функции ведения журнала. Например, контрактный завод. Организуйте все так, чтобы контракты, созданные на заводе, полагались на функции централизованного ведения журнала, а не на внутренние генераторы событий.
Если у вас есть:
contract Factory { ...
contract Created {
event LogSomething(bytes32 Id);
...
LogSomething(Id);
Переставить как
contract Hub {
event LogSomething(address contract, bytes32 Id);
...
function logSomething(bytes32 Id);
LogSomething(msg.sender, Id); // msg.sender will be the "spoke" that called Hub function.
contract Created{
...
function important(bytes32 id) {
..
Hub.logSomething(Id);
Factory, вероятно, следует называть Hub в том случае, если он используется не только для заключения контрактов.
Надеюсь, поможет.
web3.eth.filter() (низкоуровневый метод, а не тот, который вы можете получить из объектов контракта) позволяет указать список адресов для прослушивания с одним фильтром. Вам придется вручную интерпретировать темы, но это не должно быть слишком сложно.
Отследить момент создания контракта (чтобы вы знали, какие адреса слушать) несколько сложнее. Вы можете использовать тот же метод без указания списка адресов, а затем использовать topics
аргумент, чтобы убедиться, что вы получаете события только из контрактов , претендующих на то, чтобы быть вашими. Различие важно — любой может заставить событие сказать что угодно, поэтому было бы разумно убедиться, что оно исходит из контракта, в котором есть ваш код.
нергалл
нергалл
Роб Хитченс
Роб Хитченс
Роб Хитченс
нергалл
Роб Хитченс
нергалл