Получение бесконечных оценок газа для простых функций

Я проверяю прочность в remix ide, используя простые контракты. Это контракт, который я написал:

 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;   
    }
} 

Глядя на детали, я получаю бесконечные оценки газа для каждой из этих функций.

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

Пожалуйста, объясните, почему я получаю бесконечные оценки газа для этих функций и как я могу избежать этой ошибки?

где договор mortal?
я обновил по вопросу

Ответы (3)

Контракт компилируется просто отлично:

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;   
    }
} 

но потом появляются предупреждения...

введите описание изображения здесь

но он отлично отправляет/подтверждает на Ropsten..

введите описание изображения здесь

и вызовы методов тоже работают нормально..

введите описание изображения здесь

Это может быть просто ошибка в статическом анализе компилятора.

Я вижу, что он выполняется, возможно, это ошибка в ремиксе, как вы указали. Спасибо :)
Предупреждение именно об этом. Это не означает, что контракт не будет работать; это просто означает, что использование газа потенциально неограниченно. Я думаю, что предупреждение правильное.
@smarx, да, я понимаю вашу точку зрения, поскольку тип строки кажется несвязанным
@smarx Итак, если строка не ограничена, какова лучшая альтернатива для хранения строковых данных?
Я не уверен, что понимаю вопрос. Что плохого в том, чтобы просто использовать строку? Если вы хотите ограничить длину строки, которую могут предоставить пользователи, вы можете проверить длину. (Например, требуется (newMessage.length <= 20);)
@AhsanJamal Вы можете использовать bytes32или любое количество байтов вместо string. Просто убедитесь, что байты могут поддерживать необходимую информацию. Затем вы можете легко преобразовать байты в строку. эфириум.stackexchange.com/questions/2519/…

Я подозреваю, что это потому, что стоимость этих функций действительно неограничена. Строки могут быть любой длины, поэтому setNewMessage()необходимо хранить неограниченное количество данных и getMessage()читать неограниченное количество данных.

Если вы хотите избежать этого предупреждения, вам придется использовать тип данных с фиксированной верхней границей размера.

Я не знаю, что такое «за пределами лимита газа» (может быть, обсуждается предупреждение о бесконечном газе?), но, пожалуйста, добавьте ответ, если вы считаете, что у вас есть решение.
Просто чтобы подтвердить, я вижу те же предупреждения о бесконечном газе, что и OP, при использовании Solidity 0.4.19 в Remix.
Даже если я изменю тип со строки на Bytes32, я все равно получаю бесконечный газ для этих функций.
Переключение на bytes32избавляет меня от предупреждения.
Почему за это голосуют? Кажется достаточно разумным
Я почти уверен, что это правильный ответ. Я предполагаю, что за него проголосовал @Victory или кто-то еще, кто видел их комментарий (из-за чего казалось, что этот ответ был неверным).
Я удалил свой старый комментарий, это А было правильным. Я неправильно понял вопрос.

Это потому, что вы используете строку, которая не имеет определенного размера, т.е. это несвязанный тип данных. Вы можете использовать bytes32 вместо строки, чтобы ограничить стоимость газа при выполнении кода, потому что Solidity считает его 32-битным литералом.

Тем не менее, правда ли, что людям следует любой ценой избегать использования строки, поскольку она всегда будет возвращать бесконечное использование газа.