Η Λαμπρότητα και η Δυστυχία των Ατομικών Ανταλλαγών

Γιατί οι ατομικές ανταλλαγές είναι κακές και πώς τα κανάλια μπορούν να τις βοηθήσουν, ποια σημαντικά πράγματα συνέβησαν στην Κωνσταντινούπολη και τι να κάνετε όταν δεν έχετε τίποτα να πληρώσετε για βενζίνη.

Το κύριο κίνητρο κάθε επαγγελματία ασφαλείας είναι η επιθυμία να αποφύγει την ευθύνη.

Η Πρόβιντενς ήταν ευγενική, έφυγα από το ICO πριν από την πρώτη μη αναστρέψιμη συναλλαγή, αλλά σύντομα βρέθηκα να αναπτύσσω ένα ανταλλακτήριο κρυπτονομισμάτων.

Σίγουρα δεν είμαι ο Μαλχίς Κιμπαλχίς, και ένα αυστηρό βλέμμα είναι αρκετό για να με κάνει να παραδώσω όλα τα κλειδιά και τους κωδικούς πρόσβασης. Επομένως, ο κύριος στόχος μου ως αρχιτέκτονας ήταν να απομακρύνω το καυτό τσίμπημα της κρυπτανάλυσης όσο το δυνατόν περισσότερο από τα στοιχεία υποδομής που αγαπώ.

Όχι τα κλειδιά σου, όχι τα προβλήματά σου

Χτίζουμε ένα σύστημα ανταλλαγής περιουσιακών στοιχείων και θέλουμε να εξαλείψουμε την ενδιάμεση αποθήκευση αυτών των περιουσιακών στοιχείων, αλλά πρέπει να διασφαλίσουμε την ασφάλεια της συναλλαγής.

Μπορείτε να ενεργήσετε ως δικαστής σε μια αμφισβητούμενη κατάσταση και να πραγματοποιήσετε συναλλαγές με πορτοφόλια που απαιτούν δύο από τις τρεις υπογραφές: του αγοραστή, του πωλητή και του μεσεγγυητικού λογαριασμού.

Ωστόσο, εάν ο συμμετέχων επιτεθεί με επιτυχία στο escrow, λαμβάνει τις δύο επιθυμητές υπογραφές.

Ένα ατομικό swap είναι ένα σχήμα ανταλλαγής όπου ο εγγυητής είναι ένα έξυπνο συμβόλαιο που επιτρέπει μόνο ειλικρινή συμπεριφορά.

Όπως στο αίνιγμα για τον λύκο, την κατσίκα και το λάχανο, μπορείς να ενεργήσεις μόνο σύμφωνα με ένα σωστό σενάριο και να υποστείς απώλειες αν παρεκκλίνεις από αυτό.

Μόνο που αντί για αδηφάγα ζώα, η τάξη παρέχεται από μια συνάρτηση κατακερματισμού στην οποία είναι τόσο δύσκολο να βρεθεί μια σύγκρουση που δεν αξίζει καν να ξεκινήσει κανείς.

Βήμα πρώτο: αίνιγμα

Ας υποθέσουμε ότι η Άλις θέλει να μεταφέρει μερικά Bitcoin στον Μπομπ ένα ωραίο πρωί για μια χούφτα «κρυπτογιουάν».

  • Κρύβει ένα μεγάλο μυστικό.
  • Παίρνει ένα χασίς από αυτόν
  • Μεταφέρει bitcoin σε ένα έξυπνο συμβόλαιο, από το οποίο ο Μπομπ μπορεί να κάνει ανάληψη χρημάτων παρουσιάζοντας ένα μυστικό (το hash από αυτό πρέπει να είναι ίσο με αυτό που καθορίζεται στο συμβόλαιο)
  • Αν ο Μπομπ δεν εμφανιστεί για τα bitcoin του μέχρι το βράδυ, η Αλίκη μπορεί να τα πάρει πίσω.

Βήμα δεύτερο: δόλωμα

Ο Μπομπ μπαίνει στο παιχνίδι και μεταφέρει το «κρυπτοευρώ» στο συμβόλαιό του, το οποίο είναι γραμμένο με τέτοιο τρόπο ώστε:

  • Η Αλίκη μπορεί να διεκδικήσει τα «κρυπτονομίσματά» της παρουσιάζοντας έναν μυστικό αριθμό
  • Όχι νωρίτερα από το μεσημεριανό γεύμα, ο Μπομπ μπορεί να επιστρέψει την προκαταβολή αν η Αλίκη δεν εμφανιστεί.

Βήμα τρίτο: το στοιχείο βρίσκεται στο δόλωμα

Η Άλις έρχεται για τα λεφτά της και τα παίρνει από το συμβόλαιο του Μπομπ, αποκαλύπτοντας παράλληλα το μυστικό της.

Το τελευταίο βήμα: το μυστήριο λύνεται

Ο Μπομπ βλέπει τη συναλλαγή και με μάτι αετού εξάγει από αυτήν το μυστικό που παρουσίασε η Αλίκη στο συμβόλαιο. Χρησιμοποιεί αυτό το μυστικό για να πάρει τα bitcoin του.

Όταν τα πράγματα πάνε στραβά

Αν η Άλις ξαφνικά αποδειχθεί θνητή, ο Μπομπ παίρνει το γιουάν του στο μεσημεριανό γεύμα.

Με τη σειρά της, η Αλίκη επιστρέφει το bitcoin μέχρι το βράδυ, αν ο ύπουλος Μπομπ αποφασίσει να κρατήσει τα χρήματα μέχρι καλύτερες εποχές.

Αν προτιμάτε εικόνες από κείμενο, το Habr έχει μια πιο λεπτομερή και οπτική για εσάς. εξήγηση για το πώς λειτουργούν οι ατομικές ανταλλαγές.

Η διαφορά μεταξύ των χρονικών ορίων έχει σκοπό να μας προστατεύσει από μια κακόβουλη Αλίκη που παίρνει τα χρήματα του Μπομπ την τελευταία στιγμή, και το χρονικό όριο λήγει ενώ αυτός πληκτρολογεί εξάγωνο στη συναλλαγή με τρεμάμενα δάχτυλα.

Οι συμμετέχοντες δεν μπορούν να χάσουν τα χρήματά τους, το πολύ θα πρέπει να περιμένουν την επιστροφή των χρημάτων τους.

Υποστήριξη BlockchainΕίναι ένα απλό σχήμα που απαιτεί πολύ λίγα από τα αλληλεπιδρώντα blockchains:

  • Υποστήριξη για έξυπνα συμβόλαια με τουλάχιστον ένα υποκατάστημα
  • Και τα δύο blockchains πρέπει να υποστηρίζουν τους ίδιους αλγόριθμους κατακερματισμού (μην ξεχάσετε να ελέγξετε το μήκος μυστικού)
  • Χρονοκλειδώματα.

Με την πρώτη ματιά, θα μπορούσε κανείς να πει στην ανταλλαγή «αντίο, η συνάντησή μας ήταν ένα λάθος», αλλά δεν ήταν έτσι.

Παρά τα πλεονεκτήματά τους, οι λύσεις atomic swap δεν εντυπωσιάζουν με τη ρευστότητα. Κυρίως επειδή στο πιο δημοφιλές ζεύγος BTC-USD το κομμάτι fiat δεν ήταν πλήρως tokenized.
Η επιτυχία του USDT έχει δημιουργήσει ένα κύμα σταθερών κρυπτονομισμάτων ERC20 για κάθε γούστο, από το USDC θεματοφυλακής έως το αλγοριθμικό DAI.

Για λόγους απλότητας, συνεχίζουμε να υποστηρίζουμε ότι η Αλίκη πουλάει bitcoin στον Μπομπ για κάποια ERC20 tokens και ελπίζουμε στην επιτυχία των σταθεροποιητών, ευτυχώς όμως εξακολουθούμε να έχουμε πολλά ακόμη τεχνικά προβλήματα.

ταχύτητα

Το Bitcoin και το Ethereum δεν είναι πολύ γρήγορα ξεχωριστά, και εδώ πρέπει να περιμένουμε πρώτα για μία κατάθεση με όλες τις επιβεβαιώσεις και μετά για τη δεύτερη.

Αυτό συμβαίνει επειδή πρώτα ο συμμετέχων που γνωρίζει το μυστικό συνεισφέρει χρήματα και ο αντίπαλος περιμένει μέχρι τον τελικό και μόνο τότε μεταφέρει το μερίδιό του.

Επιπλέον, έχουμε να κάνουμε με ένα πολύ ασταθές περιουσιακό στοιχείο, επομένως κατά τη διάρκεια αυτής της περιόδου το επιτόκιο μπορεί να αλλάξει αρκετά σημαντικά και η αλλαγή των συνθηκών δεν είναι πλέον εύκολη.

Εμπιστευτικότητα

Οποιαδήποτε ανταλλαγή αφήνει τεχνουργήματα και στα δύο blockchains. Ένας προσεκτικός παρατηρητής μπορεί να παρατηρήσει πανομοιότυπα hashes σε έξυπνα συμβόλαια και να καταλήξει στο λογικό συμπέρασμα ότι έχει γίνει μια συμφωνία εδώ, από το οποίο μπορούν να εξαχθούν πολλά συμπεράσματα, από τις συναλλαγματικές ισοτιμίες έως τους φόρους.

Όταν το χρηματιστήριο γνωρίζει τις υποθέσεις σας, είναι εξαιρετικά δυσάρεστο· όταν όλοι το γνωρίζουν, είναι διπλά δυσάρεστο.

Ευχρηστία

Το δυνατό σημείο του blockchain γενικά και του ether ειδικότερα. Ας δούμε ποιες κινήσεις θα πρέπει να κάνουν ο πωλητής και ο αγοραστής.

Από την άποψη του πωλητή, όλα είναι σχετικά απλά: απλά χρειάζεται να μεταφέρετε bitcoin σε μια διεύθυνση p2sh. Με ​​το ether, όλα είναι πολύ πιο περίπλοκα.

ΣύμβασηΑς εξετάσουμε το μέσο συμβόλαιο για ανταλλαγή στο GitHub:

contract iERC20 {
    function totalSupply() public view returns (uint256);
    function transfer(address receiver, uint numTokens) public returns (bool);
    function balanceOf(address tokenOwner) public view returns (uint);
    function approve(address delegate, uint numTokens) public returns (bool);
    function allowance(address owner, address delegate) public view returns (uint);
    function transferFrom(address owner, address buyer, uint numTokens) public returns (bool);
}

contract Swapper {

    struct Swap {
        iERC20 token;
        bytes32 hash;
        uint amount;
        uint refundTime;
        bytes32 secret;
    }

    mapping (address => mapping(address => Swap)) swaps;

    function create(iERC20 token, bytes32 hash, address receiver, uint amount, uint refundTime) public {
        require(swaps[msg.sender][receiver].amount == 0); // check is swap with given hash already exists
        require(token.transferFrom(msg.sender, address(this), amount)); // transfer locked tokens to swap contract
        swaps[msg.sender][receiver] = Swap(token, hash, amount, refundTime, 0x00); //create swap
    }
    
    function hashOf(bytes32 secret) public pure returns(bytes32) {
        return sha256(abi.encodePacked(secret));
    }


    function withdraw(address owner, bytes32 secret) public {
        Swap memory swap = swaps[owner][msg.sender];
        require(swap.secret == bytes32(0));
        require(swap.hash == sha256(abi.encodePacked(secret))); // swap exists
        swaps[owner][msg.sender].secret = secret;
        swap.token.transfer(msg.sender, swap.amount);
    }

    function refund(address receiver) public {
        Swap memory swap = swaps[msg.sender][receiver];
        require(now > swap.refundTime);
        delete swaps[msg.sender][receiver];
        swap.token.transfer(msg.sender, swap.amount);
    }
}

Προσοχή! Μην χρησιμοποιείτε αυτό ή άλλα συμβόλαια από το άρθρο στην παραγωγή, έχουν γραφτεί μόνο για σκοπούς επίδειξης. Ειδικά αυτό.

  • Ο Μπομπ πρέπει να καλέσει τη μέθοδο του συμβολαίου με διακριτικά approve, δίνοντας στο συμβόλαιο ανταλλαγής πρόσβαση στα διακριτικά του
  • Ο Μπομπ δημιουργεί μια ανταλλαγή και ένα συμβόλαιο χρησιμοποιώντας τη μέθοδο transferFrom μεταφέρει τα διακριτικά του αποστολέα στη διεύθυνσή του
  • Η Αλίκη μέσα withdraw αποκαλύπτει το μυστικό και η συμφωνία ονομάζεται transfer

Τα περισσότερα πορτοφόλια και ανταλλακτήρια κρυπτονομισμάτων δεν υποστηρίζουν approve μάρκες, και για καλό λόγο.

Οι ίδιοι οι χρήστες συχνά κάνουν λάθη και απλώς μεταφέρουν τα tokens σε ένα συμβόλαιο, μετά το οποίο τα tokens απλώς χάνονται. Τα σχόλια στο Etherscan είναι γεμάτα θρήνους για τους άτυχους.

Και για να καλέσετε ένα συμβόλαιο, πρέπει να πληρώσετε μια προμήθεια σε ETH, πράγμα που σημαίνει ότι και οι δύο συμμετέχοντες πρέπει να το εφοδιάσουν πριν ξεκινήσουν τη συναλλαγή, και λίγοι άνθρωποι θέλουν να το κάνουν αυτό.

Θήκη αερίου

Το πρώτο βήμα είναι να καταργήσουμε τον έλεγχο αποστολέα όπου είναι δυνατόν και να υποθέσουμε ότι έχουμε κάποιον που υποφέρει από υπερβολική βενζίνη και συμβόλαια κλήσεων για όλους.

Εκσυγχρονισμένη σύμβαση

contract Swapper {

    struct Swap {
        iERC20 token;
        address receiver;
        uint amount;
        address refundAddress;
        uint refundTime;
    }

    mapping (bytes32 =>  Swap) swaps;

    function create(iERC20 token, bytes32 hash, address receiver, uint amount, address refundAddress, uint refundTime) public {
        require(swaps[hash].amount == 0); // use hash once
        require(token.transferFrom(msg.sender, address(this), amount));
        swaps[hash] = Swap(token, receiver, amount, refundAddress, refundTime);
    }


    function withdraw(bytes memory secret) public {
        bytes32 hash = sha256(secret);
        Swap memory swap = swaps[hash];
        require(swap.amount > 0);
        delete swaps[hash];
        swap.token.transfer(swap.receiver, swap.amount);
    }

    function refund(bytes32 hash) public {
        Swap memory swap = swaps[hash];
        require(now > swap.refundTime);
        delete swaps[hash];
        swap.token.transfer(swap.refundAddress, swap.amount);
    }
}

Δυϊσμός Κλειδιού Συμβολαίου και EIP 712

Όπως γνωρίζουμε, μια διεύθυνση στον αέρα μπορεί να είναι ένα συμβόλαιο ή μπορεί να είναι ένα υποκείμενο, δηλαδή ένα κλειδί.
Ο κύριος σκοπός του κλειδιού είναι η υπογραφή μηνυμάτων.

Μπορούμε να χρησιμοποιήσουμε το Bob-contract ως αποστολέα, το οποίο κάνει όλα τα απαραίτητα περάσματα, έχοντας επαληθεύσει την υπογραφή του Bob-key πριν το κάνει.

Τώρα, ο καθένας μπορεί να χρηματοδοτήσει την προμήθεια ενός συμμετέχοντα, αλλά μόνο αυτός που γνωρίζει το κλειδί παίρνει την απόφαση.

Μπομπ-συμβόλαιο

library EIP712ProxyLibrary {
    function hashCommand(address sender, iERC20 token, Swapper swapper, bytes32 hash, address receiver, uint amount, address refundAddress, uint refundTime) public view returns(bytes32);
}

contract ProxyBob {
    address owner;

    constructor(address _owner) public {
        owner = _owner;
    }

    function createSwap(Swapper swapper, iERC20 token, bytes32 hash, address receiver, uint amount, address refundAddress, uint refundTime, uint8 v, bytes32 r, bytes32 s) public {
        require(owner == ecrecover(EIP712ProxyLibrary.hashCommand(address(this), token, swapper, hash, receiver, amount, refundAddress, refundTime), v, r, s));
        token.approve(address(swapper), amount);
        swapper.create(token, hash, receiver, amount, refundAddress, refundTime);
    }
}

Υπάρχει ένα πρότυπο για την εργασία με υπογραφές σύνθετων δομών δεδομένων στο Ethereum. ΕΙΡ 712, μπορείτε να διαβάσετε περισσότερα σχετικά με αυτό στο Ιστολόγιο πορτοφολιού Metamask

Διαίρει και βασίλευε

Συχνά, το σενάριο για την παραβίαση ενός συμβολαίου Ethereum μοιάζει με αυτό:

  • Ο συμμετέχων καταθέτει κεφάλαια στη σύμβαση
  • Στη συνέχεια παίρνει τα χρήματα
  • Κάτι πάει στραβά
  • Ο απατεώνας παίρνει τα χρήματα ξανά και ξανά

Αν επιστρέψουμε στο πρώτο μας παράδειγμα, κάτι πάει στραβά αν το μυστήριο είναι ένα κενό σύνολο bytes.

Πώς να κλέψετε ένα εκατομμύριοΔημιουργήστε μια ανταλλαγή με ένα hash 0x66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925
Αυτό είναι το sha256 από 0x0000000000000000000000000000000000000000000000000000000000000000
Μεταδίδουμε το μυστικό και παίρνουμε τα κουπόνια μας
Το περνάμε ξανά και αφαιρούμε το κάποιου άλλου, όλα αυτά επειδή 0 = 0

Δημιουργώντας μια ξεχωριστή σύμβαση για κάθε συναλλαγή, μπορούμε να απομονώσουμε τις συμβάσεις σε επίπεδο EVM.

Αλλά αυτό δεν είναι όλο: τώρα κάθε συναλλαγή έχει τη δική της διεύθυνση, στην οποία μπορείτε να μεταφέρετε tokens από οποιοδήποτε πορτοφόλι ή ανταλλακτήριο.

Εγκαταλελειμμένα συμβόλαια και δημιουργία2

Αλλά τώρα για κάθε συναλλαγή πρέπει να δημιουργούμε μια σύμβαση και να περιμένουμε τον αγοραστή να μεταφέρει την εργασία "κρυπτοφενίγκ" εκεί. Στο σχέδιο "συμβάσεις το πρωί, χρήματα το βράδυ" υπάρχει πάντα ο κίνδυνος ο αγοραστής να αποχωρήσει και ο αιθέρας για τη δημιουργία της σύμβασης να έχει ήδη δαπανηθεί.

Είναι δυνατόν να γίνει έτσι ώστε το πρωί να υπάρχουν χρήματα και το βράδυ να υπάρχουν bytes;

Στη σκληρή διακλάδωση της Κωνσταντινούπολης, οι προγραμματιστές ΕΙΡ 1014 προστέθηκε η εντολή create2, η οποία δημιουργεί ένα νέο συμβόλαιο σε μια ντετερμινιστική διεύθυνση

keccak256( 0xff ++ address ++ salt ++ keccak256(init_code))[12:]

Πού

  • διεύθυνση — διεύθυνση εργοστασιακής σύμβασης
  • αλάτι - κάποιος αριθμός, τη σημασία του οποίου θα μάθουμε στο επόμενο επεισόδιο
  • init_code — bytecode σύμβασης και παράμετροι κατασκευαστή.

ΕργοστάσιοΗ οδηγία λειτουργεί μόνο μέσω συναρμολόγησης, επομένως το εργοστάσιο φαίνεται λίγο τρομακτικό:

contract Factory {
  event Deployed(address addr, uint256 salt);

  function create2(bytes memory code, uint256 salt) public {
    address addr;
    assembly {

      addr := create2(0, add(code, 0x20), mload(code), salt)
    }

    emit Deployed(addr, salt);
  }
}

Ο κωδικός της σύμβασής σας μπορεί να ληφθεί χρησιμοποιώντας το web3:

const MyContract = new web3.eth.Contract(ABI, {})
const сode = MyContract.deploy({
    data: BYTECODE,
    arguments: contructorArgs  
}).encodeABI();
const factory = new web3.eth.Contract(FACTORY_ABI, factoryAddress);
tx = factory.methods.create2(сode, salt);

Λόγω περιορισμένης υποστήριξης σε σταθερότητα, το φυσικό αέριο για το συμβόλαιο ενδέχεται να μην υπολογιστεί σωστά λόγω ορισμένων λεπτών λεπτομερειών του Ethereum.

Είναι ιδιαίτερα ευχάριστο το γεγονός ότι σε περίπτωση έλλειψης φυσικού αερίου η σύμβαση αποτυγχάνει λόγω εσωτερικού σφάλματος, χωρίς να αναφέρεται ότι δεν υπήρχε αρκετό φυσικό αέριο, όπως θα ήταν αναμενόμενο.

Τώρα μπορούμε να μεταφέρουμε διακριτικά σε συμβόλαια χωρίς να τα δημιουργούμε εκ των προτέρων και μέχρι να τα δημοσιεύσουμε στο δίκτυο, κανείς δεν θα μαντέψει τι ακριβώς κάνει η σύμβαση.

Ένα κοράκι δεν θα ραμφίσει το μάτι ενός άλλου κορακιού

Είναι σαφές ότι ένας πραγματικός αναλυτής, ειδικά κάποιος που έχει λάβει καλές επενδύσεις στην καταπολέμηση των εχθρών του καθεστώτος μέσω του ξεπλύματος χρήματος, δεν θα σταματήσει από τέτοια παιδαριώδη κόλπα, και μετά τη δημιουργία του συμβολαίου θα εξακολουθεί να βλέπει το χασίς.

Πώς μπορώ να βεβαιωθώ ότι το hash δεν είναι εκτεθειμένο;

Μετακινούμε την ίδια την ανταλλαγή εκτός αλυσίδας: οι συμμετέχοντες ανταλλάσσουν υπογραφές για να μεταφερθούν στη σύμβαση ανταλλαγής και στη συνέχεια το μυστικό αποκαλύπτεται ιδιωτικά.

Βήμα προς βήμαΔημιουργούνται δύο «πολλαπλές υπογραφές» από τις οποίες μπορούν να αποσυρθούν χρήματα εάν η Αλίκη και ο Μπομπ έχουν τις υπογραφές τους.

Για να αποτρέψουμε την τραγωδία που θα προκαλούσε η αποσύνδεση ενός από τους συμμετέχοντες, ας προσθέσουμε ένα παλιό καλό χρονικό όριο.

Η Αλίκη και ο Μπομπ κάνουν καταθέσεις παράλληλα

  • Η Αλίκη δημιουργεί ένα μυστικό και δίνει στον Μπομπ το hash του μυστικού και την υπογραφή της συναλλαγής που μεταφέρει τα bitcoin στη διεύθυνση ανταλλαγής.
  • Ο Μπομπ δίνει στην Αλίκη μια υπογραφή για να αποσύρει μάρκες στο συμβόλαιο ανταλλαγής με το δεδομένο hash.
  • Η Άλις αποκαλύπτει στον Μπομπ ένα μυστικό.

Σε αυτό το σημείο, επικρατεί αρμονία: η Άλις και ο Μπομπ μπορούν να τερματίσουν τη συναλλαγή ανά πάσα στιγμή. Σε ένα τόσο φιλικό περιβάλλον, μπορούν να ανταλλάξουν υπογραφές για να κάνουν ανάληψη χρημάτων στις τελικές τους διευθύνσεις.

Για έναν εξωτερικό παρατηρητή, φαίνεται ότι τα χρήματα πέρασαν από ένα συμβόλαιο πολλαπλών υπογραφών 2 στα 2.

Αυτό το σχέδιο επιτρέπει επίσης και στα δύο μέρη να κάνουν μια κατάθεση ταυτόχρονα, καθώς το μυστικό αποκαλύπτεται μετά από όλες τις επιβεβαιώσεις.

Επίπεδο 2

Δεδομένου ότι μπορούμε να κάνουμε ανάληψη χρημάτων σε μία διεύθυνση και να μην δημοσιεύσουμε μια ενδιάμεση συναλλαγή, τίποτα δεν μας εμποδίζει να κάνουμε ανάληψη χρημάτων σε πολλές διευθύνσεις και να πραγματοποιούμε απεριόριστο αριθμό ενδιάμεσων συναλλαγών. Όχι ότι αυτό είναι απαραίτητο σετ για ανταλλαγή, αλλά μόλις αρχίσετε να συλλέγετε swap, είναι δύσκολο να σταματήσετε.

Τώρα η Αλίκη και ο Μπομπ μπορούν να κάνουν το καλύτερο δυνατό. Για παράδειγμα, να υπολογίσουν αυτόματα τη μέση τιμή, ανταλλάσσοντας σατόσι ανά δευτερόλεπτο ή απλώς να συνδέσουν απευθείας τον market maker και τον αποδέκτη της ρευστότητας.

Βήμα προς βήμα

  • Ο πωλητής δημιουργεί ένα μυστικό και δίνει στον αγοραστή ένα hash του μυστικού και μια υπογραφή της συναλλαγής όπου μέρος των χρημάτων μεταφέρεται στη διεύθυνση ανταλλαγής p2sh και το υπόλοιπο επιστρέφεται στη διεύθυνση του πωλητή.
  • Ο αγοραστής παρέχει μια υπογραφή που επιτρέπει την ανάληψη των διακριτικών και των ρεστά στη διεύθυνση του παραλήπτη για ανταλλαγή.
  • Ο πωλητής αποκαλύπτει το μυστικό
  • Η ιστορία επαναλαμβάνεται με ένα νέο μυστικό, ενώ εκτός από την ανταλλαγή και την αλλαγή, υπάρχει και η απόσυρση του προηγουμένως αγορασμένου στη διεύθυνση του αγοραστή και του ήδη πληρωμένου στη διεύθυνση του πωλητή.

Τώρα έχουμε πρόσβαση σε υψηλής ταχύτητας συναλλαγές p2p, το κύριο πράγμα είναι να παρακολουθούμε τον χρόνο και να κλείνουμε τη συμφωνία πριν από το χρονικό όριο.

Ωστόσο, με μια μικρή τροποποίηση των συμβολαίων μας, μπορούμε να δώσουμε στα κανάλια μας αθανασία, κάτι που θα μας διευκολύνει πολύ να δημιουργήσουμε ένα δίκτυο.

Αλλά θα μιλήσουμε γι' αυτό στο επόμενο επεισόδιο.

Πηγή: www.habr.com

Αγοράστε αξιόπιστη φιλοξενία για ιστότοπους με προστασία DDoS, διακομιστές VPS VDS 🔥 Αγοράστε αξιόπιστη φιλοξενία ιστοσελίδων με προστασία DDoS, διακομιστές VPS VDS | ProHoster