EIP-1271: స్మార్ట్ కాంట్రాక్ట్ సంతకాలను చేయడం మరియు ధృవీకరించడం
EIP-1271 (opens in a new tab) ప్రమాణం స్మార్ట్ కాంట్రాక్ట్లను సంతకాలను ధృవీకరించడానికి అనుమతిస్తుంది.
ఈ ట్యుటోరియల్లో, మేము డిజిటల్ సంతకాలు, EIP-1271 యొక్క నేపథ్యం మరియు Safe (opens in a new tab) (గతంలో Gnosis Safe) ఉపయోగించే EIP-1271 యొక్క నిర్దిష్ట అమలు గురించి అవలోకనాన్ని అందిస్తాము. ఇవన్నీ కలిపి, మీ స్వంత కాంట్రాక్ట్లలో EIP-1271ని అమలు చేయడానికి ఒక ప్రారంభ బిందువుగా ఉపయోగపడతాయి.
సంతకం అంటే ఏమిటి?
ఈ సందర్భంలో, సంతకం (మరింత కచ్చితంగా చెప్పాలంటే, "డిజిటల్ సంతకం") అనేది ఒక సందేశం మరియు ఆ సందేశం ఒక నిర్దిష్ట వ్యక్తి/పంపినవారు/చిరునామా నుండి వచ్చిందని చెప్పడానికి ఒక రకమైన రుజువు.
ఉదాహరణకు, డిజిటల్ సంతకం ఈ విధంగా ఉండవచ్చు:
- సందేశం: "నేను నా ఎథీరియం వాలెట్తో ఈ వెబ్సైట్కి లాగిన్ అవ్వాలనుకుంటున్నాను."
- సంతకం చేసేవారు: నా చిరునామా
0x000… - రుజువు:
0x000…అయిన నేను, వాస్తవానికి ఈ మొత్తం సందేశాన్ని సృష్టించాను అనడానికి ఇక్కడ కొంత రుజువు ఉంది (ఇది సాధారణంగా గూఢలిపి శాస్త్రానికి సంబంధించినది).
డిజిటల్ సంతకంలో "సందేశం" మరియు "సంతకం" రెండూ ఉంటాయని గమనించడం ముఖ్యం.
ఎందుకు? ఉదాహరణకు, మీరు నాకు సంతకం చేయడానికి ఒక కాంట్రాక్ట్ను ఇచ్చి, ఆపై నేను సంతకం పేజీని కత్తిరించి, మిగిలిన కాంట్రాక్ట్ లేకుండా నా సంతకాలను మాత్రమే మీకు తిరిగి ఇస్తే, ఆ కాంట్రాక్ట్ చెల్లదు.
అదే విధంగా, అనుబంధిత సందేశం లేకుండా డిజిటల్ సంతకానికి ఎలాంటి అర్థం ఉండదు!
EIP-1271 ఎందుకు ఉనికిలో ఉంది?
ఎథీరియం-ఆధారిత బ్లాక్చెయిన్లలో ఉపయోగించడానికి డిజిటల్ సంతకాన్ని సృష్టించడానికి, మీకు సాధారణంగా మరెవరికీ తెలియని రహస్య ప్రైవేట్ కీ అవసరం. ఇదే మీ సంతకాన్ని మీదిగా చేస్తుంది (రహస్య కీ గురించి తెలియకుండా మరెవరూ అదే సంతకాన్ని సృష్టించలేరు).
మీ ఎథీరియం ఖాతా (అంటే, మీ బాహ్య-యాజమాన్య ఖాతా/EOA) దానికి అనుబంధించబడిన ప్రైవేట్ కీని కలిగి ఉంటుంది మరియు వెబ్సైట్ లేదా వికేంద్రీకృత అప్లికేషన్ (dapp) మిమ్మల్ని సంతకం అడిగినప్పుడు (ఉదా., "ఎథీరియంతో లాగిన్ అవ్వండి" కోసం) సాధారణంగా ఉపయోగించే ప్రైవేట్ కీ ఇదే.
ఒక యాప్ మీ ప్రైవేట్ కీ తెలియకుండానే (opens in a new tab) ethers.js వంటి థర్డ్-పార్టీ లైబ్రరీని ఉపయోగించి మీరు సృష్టించిన సంతకాన్ని ధృవీకరించగలదు (opens in a new tab) మరియు ఆ సంతకాన్ని సృష్టించింది మీరే అని నమ్మకంగా ఉండగలదు.
వాస్తవానికి, EOA డిజిటల్ సంతకాలు పబ్లిక్-కీ గూఢలిపి శాస్త్రాన్ని ఉపయోగిస్తాయి కాబట్టి, వాటిని ఆఫ్చైన్లో రూపొందించవచ్చు మరియు ధృవీకరించవచ్చు! గ్యాస్లెస్ DAO ఓటింగ్ ఈ విధంగానే పనిచేస్తుంది — ఆన్చైన్లో ఓట్లను సమర్పించడానికి బదులుగా, క్రిప్టోగ్రాఫిక్ లైబ్రరీలను ఉపయోగించి డిజిటల్ సంతకాలను ఆఫ్చైన్లో సృష్టించవచ్చు మరియు ధృవీకరించవచ్చు.
EOA ఖాతాలు ప్రైవేట్ కీని కలిగి ఉన్నప్పటికీ, స్మార్ట్ కాంట్రాక్ట్ ఖాతాలకు ఎలాంటి ప్రైవేట్ లేదా రహస్య కీ ఉండదు (కాబట్టి "ఎథీరియంతో లాగిన్ అవ్వండి" మొదలైనవి స్మార్ట్ కాంట్రాక్ట్ ఖాతాలతో స్థానికంగా పనిచేయలేవు).
EIP-1271 పరిష్కరించడానికి లక్ష్యంగా పెట్టుకున్న సమస్య: స్మార్ట్ కాంట్రాక్ట్ సంతకంలో చేర్చడానికి దానికి ఎలాంటి "రహస్యం" లేకపోతే, ఆ స్మార్ట్ కాంట్రాక్ట్ సంతకం చెల్లుబాటు అవుతుందని మనం ఎలా చెప్పగలం?
EIP-1271 ఎలా పనిచేస్తుంది?
సందేశాలపై సంతకం చేయడానికి ఉపయోగపడే ప్రైవేట్ కీలు స్మార్ట్ కాంట్రాక్ట్లకు ఉండవు. కాబట్టి సంతకం ప్రామాణికమైనదో కాదో మనం ఎలా చెప్పగలం?
సరే, ఒక ఆలోచన ఏమిటంటే, సంతకం ప్రామాణికమైనదో కాదో మనం స్మార్ట్ కాంట్రాక్ట్ను అడగవచ్చు!
EIP-1271 ఏమి చేస్తుందంటే, ఇచ్చిన సంతకం చెల్లుబాటు అవుతుందో లేదో స్మార్ట్ కాంట్రాక్ట్ను "అడగడం" అనే ఈ ఆలోచనను ప్రామాణీకరిస్తుంది.
EIP-1271ని అమలు చేసే కాంట్రాక్ట్ తప్పనిసరిగా isValidSignature అనే ఫంక్షన్ను కలిగి ఉండాలి, ఇది సందేశం మరియు సంతకాన్ని తీసుకుంటుంది. ఆ తర్వాత కాంట్రాక్ట్ కొంత ధృవీకరణ లాజిక్ను రన్ చేయగలదు (స్పెక్ ఇక్కడ నిర్దిష్టంగా దేనినీ అమలు చేయదు) ఆపై సంతకం చెల్లుబాటు అవుతుందో లేదో సూచించే విలువను అందిస్తుంది.
isValidSignature చెల్లుబాటు అయ్యే ఫలితాన్ని అందిస్తే, అది దాదాపుగా కాంట్రాక్ట్ "అవును, నేను ఈ సంతకం + సందేశాన్ని ఆమోదిస్తున్నాను!" అని చెప్పినట్లే.
ఇంటర్ఫేస్
EIP-1271 స్పెక్స్లోని ఖచ్చితమైన ఇంటర్ఫేస్ ఇక్కడ ఉంది (మేము దిగువన _hash పారామీటర్ గురించి మాట్లాడతాము, కానీ ప్రస్తుతానికి, దానిని ధృవీకరించబడుతున్న సందేశంగా భావించండి):
pragma solidity ^0.5.0;
contract ERC1271 {
// bytes4(keccak256("isValidSignature(bytes32,bytes)")
bytes4 constant internal MAGICVALUE = 0x1626ba7e;
/**
* @dev అందించిన హాష్ కోసం అందించిన సంతకం చెల్లుబాటు అవుతుందో లేదో తిరిగి ఇవ్వాలి
* @param _hash సంతకం చేయాల్సిన డేటా యొక్క హాష్
* @param _signature _hash తో అనుబంధించబడిన సంతకం బైట్ అర్రే
*
* ఫంక్షన్ పాస్ అయినప్పుడు తప్పనిసరిగా bytes4 మ్యాజిక్ విలువ 0x1626ba7e ని తిరిగి ఇవ్వాలి.
* స్టేట్ను మార్చకూడదు (solc < 0.5 కోసం STATICCALL, solc > 0.5 కోసం view మాడిఫైయర్ని ఉపయోగించి)
* బాహ్య కాల్లను తప్పనిసరిగా అనుమతించాలి
*/
function isValidSignature(
bytes32 _hash,
bytes memory _signature)
public
view
returns (bytes4 magicValue);
}
ఉదాహరణ EIP-1271 అమలు: Safe
కాంట్రాక్ట్లు isValidSignatureని అనేక విధాలుగా అమలు చేయగలవు — స్పెక్ ఖచ్చితమైన అమలు గురించి పెద్దగా చెప్పదు.
EIP-1271ని అమలు చేసే ఒక ముఖ్యమైన కాంట్రాక్ట్ Safe (గతంలో Gnosis Safe).
Safe కోడ్లో, సంతకాలను రెండు విధాలుగా (opens in a new tab) సృష్టించడానికి మరియు ధృవీకరించడానికి వీలుగా isValidSignature అమలు చేయబడింది (opens in a new tab):
- ఆన్చైన్ సందేశాలు
- సృష్టి: ఒక సేఫ్ యజమాని సందేశంపై "సంతకం" చేయడానికి కొత్త సేఫ్ లావాదేవీని సృష్టిస్తాడు, సందేశాన్ని లావాదేవీలోకి డేటాగా పంపుతాడు. మల్టీసిగ్ థ్రెషోల్డ్ను చేరుకోవడానికి తగినంత మంది యజమానులు లావాదేవీపై సంతకం చేసిన తర్వాత, లావాదేవీ ప్రసారం చేయబడుతుంది మరియు రన్ అవుతుంది. లావాదేవీలో, (
signMessage(bytes calldata _data)) అనే సేఫ్ ఫంక్షన్ ఉంది, ఇది "ఆమోదించబడిన" సందేశాల జాబితాకు సందేశాన్ని జోడిస్తుంది. - ధృవీకరణ: Safe కాంట్రాక్ట్పై
isValidSignatureని కాల్ చేయండి మరియు ధృవీకరించాల్సిన సందేశాన్ని సందేశ పారామీటర్గా మరియు సంతకం పారామీటర్ కోసం ఖాళీ విలువను (opens in a new tab) (అంటే,0x) పంపండి. సంతకం పారామీటర్ ఖాళీగా ఉందని Safe చూస్తుంది మరియు సంతకాన్ని క్రిప్టోగ్రాఫిక్గా ధృవీకరించడానికి బదులుగా, సందేశం "ఆమోదించబడిన" సందేశాల జాబితాలో ఉందో లేదో తనిఖీ చేయడానికి ముందుకు వెళ్లాలని దానికి తెలుస్తుంది.
- సృష్టి: ఒక సేఫ్ యజమాని సందేశంపై "సంతకం" చేయడానికి కొత్త సేఫ్ లావాదేవీని సృష్టిస్తాడు, సందేశాన్ని లావాదేవీలోకి డేటాగా పంపుతాడు. మల్టీసిగ్ థ్రెషోల్డ్ను చేరుకోవడానికి తగినంత మంది యజమానులు లావాదేవీపై సంతకం చేసిన తర్వాత, లావాదేవీ ప్రసారం చేయబడుతుంది మరియు రన్ అవుతుంది. లావాదేవీలో, (
- ఆఫ్చైన్ సందేశాలు:
- సృష్టి: ఒక సేఫ్ యజమాని ఆఫ్చైన్లో సందేశాన్ని సృష్టిస్తాడు, ఆపై మల్టీసిగ్ ఆమోద థ్రెషోల్డ్ను అధిగమించడానికి తగినన్ని సంతకాలు వచ్చే వరకు ఇతర సేఫ్ యజమానులచే ఒక్కొక్కరితో విడివిడిగా సందేశంపై సంతకం చేయిస్తాడు.
- ధృవీకరణ:
isValidSignatureని కాల్ చేయండి. సందేశ పారామీటర్లో, ధృవీకరించాల్సిన సందేశాన్ని పంపండి. సంతకం పారామీటర్లో, ప్రతి సేఫ్ యజమాని యొక్క వ్యక్తిగత సంతకాలను ఒకదాని తర్వాత ఒకటిగా కలిపి పంపండి. థ్రెషోల్డ్ను చేరుకోవడానికి తగినన్ని సంతకాలు ఉన్నాయా మరియు ప్రతి సంతకం చెల్లుబాటు అవుతుందా అని Safe తనిఖీ చేస్తుంది. అలా అయితే, ఇది విజయవంతమైన సంతకం ధృవీకరణను సూచించే విలువను అందిస్తుంది.
_hash పారామీటర్ అంటే ఏమిటి? మొత్తం సందేశాన్ని ఎందుకు పంపకూడదు?
EIP-1271 ఇంటర్ఫేస్ (opens in a new tab)లోని isValidSignature ఫంక్షన్ సందేశాన్ని తీసుకోదని, దానికి బదులుగా _hash పారామీటర్ను తీసుకుంటుందని మీరు గమనించి ఉండవచ్చు. దీని అర్థం ఏమిటంటే, పూర్తి ఏకపక్ష-పొడవు సందేశాన్ని isValidSignatureకి పంపడానికి బదులుగా, మేము సందేశం యొక్క 32-బైట్ హాష్ను (సాధారణంగా keccak256) పంపుతాము.
కాల్ డేటా యొక్క ప్రతి బైట్ — అంటే, స్మార్ట్ కాంట్రాక్ట్ ఫంక్షన్కు పంపబడిన ఫంక్షన్ పారామీటర్ డేటా — 16 గ్యాస్ ఖర్చవుతుంది (సున్నా బైట్ అయితే 4 గ్యాస్) (opens in a new tab), కాబట్టి సందేశం పొడవుగా ఉంటే ఇది చాలా గ్యాస్ను ఆదా చేస్తుంది.
మునుపటి EIP-1271 లక్షణాలు
వాడుకలో ఉన్న EIP-1271 స్పెసిఫికేషన్లు ఉన్నాయి, ఇవి bytes రకం (స్థిర-పొడవు bytes32కి బదులుగా ఏకపక్ష-పొడవు) మొదటి పారామీటర్ మరియు పారామీటర్ పేరు messageతో isValidSignature ఫంక్షన్ను కలిగి ఉంటాయి. ఇది EIP-1271 ప్రమాణం యొక్క పాత వెర్షన్ (opens in a new tab).
నా స్వంత కాంట్రాక్ట్లలో EIP-1271ని ఎలా అమలు చేయాలి?
స్పెక్ ఇక్కడ చాలా ఓపెన్-ఎండెడ్గా ఉంది. Safe అమలులో కొన్ని మంచి ఆలోచనలు ఉన్నాయి:
- మీరు కాంట్రాక్ట్ యొక్క "యజమాని" నుండి వచ్చే EOA సంతకాలను చెల్లుబాటు అయ్యేవిగా పరిగణించవచ్చు.
- మీరు ఆమోదించబడిన సందేశాల జాబితాను నిల్వ చేయవచ్చు మరియు వాటిని మాత్రమే చెల్లుబాటు అయ్యేవిగా పరిగణించవచ్చు.
చివరికి, కాంట్రాక్ట్ డెవలపర్గా ఇది మీ ఇష్టం!
ముగింపు
EIP-1271 (opens in a new tab) అనేది స్మార్ట్ కాంట్రాక్ట్లను సంతకాలను ధృవీకరించడానికి అనుమతించే బహుముఖ ప్రమాణం. ఇది స్మార్ట్ కాంట్రాక్ట్లు EOAల వలె మరింతగా పనిచేయడానికి తలుపులు తెరుస్తుంది — ఉదాహరణకు స్మార్ట్ కాంట్రాక్ట్లతో పనిచేయడానికి "ఎథీరియంతో లాగిన్ అవ్వండి" కోసం ఒక మార్గాన్ని అందించడం — మరియు దీనిని అనేక విధాలుగా అమలు చేయవచ్చు (Safe పరిగణించదగిన ఒక ముఖ్యమైన, ఆసక్తికరమైన అమలును కలిగి ఉంది).