gas infinito requerido de llamada de función externa simple

He minimizado el siguiente código de solidez generado en remix para demostrar el problema. Este código advierte que la función test001.regester requiere gas infinito que obviamente por el código no puede ser.

¿Alguien podría determinar cuál es realmente el problema?

He probado varias versiones de la secuencia de llamadas de la llamada remota y todas tienen el mismo problema. (Otras versiones se muestran comentadas en el código de función a continuación).

pragma solidity ^0.4.17;

contract test002 {

    address[] AddressList;

    event ItemAdded(address, address);


    function getItemCount() public view returns(uint) {return(AddressList.length);}
    function getItem(uint index) public view returns(address) {return(AddressList[index]);}

    function addItem(address inItem) public {
        AddressList[AddressList.length] = inItem;
        ItemAdded(this, inItem);
    }

}

contract test001 {

    address AA;

    event Creation(address, address);

    function test001() public {
        AA = new test002();

        Creation(address(this), AA);
    }

    function register() public {
        // option 1
//        test002(AA).addItem(address(this));

        // option 2        
//        test002 A = test002(AA);
//        A.addItem(this);

        // option 3
        test002 A = test002(AA);
        A.addItem(address(this));
    }



}

Respuestas (1)

Creo que esto es solo una limitación del compilador Solidity. Cualquier llamada a otro contrato activa esta advertencia, ya que Solidity no sabe cuánta gasolina requerirá el otro contrato.

Es técnicamente posible que el compilador reconozca aquí a través de un análisis estático que la dirección que está usando siempre proviene new test002()del constructor, pero en realidad es una inferencia bastante difícil de hacer. El compilador de Solidity no es tan inteligente, por lo que se da por vencido y dice que está llamando a otro contrato, por lo que no se puede determinar el gas requerido en el momento de la compilación.

Es seguro simplemente ignorar la advertencia.

EDITAR

Abordando el error que mencionaste en el comentario.

Esta línea siempre intenta escribir más allá del final de una matriz:

AddressList[AddressList.length] = inItem;

Primero debe extender la longitud de la matriz, así:

AddressList.length += 1
AddressList[AddressList.length - 1] = inItem;

o (mejor) simplemente use push:

AddressList.push(inItem);
Al crear los contratos en Remix, la llamada para registrarse falla debido al siguiente error sin capacidad de depuración. "transacción a prueba001. registro erróneo: el gas requerido excede la asignación o siempre falla la transacción"
¿Está seguro? Para mí, falla con "transact to test001.register errored: VM error: revert". Oh, acabo de ver tu comentario editado. Sí, ese error es similar. Tampoco tiene que ver con el aviso de gas infinito.
Vea mi edición para conocer la causa de ese error.
¡Muchas gracias! ¡Eso parece resolver este problema para este ejemplo! Ahora regresaré e intentaré aplicar esta solución al código original y veré qué sucede.