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?
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.
Noureddine
Shawn Tabrizi