Obtener estimaciones infinitas de gas para funciones simples

Estoy probando solidez en remix ide usando contratos simples. Este es el contrato que escribí:

 contract mortal {

address owner;

function mortal() {
    owner = msg.sender;
}

function kill(){
    if(msg.sender == owner){
        selfdestruct(owner);
    }
   }
}

contract Hello is mortal
{

string public message;

function Hello(){
    message = 'This is the initial Message';
    }

function getMessage() public constant returns(string){
    return message;
    }

function setNewMessage(string newMessage) public payable {
    message = newMessage;   
    }
} 

Al observar los detalles, obtengo estimaciones infinitas de gas para cada una de estas funciones.

{
"Creation": {
    "codeDepositCost": "243200",
    "executionCost": "infinite",
    "totalCost": "infinite"
},
"External": {
    "getMessage()": "infinite",
    "kill()": "30636",
    "message()": "infinite",
    "setNewMessage(string)": "infinite"
}
}

Explique por qué obtengo estimaciones de gas infinitas para estas funciones y cómo puedo evitar este error.

mortaldonde esta el contrato
Actualicé por pregunta

Respuestas (3)

El contrato se compila muy bien:

pragma solidity ^0.4.15;

contract mortal {
    address owner;

    function mortal() public {
        owner = msg.sender;
    }

    function kill() public {
        if (msg.sender == owner) {
            selfdestruct(owner);
        }
    }
}

contract Hello is mortal {
    string public message;

    function Hello() public {
        message = 'This is the initial Message';
    }

    function getMessage() public constant returns(string) {
        return message;
    }

    function setNewMessage(string newMessage) public payable {
        message = newMessage;   
    }
} 

pero luego aparecen las advertencias...

ingrese la descripción de la imagen aquí

pero envía/confirma en Ropsten muy bien...

ingrese la descripción de la imagen aquí

y las llamadas al método también funcionan bien ...

ingrese la descripción de la imagen aquí

Esto puede ser solo un error en el análisis estático del compilador.

Veo que se está ejecutando, tal vez sea un error en el remix como señalaste. Gracias :)
La advertencia es solo eso. No significa que el contrato no funcionará; simplemente significa que el uso de gas es potencialmente ilimitado. Creo que la advertencia es correcta.
@smarx, sí, veo tu punto, ya que el tipo de cadena parece no estar vinculado
@smarx Entonces, si la cadena no tiene límites, ¿cuál es la mejor alternativa para almacenar datos de cadena?
No estoy seguro de entender la pregunta. ¿Qué tiene de malo usar solo una cadena? Si desea limitar la longitud de la cadena que los usuarios pueden proporcionar, puede verificar la longitud. (Por ejemplo, require(newMessage.length <= 20);)
@AhsanJamal Puede usar bytes32o cualquier cantidad de bytes en lugar de string. Solo asegúrese de que los bytes puedan admitir la información necesaria. Luego puede convertir fácilmente los bytes en cadenas fácilmente. ethereum.stackexchange.com/questions/2519/…

Sospecho que esto se debe a que el costo de esas funciones es ilimitado. Las cadenas pueden tener cualquier longitud, por lo setNewMessage()que necesita almacenar una cantidad ilimitada de datos y getMessage()necesita leer una cantidad ilimitada de datos.

Si desea evitar esa advertencia, debe usar un tipo de datos con un límite superior fijo en su tamaño.

No sé qué es un "límite de gas agotado" (¿tal vez se está discutiendo la advertencia de gas infinito?), Pero agregue una respuesta si cree que tiene una solución.
Solo para confirmar, veo las mismas advertencias de gas infinito que OP cuando uso Solidity 0.4.19 en Remix.
Incluso si cambio el tipo de cadena a Bytes32, sigo obteniendo gas infinito para estas funciones.
Cambiar a bytes32me deshace de la advertencia.
¿Por qué esto está siendo votado negativo? parece bastante razonable
Estoy bastante seguro de que esta es la respuesta correcta. Supongo que fue rechazado por @Victory o por otra persona que vio su comentario (lo que hizo que pareciera que esta respuesta era incorrecta).
Eliminé mi comentario anterior, esta A era correcta. Leí mal la pregunta.

Es porque está utilizando una cadena que no tiene un tamaño particular, es decir, es un tipo de datos no vinculado. Puede usar bytes32 en lugar de una cadena para limitar el costo del gas en el código de ejecución porque Solidity lo considera un literal de 32 bits.

Dicho esto, ¿es cierto que la gente debería evitar el uso de cuerdas a toda costa, ya que siempre devolverá un uso infinito de gas?