Llamar a un contrato desde un contrato llamado

Estoy tratando de hacer llamadas anidadas o como se llamen. Siempre me quedo sin gas excepción. ¿Qué me estoy perdiendo?

Desde el lado de JS lo hagocaller.makeCall(firstAddress, secondAddress, {gas:300000, value: 300000000000000000}, callback)

Estos son los contratos:

contract caller {
    function makeCall(address first, address second){
        first.call.gas(100000).value(200000000000000000)(bytes4(bytes32(sha3('makeCall(address)'))), second);
    }
}

contract first {
    function makeCall(address second) {
        second.call.gas(100000).value(100000000000000000)(bytes4(bytes32(sha3('make()'))));
    }
}

contract second {
    uint public x = 1;
    function make(){
        x = 2;
    }
    function(){
        x = 3;
    }
}

He comprobado dos veces todo. He suministrado hasta 3 millones de gas y todavía me quedo sin excepción de gas .

Aquí hay un tx https://testnet.etherscan.io/tx/0xf5986e85f7601e6a896eda22d72cb302d59013f9750c9997bf112acea757f839

¡Por favor ayuda!

Respuestas (2)

Está cambiando los parámetros de la función, no los valores del gas. Consulte la documentación para conocer la sintaxis correcta de llamar a métodos de contrato externos desde contratos.

Nunca use call() para métodos que cambien el estado de la cadena de bloques. call() se usa solo para consultar (leer) la cadena de bloques.

Vaya, he encontrado un error.

Entonces, el problema era que first.call.gas(100000)los forwards contrataban firstexactamente esa cantidad. Cuando el control de EVM second.call.gas(100000)lo alcanza, envía esta cantidad al contrato de segundo y, como resultado, no queda más gas para el contrato de primero . Y de ahí viene la excepción de falta de gasolina . Ahora, he cambiado first.call.gas(100000)a first.call.gas(200000)y todo funciona bien.

  • la persona que llama tiene un saldo de 0.1 ether
  • primero tiene 0.1 balance de éter
  • el segundo tiene un balance de éter de 0.1
  • uint público x == 2