¿La propiedad no está asignada en el contrato?

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();
        }
    }
}
tienes que definir la función constructora correctamente. consulte este ethereum.stackexchange.com/q/55383/16301

Respuestas (3)

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:

  • versión pragma (línea 1)
  • dirección de pago (línea 5)
  • constructor (línea 10)

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.

Hola Skyge, originalmente los tenía iguales pero no me permitiría tener una función con el mismo nombre que el contrato. Ahora he solucionado esto usando 'constructor() public { propietario = msg.sender;'
Esto ha asignado la cuenta que implementa la cuenta como propietario, pero aún no puede transferir la propiedad y no hay transferencia de saldo cuando se realiza el pago. Puede ser una solución simple, pero no estoy seguro de dónde me equivoqué.
Cambio el código "propietario.transferencia(este.saldo);" en "propietario.transfer(msg.value);", funciona.
Lo intenté antes, pero aún no hay transferencia de propiedad o éter.
Puedo transferir la propiedad, tal vez haya algún problema con su operación. Primero, uso una cuenta para implementar este contrato, luego uso otra cuenta para comprar este contrato con 3 ether, luego, funciona.

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 constructoren 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 constructorpalabra clave y no caiga en esta trampa en el futuro.