So erstellen Sie eindeutige Beitragsadressen für ein Empfehlungssystem von SmartContract

Ich hatte Probleme mit meinem Smart Contract. Ich möchte jeder Person, die am ICO-Empfehlungsprogramm teilgenommen hat, Empfehlungstoken zuweisen können. Dazu muss der Smart Contract geleistete Beiträge unterscheiden und einem bestimmten Teilnehmer zuordnen können. Ich suche nach einer Möglichkeit, den Smart Contract eindeutige Beitragsadressen für jeden Teilnehmer erstellen zu lassen, der sich für das ICO registriert. Diese Adressen erhalten Beiträge und übertragen sie sofort an die "Haupt"-Vertragsadresse, wodurch jeder Beitrag jedes Beitragenden separat bekannt ist, auch wenn er von mehreren Wallets aus beisteuert. Wie kann ich das machen?

Ich verstehe es nicht, Sie wollen nur wissen, WANN ein Mitwirkender etwas beigetragen hat?
Nein, ich möchte wissen, WER der Beitragende ist, auch wenn er von 3/4 verschiedenen Adressen aus Beiträge leistet. Ich möchte eine Möglichkeit, eine eindeutige Adresse für jeden ICO-Teilnehmer zu erstellen, damit ich weiß, wer was sendet.
Sie können keine Adresse aus dem Smart Contract zuweisen, aber Sie können ihnen eine ID zuweisen.
Und wie funktioniert das genau?
Nur um das klarzustellen: Eine Person, die etwas beitragen möchte, meldet sich auf einer Website an und erhält ihr Dashboard. Auf diesem Dashboard erhält er einen Empfehlungslink und kann die Anzahl der Personen sehen, die sich über diesen Link angemeldet haben, und als nächstes sieht er die Gesamtsumme aller Beiträge, die von diesen Personen geleistet wurden. Ich muss wissen, wie ich diese Mitwirkenden unterscheiden kann, indem ich jedem von ihnen eine Beitragsadresse gebe, von der der Smart Contract weiß, wer es ist. Sonst weiß man nicht, wer was beigetragen hat.

Antworten (2)

Laut den Kommentaren im OP:

Sie können einem Absender in einem Smart Contract keine neue Adresse zuweisen. Darüber hinaus gibt es innerhalb des Vertrags eine neue Möglichkeit für Sie, zu erfahren, welche Adresse Ihnen gehört. Darüber hinaus ist dies nur meine Sichtweise, Benutzer senden Ether von wo sie wollen, normalerweise von nur einem Konto. Es liegt in ihrer Verantwortung, von wo sie wollen, zu senden, nicht in unserer.

Aber selbst wenn es Ihnen gelingt, Benutzer zu identifizieren, würde ich eine Zuordnung mit einem uint als Schlüssel und einer Zuordnung als Wert erstellen. Diese andere Zuordnung wäre die Liste der Adressen, von denen der Benutzer Ether gesendet hat. Auf diese Weise können Sie Adressen identifizieren.

Und was ist, wenn ich für jeden Teilnehmer Receiver-Verträge und einen separaten Sammelvertrag abschließe, der alle Beträge der Receiver-Verträge akkumuliert? Wie würde ich diesen Empfängervertrag auslösen, um automatisch jeden Beitrag an den Akkumulationsvertrag zu senden?
Verträge zur Abwicklung von Verträgen mit... ? Haben Sie eine Ahnung, wie viel Sie (oder der Absender) das kosten wird? Eine Menge Geld. Machen Sie die Dinge in Solidität einfach, nicht kompliziert, oder Sie werden viel Geld verlieren.
Wie würden Sie mir dann vorschlagen, es zu tun?

Sie müssen zwei Verträge haben: Main und Reciever. Hauptvertrag, der die Funktion hat, eine Instanz eines Empfängervertrags zu erstellen und diese Instanz in der Zuordnung zu registrieren, um sicherzustellen, dass wir nur Zahlungen von gültigen Empfängern erhalten.

Der Empfängervertrag implementiert eine standardmäßig zahlbare Fallback-Funktion, die jeden Wert an den Hauptvertrag überträgt. Es gibt nur eine kleine Menge Gas, die standardmäßig für die Zahlungsfunktion verwendet werden kann, wenn ETH gesendet wird, sodass Sie Ihre Benutzer bitten können, eine spezielle Funktion aufzurufen, um ihre Zahlungen zu leisten. Ich habe es PayTransfer genannt. Arbeitscode, getestet auf Remix ist unten. Um es zu testen, müssen Sie:

  1. Hauptvertrag anlegen
  2. Rufen Sie die AddReceiver-Funktion im Hauptvertrag auf.
  3. Die Adresse des neuen Empfängers wird im Ereignis NewReceiver und auch in der öffentlichen Variable lastReceiver angezeigt.
  4. Dann müssen Sie eine Zahlung an den Empfängervertrag leisten. In Remix können Sie den PaymentReceiver-Vertrag an die Adresse anhängen, die Sie im vorherigen Schritt erhalten haben. Verwenden Sie die Schaltfläche An Adresse.

  5. Sobald die Zahlung erfolgt ist, können Sie Ihren Hauptvertragssaldo, den Empfängersaldo und den Beitragswert des Empfängers zum Hauptvertrag mit den folgenden Funktionen überprüfen:

    • Mein Gleichgewicht
    • EmpfängerBalance
    • Empfängerbeitrag

Falls die standardmäßig zahlbare Fallback-Funktion nicht funktioniert (funktioniert auf Remix), können Sie entweder Ihre Kunden bitten, die PayTransfer-Funktion aufzurufen, um ihre Zahlungen zu leisten, oder die Fallback-Funktion ändern, um msg.value nicht an den Hauptvertrag zu übertragen, und die RetrievePayment-Funktion verwenden, um ETH zu Ihrem zu übertragen Hauptvertrag (in diesem Fall müssen Sie für Gas bezahlen).

Hoffe das hilft.

pragma solidity ^0.4.24;


contract PaymentReceiver {

    Main public main;

    function () payable {
        main.ReceivePayment.value(msg.value)();
    }

    function PayTransfer() public payable {
    main.ReceivePayment.value(msg.value)();
    }

    function RetreivePayment() public {
        main.ReceivePayment.value(address(this).balance)();
    }
    constructor() public {
        main = Main( msg.sender);
    }
}


contract Main {

    event NewReceiver(address receiver);
    event ReceivedPayment(address receiver, uint256 value);
    mapping(address => uint256) contributions;
    mapping (address=>bool) validReceiver;
    address public lastReceiver;

    function ReceivePayment() public payable {
        require (validReceiver[msg.sender]);
        contributions[msg.sender] = contributions[msg.sender] + msg.value;
        emit ReceivedPayment(msg.sender,msg.value);

    }

    function AddReceiver() public {
        PaymentReceiver receiver = new PaymentReceiver();
        validReceiver[address(receiver)] = true;
        lastReceiver = address(receiver);
        emit NewReceiver(receiver);
    }

    function MyBalance() public view  returns (uint) {

    return address(this).balance;

    }

    function ReceiverBalance(address receiver) public view returns (uint256) {
        require(validReceiver[receiver]);
        return address(receiver).balance;
    }

    function ReceiverContribution(address receiver) public view returns (uint256) {
        return contributions[address(receiver)];
    }


}