Bakit masama ang atomic swap at kung paano sila matutulungan ng mga channel, anong mahahalagang bagay ang nangyari sa hard fork ng Constantinople at kung ano ang gagawin kapag wala kang babayaran para sa gas.
Ang pangunahing motibasyon ng sinumang espesyalista sa seguridad ay ang pagnanais na maiwasan ang responsibilidad.
Ang Providence ay maawain, umalis ako sa ICO nang hindi naghihintay para sa unang hindi maibabalik na transaksyon, ngunit sa lalong madaling panahon natagpuan ang aking sarili na bumuo ng isang crypto exchange.
Talagang hindi ako si Malchish Kibalchish, at ang isang mahigpit na tingin ay sapat na para ibigay ko ang lahat ng mga susi at password. Samakatuwid, ang aking pangunahing layunin bilang isang arkitekto ay ilagay ang mainit na tibo ng cryptanalysis hangga't maaari mula sa mga elemento ng imprastraktura na mahal sa akin.
Hindi ang iyong mga susi, hindi ang iyong mga problema
Bumubuo kami ng isang asset exchange system at gusto naming alisin ang intermediate storage ng mga asset na ito, ngunit dapat naming tiyakin ang seguridad ng transaksyon.
Maaari kang kumilos bilang isang hukom sa isang kontrobersyal na sitwasyon at magsagawa ng mga transaksyon gamit ang mga wallet na nangangailangan ng dalawa sa tatlong lagda: mamimili, nagbebenta at escrow.
Gayunpaman, kung matagumpay na inatake ng kalahok ang escrow, pagkatapos ay natatanggap niya ang kinakailangang dalawang pirma.
Ang Atomic swap ay isang exchange scheme kung saan ang guarantor ay isang matalinong kontrata na nagbibigay-daan lamang sa tapat na pag-uugali.
Na parang sa isang bugtong tungkol sa isang lobo, isang kambing at isang repolyo, maaari ka lamang kumilos ayon sa tanging tamang senaryo at magdaranas ng mga pagkalugi kung lumihis ka mula dito.
Tanging sa halip na mga matakaw na hayop, ang pagkakasunud-sunod ay ibinibigay ng isang hash function kung saan napakahirap na makahanap ng isang banggaan na hindi ito nagkakahalaga ng pagsisimula.
Unang hakbang: bugtong
Ipagpalagay na isang magandang umaga ay gustong bigyan ni Alice si Bob ng bitcoin para sa isang dakot na "crypto-yuan".
- May ginagawa siyang malaking sikreto
- Nakakakuha ng hash mula dito
- Naglilipat ng mga bitcoin sa isang matalinong kontrata, kung saan maaaring mag-withdraw ng pera si Bob sa pamamagitan ng pagpapakita ng isang lihim (ang hash nito ay dapat na katumbas ng tinukoy sa kontrata)
- Kung hindi lalabas si Bob para sa kanyang mga bitcoin sa gabi, maaari itong ibalik ni Alice sa kanyang sarili.
Pangalawang hakbang: pain
Pumasok si Bob at inilipat ang "crypto-euro" sa kanyang kontrata, na isinulat sa paraang:
- Maaaring alisin ni Alice ang "crypto-yens" sa pamamagitan ng pagpapakita ng isang lihim na numero
- Hindi mas maaga kaysa sa tanghalian, maaaring ibalik ni Bob ang deposito kung nabigo si Alice na magpakita.
Ikatlong hakbang: ang sagot ay nasa pain
Dumating si Alice para sa kanyang pera at kinuha ang pera mula sa kontrata ni Bob, na inihayag ang kanyang sikreto sa proseso.
Huling hakbang: ang bugtong ay nalutas
Nakita ni Bob ang transaksyon, at sa kanyang mata ng agila ay kinuha niya mula rito ang lihim na ipinakita ni Alice sa kontrata. Ginagamit niya ang sikretong ito para bawiin ang kanyang mga bitcoin.
Kapag nagkamali
Kung biglang naging mortal si Alice, kinukuha ni Bob ang kanyang yuan sa tanghalian.
Sa turn, ibinabalik ni Alice ang bitcoin sa gabi kung ang taksil na si Bob ay nagpasya na hawakan ang pera hanggang sa mas magandang panahon.
Kung mas gusto mo ang isang larawan kaysa sa text, ang Habré ay may mas detalyado at visual na isa para sa iyo. .
Ang pagkakaiba sa pagitan ng mga timeout ay idinisenyo upang i-insure tayo laban sa malisyosong Alice, na kumukuha ng pera ni Bob sa pinakahuling sandali, at ang timeout ay mag-e-expire habang pinapasok niya ang hex sa transaksyon gamit ang nanginginig na mga daliri.
Ang mga kalahok ay hindi maaaring mawala ang kanilang pera; sa karamihan, kailangan nilang maghintay para sa isang refund.
Suporta sa BlockchainIto ay isang simpleng pamamaraan na hindi nangangailangan ng lahat mula sa pakikipag-ugnay sa mga blockchain:
- Suporta para sa mga matalinong kontrata na may kahit isang sangay
- Ang parehong mga blockchain ay dapat na sumusuporta sa parehong hashing algorithm (tandaan na suriin ang lihim na haba)
- Mga timelock.
Sa unang sulyap, posible nang sabihin sa stock exchange na "paalam, ang aming pagpupulong ay isang pagkakamali," ngunit hindi iyon ang kaso.
Para sa lahat ng kanilang mga pakinabang, ang mga solusyon sa atomic swap ay hindi humahanga sa kanilang pagkatubig. Higit sa lahat dahil sa pinakasikat na pares ng BTC-USD, ang fiat na bahagi ay hindi ganap na na-tokenize.
Ang tagumpay ng USDT ay nagbunga ng isang buong wave ng stable coins sa ERC20 format para sa bawat panlasa, mula sa pinaka-custodial USDC hanggang sa pinaka algorithmic na DAI.
Samakatuwid, para sa pagiging simple, lalo naming pinagtatalunan na si Alice ay nagbebenta ng Bitcoins kay Bob para sa ilang ERC20 token, at umaasa kami para sa suwerte ng mga stabilizer, dahil marami pa kaming mga teknikal na problema.
bilis
Ang Bitcoin at Ethereum ay hindi masyadong mabilis nang paisa-isa, ngunit dito kailangan muna nating maghintay para sa isang deposito na may lahat ng kumpirmasyon, pagkatapos ay para sa pangalawa.
Ito ay lahat dahil ang kalahok na nakakaalam ng sikreto ay unang nagdeposito ng pera, at ang kalaban ay naghihintay para sa finality at pagkatapos ay inilipat ang kanyang bahagi.
Bilang karagdagan, nakikipag-ugnayan kami sa isang napakapabagu-bagong asset, kaya sa panahong ito ang rate ay maaaring magbago nang malaki, at ang pagbabago ng mga kondisyon ay hindi na madali.
Конфиденциальность
Ang anumang palitan ay nag-iiwan ng mga artifact sa parehong mga blockchain. Ang isang matulungin na tagamasid ay maaaring mapansin ang parehong mga hash sa mga matalinong kontrata at gumawa ng isang lohikal na konklusyon na ang isang transaksyon ay nakumpleto, kung saan maraming mga konklusyon ang maaaring makuha mula sa exchange rate hanggang sa buwis.
Kapag alam ng stock exchange ang tungkol sa iyong mga gawain, ito ay lubhang hindi kasiya-siya; kapag alam ng lahat ang tungkol dito, ito ay dobleng hindi kasiya-siya.
Kakayahang magamit
Ang malakas na punto ng blockchain sa pangkalahatan at ether sa partikular. Tingnan natin kung anong mga galaw ang kailangang gawin ng nagbebenta at bumibili.
Mula sa punto ng view ng nagbebenta, ang lahat ay medyo simple: kailangan mo lamang ilipat ang Bitcoin sa isang p2sh address. Sa ether, ang lahat ay mas nakakalito.
KontrataTingnan natin ang kontratang na-average sa Github para sa isang swap:
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);
}
}
Warning! Huwag gamitin ito at ang iba pang mga kontrata mula sa artikulo sa produksyon, ang mga ito ay isinulat para sa mga layunin ng pagpapakita lamang. Lalo na ang isang ito.
- Dapat tawagan ni Bob ang pamamaraan ng kontrata ng token
approve, na nagbibigay ng access sa kontrata ng swap sa mga token nito - Lumilikha si Bob ng swap at kontrata gamit ang pamamaraan
transferFromdinadala ang mga token ng nagpadala sa iyong address - pumasok si Alice
withdrawnagbubunyag ng sikreto at tumatawag ang kontratatransfer
Karamihan sa mga wallet at crypto exchange ay hindi sumusuporta approve mga token, at para sa magandang dahilan.
Ang mga gumagamit mismo ay madalas na nagkakamali at naglilipat lamang ng mga token sa kontrata, pagkatapos nito ay nawala na lang ang mga token. Ang mga komento sa Etherscan ay puno ng pagdadalamhati mula sa mga kapus-palad.
At para makatawag ng kontrata, kailangan mong magbayad ng komisyon sa ETH, na nangangahulugang ang mga kalahok ay dapat mag-stock dito bago simulan ang transaksyon, at kakaunti ang gustong gawin ito.
May hawak ng gas
Ang isang magandang lugar upang magsimula ay alisin ang tseke ng nagpadala hangga't maaari at ipagpalagay na mayroon kaming isang taong nagdurusa sa labis na mga kontrata sa pagtawag sa gas para sa lahat ng dumating.
Na-upgrade na kontrata
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);
}
}
Contract-key dualism at EIP 712
Tulad ng alam natin, ang isang address sa himpapawid ay maaaring isang kontrata, o maaari itong maging isang paksa, iyon ay, isang susi.
Ang pangunahing gawain ng susi ay pumirma ng ilang mensahe.
Maaari naming gamitin ang Bob-contract bilang isang nagpadala, na gumagawa ng lahat ng kinakailangang mga pass, na sinuri muna ang lagda ng Bob-key.
Ngayon, kahit sino ay maaaring mag-sponsor ng komisyon ng kalahok, ngunit ang nakakaalam lamang ng susi ang gumagawa ng desisyon.
Bob-kontrata
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);
}
}
Ang Ethereum ay may pamantayan para sa pagtatrabaho sa mga lagda ng mga kumplikadong istruktura ng data , maaari mong basahin ang higit pa tungkol dito sa
Hatiin at tuntunin
Kadalasan ang senaryo para sa pag-hack ng kontrata ng Ethereum ay ganito:
- Ang kalahok ay nagdeposito ng mga pondo sa kontrata
- Pagkatapos ay kinukuha niya ang mga pondo
- May nangyayaring mali
- Paulit-ulit na kinukuha ng umaatake ang pera
Kung babalik tayo sa ating unang halimbawa, may mali kung ang bugtong ay isang walang laman na hanay ng mga byte.
Paano magnakaw ng isang milyonGumawa ng swap gamit ang hash 0x66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925
Ito ay mula sa sha256 0x0000000000000000000000000000000000000000000000000000000000000000
Inilipat namin ang sikreto at kinukuha ang aming mga token
Muli kaming nagpapadala at kumuha ng iba, lahat dahil 0 = 0
Sa pamamagitan ng paglikha ng isang hiwalay na kontrata para sa bawat kalakalan, maaari naming ihiwalay ang mga kontrata sa antas ng EVM.
Ngunit hindi lang iyon: ngayon ang bawat transaksyon ay may sariling address, kung saan maaari kang maglipat ng mga token mula sa anumang pitaka o palitan.
Inabandunang mga kontrata at lumikha2
Ngunit ngayon para sa bawat transaksyon kailangan nating lumikha ng isang kontrata at maghintay para sa mamimili na maglipat ng labor "crypto-finding" doon. Sa scheme ng "mga kontrata sa umaga, pera sa gabi", palaging may panganib na mahuhulog ang mamimili, at ang eter ay ginugol na sa paglikha ng kontrata.
Posible bang gawin ito upang magkaroon ka ng pera sa umaga at bytes sa gabi?
Mga developer sa Constantinople hard fork idinagdag ang create2 na pagtuturo, na lumilikha ng bagong kontrata sa isang deterministikong address
keccak256( 0xff ++ address ++ salt ++ keccak256(init_code))[12:]
saan
- address — address ng kontrata ng pabrika
- asin - ilang numero, ang kahulugan kung saan matututunan natin sa susunod na serye
- init_code — contract bytecode at mga parameter ng constructor.
Ang pabrikaGumagana lamang ang pagtuturo sa pamamagitan ng pagpupulong, kaya ang pabrika ay mukhang medyo nakakatakot:
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);
}
}
Maaaring makuha ang iyong code ng kontrata gamit ang 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);
Dahil sa limitadong suporta sa solidity, ang gas para sa isang kontrata ay maaaring hindi wastong kalkulahin dahil sa ilang mga subtleties ng ether.
Ito ay lalong maganda na sa kaganapan ng isang kakulangan ng gas, ang kontrata ay nag-crash na may panloob na error, nang hindi nag-uulat na walang sapat na gas, gaya ng maaari mong asahan.
Ngayon ay maaari na kaming maglipat ng mga token sa mga kontrata nang hindi ginagawa ang mga ito nang maaga, at hanggang sa mai-publish namin ang mga ito sa network, walang sinuman ang makakahuhula kung ano ang eksaktong ginagawa ng kontrata.
Ang uwak ay hindi tumutusok sa mata ng uwak
Ito ay malinaw na ang isang tunay na analyst, lalo na ang isa na nakatanggap ng mahusay na pamumuhunan sa paglaban sa mga kaaway ng rehimen na may money laundering, ay hindi titigil sa pamamagitan ng gayong mga pandaraya, at pagkatapos na lumikha ng kontrata ay makikita pa rin niya ang hash.
Paano mapipigilan ang pagpapakita ng hash?
Inilipat namin ang swap mismo sa offchain: ang mga kalahok ay nagpapalitan ng mga lagda para sa paglipat sa isang kontrata ng swap, at pagkatapos ay pribado na ibinunyag ang sikreto.
Hakbang-hakbangDalawang "multisig" ang nilikha kung saan maaaring bawiin ang mga pondo kung may mga lagda sina Alice at Bob.
Upang maiwasan ang alinman sa mga kalahok na maging isang trahedya, magdaragdag kami ng magandang lumang timeout.
Si Alice at Bob ay gumagawa ng mga deposito nang magkatulad
- Nahulaan ni Alice ang isang lihim at binigyan si Bob ng hash ng sikreto at isang lagda ng transaksyon na naglilipat ng mga bitcoin sa swap address.
- Binigyan ni Bob si Alice ng lagda para mag-withdraw ng mga token sa isang kontrata ng swap na may nakatagong hash.
- Sinabi ni Alice kay Bob ang isang sikreto.
Sa sandaling ito, darating ang harmony: parehong makumpleto nina Alice at Bob ang deal anumang oras. Sa ganitong magiliw na kapaligiran, maaari silang makipagpalitan ng mga lagda upang mag-withdraw ng pera sa mga huling address.
Sa isang outside observer, mukhang dumaan sa 2-of-2 multisig contract ang pera.
Ang pamamaraan na ito ay nagpapahintulot din sa parehong mga partido na gumawa ng isang deposito sa parehong oras, dahil ang lihim ay inihayag pagkatapos ng lahat ng mga kumpirmasyon.
Antas 2
Dahil maaari kaming mag-withdraw ng pera sa isang address at hindi mag-publish ng isang intermediate na transaksyon, walang pumipigil sa amin na mag-withdraw ng pera sa ilang mga address at gumawa ng walang limitasyong bilang ng mga intermediate na transaksyon. Hindi ito isang kinakailangang set para sa isang palitan, ngunit sa sandaling simulan mo ang pagkolekta ng isang swap, mahirap ihinto.
Ngayon ay magagawa na nina Alice at Bob na tumalikod nang buong lakas. Halimbawa, awtomatikong kalkulahin ang average na presyo sa pamamagitan ng pagpapalitan ng satoshi bawat segundo, o direktang ikonekta ang market maker at tatanggap ng liquidity.
Hakbang-hakbang
- Ang nagbebenta ay gumagawa ng isang lihim at binibigyan ang mamimili ng isang hash ng sikreto at isang lagda ng transaksyon kung saan ang bahagi ng mga pondo ay inililipat sa p2sh swap address, at ang iba ay ibinalik sa address ng nagbebenta
- Ang mamimili ay nagsusumite ng isang lagda na nagpapahintulot sa mga swap token at pagbabago na maipadala sa address ng tatanggap.
- Inihayag ng nagbebenta ang lihim
- Ang kasaysayan ay umuulit sa sarili nito sa isang bagong lihim, at bilang karagdagan sa pagpapalit at pagbabago, ang pag-withdraw ng dati nang binili sa address ng mamimili at nabayaran na sa address ng nagbebenta ay idinagdag.
Ngayon ay mayroon na kaming access sa high-speed p2p trading, ang pangunahing bagay ay subaybayan ang oras at isara ang deal bago ang timeout.
Gayunpaman, sa pamamagitan ng kaunting pag-aayos ng aming mga kontrata, maaari naming bigyan ang aming mga channel ng imortalidad, na gagawing mas madali para sa amin na bumuo ng isang network.
Ngunit pag-uusapan natin ito sa susunod na yugto.
Pinagmulan: www.habr.com
