Estoy trabajando en un proyecto que permite a los usuarios implementar automáticamente un contrato específico que creé. Es importante que el sistema pueda escuchar eventos específicos (por ejemplo, una nueva transacción) en TODOS los contratos implementados.
Nota: estoy usando nodejs a través de web3 json rpc para monitorear eventos.
Una posible solución en la que pensé es usar un contrato contenedor que canaliza todas las solicitudes de transacción y envía los eventos en sí. Esto permitirá escuchar solo eventos de un solo contrato, pero no encuentro esa solución muy elegante.
¿Existe una manera eficiente y escalable de lograr eso sin crear un oyente en cada contrato específico?
Parece que la preocupación es que los oyentes podrían multiplicarse de una manera que podría no escalar. No hay una bala de plata que yo sepa que permita que un solo oyente filtre eventos como los que necesitarías. Esta tercera vía es una variante de las dos opciones que entiendo que estás considerando.
Considere manejar las transacciones de la manera que desee y agregue funciones de registro lógicamente centralizadas. Por ejemplo, la fábrica por contrato. Organice las cosas para que los contratos creados en fábrica se basen en las funciones de registro centralizadas en lugar de los emisores de eventos internos.
Si usted tiene:
contract Factory { ...
contract Created {
event LogSomething(bytes32 Id);
...
LogSomething(Id);
Reorganizar como
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 probablemente debería llamarse Hub en el caso de que se dependa de él para algo más que contratos de acuñación.
Espero eso ayude.
web3.eth.filter() (el método de bajo nivel, no del tipo que puede obtener de los objetos de contrato) permite especificar una lista de direcciones para escuchar con un filtro. Tendrá que interpretar manualmente los temas, pero eso no debería ser demasiado difícil.
Observar cuándo se crea un contrato (para saber qué direcciones escuchar) es un poco más difícil. Puede usar el mismo método sin especificar una lista de direcciones y luego usar el topics
argumento para asegurarse de que solo obtiene eventos de contratos que afirman ser suyos. La distinción es importante: cualquiera puede hacer que un evento diga cualquier cosa, por lo que sería prudente verificar que proviene de un contrato que tiene su código.
nergall
nergall
Rob Hitchens
Rob Hitchens
Rob Hitchens
nergall
Rob Hitchens
nergall