Shine na taabu hubadilishana atomiki

Kwa nini ubadilishaji wa atomiki ni mbaya na jinsi njia zitawasaidia, ni mambo gani muhimu yaliyotokea kwenye uma ngumu ya Constantinople na nini cha kufanya wakati huna chochote cha kulipia gesi.

Motisha kuu ya mtaalamu yeyote wa usalama ni tamaa ya kuepuka wajibu.

Providence ilikuwa ya rehema, niliacha ICO bila kungoja shughuli ya kwanza isiyoweza kurekebishwa, lakini hivi karibuni nilijikuta nikitengeneza ubadilishaji wa crypto.

Hakika mimi si Malkish Kibalchish, na sura moja ya ukali inatosha kwangu kukabidhi funguo na nywila zote. Kwa hivyo, lengo langu kuu kama mbunifu lilikuwa kuweka uchungu mkali wa cryptanalysis iwezekanavyo kutoka kwa vipengele vya miundombinu ninavyopenda.

Sio funguo zako, sio shida zako

Tunaunda mfumo wa kubadilishana mali na tunataka kuondoa uhifadhi wa kati wa mali hizi, lakini ni lazima tuhakikishe usalama wa ununuzi.

Unaweza kutenda kama jaji katika hali ya kutatanisha na kufanya miamala na pochi zinazohitaji saini mbili kati ya tatu: mnunuzi, muuzaji na escrow.

Walakini, ikiwa mshiriki atashambulia kwa mafanikio escrow, basi anapokea saini mbili zinazohitajika.

Kubadilishana kwa atomiki ni mpango wa kubadilishana ambapo mdhamini ni mkataba mzuri unaoruhusu tabia ya uaminifu pekee.

Kana kwamba katika kitendawili kuhusu mbwa mwitu, mbuzi na kabichi, unaweza kutenda tu kulingana na hali sahihi na kupata hasara ikiwa utaiacha.

Badala ya wanyama wa kula tu, utaratibu hutolewa na kazi ya hashi ambayo ni vigumu kupata mgongano kwamba haifai kuanza.

Hatua ya kwanza: kitendawili

Tuseme kwamba Alice asubuhi moja nzuri anataka kumpa Bob bitcoin kwa wachache wa "crypto-yuan".

  • Anafanya siri kubwa
  • Anapata heshi kutoka kwayo
  • Huhamisha bitcoins kwa mkataba mzuri, ambao Bob anaweza kutoa pesa kwa kuwasilisha siri (heshi yake lazima iwe sawa na ile iliyoainishwa kwenye mkataba)
  • Ikiwa Bob hajitokezi kwa bitcoins zake jioni, Alice anaweza kuzirudisha kwake.

Hatua ya pili: bait

Bob anakuja kucheza na kuhamisha "crypto-euro" kwa mkataba wake, ambayo imeandikwa kwa njia ambayo:

  • Alice anaweza kuchukua "crypto-yens" kwa kuwasilisha nambari ya siri
  • Sio mapema zaidi ya chakula cha mchana, Bob anaweza kurejesha amana ikiwa Alice atashindwa kufika.

Hatua ya tatu: jibu ni katika bait

Alice huja kwa pesa zake na kuchukua pesa kutoka kwa mkataba wa Bob, akifichua siri yake katika mchakato huo.

Hatua ya mwisho: kitendawili kinatatuliwa

Bob anaona shughuli hiyo, na kwa jicho lake la tai anatoa siri ambayo Alice aliwasilisha kwenye mkataba. Anatumia siri hii kurudisha bitcoins zake.

Mambo yanapoharibika

Ikiwa Alice atabadilika ghafla kuwa mtu anayeweza kufa, Bob huchukua yuan yake wakati wa chakula cha mchana.

Kwa upande wake, Alice anarudisha bitcoin jioni ikiwa Bob mwenye hila ataamua kushikilia pesa hadi nyakati bora.

Ikiwa ungependa picha itumike maandishi, Habre anayo ya kina zaidi na inayoonekana kwa ajili yako. maelezo ya jinsi ubadilishaji wa atomiki unavyofanya kazi.

Tofauti kati ya muda wa kuisha imeundwa ili kutuhakikishia dhidi ya Alice mwenye nia mbaya, ambaye huchukua pesa za Bob katika dakika ya mwisho kabisa, na muda wa kuisha unaisha huku akiingia kwenye shughuli na vidole vinavyotetemeka.

Washiriki hawawezi kupoteza pesa zao; hata zaidi, watalazimika kusubiri kurejeshewa pesa.

Msaada wa blockchainHuu ni mpango rahisi ambao hauitaji chochote kutoka kwa blockchains zinazoingiliana:

  • Usaidizi wa kandarasi mahiri na angalau tawi moja
  • Minyororo yote miwili ya kuzuia lazima iunge mkono kanuni sawa za hashing (kumbuka kuangalia urefu wa siri)
  • Vifungo vya wakati.

Kwa mtazamo wa kwanza, tayari inawezekana kusema kwa soko la hisa "kwaheri, mkutano wetu ulikuwa wa makosa," lakini haikuwa hivyo.

Kwa faida zao zote, suluhu za kubadilishana atomiki hazivutii na ukwasi wao. Kwa kiasi kikubwa kwa sababu katika jozi maarufu zaidi ya BTC-USD, sehemu ya fiat haikuonyeshwa kikamilifu.
Mafanikio ya USDT yamezaa wimbi zima la sarafu thabiti katika umbizo la ERC20 kwa kila ladha, kutoka USDC iliyohifadhiwa zaidi hadi DAI ya algorithmic zaidi.

Kwa hiyo, kwa unyenyekevu, tunasema zaidi kwamba Alice anauza Bitcoins kwa Bob kwa baadhi ya ishara za ERC20, na tunatumai bahati ya vidhibiti, kwa kuwa bado tuna matatizo mengi zaidi ya kiufundi.

Kasi

Bitcoin na Ethereum sio haraka sana mmoja mmoja, lakini hapa tunapaswa kusubiri kwanza amana moja na uthibitisho wote, kisha kwa pili.

Hii yote ni kwa sababu mshiriki ambaye anajua siri kwanza huweka pesa, na mpinzani anasubiri mwisho na kisha tu kuhamisha sehemu yake.

Kwa kuongeza, tunashughulika na mali yenye tete sana, kwa hiyo wakati huu kiwango kinaweza kubadilika kwa kiasi kikubwa, na kubadilisha hali si rahisi tena.

Usiri

Ubadilishanaji wowote huacha mabaki kwenye blockchains zote mbili. Mtazamaji makini anaweza kutambua heshi sawa katika mikataba mahiri na kufanya hitimisho la kimantiki kwamba shughuli imekamilika, ambayo hitimisho nyingi zinaweza kutolewa kutoka kiwango cha ubadilishaji hadi ushuru.

Wakati soko la hisa linajua juu ya mambo yako, haifurahishi sana; wakati kila mtu anajua kuihusu, haifurahishi mara mbili.

Usability

Hatua kali ya blockchain kwa ujumla na ether haswa. Wacha tuone ni ishara gani muuzaji na mnunuzi atalazimika kufanya.

Kutoka kwa mtazamo wa muuzaji, kila kitu ni rahisi: unahitaji tu kuhamisha Bitcoin kwa anwani ya p2sh. Na ether, kila kitu ni gumu zaidi.

mkatabaWacha tuangalie mkataba uliowekwa wastani juu ya Github kwa ubadilishaji:

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

Attention! Usitumie hii na mikataba mingine kutoka kwa makala katika uzalishaji, imeandikwa kwa madhumuni ya maandamano tu. Hasa huyu.

  • Bob lazima aite mbinu ya mkataba wa ishara approve, kutoa ufikiaji wa mkataba wa kubadilishana kwa ishara zake
  • Bob huunda ubadilishaji na mkataba kwa kutumia mbinu transferFrom hupeleka tokeni za mtumaji kwenye anwani yako
  • Alice ndani withdraw inafichua siri na mkataba unaita transfer

Pochi nyingi na ubadilishanaji wa crypto hauungi mkono approve ishara, na kwa sababu nzuri.

Watumiaji wenyewe mara nyingi hufanya makosa na kuhamisha ishara tu kwa mkataba, baada ya hapo ishara zinapotea tu. Maoni kuhusu Etherscan yamejaa maombolezo kutoka kwa wenye bahati mbaya.

Na ili kuita mkataba, unahitaji kulipa tume katika ETH, ambayo ina maana washiriki wote wanapaswa kuhifadhi juu yake kabla ya kuanza shughuli, na watu wachache wanataka kufanya hivyo.

Mmiliki wa gesi

Mahali pazuri pa kuanzia ni kuondoa hundi ya mtumaji inapowezekana na kudhani kuwa tuna mtu anayesumbuliwa na kandarasi za kupiga simu kwa gesi ya ziada kwa wote wanaokuja.

Mkataba ulioboreshwa

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

Uwili wa ufunguo wa mkataba na EIP 712

Kama tunavyojua, anwani hewani inaweza kuwa mkataba, au inaweza kuwa somo, yaani, ufunguo.
Kazi kuu ya ufunguo ni kusaini baadhi ya ujumbe.

Tunaweza kutumia Bob-mkataba kama mtumaji, ambayo hufanya pasi zote muhimu, baada ya kuangalia kwanza sahihi ya ufunguo wa Bob.

Sasa, mtu yeyote anaweza kufadhili tume ya mshiriki, lakini ni yule tu anayejua ufunguo ndiye anayefanya uamuzi.

Bob-mkataba

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 ina kiwango cha kufanya kazi na saini za miundo tata ya data 712, unaweza kusoma zaidi juu yake ndani Blogi ya mkoba ya Metamask

Gawanya na kushinda

Mara nyingi hali ya kudukuliwa kwa mkataba wa Ethereum inaonekana kama hii:

  • Mshiriki huweka fedha kwenye mkataba
  • Kisha anachukua fedha
  • Kitu kinaendelea vibaya
  • Mshambulizi huchukua pesa tena na tena

Tukirudi kwa mfano wetu wa kwanza, hitilafu fulani hutokea ikiwa kitendawili ni seti tupu ya baiti.

Jinsi ya kuiba milioniUnda ubadilishaji na heshi 0x66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925
Hii ni sha256 kutoka 0x0000000000000000000000000000000000000000000000000000000000000000
Tunahamisha siri na kuchukua ishara zetu
Tunasambaza tena na kuchukua ya mtu mwingine, yote kwa sababu 0 = 0

Kwa kuunda mkataba tofauti kwa kila biashara, tunaweza kutenga kandarasi katika kiwango cha EVM.

Lakini sio yote: sasa kila shughuli ina anwani yake mwenyewe, ambayo unaweza kuhamisha ishara kutoka kwa mkoba wowote au kubadilishana.

Mikataba iliyotelekezwa na kuunda2

Lakini sasa kwa kila shughuli tunapaswa kuunda mkataba na kusubiri mnunuzi kuhamisha kazi "crypto-finding" huko. Katika mpango wa "mikataba asubuhi, pesa jioni", daima kuna hatari kwamba mnunuzi ataanguka, na ether tayari imetumika kuunda mkataba.

Je, inawezekana kuifanya ili uwe na pesa asubuhi na bytes jioni?

Watengenezaji katika uma ngumu wa Constantinople 1014 imeongeza maagizo ya create2, ambayo huunda mkataba mpya katika anwani bainifu

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

Je!

  • anwani - anwani ya mkataba wa kiwanda
  • chumvi - nambari fulani, maana ambayo tutajifunza katika mfululizo unaofuata
  • init_code - bytecode ya mkataba na vigezo vya mjenzi.

KiwandaMaagizo hufanya kazi tu kupitia kusanyiko, kwa hivyo kiwanda kinaonekana cha kutisha kidogo:

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

Msimbo wako wa mkataba unaweza kupatikana kwa kutumia 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);

Kutokana na usaidizi mdogo katika uimara, gesi kwa ajili ya mkataba inaweza kuhesabiwa kimakosa kutokana na baadhi ya hila za etha.

Ni nzuri sana kwamba katika tukio la uhaba wa gesi, mkataba unaanguka na kosa la ndani, bila kutoa taarifa kwamba hapakuwa na gesi ya kutosha, kama unavyoweza kutarajia.

Sasa tunaweza kuhamisha ishara kwa mikataba bila kuunda mapema, na mpaka tuzichapishe kwenye mtandao, hakuna mtu atakayekisia nini hasa mkataba hufanya.

Kunguru hatang'oa jicho la kunguru

Ni wazi kuwa mchambuzi wa kweli hasa aliyepata vitega uchumi vizuri katika vita dhidi ya maadui wa utawala huo kwa ubadhirifu wa pesa hatazuiliwa na hila za kitoto hizo, na baada ya kuunda mkataba bado ataona hashi.

Jinsi ya kuzuia heshi isionyeshwe?

Tunahamisha ubadilishanaji yenyewe kwa offchain: washiriki hubadilishana saini kwa uhamisho wa mkataba wa kubadilishana, na kisha siri inafichuliwa kwa faragha.

Hatua kwa hatua"multisigs" mbili zinaundwa ambazo pesa zinaweza kutolewa ikiwa Alice na Bob wana saini.

Ili kuzuia mshiriki yeyote kutoka nje ya mtandao kuwa msiba, tutaongeza muda mzuri wa kuisha.

Alice na Bob hufanya amana kwa sambamba

  • Alice anakisia siri na kumpa Bob heshi ya siri na saini ya muamala ambayo huhamisha bitcoins kwenye anwani ya kubadilishana.
  • Bob anampa Alice saini ya kuondoa tokeni kwenye mkataba wa kubadilishana na heshi iliyofichwa.
  • Alice anamwambia Bob siri.

Kwa wakati huu, maelewano yanakuja: Alice na Bob wanaweza kukamilisha mpango huo wakati wowote. Katika mazingira hayo ya kirafiki, wanaweza kubadilishana saini ili kutoa pesa kwa anwani za mwisho.

Kwa mtazamaji wa nje, inaonekana kama pesa zilipitia mkataba wa 2-of-2 multisig.

Mpango huu pia unaruhusu pande zote mbili kufanya amana kwa wakati mmoja, kwani siri imefunuliwa baada ya uthibitisho wote.

Level 2

Kwa kuwa tunaweza kutoa pesa kwa anwani moja na tusichapishe muamala wa kati, hakuna kitu kinachotuzuia kutoa pesa kwa anwani kadhaa na kufanya idadi isiyo na kikomo ya miamala ya kati. Sio kwamba hii ni seti ya lazima kwa kubadilishana, lakini mara tu unapoanza kukusanya ubadilishaji, ni vigumu kuacha.

Sasa Alice na Bob wataweza kugeuka kwa nguvu zao zote. Kwa mfano, hesabu bei ya wastani kiotomatiki kwa kubadilishana satoshi kwa sekunde moja, au unganisha moja kwa moja mtengenezaji wa soko na mpokeaji wa ukwasi.

Hatua kwa hatua

  • Muuzaji hufanya siri na kumpa mnunuzi heshi ya siri na saini ya muamala ambapo sehemu ya fedha huhamishiwa kwa anwani ya kubadilishana ya p2sh, na iliyobaki inarejeshwa kwa anwani ya muuzaji.
  • Mnunuzi atawasilisha saini inayoruhusu tokeni za kubadilishana na mabadiliko kutumwa kwa anwani ya mpokeaji.
  • Muuzaji anafichua siri
  • Historia inajirudia kwa siri mpya, na pamoja na kubadilishana na kubadilisha, uondoaji wa kile kilichonunuliwa hapo awali kwa anwani ya mnunuzi na tayari kulipwa kwa anwani ya muuzaji huongezwa.

Sasa tuna ufikiaji wa biashara ya kasi ya p2p, jambo kuu ni kuweka wimbo wa wakati na kufunga mpango kabla ya kuisha.

Hata hivyo, kwa kurekebisha kandarasi zetu kidogo, tunaweza kuzipa chaneli zetu hali ya kutokufa, ambayo itafanya iwe rahisi kwetu kujenga mtandao.

Lakini tutazungumza juu ya hili katika sehemu inayofuata.

Chanzo: mapenzi.com

Nunua upangishaji wa kuaminika wa tovuti zilizo na ulinzi wa DDoS, seva za VPS VDS 🔥 Nunua upangishaji wa tovuti unaoaminika kwa ulinzi wa DDoS, seva za VPS VDS | ProHoster