Tengo un flujo que produce 4 eventos.
Cuando obtengo el hash de la transacción a través de web3.js, puedo ver que los 4 eventos están incluidos en los registros de recepción, pero solo los últimos 2 eventos están en los registros decodificados (lo que significa que tengo que decodificar los primeros 2 eventos yo mismo):
{
"receipt": {
...
"logs": [
{
"logIndex": 0,
...
},
{
"logIndex": 1,
...
},
{
"logIndex": 2,
...
},
{
"logIndex": 3,
...
}
],
...
},
"logs": [
{
"logIndex": 2,
...
},
{
"logIndex": 3,
...
}
]
}
¿Cuál es la razón para esto?
OK, entiendo la razón:
Todos los eventos generados durante la ejecución de la función llamada por web3 se incluyen en los registros de recepción, pero solo los eventos generados en el ámbito del contrato en el que se implementa la función se incluyen en los registros decodificados.
Por ejemplo, dado el siguiente código en cadena:
Archivo IContract1.sol
:
pragma solidity ^0.4.18;
interface IContract1 {
function func(uint256 x) external returns (uint256);
}
Archivo Contract1.sol
:
pragma solidity ^0.4.18;
import "./IContract1.sol";
contract Contract1 is IContract1{
event Event1(uint256 x);
function func(uint256 x) external returns (uint256) {
Event1(x);
return x;
}
}
Archivo Contract2.sol
:
pragma solidity ^0.4.18;
import "./IContract1.sol";
contract Contract2 {
IContract1 private contract1;
function Contract2(IContract1 _contract1) public {
contract1 = _contract1;
}
event Event2(uint256 x);
function func(uint256 x) external returns (uint256) {
Event2(x);
return contract1.func(x);
}
}
Si ejecuto el siguiente código fuera de la cadena:
let contract1 = await artifacts.require("Contract1.sol").new();
let contract2 = await artifacts.require("Contract2.sol").new(contract1.address);
let hash = await contract2.func(42);
Entonces hash.receipt.logs
incluirá tanto Event1
como Event2
.
Pero hash.logs
incluirá solamente Event2
.
thomas jay prisa
buena vibración
receipt
parte lo muestra claramente, pero la parte del registro decodificado contiene solo información parcial. Cuando ejecuto flujos similares con solo 2 eventos, todos se decodifican. Tal vez haya una limitación de web3 en la cantidad de eventos decodificados, pero claramente se siente como un problema en el lado de web3. ¡¡¡Gracias!!!thomas jay prisa
buena vibración
buena vibración