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));
}
}
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);
les
usuario19510
usuario19510
les