Intelligente Verträge zum Bieten

In einem Szenario, in dem ein Vertrag eine Käufer-Verkäufer-Vereinbarung darstellt, müssen Verkäufer für jedes neue Gebot einen neuen Vertrag/oder neuen Eintrag in einem Array innerhalb desselben Vertrags veröffentlichen, und dann wählt ein Käufer das am besten geeignete Angebot aus, indem er die anderen konsultiert bestehende Gebote (Kontrakte/Array).

Meine Frage ist, wie Käufer eine Blockchain einfach durchsuchen und konsultieren können, um die bestehenden Angebote (Verträge) anzuzeigen und dann das nicht ausgewählte und für ihn geeignete auszuwählen?

Nach meinem Verständnis muss der Käufer die Adresse der verschiedenen Verträge kennen und dann an jeden von ihnen senden Tx, um den Angebotsinhalt von jedem von ihnen zu lesen, ist das richtig?

Was ist das beste Design, um eine solche Geschäftslogik solide zu implementieren?

Antworten (1)

Es wäre wahrscheinlich nicht richtig, jedes Angebot durch einen eigenen Vertrag vertreten zu lassen. Sie können einen Vertrag entwerfen, bei dem jede unterschiedliche Auktion eine eigene Bereitstellung des Vertrags hat (ähnlich wie Token bereitgestellt werden), aber selbst das ist wahrscheinlich nicht korrekt. Wenn es ein gut definiertes Muster dafür gibt, wie Gebote/Auktionen ausgeführt werden sollen, können Sie wahrscheinlich einen einzelnen intelligenten Vertrag programmieren, der diese Ereignisse erstellt und verwaltet.

Es ist ein bisschen zu viel, in alle Details zu gehen, wie man einen vollständigen, produktionsbereiten Smart Contract erstellt, aber hier ist ein kurzes Beispiel, das Ihnen einige der Ideen eines grundlegenden Bietervertrags zeigen kann. Kommentare im Text:

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);
    }
}

Um Daten aus dem Vertrag auszulesen, haben wir Getter-Funktionen bereitgestellt, die unterschiedliche Gebotsinformationen zurückgeben. Sie können diese Funktionen von Ihrem Front-End aus mit etwas wie Web3.js und einem lokalen/gehosteten Knoten aufrufen.

Auch hier wäre ein Vertrag wie dieser nicht produktionsreif, sondern zeigt lediglich eine Möglichkeit, einen einfachen Bietervertrag zu erstellen.

Danke für das hilfreiche Beispiel! aber nachdem er ein Gebot abgegeben hat, wählt der Käufer ein Gebot aus und eine Vereinbarung (Vertrag) wird zwischen dem Verkäufer und einem Käufer erstellt. Beispielsweise wird der Kauf von Waren nur abgeschlossen, wenn eine Reihe von Regeln (in der Vertragslogik zu definieren) erfüllt sind. Um die Regeln zu überprüfen und auszuführen, sind möglicherweise einige externe Eingaben erforderlich. Daher sollte die Vertragsadresse der Vereinbarung veröffentlicht werden, damit externe Einheiten (z. B. IoT-Geräte) einige Daten senden können. Wie kann dies gehandhabt werden?
Wenn Dinge außerhalb der Blockchain erledigt werden müssen, benötigen Sie ein Oracle, um diese Daten der Blockchain bereitzustellen. Hier ist ein Beispiel: oraclize.it