EIP-1271: Kusaini na Kuthibitisha Sahihi za Mkataba-erevu
Kiwango cha EIP-1271 (opens in a new tab) huruhusu mikataba-erevu kuthibitisha sahihi.
Katika mafunzo haya, tunatoa muhtasari wa sahihi za dijitali, historia ya EIP-1271, na utekelezaji mahususi wa EIP-1271 unaotumiwa na Safe (opens in a new tab) (awali Gnosis Safe). Kwa pamoja, hii inaweza kutumika kama sehemu ya kuanzia kwa ajili ya kutekeleza EIP-1271 katika mikataba yako mwenyewe.
Sahihi ni nini?
Katika muktadha huu, sahihi (kwa usahihi zaidi, "sahihi ya dijitali") ni ujumbe pamoja na aina fulani ya uthibitisho kwamba ujumbe umetoka kwa mtu/mtumaji/anwani maalum.
Kwa mfano, sahihi ya dijitali inaweza kuonekana hivi:
- Ujumbe: “Nataka kuingia katika tovuti hii kwa kutumia mkoba wangu wa Ethereum.”
- Msaini: Anwani yangu ni
0x000… - Uthibitisho: Huu ni uthibitisho kwamba mimi,
0x000…, ndiye niliyeunda ujumbe huu wote (kwa kawaida hii ni kitu cha kroptografia).
Ni muhimu kuzingatia kwamba sahihi ya dijitali inajumuisha "ujumbe" na "sahihi".
Kwa nini? Kwa mfano, kama ungenipa mkataba wa kusaini, kisha nikakata ukurasa wa sahihi na kukurejeshea sahihi zangu pekee bila sehemu nyingine ya mkataba, mkataba huo haungekuwa halali.
Vivyo hivyo, sahihi ya dijitali haina maana yoyote bila ujumbe unaohusiana nayo!
Kwa nini EIP-1271 ipo?
Ili kuunda sahihi ya dijitali kwa matumizi katika blockchain zinazotumia Ethereum, kwa ujumla unahitaji ufunguo binafsi wa siri ambao hakuna mtu mwingine anayejua. Hiki ndicho kinachofanya sahihi yako kuwa yako (hakuna mtu mwingine anayeweza kuunda sahihi sawa bila kujua ufunguo wa siri).
Akaunti yako ya Ethereum (yaani, akaunti yako inayomilikiwa nje/EOA) ina ufunguo binafsi unaohusishwa nayo, na huu ndio ufunguo binafsi unaotumiwa kwa kawaida wakati tovuti au mfumo mtawanyo wa kimamlaka inakuomba sahihi (k.m., kwa ajili ya “Ingia na Ethereum”).
Programu inaweza kuthibitisha sahihi (opens in a new tab) unayounda kwa kutumia maktaba ya wahusika wengine kama ethers.js bila kujua ufunguo wako binafsi (opens in a new tab) na kuwa na uhakika kwamba wewe ndiye uliyeunda sahihi hiyo.
Kwa hakika, kwa sababu sahihi za dijitali za EOA hutumia kroptografia ya ufunguo wa umma, zinaweza kuundwa na kuthibitishwa nje ya mnyororo! Hivi ndivyo upigaji kura wa DAO bila gesi unavyofanya kazi — badala ya kuwasilisha kura kwenye mnyororo, sahihi za dijitali zinaweza kuundwa na kuthibitishwa nje ya mnyororo kwa kutumia maktaba za kroptografia.
Ingawa akaunti za EOA zina ufunguo binafsi, akaunti za mkataba-erevu hazina aina yoyote ya ufunguo binafsi au wa siri (hivyo "Ingia na Ethereum", n.k. haziwezi kufanya kazi moja kwa moja na akaunti za mkataba-erevu).
Tatizo ambalo EIP-1271 inalenga kutatua: tunawezaje kujua kuwa sahihi ya mkataba-erevu ni halali ikiwa mkataba-erevu hauna “siri” inayoweza kujumuishwa katika sahihi?
EIP-1271 inafanyaje kazi?
Mikataba-erevu haina funguo binafsi zinazoweza kutumika kusaini jumbe. Basi tunawezaje kujua ikiwa sahihi ni halisi?
Naam, wazo moja ni kwamba tunaweza tu kuuliza mkataba-erevu ikiwa sahihi ni halisi!
Anachofanya EIP-1271 ni kusawazisha wazo hili la “kuuliza” mkataba-erevu ikiwa sahihi fulani ni halali.
Mkataba unaotekeleza EIP-1271 lazima uwe na kitendakazi kiitwacho isValidSignature ambacho huchukua ujumbe na sahihi. Mkataba unaweza kisha kuendesha mantiki fulani ya uthibitishaji (vipimo havishurutishi kitu chochote maalum hapa) kisha kurudisha thamani inayoonyesha kama sahihi ni halali au la.
Ikiwa isValidSignature inarudisha matokeo halali, hiyo ni sawa na mkataba kusema “ndiyo, naidhinisha sahihi + ujumbe huu!”
Kiolesura
Huu hapa ni muundo kamili katika vipimo vya EIP-1271 (tutazungumzia kigezo cha _hash hapo chini, lakini kwa sasa, fikiria kama ni ujumbe unaothibitishwa):
1pragma solidity ^0.5.0;23contract ERC1271 {45 // bytes4(keccak256("isValidSignature(bytes32,bytes)")6 bytes4 constant internal MAGICVALUE = 0x1626ba7e;78 /**9 * @dev Inapaswa kurudisha iwapo sahihi iliyotolewa ni halali kwa hashi iliyotolewa10 * @param _hash Hashi ya data itakayosainiwa11 * @param _signature Safu ya baiti za Sahihi inayohusishwa na _hash12 *13 * LAZIMA irudishe thamani ya uchawi ya bytes4 0x1626ba7e wakati kitendakazi kinafaulu.14 * LAZIMA ISIBADILISHE hali (kwa kutumia STATICCALL kwa solc < 0.5, kirekebishaji cha mwonekano kwa solc > 0.5)15 * LAZIMA iruhusu wito wa nje16 */17 function isValidSignature(18 bytes32 _hash,19 bytes memory _signature)20 public21 view22 returns (bytes4 magicValue);23}Onyesha yoteMfano wa Utekelezaji wa EIP-1271: Safe
Mikataba inaweza kutekeleza isValidSignature kwa njia nyingi — vipimo havisemi mengi kuhusu utekelezaji kamili.
Mkataba mmoja mashuhuri unaotekeleza EIP-1271 ni Safe (awali Gnosis Safe).
Katika msimbo wa Safe, isValidSignature imetekelezwa (opens in a new tab) ili sahihi ziweze kuundwa na kuthibitishwa kwa njia mbili (opens in a new tab):
- Ujumbe wa kwenye mnyororo
- Uundaji: mmiliki wa safe huunda muamala mpya wa safe ili “kusaini” ujumbe, akipitisha ujumbe kama data kwenye muamala. Mara tu wamiliki wa kutosha wanaposaini muamala kufikia kizingiti cha multisig, muamala hutangazwa na kuendeshwa. Katika muamala, kuna kitendakazi cha safe kiitwacho (
signMessage(bytes calldata _data)) ambacho huongeza ujumbe kwenye orodha ya jumbe “zilizoidhinishwa”. - Uthibitishaji: ita
isValidSignaturekwenye mkataba wa Safe, na kupitisha ujumbe wa kuthibitisha kama kigezo cha ujumbe na thamani tupu kwa kigezo cha sahihi (opens in a new tab) (yaani,0x). Safe itaona kuwa kigezo cha sahihi ni tupu na badala ya kuthibitisha sahihi kwa njia ya kroptografia, itajua kuendelea na kuangalia ikiwa ujumbe upo kwenye orodha ya jumbe “zilizoidhinishwa”.
- Uundaji: mmiliki wa safe huunda muamala mpya wa safe ili “kusaini” ujumbe, akipitisha ujumbe kama data kwenye muamala. Mara tu wamiliki wa kutosha wanaposaini muamala kufikia kizingiti cha multisig, muamala hutangazwa na kuendeshwa. Katika muamala, kuna kitendakazi cha safe kiitwacho (
- Jumbe za nje ya mnyororo:
- Uundaji: mmiliki wa safe huunda ujumbe nje ya mnyororo, kisha anawapata wamiliki wengine wa safe kusaini ujumbe huo kila mmoja kivyake hadi kuwe na sahihi za kutosha kuvuka kizingiti cha idhini ya multisig.
- Uthibitishaji: ita
isValidSignature. Katika kigezo cha ujumbe, pitisha ujumbe wa kuthibitishwa. Katika kigezo cha sahihi, pitisha sahihi za kila mmiliki wa safe zikiwa zimeunganishwa pamoja, moja baada ya nyingine. Safe itaangalia kuwa kuna sahihi za kutosha kufikia kizingiti na kwamba kila sahihi ni halali. Ikiwa ndivyo, itarudisha thamani inayoonyesha uthibitishaji uliofaulu wa sahihi.
Kigezo cha _hash ni nini hasa? Kwa nini usipitishe ujumbe wote?
Huenda umegundua kwamba kitendakazi cha isValidSignature katika muundo wa EIP-1271 (opens in a new tab) hakichukui ujumbe wenyewe, bali kigezo cha _hash. Hii inamaanisha kuwa badala ya kupitisha ujumbe kamili wa urefu wowote kwa isValidSignature, badala yake tunapitisha hashi ya baiti 32 ya ujumbe (kwa ujumla keccak256).
Kila baiti ya calldata — yaani, data ya kigezo cha kitendakazi inayopitishwa kwa kitendakazi cha mkataba-erevu — hugharimu gesi 16 (gesi 4 ikiwa ni baiti ya sifuri) (opens in a new tab), hivyo hii inaweza kuokoa gesi nyingi ikiwa ujumbe ni mrefu.
Vipimo vya Awali vya EIP-1271
Kuna vipimo vya EIP-1271 vinavyotumika ambavyo vina kitendakazi cha isValidSignature chenye kigezo cha kwanza cha aina ya bytes (urefu wowote, badala ya urefu usiobadilika wa bytes32) na jina la kigezo message. Hili ni toleo la zamani (opens in a new tab) la kiwango cha EIP-1271.
EIP-1271 inapaswa kutekelezwa vipi katika mikataba yangu mwenyewe?
Vipimo havina masharti mengi hapa. Utekelezaji wa Safe una mawazo mazuri:
- Unaweza kuzingatia sahihi za EOA kutoka kwa "mmiliki" wa mkataba kuwa halali.
- Unaweza kuhifadhi orodha ya jumbe zilizoidhinishwa na kuzingatia hizo tu kuwa halali.
Mwishowe, ni juu yako kama msanidi programu wa mkataba!
Hitimisho
EIP-1271 (opens in a new tab) ni kiwango chenye matumizi mengi kinachoruhusu mikataba-erevu kuthibitisha sahihi. Inafungua mlango kwa mikataba-erevu kufanya kazi zaidi kama EOA — kwa mfano kutoa njia ya "Ingia na Ethereum" kufanya kazi na mikataba-erevu — na inaweza kutekelezwa kwa njia nyingi (Safe ikiwa na utekelezaji usio rahisi na wa kuvutia kuzingatia).
Ukurasa ulihaririwa mwisho: 16 Januari 2026