Я проверяю прочность в 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"
}
}
Пожалуйста, объясните, почему я получаю бесконечные оценки газа для этих функций и как я могу избежать этой ошибки?
Контракт компилируется просто отлично:
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..
и вызовы методов тоже работают нормально..
Это может быть просто ошибка в статическом анализе компилятора.
bytes32
или любое количество байтов вместо string
. Просто убедитесь, что байты могут поддерживать необходимую информацию. Затем вы можете легко преобразовать байты в строку. эфириум.stackexchange.com/questions/2519/…Я подозреваю, что это потому, что стоимость этих функций действительно неограничена. Строки могут быть любой длины, поэтому setNewMessage()
необходимо хранить неограниченное количество данных и getMessage()
читать неограниченное количество данных.
Если вы хотите избежать этого предупреждения, вам придется использовать тип данных с фиксированной верхней границей размера.
bytes32
избавляет меня от предупреждения.Это потому, что вы используете строку, которая не имеет определенного размера, т.е. это несвязанный тип данных. Вы можете использовать bytes32 вместо строки, чтобы ограничить стоимость газа при выполнении кода, потому что Solidity считает его 32-битным литералом.
Шомари
mortal
?Ахсан Джамал