Tomé el siguiente contrato como ejemplo de un tutorial y cambié los elementos resaltados en negrita, según los errores del IDE.
Lo que debe hacer el contrato es asignar la propiedad del artículo a la cuenta que implementa el contrato, luego, cuando se pagan 2 ether, cambiar la propiedad a la cuenta que realizó el pago. Cuando implemento el contrato, la propiedad no se asigna a la cuenta, sino que tiene la dirección 0x000... y cuando uso la función de compra, la propiedad no se transfiere y el éter no se deduce de la cuenta del comprador. Cualquier ayuda sería apreciada.
pragma solidity ^0.4.0;
contract SalesContract {
address **public** owner;
bool public isSold = false;
string public salesDescription = "Honda Civic";
uint public price = 2 ether;
function SaleContract() {
owner = msg.sender;
}
function Buy() **public** payable {
if(msg.value >= price) {
**owner.transfer(address(this).balance)**;
owner = msg.sender;
isSold = true;
} else {
revert();
}
}
}
Código original del tutorial:
pragma solidity ^0.4.0;
contract SalesContract {
address public owner;
bool public sold = false;
string public salesDescription = 'Volvo V40 HF 56 32';
uint price = 2 ether;
function SalesContract() payable {
owner = msg.sender;
}
function buy() payable {
if(msg.value >= price) {
owner.transfer(this.balance);
owner = msg.sender;
sold = true;
} else {
revert();
}
}
}
Aquí está el código, actualizado a solidity 5 y confirmado en Remix. Dejanos saber si tienes preguntas.
pragma solidity ^0.5.0;
contract SalesContract {
address payable public owner;
bool public isSold = false;
string public salesDescription = "Honda Civic";
uint public price = 2 ether;
constructor() public {
owner = msg.sender;
}
function Buy() public payable {
if(msg.value >= price) {
owner.transfer(address(this).balance);
owner = msg.sender;
isSold = true;
} else {
revert();
}
}
}
Las diferencias:
Tal vez debería revisar su ortografía, creo que debería ser "Contrato de venta" en lugar de "Contrato de venta", cuando usamos el mismo nombre del contrato, podemos inicializar nuestro contrato correctamente.
Una historia interesante sobre:
contract SalesContract {
...
function SaleContract() {
...
}
...
}
Hace un tiempo, una empresa implementó un contrato con el mismo error tipográfico.
Poco tiempo después, todo el dinero depositado en ese contrato fue robado.
¿Por qué?
El autor decidió cambiar el nombre del contrato, pero se olvidó de cambiar el nombre del constructor.
Entonces, en lugar de un constructor, ahora había una función pública disponible para que cualquiera la invocara.
Cambie a Solidity 0.4.21 o posterior y declare constructor
en su lugar.
Por supuesto, no resolverá este problema específico, porque aún puede cometer el error de declarar esa función pública, pero lo más probable es que comience a usar la constructor
palabra clave y no caiga en esta trampa en el futuro.
Achala Dissanayake