Hiilgavus ja vaesus atomic swaps

Miks on atomaarsetel vahetustel puudusi ning kuidas saavad kanalid abiks olla, mis olulist juhtus Constantinople'i hard fork'is ja kuidas kÀituda, kui gaasi eest maksmiseks pole midagi.

Igale turbeeksperdile peamine motivatsioon — soov vĂ€ltida vastutust.

Saatus oli armuline, jĂ€tsin ICO-ta Ă€ra, oodates esimeseid pöördumatuid tehinguid, aga leidsin end peagi krĂŒptobörsi arendamisel.

Mina — ei ole mitte mingil juhul Malchish Kibalchish ja ĂŒksainus range pilk on piisav, et ma annaksin kĂ”ik vĂ”tmed ja paroolid ĂŒles. SeetĂ”ttu oli minu pĂ”hieesmĂ€rgiks, kui arhitekt, paigutada kuum krĂŒptoanalĂŒĂŒsi nĂ”el nii kaugele kui vĂ”imalik mulle kallite infrastruktuuri elementide juurest.

Ei sinu vÔtmed, ei sinu probleemid

Ehitusme oleme aktiivide vahetussĂŒsteemi ja soovime vĂ€listada nende aktiivide vahehoidmise enda juures, kuid peame tagama tehingu turvalisuse.

VĂ”ib mĂ€ngida kohtuniku rolli vaidlusalustes olukordades ja teostada tehingud rahakottide vahel, mis nĂ”uavad kolme alt kahe allkirja: ostja, mĂŒĂŒja ja deponeerija.

Kuid kui osaleja edukalt rĂŒndab deponeerijat, siis ta saab soovitud kaks allkirja.

Atomaarne vahetus — vahetuse skeem, kus garanteerijaks on nutileping, mis lubab ainult ausat kĂ€itumist.

Nagu mĂ”istatuses, kus on hunt, kits ja kapsas, saad tegutseda ainult ĂŒhe ainulaadse Ă”ige stsenaariumi jĂ€rgi ja kannatada kaotusi, kui sellest kĂ”rvale kalduda.

Aga ahnete loomade asemel tagab korra hÀsifunktsioon, milles on nii keeruline leida kollisiooni, et pole vÀhematki mÔtet alustada.

Esimene samm: mÔistatus

Oletame, et Alice soovib ĂŒhel ilusal hommikul Bobile bitcoini edastada hunniku "krĂŒptojuani" eest.

  • Ta mĂ”tleb vĂ€lja suure salajase
  • Saab temalt hĂ€sĆĄi
  • Edastab bitcoine nutilepingusse, kust Bob saab raha vĂ€lja vĂ”tta, esitades salajase numbri (hĂ€sĆĄ peab olema lepingus mĂ€rgitud).
  • Kui Bob ei tule oma bitcoine Ă”htuks, vĂ”ib Alice need tagasi vĂ”tta.

Teine samm: ahvatlus

MĂ€ngu astub Bob ja edastab "krĂŒpto-eurod" oma lepingusse, mis on kirjutatud nii, et:

  • Alice vĂ”ib "krĂŒpto-jenid" tagasi vĂ”tta, esitades salajase arvu
  • Hiljemalt lĂ”una ajal vĂ”ib Bob, kui Alice ei ilmu, tagasi saada oma deposiidi

Kolmas samm: mÔistatuse lahendamine ahvatluses

Alice tuleb oma raha jÀrele ja vÔtab Bobi lepingust raha, paljastades samal ajal oma saladuse.

Viimane samm: mÔistatus on lahendatud

Transaktsiooni nÀeb Bob ja tema kotkasilm eraldab sellest Alice'i lepingule esitatud saladuse. Seda saladust kasutab ta, et juba enda bitcoine tagasi vÔtta.

Kui midagi lÀheb valesti

Kui Alice Ă€kki osutub surmatu, vĂ”tab Bob lĂ”unaks oma jĂŒaani.

Omakorda tagastab Alice Ôhtuks bitcoini, kui reeturlik Bob otsustab raha paremaid aegu ootama jÀtta.

Kui eelistate pilti tekstile, on Habras teile pÔhjalikum ja visuaalsem selgitus aatomite vahetuste toimimise kohta.

Ajavahed, mis on ette nÀhtud, et kaitsta meid kurja Alice'i eest, kes Bobi raha viib viimasel hetkel, ja ajavahemik lÔppeb, samal ajal kui ta vÀrisevate sÔrmedega hex-koodi transaktsiooni sisestab.

Osalejad ei saa oma raha kaotada, maksimum on vaid ootamine tagastamise osas.

Toetamine plokiahelatesSee on lihtne nagu sokk skeem, mis nÔuab vastastikku suhtlevatelt plokiahelatelt vaid vÀhe:

  • Toetamine nutilepingutele, millel on vĂ€hemalt ĂŒks haru
  • MĂ”lemad plokiahelad peavad toetama samu hash-algoritme (Ă€rge unustage kontrollida saladuse pikkust)
  • Aja lukud.

Esmapilgul vĂ”ib juba öelda börsile „head aega, meie kohtumine oli eksitus”, aga ei ole ikka nii lihtne.

Kuna kÔik oma eelised ja atomic swap lahendustel puudub likviidsus. Peamiselt seetÔttu, et kÔige populaarsemas paaris BTC-USD ei olnud fiat-osa pÀris tokenizeeritud.
USDT edu on sĂŒnnitanud terve laine stabiilseid mĂŒnte ERC20 formaadis, alates vĂ€ga hoitud USDC-st kuni algoritmilise DAI-ni.

Seega lihtsuse huvides arutame edaspidi, et Alice mĂŒĂŒb Bobile bitcoine mĂ”ne ERC20 tokeni eest, lootes stabiliseerijate Ă”nne, kĂŒllap on meil veel palju tehnilisi probleeme.

Kiirus

Bitcoin ja Ethereum eraldi ei ole eriti kiired ning siin peame ootama kĂ”igepealt ĂŒhe sissemakse kĂ”igi kinnitustega, seejĂ€rel teise.

KĂ”ik see on tingitud sellest, et esmalt sisendab raha osaleja, kellele saladus on tuntud, ja vastane ootab lĂ”plikkust ning siis alles kannab oma osa ĂŒle.

Lisaks tegeleme me vÀga volatiilse varaga, nii et selle aja jooksul vÔib kurss mÀrkimisvÀÀrselt muutuda ning tingimuste muutmine on juba keeruline.

Privaatsus

Iga vahetus jÀtab jÀlgi mÔlemale plokiahelale. TÀhelepanelik vaataja vÔib mÀrgata sama hash-koodi nutilepingutes ja teha loogilisi jÀreldusi, mida seal on tehing toimunud, mille pÔhjal saab teha palju jÀreldusi kursivÀÀrtustest maksudeni.

Kui börsil on teadlik sinu toimingutest – on see ÀÀrmiselt ebameeldiv, aga kui sellest on teadlik igaĂŒks, on see kahekordselt ebameeldiv.

Kasutusmugavus

Plokiahela ja eriti Ethereumi eripĂ€ra. Vaatame, milliseid samme peab mĂŒĂŒja ja ostja ette vĂ”tma.

MĂŒĂŒja jaoks on kĂ”ik suhteliselt lihtne: tuleb lihtsalt Bitcoin p2sh aadressile ĂŒle kanda. Ethereumiga on kĂ”ik palju keerulisem.

LepingVaatame keskmist GitHubi lepingut vahetuseks:

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

TĂ€helepanu! Ärge kasutage seda ja muid artiklis olevaid lepinguid tootmises, need on kirjutatud ainult demonstreerimiseks. Eriti see.

  • Bob peab kutsuma tokeni lepingu meetodi approve, andes swap-lepingu oma tokenitele juurdepÀÀsu
  • Bob loob swap-i ja lepingu meetodi abil transferFrom vĂ”tab saatjalt tokensid oma aadressile
  • Alice on withdraw paljastab saladuse ja leping kutsub esile ĂŒlekandmine

Enamik rahakotte ja krĂŒptobörse ei toeta approve tokenite jaoks, ja pole ka ime.

Kasutajad teevad sageli vigu ja lihtsalt kannavad tokenid lepingule, pÀrast mida tokenid lihtsalt kaovad. Etherscani kommentaarid on tÀis Ônnetute kaebusi.

Lepingu kutseks on vaja maksta komisjonitasu ETH-s, mis tÀhendab, et mÔlemal osalejal peab olema seda enne tehingu alustamist, ja sellega ei taha keegi tegeleda.

Gaasihoidla

Alustuseks tuleks eemaldada saatja kontroll kĂ”ikjal, kus see vaid vĂ”imalik, ja eeldada, et meil on keegi, kes kannatab gaasi ĂŒlejÀÀgi kĂ€es ja kutsub lepingut kĂ”igile soovijatele.

Uuendatud leping

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); // kasuta hash'i ainult ĂŒhte korda
        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);
    }
}

Leping- vÔtme dualism ja EIP 712

Kuidas me teame, et aadress Ethereumis vÔib olla leping vÔi subjekti, st vÔti.
Peamine tegevus vÔtmel on allkirjastada mingeid teateid.

Me vĂ”ime saatjana kasutada Bob- lepingut, mis teeb kĂ”ik vajalikud ĂŒlekanded, kontrollides eelnevalt Bob-vĂ”tme allkirja.

NĂŒĂŒd vĂ”ib keegi sponsoreerida osalise tasu, kuid otsuse langetab ainult see, kellel on teada vĂ”ti.

Bob-leping

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

Allkirjade töötlemiseks keerukate andmestruktuuride kohta Ethereumis on standard EIP 712, rohkem saate sellest lugeda Metamaski rahakoti blogis

Jaga ja valitse

Sageli nÀeb Ethereum'i lepingu hÀkkimise stsenaarium vÀlja jÀrgmiselt:

  • Osaleja paneb vahendid lepingusse
  • Siis vĂ”tab vahendid vĂ€lja
  • Midagi lĂ€heb valesti
  • Kurjategija vĂ”tab raha jĂ€rjest uuesti ja uuesti

Kui me naaseme meie esimese nĂ€ite juurde, siis midagi lĂ€heb valesti, kui mĂ”istatus on tĂŒhi baitide kogus.

Kuidas varastada miljonLoo swap hashiga 0x66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925
See on sha256 0x0000000000000000000000000000000000000000000000000000000000000000
Edastame saladuse ja vÔtame oma tokenid
Edastame veelkord ja vÔtame teiste omad, kÔik seetÔttu, et 0 = 0

Loodes iga tehingu jaoks eraldi leping, saame isoleerida lepingud EVM tasemel.

Aga see ei ole veel kĂ”ik: nĂŒĂŒd on igal tehingul oma aadress, kuhu saab tokenid edastada igast rahakotist vĂ”i börsilt.

HĂŒljatud lepingud ja create2

Aga nĂŒĂŒd peame igaks tehinguks looma leping ja ootama, kuni ostja kannab sinna tööjĂ”u "krĂŒptorahad". Skeemis "hommikul lepingud, Ă”htul raha" on alati oht, et ostja loobub, ja eteerium lepingute loomiseks on juba kulutatud.

Kas ei vÔiks seda teha nii, et hommikul raha ja Ôhtul baitide?

Harde fork Constantinople'i arendajad EIP 1014 lisasid kÀsu create2, mis loob uue lepingu mÀÀratletud aadressil

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

Kus

  • address — tehase lepingute aadress
  • salt — mingi number, mille tĂ€henduse saame teada jĂ€rgmises osas
  • init_code — lepingu baitkood ja konstruktori parameetrid.

TehasKÀsk toimib ainult lÀbi assembly, seega nÀeb tehas vÀlja veidi hirmutav:

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

Teie lepingu koodi saab hankida web3 abil:

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

Oma piiratud toetuse tĂ”ttu solidity's, vĂ”ib lepingu gaasi arvutada valesti mĂ”ningate eetri nĂŒansside tĂ”ttu.

Eriti armas on, et gaasi puudumise korral tÔuseb leping sisemise veaga, andmata teada, et gaasi ei jÀtku, nagu vÔiks oodata.

NĂŒĂŒd saame tĂ”lkida tokenid lepinguteks, neid eelnevalt loomata, ja enne kui me need vĂ”rku avaldame, ei oska keegi aimata, mida leping tĂ€pselt teeb.

VÔrdub, et vares vareselt silma ei kaeva.

Selge on, et tĂ”sist analĂŒĂŒtikut, kes on saanud head investeeringud reĆŸiimi vaenlastele rahapesus vĂ”itlemiseks, sellised lapsikud nipid ei peata ning pĂ€rast lepingu loomist nĂ€eb ta ikkagi hash'i.

Kuidas teha nii, et hash ei lekiks?

Swap'i viime off-chain: osalised vahetavad allkirju swap-lepingule ĂŒlemineku jaoks ning seejĂ€rel paljastatakse saladus privaatselt.

Samm-sammultLoodud on kaks "multisig'i", mille tÔttu saab varad vÀlja vÔtta, kui Alice'i ja Bob'i allkirjad on olemas.

Kuna kellegi osaleja offline minek ei tohi olla tragöödia, lisame vana hea aegumise.

Alice ja Bob teevad samal ajal deposiidid

  • Alice mĂ”tleb vĂ€lja salajase ja edastab Bob'ile salajase hash'i ning tehingu allkirja, mis viib bitcoine swap'a aadressile.
  • Bob edastab Alice'ile allkirja, et tĂŒhjendada tokenid swap-lepingule, kasutades mĂ”eldud hash'i.
  • Alice ĂŒtleb Bob'ile saladuse.

Sel hetkel toimub harmoonia: nii Alice kui Bob saavad igal momendil tehingu lÔpetada. Selles sÔbralikus keskkonnas saavad nad vahetada allkirju raha vÀljavÔtmiseks lÔppaadressidele.

Kolmandale vaatlejale nÀib, nagu oleks raha lÀbinud 2/2 multisig leping.

Ja see skeem vÔimaldab mÔlemal osapoolel samaaegselt deposiidi teha, kuna saladus mÔeldakse vÀlja pÀrast kÔiki kinnitusi.

Tase 2

Kuna me saame raha kanda ĂŒhele aadressile ja ei avalda vahepealset tehingut, ei takista meid midagi raha vĂ€ljamaksmine mitmele aadressile ja piiramatu arvu vahetehingute tegemine. See ei ole mitte vajalike pĂ€ringute kogum vahetamiseks, kuid kui oled swap'i kogumisega alustanud, on raske peatuda.

NĂŒĂŒd saavad Alice ja Bob tĂ€ielikult vĂ€lja minna. NĂ€iteks automaatselt arvutada keskmist hinda, vahetades satoshis sekundi kohta, vĂ”i lihtsalt otse ĂŒhendada turu tegija ja likviidsuse saaja.

Samm-sammult

  • MĂŒĂŒja mĂ”tleb vĂ€lja saladuse ja annab ostjale salajase hash'i ning tehingu allkirja, kus osa vahenditest kantakse p2sh swap'a aadressile ja ĂŒlejÀÀnud tagastatakse mĂŒĂŒja aadressile.
  • Kliendilt saadud allkiri, mis vĂ”imaldab tokenite ja tagasimaksete vĂ€ljavĂ”tmist saaja aadressile.
  • MĂŒĂŒja paljastab saladuse
  • Ajaloos kordub uus saladus, mille kĂ€igus lisanduvad swapile ja tagasimaksele ka varem ostetud ja mĂŒĂŒjale makstud vĂ€lja tĂ”mbamine ostja aadressile.

NĂŒĂŒd on meil juurdepÀÀs kiirele p2p kaubandusele, peamine on jĂ€lgida aega ja tehing lĂ”petada enne tĂ€htaega.

Kuid natuke muudates meie lepinguid, saame kinkida meie kanalitele surematuse, mis lihtsustab meie vÔrgu loomist.

Kuid sellest rÀÀgime jÀrgmises osas.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster