Estoy tratando de llamar a una función de contrato desde otro contrato, usando web3.js
.
Al usar ganache
o remix
todo funciona bien: web3.js
devuelve los eventos disparados y el gas usado (33938 en este ejemplo) y los campos relevantes en los contratos están siendo cambiados.
Sin embargo, cuando estoy usando geth
todo lo anterior funciona, pero solo mientras no llame a la función de otro contrato.
Al hacerlo no se devuelven los eventos, no se modifican los campos y el gas devuelto es 90000 o el gas que estoy enviando en las send
opciones web3 (ej.c1.methods.transferToC2(1).send({from: <my account address>, gas: 2000000});
Estos no son exactamente los contratos, pero para una comprensión general del problema, la estructura de los contratos relevantes es algo así como:
Contract c1 () {
event Event(uint256 someNumber);
address private c2Address = 0x208bcebf6cfa80fe2862fcdacdeb6ad9d3533017;
address private someAddress = 0x5e7105a34ed27f0b72285f2f951394f3da3ea5eb;
function transferToC2(uint256 someNumber) public {
Event(someNumber);
IERC20(c2Address).foo(someAddress, someNumber);
}
}
Contract c2 is ERC20 () {
}
interface IERC20 {
function foo(address someAddress, uint256 someNumber) public returns (bool);
}
contract ERC20 is IERC20 {
mapping (address => uint256) internal someMapping;
function foo(address someAddress, uint256 someNumber) public {
someMapping[someAddress] = someNumber;
return true;
}
}
Estoy implementando los contratos truffle migrate --network <network> --reset
y el resultado es algo así como:
Deploying c1...
... 0x703293ce078c3c50e6da8725c6e9a4b91ae904c2943929c8e4189069dccc3de8
c1: 0xed8b7d949b961b1135199e08a9180f5328234426
Deploying c2...
... 0x1b54c170d4fccc13724ee9000078ff437b49883438413e5bf8da68d9343ca6d8
c2: 0x208bcebf6cfa80fe2862fcdacdeb6ad9d3533017
Dentro del nodo geth parece que el saldo de la dirección de mi cuenta siempre está creciendo, supongo que como resultado de la minería.
Siguiendo la dirección de Ismael, agregué a genesis.json
la byzantiumBlock
definición, por ejemplo:
"config": {
"chainId": 6035,
"homesteadBlock": 0,
"byzantiumBlock": 0 //added this
},
Y el problema paró.
ismael
msg.sender will be contract A not the original sender. If B is an ERC20 token and A want to transfer tokens from the user it has to call
transferFrom` (el usuario tiene queapprove
contratar previamente a A para hacerlo).Achi Even-dar
ismael
Achi Even-dar
byzantiumBlock
algenesis.json
archivo