Contratos inteligentes para pujar

En un escenario en el que un contrato representa un acuerdo entre comprador y vendedor, los vendedores deben publicar para cada nueva oferta un nuevo contrato o una nueva entrada en una matriz dentro de un mismo contrato único, y luego un comprador selecciona la oferta más adecuada consultando los diferentes ofertas existentes (contratos/matriz).

Mi pregunta es, ¿cómo pueden los compradores buscar y consultar fácilmente una cadena de bloques para ver las ofertas existentes (contratos) y luego seleccionar la no seleccionada y adecuada para él?

A mi entender, el comprador necesita saber la dirección de los diferentes contratos y luego enviar Txa cada uno de ellos para poder leer el contenido de la oferta de cada uno de ellos, ¿es así?

¿Cuál es el mejor diseño para implementar dicha lógica de negocios en Solidity?

Respuestas (1)

Probablemente no sería correcto tener cada oferta representada por su propio contrato. Puede diseñar un contrato en el que cada subasta diferente tenga su propia implementación del contrato (similar a cómo se implementan los tokens), pero incluso eso probablemente no sea correcto. Si hay un patrón bien definido sobre cómo se deben ejecutar las ofertas/subastas, probablemente pueda programar un solo contrato inteligente que cree y administre estos eventos.

Es demasiado entrar en detalles completos sobre cómo crear un contrato inteligente completo y listo para la producción, pero aquí hay una muestra rápida que puede mostrarle algunas de las ideas de un contrato de licitación básico. Comentarios en línea:

pragma solidity ^0.4.25;

contract BiddingContract
{
    // Bids will have a user and an amount
    struct Bid {
        address user;
        uint bidAmount;
    }

    // This array will store the history of all bids
    // Due to the logic in this contract, bids will always be in acending price order
    Bid[] AllBids;

    // We will initialize the contract with a bid for 0 from 0x0
    constructor() public {
        AllBids.push(Bid(0x0, 0));
    }

    // Users will submit a bid here as _bidPrice
    function submitBid(uint _bidPrice) public {
        // The last index of the array is one less than the length
        uint lastIndex = AllBids.length - 1;
        // Ensure this bid is more than the current highest bid (the latest bid)
        require(_bidPrice > AllBids[lastIndex].bidAmount);
        // If it is, then push the new bid to the end of the array
        AllBids.push(Bid(msg.sender, _bidPrice));
    }

    // Getter function to return the "top bid", which is the last index of the array
    function getTopBid() public view returns (address, uint) {
        uint lastIndex = AllBids.length - 1;

        return (AllBids[lastIndex].user, AllBids[lastIndex].bidAmount);
    }

    // Getter function to return the total number of bids
    // Allows you to write a loop which goes through all the bids
    function getNumberOfBids() public view returns (uint) {
        return AllBids.length;
    }

    // Getter function to return a single bid from the array by index
    // Allows you to write a loop which goes through all the bids
    function getBid(uint index) public view returns (address, uint) {
        return (AllBids[index].user, AllBids[index].bidAmount);
    }
}

Para leer los datos del contrato, hemos proporcionado funciones de obtención que devolverán información de oferta diferente. Puede llamar a estas funciones desde su front-end usando algo como Web3.js y un nodo local/alojado.

Nuevamente, un contrato como este no estaría listo para la producción, sino que simplemente demuestra una forma de construir un contrato de licitación simple.

¡Gracias por el útil ejemplo! pero después de hacer una oferta, el comprador seleccionará una oferta y se creará un acuerdo (contrato) entre el vendedor y el comprador. Por ejemplo, la compra de bienes solo se completará si se cumple un conjunto de reglas (que se definirán en la lógica del acuerdo). Para verificar y ejecutar las reglas, es posible que se necesiten algunas entradas externas. Por lo tanto, la dirección del contrato del acuerdo debe publicarse para permitir que entidades externas (por ejemplo, dispositivos IoT) envíen algunos datos. ¿Cómo se puede manejar esto?
Si hay cosas que deben completarse fuera de la cadena de bloques, necesitará un Oracle para proporcionar esos datos a la cadena de bloques. Aquí hay un ejemplo: oraclize.it