Prüfen, ob ein Vertragsrücktritt zulässig ist

Ich versuche zu konzeptualisieren, wie eine bestimmte Art von Smart Contract geschrieben werden würde.

Der Vertrag würde im Wesentlichen Ein- und Auszahlungen von ETH oder einer Art ERC20-Token abwickeln.

Die Guthaben würden dann verwendet, um verschiedene Off-Chain-Spiele zu spielen, hauptsächlich Dinge im Casino-Stil für mehrere Spieler wie Texas Holdem. Die Spiele sind Offchain, weil sie viele Operationen erfordern und die Tx-Gebühren nicht benutzerfreundlich wären.

Benutzer würden ihr Guthaben innerhalb des Vertrags durch das Spielen dieser Spiele erhöhen (oder verringern).

Ich möchte den Benutzern die Möglichkeit geben, ihr Guthaben jederzeit wieder auf ihre Brieftaschen abzuheben, aber ich muss in der Lage sein, die Spielserver zu überprüfen, um sicherzustellen, dass sie sich nicht gerade in einem Spiel befinden, während sie versuchen, abzuheben.

Ich versuche, ein Szenario zu verhindern, in dem ein Spieler in ein Spiel (wie Poker) einsteigt, sein Guthaben außerhalb der Kette setzt, es aber aus dem Vertrag zurückzieht, während das Spiel im Gange ist. Wenn sie dann verlieren, gibt es kein Guthaben, das auf den anderen Spieler übertragen werden kann.

Ich bin mir nicht sicher, was der richtige Ansatz wäre, dies zu tun? Könnte das Erstellen eines Tokens/benutzerdefinierten Wallets oder das Oraklisieren der Auszahlung trotzdem helfen?

Jeder Einblick wäre sehr dankbar!

Danke

Antworten (3)

Sie könnten die Auszahlung für eine Stunde sperren lassen und eine Kaution verlangen. Wenn Sie nachweisen können, dass der Benutzer immer noch über Signaturen von staatlichen Kanälen gespielt hat, können Sie nachweisen, dass er auf schändliche Weise versucht hat, sich zurückzuziehen, und seine Auszahlung und Kaution einfordern.

Könnten Sie die Implementierung von "Signaturen von staatlichen Kanälen" erklären, damit bin ich nicht vertraut
Sie sollten einen Blick auf Plasma Cash -> karl.tech/plasma-cash-simple-spec werfen , da es Aufschluss darüber geben wird, wie das eigentliche Off-Chain-Asset-Management und die On-Chain-Konfliktlösung durchgeführt werden.

Sie haben ein Off-Chain-Gameplay, daher gibt es ein Element des Vertrauens in die Spielserver. Sie haben getrennte Gelder im Spiel von Geldern, die frei (unbelastet) abgehoben werden können.

Eine einfache Formulierung wäre, Gelder in die Obhut des Spielsystems und seines Buchhaltungsprozesses zu überweisen , bis Gelder aus dem Live-Spiel genommen werden und zur Auszahlung verfügbar sind.

Falls das nicht klar ist.

Alice hat 10 Äther. Sie kauft 5 Chips für 5 Ether und hat 5 Ether zur Auszahlung zur Verfügung. Sie kassiert ihre Chips ein, wenn sie nicht im Spiel sind, aber das ist eine Sache des Spielservers, weil er weiß, welche „frei und klar“ sind und welche im Spiel sind. Wenn Alice verkauft, sagen wir 7 Chips (glückliche Alice), bekommt sie 7 Ether zurück.

Ein Vertrag kann die Ein- und Auszahlung von Ether abwickeln. Es kann den Handel mit Chips handhaben, indem es den Ether wegnimmt (Übertragung an den Besitzer) und ein Ereignis ausgibt. Es liegt in der Verantwortung des Spielservers, ihr Casino-Chips gutzuschreiben. Der Vertrag gibt lediglich ein Ereignis aus, damit er weiß, was er tun soll.

Wenn Alice ihre Chips einlöst, nimmt der Spielserver die Chips weg und überweist die entsprechende Menge an Ether auf Alices Konto. Alice kann Äther abheben, um die Einrichtung zu verlassen.

Dies ist ein zugegebenermaßen stark vereinfachtes Beispiel, um Ihnen einige Ideen zu geben.

pragma solidity 0.5.1;

contract Holdem {

    mapping(address => uint) public balances;

    event LogDeposit(address sender, uint amount);
    event LogWithdrawal(address receiver, uint amount);
    event LogTransfer(address sender, address receiver, uint amount);

    function depost() public payable {
        balances[msg.sender] += msg.value;
        emit LogDeposit(msg.sender, msg.value);
    }

    function withdraw(uint amount) public {
        uint bal = balances[msg.sender];
        require(bal >= amount, "Insufficient Funds.");
        balances[msg.sender] -= amount;
        emit LogWithdrawal(msg.sender, amount);
        msg.sender.transfer(amount);
    }

    function transfer(uint amount, address receiver) public {
        uint bal = balances[msg.sender];
        require(bal >= amount, "Insufficient Funds.");
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit LogTransfer(msg.sender, receiver, amount);
    }

}

Die transfer()Funktion lässt Alice an das Haus geben und lässt das Haus an Alice geben. Es gibt ein Ereignis aus, das für ein ehrliches Haus ausreicht, um über erhaltene Gelder Rechenschaft abzulegen.

Aufmerksame Beobachter werden feststellen, dass es nichts gibt, was das Haus daran hindert, Gewinne (im ehrlichen Fall) oder alles (im Fall des Austrittsbetrugs) abzuheben. Man müsste strenge Beschränkungen für die Fähigkeit des Hauses hinzufügen, Geld abzuheben (Chips sollten besichert sein) sowie Beweise dafür, dass die Spiele fair sind, bevor die „Off-Chain“-Teile eines solchen Systems vertrauenswürdig wären.

Ich hoffe es hilft.

Worüber Sie sprechen, ist im Wesentlichen das Konzept der „Orcales“ außerhalb der Kette. Beispiele dafür, wie dies gemacht wird, können Sie sich Einrichtungen ansehen, wie sie von https://chain.link bereitgestellt werden .

Die allgemeine Methodik besteht darin, Vertragsfunktionen zu erstellen, die von Code aufgerufen werden können, der außerhalb der Blockchain läuft (so wie eine Brieftasche oder Dapp einen On-Chain-Vertrag aufruft), um Daten aus der Off-Chain-Welt bereitzustellen.

In einem Szenario wie dem, das Sie beschreiben, müssten Ihre Off-Chain-Spielserver eine bestimmte Menge an Wert in der Kette „sperren“ und dann den Wert „freischalten“, der während des Spiels nicht ausgegeben wurde. Offensichtlich müssten die von ihnen aufgerufenen Vertragsfunktionen "onlyOwner"-Funktionen sein (dh Zugriffskontrollen haben), und Sie möchten möglicherweise auch eine gewisse Kryptografie der ausgetauschten Daten durchführen. Alles in der Kette ist sichtbar, auch wenn Variablen in Solidity als "privat" deklariert sind. Daher ist es nicht trivial, Informationen, die on-/off-chain weitergegeben werden, privat zu halten.