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.
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...
pero envía/confirma en Ropsten muy bien...
y las llamadas al método también funcionan bien ...
Esto puede ser solo un error en el análisis estático del compilador.
bytes32
o 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.
bytes32
me deshace de la advertencia.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.
Shomari
mortal
donde esta el contratoAhsan Jamal