Miks on aatomilised swapid halvad ja kuidas vÔivad kanalid aidata, mis olulist juhtus Constantinople'i hard fork'is ja kuidas olla, kui ei ole millegagi gaasi maksta.
Iga turbeeksperdi peamine motivatsioon on soov vÀltida vastutust.
Saatuse halastus oli kohal, lahkusin ICOst, ootamata esimest pöördumatut tehingut, kuid peagi leidsin end krĂŒptobörsi arendamise juures.
Mina ei ole kindlasti MalkoĆĄa KibalÄiĆĄ ja ĂŒks rangem pilk on piisav, et ma annaksin kĂ”ik vĂ”tmed ja paroolid ĂŒle. SeetĂ”ttu oli minu peamine eesmĂ€rk arhitektina asetada tuline krĂŒptoanalĂŒĂŒsi nĂ”el nii kaugele kui vĂ”imalik minule kallite infrastruktuuri elementide juurest.
Kuna need ei ole sinu vÔtmed, ei ole need ka sinu probleemid.
Me ehitame varade vahetussĂŒsteemi ja soovime vĂ€ltida nende varade hoidmist enda kĂ€es, kuid peame tagama tehingu turvalisuse.
Saame tegutseda vahemeesena vaidlusalustes olukordades ja teha tehinguid rahakottidega, mis nĂ”uavad kolme allkirja: ostjalt, mĂŒĂŒjalt ja hooldajalt.
Kuid kui osaleja suudab hooldajat edukalt rĂŒnnata, siis saab ta soovitud kaks allkirja.
Aatomaarne vahetus â vahetuskeem, kus garantii rollis on nutileping, mis lubab ainult ausat kĂ€itumist.
Nagu mĂ”istatuses hundist, lambast ja kapsast vĂ”id sina toimida ainult ĂŒhes Ă”iges stsenaariumis ja kannatada kaotusi, kui sellest kĂ”rvale kaldud.
Austatav looma asemel tagab korra rÀsifunktsioon, milles kollisiooni leidmine on nii keeruline, et ei tasu isegi proovida.
Esimene samm: mÔistatus
Kujutame ette, et Alice tahab ĂŒhel kaunil hommikul saata Bobile bitcoini vastu tĂ”ukeratta 'krĂŒptovÀÀringut'.
- Ta mÔtleb vÀlja mingi suure saladuse
- Saab temalt rÀsihash'i
- Kandab bitcoine nutilepingusse, kust saab raha vÔtta Bob, esitades saladuse (hash peab olema lepingus mÀrgitud hash'iga vÔrreldav)
- Kui Bob ei tule oma bitcoine Ôhtuks kÀtte saama, vÔib Alice need tagasi endale vÔtta.
Teine samm: lÔks
MĂ€ngu astub Bob ja kannab 'krĂŒptoeurod' oma lepingusse, mis on kirjutatud selliselt, et:
- Alice vĂ”ib 'krĂŒptoraha' kĂ€tte saada, esitades salajase numbri
- Enne lÔunat vÔib Bob, kui Alice ei ilmu, peadagust tagasi saada.
Kolmas samm: nÀpunÀide mÔistatusele
Alicia tuleb oma raha jÀrele ja vÔtab Bobi lepingust raha, paljastades samal ajal oma saladuse.
Viimane samm: mÔistus on lahendatud
Bobi nÀeb tehingut ja kotkasilmaga eraldab ta sellest saladuse, mille Alicia lepingule esitas. Seda saladust ta kasutab, et juba ise oma bitcoine kÀtte saada.
Kui midagi lÀheb valesti
Kui Alicia peaks Ă€kitselt surelikuks osutuma, vĂ”tab Bob lĂ”unaks oma jĂŒaanid tagasi.
Oma osas tagastab Alicia Ôhtuks bitcoini, kui reeturlik Bob otsustab raha paremate aegade ootamiseks pidada.
Kui eelistad pilti tekstile, on Habras sinu jaoks pÔhjalikum ja visuaalne .
Erinevus aegade vahel on loodud meid kaitsma pahatahtliku Aliciast, kes vÔtab Bobi raha viimasel hetkel, kui aeg on otsa saamas, samal ajal kui ta vÀrisevate sÔrmedega sisestab hex'i tehingusse.
Osalejad ei saa raha kaotada, maksimum, peab natuke ootama tagastamist.
Toetamine plokiahelatesSee on lihtne, nagu king, skeem, mis nÔuab suheldes plokiahelatelt vaid vÀhe.
- Nutitehingute to support with vĂ€hemalt ĂŒhe haru
- MĂ”lemad plokiahelad peavad toetama sama krĂŒptimisalgoritmi (Ă€rge unustage kontrollida salajase pikkust)
- Aeglukud.
Esmapilgul vÔib juba öelda, et börsile 'head aega, meie kohtumine oli viga', kuid see ei ole nii lihtne.
KĂ”ikide oma eeliste juures ei ole lahendused atomic swap'idel likviidsusega ĂŒle mĂ”istuse. Suur osa on selles, et populaarseimas paaris BTC-USD ei olnud fiat-osa tĂ€ielikult tokeniseeritud.
USDT edu on tekitanud terve hulga stabiilseid mĂŒnte ERC20 formaadis, mis katab kĂ”iki maitseid, alates kĂ”ige hoidlikumast USDC-st kuni kĂ”ige algoritmilise DAI-ni.
SeetĂ”ttu rÀÀgime edaspidi lihtsuse huvides sellest, et Alice mĂŒĂŒb Bobile Bitcoine mingite ERC20 tokenite eest ja loodame stabilisaatorite Ă”nnele, sest meil on veel palju rohkem tehnilisi probleeme.
Kiirus
Bitcoine ja Ethereum ei ole ĂŒksinda ka eriti kiired, ja nĂŒĂŒd peame ootama kĂ”igepealt ĂŒhe sissemakse kĂ”ikide kinnitustega, siis teist.
See kÔik on sellepÀrast, et kÔigepealt teeb sissemakse osaleja, kellel on saladus teada, ja vastane ootab lÔpuleviimist ning alles seejÀrel kannab oma osa.
Samuti tegeleme vÀga volatiilse varaga, seega vÔib selle aja jooksul hind oluliselt muutuda, ning tingimuste muutmine pole enam lihtne.
Privaatsus
Iga vahetus jÀtab jÀlgi mÔlemale plokiahelale. TÀhelepanelik vaatleja vÔib mÀrgata samu hashe nii nutilepingutes ja teha loogilise jÀrelduse, et siin on toimunud tehing, mille pÔhjal saab teha rohkelt jÀreldusi alates vahetuskurssidest kuni maksudeni.
Kui börs teab sinu tegemistest â on see ÀÀrmiselt ebameeldiv; kui sellest teab igaĂŒks â on see kahekordselt ebameeldiv.
Usability
Plokiahela ja eriti Etheri tugevus. Vaadakem, milliseid samme peab mĂŒĂŒja ja ostja astuma.
MĂŒĂŒgipoolelt on kĂ”ik suhteliselt lihtne: tuleb lihtsalt edastada Bitcoin p2sh aadressile. Etheriga on olukord palju keerulisem.
LepingVaatame keskmist GitHubi lepingut vahetamiseks:
pragma solidity ^0.5.0;
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 teisi artikli lepinguid tootmises, need on kirjutatud ainult demo eesmĂ€rkidel. Eriti seda..
- Bob peab kutsuma lepingus tokeni meetodit.
reject, andes vahetuse lepingule ligipÀÀsu oma tokenitele. - Bob loob vahetuse ja lepingu meetodi abil.
transferFrom.vÔtab saatja tokenid enda aadressile. - Alice on.
withdraw.avalikustab salajase ja leping kutsub.transfer
Enamik rahakotte ja krĂŒptobörse ei toeta. reject tokenite jaoks, ja mitte ilma pĂ”hjuseta.
Kasutajad eksivad sageli ja lihtsalt kannavad tokenid lepingule, mille jÀrel tokenid lihtsalt kaovad. Etherscani kommentaarid on tÀis Ônnetute nutu.
Ja et kutsuda lepingut, on vaja maksta ETH tasu, seega peavad mÔlemad osalejad enne tehingu alustamist selleks ette valmistama, millega ei taha paljud tegeleda.
Gaasihoidla.
Alguses tasub eemaldada saatja kontroll igal vĂ”imalikul juhul ja eeldada, et meil on keegi, kes kannatab gaasi ĂŒlekoormuse all ja kutsub lepinguid kĂ”igile huvilistele.
Moderniseeritud leping.
kontrakt Swapper {
struktuur Swap {
iERC20 token;
aadress vastuvÔtja;
uint summa;
aadress tagasimakseAadress;
uint tagasimakseAeg;
}
mÀpiga (bytes32 => Swap) swapid;
funktsioon create(iERC20 token, bytes32 hash, aadress vastuvÔtja, uint summa, aadress tagasimakseAadress, uint tagasimakseAeg) public {
nÔuda(swapid[hash].summa == 0); // kasuta hash'i kord
nÔuda(token.transferFrom(msg.sender, address(this), summa));
swapid[hash] = Swap(token, vastuvÔtja, summa, tagasimakseAadress, tagasimakseAeg);
}
funktsioon withdraw(bytes memory saladus) public {
bytes32 hash = sha256(saladus);
Swap memory swap = swapid[hash];
nÔuda(swap.summa > 0);
delete swapid[hash];
swap.token.transfer(swap.vastuvÔtja, swap.summa);
}
funktsioon refund(bytes32 hash) public {
Swap memory swap = swapid[hash];
nÔuda(now > swap.tagasimakseAeg);
delete swapid[hash];
swap.token.transfer(swap.tagasimakseAadress, swap.summa);
}
}
Kontraktiline vÔtme-dualism ja EIP 712
Nagu me teame, vÔib Etheri aadress olla kas leping vÔi subjekti, st vÔti.
Peamine tegevusvÔti on allkirjastada mingeid sÔnumeid.
Saame kasutada saatjana Bob-lepingut, mis teeb kÔik vajalikud tehingud, kontrollides enne seda Bob-vÔtme allkirja.
NĂŒĂŒd saab igaĂŒks sponsorida osalise tasu, kuid otsustamise tegija on ainult see, kellel on 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);
}
}
Ethereumis keerukate andmestruktuuride allkirjade haldamiseks on standard , selle kohta vÔite lÀhemalt lugeda
Jagage ja valitsege
Sageli nÀeb Ethereum'i lepingu hÀkkimise stsenaarium vÀlja jÀrgmine:
- Osaline paneb lepingusse raha
- Siis vÔtab raha tagasi
- Midagi lÀheb valesti
- Kurjategija vÔtab raha ikka ja jÀlle
Kui naaseme meie esimese nĂ€ite juurde, siis midagigi lĂ€heb valesti, kui mĂ”istatus on tĂŒhi baitide kogum.
Kuidas varastada miljonLoome vahetuse, mille hashr on 0x66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925
See on sha256 0x0000000000000000000000000000000000000000000000000000000000000000
Edastame salajase ja vÔtame oma tokenid
Edastame veel kord ja vÔtame teiste oma, kÔik seetÔttu, et 0 = 0
Iga tehingu jaoks eraldi lepingu loomisega saame EVM tasemel lepingud isoleerida.
Aga see pole veel kĂ”ik: nĂŒĂŒd on igal tehingul oma aadress, kuhu saab ĂŒlekandeks tokenid mis tahes rahakotist vĂ”i börsilt.
HĂŒljatud lepingud ja create2
Kuid nĂŒĂŒd peame igale tehingule looma lepingud ja ootama, kuni ostja sinna oma töö 'krĂŒptoveri' kannab. Skeemis 'hommikul lepingud, Ă”htul raha' on alati oht, et ostja loobub, kuid lepingute tegemiseks kulutatud ether on juba Ă€ra kulutatud.
Kas ei saaks teha nii, et hommikul raha ja Ôhtul baitid?
Hardforkis Constantinople arendajad lisasid create2 kÀsu, mis loob uue lepingu mÀÀratletud aadressil
keccak256( 0xff ++ aadress ++ sool ++ keccak256(init_code))[12:]
Kus
- aadress â tehaste lepingu aadress
- sool â mĂ”ni number, mille tĂ€hendus selgub jĂ€rgmises osas
- init_code â lepingu baitkood ja konstruktoriparameetrid.
TehasKÀsk töötab ainult assembly kaudu, seega nÀeb tehas vÀlja mÔnevÔrra hirmutav:
leping Factory {
ĂŒritus Deployed(address addr, uint256 salt);
funktsioon create2(bytes mÀlu kood, uint256 salt) avalik {
aadress addr;
assamblee {
addr := create2(0, add(kood, 0x20), mload(kood), salt)
}
emit Deployed(addr, salt);
}
}
Teie lepingu koodi saab hankida web3 abil:
const MyContract = new web3.eth.Contract(ABI, {})
const kood = MyContract.deploy({
data: BYTECODE,
arguments: contructorArgs
}).encodeABI();
const factory = new web3.eth.Contract(FACTORY_ABI, factoryAddress);
tx = factory.methods.create2(kood, salt);
Solidity piiratud toe tĂ”ttu vĂ”ib lepingu gaasi hindamine olla vale, mis tuleneb mĂ”ningatest eetriga seotud nĂŒanssidest.
Eriti meeldiv on see, et gaasi puudumisel kukub leping sisemise veaga, teavitamata, et gaasi on liiga vÀhe, nagu vÔiks oodata.
NĂŒĂŒd saame edastada tokenid lepingutele, luues need eelnevalt, ja enne, kui me neid vĂ”rku avaldame, ei saa keegi aru, mida leping tĂ€pselt teeb.
Varese varesele silma ei nÀpi.
On selge, et tĂ”elist analĂŒĂŒtikut, eriti kui ta on saanud head investeeringud reĆŸiimi vastastele raha pesemisega vĂ”itlemiseks, sellised lapsemeelsed trikid ei peata, ja pĂ€rast lepingu loomist nĂ€eb ta ikkagi hashi.
Kuidas teha nii, et hash ei ilmuks?
Iga swapime viibime off-chain: osalejad vahetavad allkirju swap-lepingule ĂŒleminekuks, ja seejĂ€rel paljastatakse saladus privaatsetelt.
Samm-sammultLoomisel on kaks "multisigi", millega saab varasid vÔtta, kui Alice'il ja Bob'il on allkirjad.
Kuna kellegi osalejate offline minek ei tohiks olla tragöödia, lisame vana hea ajavööndi.
Alice ja Bob teevad samal ajal sissemakseid
- Alice mÔtleb vÀlja salajase sÔnumi ja edastab Bob'ile salajase sÔnumi haƥi ja allkirja tehingule, mis kannab bitcoine swap-aadressile.
- Bob edastab Alicele allkirja tokenite vÀljavÔtmiseks swap-lepingule mÀÀratud hashing'iga.
- Alice teatab Bob'ile saladuse.
Sel hetkel saavutavad nad harmoonia: nii Alice kui ka Bob saavad igal hetkel tehingu lÔpetada. Selles sÔbralikus keskkonnas saavad nad vahetada allkirju raha vÀljavÔtmiseks lÔpp-aadressidele.
Kaugele vaatleja jaoks nÀeb see vÀlja nagu raha liikus lÀbi 2/2 multisig leping.
Ja selline skeem vÔimaldab mÔlemal poolel teha sissemakseid samaaegselt, kuna saladus mÔeldakse vÀlja juba pÀrast kÔiki kinnitusi.
Tase 2
Kuna me saame raha kanda ĂŒhele aadressile ja ei avalda vahepealseid tehinguid, ei takista meid raha ĂŒlekandmine mitmele aadressile ning piiramatute vahepealsete tehingute tegemine. See ei ole kindlasti vahetuse jaoks vajalik komplekt, kuid kui oled vahetuse kogumisega alustanud, on keeruline peatuda.
NĂŒĂŒd saavad Alice ja Bob tĂ€ielikult tegutseda. NĂ€iteks arvutada automaatselt keskmist hinda, vahetades satoshis sekundis, vĂ”i lihtsalt otse ĂŒhendades turuhindaja ja likviidsuse saaja.
Samm-sammult
- MĂŒĂŒja mĂ”tleb vĂ€lja salajase numbri ja annab ostjale salajase numbri hÀÀletuse ja tehingu allkirja, kus osa vahenditest kantakse p2sh vahetuse aadressile ning ĂŒlejÀÀnu tagastatakse mĂŒĂŒja aadressile.
- Ostja edastab allkirja, mis lubab vahetus tokenitele ja tagasimaksetele saajale ĂŒlekande teha.
- MĂŒĂŒja avab salajase numbri.
- Lugu kordub uue salajase numbriga, mille kĂ€igus lisatakse vahetusele ja tagasimaksete juurde ka varem ostetud ja mĂŒĂŒja aadressile makstud raha vĂ€ljavĂ”tmine ostja aadressile.
NĂŒĂŒd on meil ligipÀÀs kiiretlte p2p kauplemisele, peamine on jĂ€lgida aega ja tehing enne aja maha minekut lĂ”petada.
Kuid veidi muutes meie lepinguid, saame kinkida meie kanalitele surematuse, mis lihtsustab vÔrgu loomist oluliselt.
Kuid sellest rÀÀgime jÀrgmises osas.
Allikas: habr.com
