श्वेतपत्र · 08
सुरक्षा फ़्रेमवर्क
A-REX Core संदर्भ कार्यान्वयन का थ्रेट मॉडल, इनवेरिएंट, एक्सेस नियंत्रण, हुक विश्वास सीमा, प्रवर्तन कुंजी प्रबंधन, अपग्रेड सुरक्षा और ऑडिट स्थिति।
सुरक्षा स्थिति एक अनुच्छेद में
संदर्भ टोकन में एक चोक पॉइंट (_update), एक निश्चित मूल्यांकन क्रम, पूरे हुक अनुक्रम के चारों ओर रीएंट्रेंसी लॉक, भूमिका-आधारित प्राधिकार जो कभी बैलेंस से व्युत्पन्न नहीं होता, ERC-7201 स्टोरेज, और एक छोटी सतह है: ERC-1155 के अतिरिक्त आठ बाह्य स्थिति-परिवर्तनकारी फ़ंक्शन। सबसे शक्तिशाली क्षमताएँ — फ़्रीज़ करना, बलपूर्वक ट्रांसफ़र, हुक प्रशासन, अपग्रेड — अलग-अलग भूमिकाएँ हैं जो मल्टीसिग और टाइमलॉक के लिए अभिप्रेत हैं, और उनका प्रत्येक उपयोग एक इवेंट है।
इनवेरिएंट
| इनवेरिएंट | किसके द्वारा लागू | किसके द्वारा परखा गया |
|---|---|---|
totalSupply(id) id के बैलेंस के योग के बराबर है | OpenZeppelin ERC1155Supply; transform _update के माध्यम से पहले बर्न करता है, फिर मिंट | वंशावली टेस्ट (विभाजन, मर्ज, प्रसंस्करण) |
status == 255 अंतिम है | setBatchStatus ARexInvalidStatusTransition के साथ रिवर्ट करता है | स्टेटस टेस्ट |
| रिटायर किया गया बैच मिंट या ट्रांसफ़र नहीं किया जा सकता, केवल बर्न किया जा सकता है | _update | रिटायर-बैच टेस्ट |
धारक-आरंभित गतिविधियों के लिए amount ≤ balance − frozen | _update; forcedTransfer frozen को balance − amount तक घटाता है | फ़्रीज़/बलपूर्वक ट्रांसफ़र टेस्ट |
| कोई हुक बैलेंस बदलने वाले फ़ंक्शन में पुनः प्रवेश नहीं कर सकता | जाँच से पहले सेट किया गया और सूचनाओं के बाद साफ़ किया गया स्टोरेज लॉक | ReentrantHook टेस्ट |
| हुक का मूल्यांकन पंजीकरण क्रम में होता है; हटाने पर क्रम बना रहता है | removeHook में ऐरे शिफ़्ट | क्रम टेस्ट |
| अस्वीकृत ऑपरेशन कोई बैलेंस नहीं बदलता और कोई ट्रांसफ़र इमिट नहीं करता | जाँच super._update से पहले चलती हैं | अस्वीकृति टेस्ट (निष्पादित गणना अपरिवर्तित) |
| प्राधिकार कभी बैलेंस से व्युत्पन्न नहीं होता | प्रत्येक स्थिति-परिवर्तनकारी फ़ंक्शन भूमिका-गेटेड या ERC-1155-अनुमोदन-गेटेड है | "टोकन धारण करने से कुछ नहीं मिलता" टेस्ट |
canTransfer == (transferCheck == 0) | canTransfer को वैसे ही परिभाषित किया गया है | अनुरूपता टेस्ट |
थ्रेट मॉडल
कर्ता और क्षमताएँ
| कर्ता | कर सकता है | नहीं कर सकता |
|---|---|---|
| धारक | अनफ़्रीज़्ड इकाइयाँ पात्र प्राप्तकर्ताओं को ट्रांसफ़र करना; बर्न करना; समान कमोडिटी/इकाई को संरक्षित मात्रा के साथ री-बैच करना | स्टेटस बदलना, मिंट करना, किसी अन्य कमोडिटी में प्रसंस्करण करना, फ़्रीज़ की गई इकाइयाँ हिलाना |
| अनुमोदित ऑपरेटर | अनुमोदन देने वाले खाते के लिए धारक के समान | ऐसा कुछ भी जो धारक नहीं कर सकता |
ISSUER_ROLE | बैच बनाना | दूसरों के टोकन ट्रांसफ़र करना |
TRANSFORMER_ROLE | अपने पास रखे या अनुमोदित टोकन के प्रसंस्करण ट्रांसफ़ॉर्म | बिना अनुमोदन के टोकन ट्रांसफ़ॉर्म करना |
STATUS_ROLE | स्टेटस बदलना (रिटायर करना सहित), मेटाडेटा अपडेट करना | टोकन ट्रांसफ़र करना |
ENFORCER_ROLE | कोई भी राशि फ़्रीज़ करना; कोई भी ट्रांसफ़र बलपूर्वक करना | हुक को बायपास करना (वे OP_FORCED_TRANSFER के साथ चलते हैं) |
HOOK_ADMIN_ROLE | हुक जोड़ना/हटाना | बैलेंस सीधे बदलना |
PAUSER_ROLE | बलपूर्वक ट्रांसफ़र को छोड़कर सब कुछ रोकना | — |
UPGRADER_ROLE | इम्प्लीमेंटेशन बदलना | — (यह पूर्ण शक्ति है; कुंजी प्रबंधन देखें) |
| हुक कॉन्ट्रैक्ट | ऑपरेशन अस्वीकार करना; उनका अवलोकन करना; पात्रता का उत्तर देना | पुनः प्रवेश करना; बैलेंस बदलना |
परिदृश्य
दुर्भावनापूर्ण या बग-युक्त हुक (सेवा-अवरोध)। जो हुक हमेशा अस्वीकार करता है वह टोकन के सभी ट्रांसफ़र ब्लॉक कर देता है; जो check में रिवर्ट करता है वह भी यही करता है। शमन: HOOK_ADMIN_ROLE किसी भी समय कोई भी हुक हटा सकती है (क्रम बना रहता है); जाँच के दौरान PAUSER_ROLE सब कुछ रोक सकती है; बलपूर्वक ट्रांसफ़र फिर भी चलते हैं, इसलिए प्रवर्तन खोता नहीं। पंजीकरण ERC-165 समर्थन और गैर-शून्य फ़्लैग सत्यापित करता है, और EOA को अस्वीकार करता है। अनुशंसा: पंजीकरण से पहले हुक का ऑडिट करें; संख्या कम रखें; प्रशासक को टाइमलॉक के पीछे रखें ताकि हुक परिवर्तन प्रभावी होने से पहले दिखाई दें।
हुक रीएंट्रेंसी। हुक की onExecuted वापस safeTransferFrom को कॉल करती है। शमन: लॉक; कॉल ARexReentrantCall के साथ रिवर्ट होती है। ध्यान दें कि ERC-1155 का रिसीवर कॉलबैक (onERC1155Received) लॉक जारी होने के बाद चलता है, जैसा हर ERC-1155 टोकन में होता है; तब तक टोकन की स्थिति अंतिम होती है।
समझौता-ग्रस्त प्रवर्तन कुंजी। जिसके पास ENFORCER_ROLE है वह कोई भी टोकन ट्रांसफ़र कर सकता है। शमन: प्रलेखित प्रक्रिया (न्यायालय आदेश, गिरवी करार, प्रतिबंध सूचना) के साथ मल्टीसिग; प्रत्येक कार्रवाई ForcedTransfer/Frozen इमिट करती है; हुक ट्रांसफ़र डेटा में आदेश संदर्भ अनिवार्य कर सकते हैं (OP_FORCED_TRANSFER हुक से मुक्त नहीं है)। गैर-तात्कालिक प्रवर्तन के लिए टाइमलॉक पर विचार करें।
समझौता-ग्रस्त अपग्रेडर। पूर्ण समझौता। शमन: मल्टीसिग के साथ टाइमलॉक; CI में OpenZeppelin अपग्रेड वैलिडेशन; लेआउट संबंधी दुर्घटनाओं से बचने के लिए ERC-7201 स्टोरेज।
स्टेटस का दुरुपयोग। STATUS_ROLE दूसरों द्वारा धारित बैच को रिटायर कर सकती है। यह जान-बूझकर है — वेयरहाउस, निरीक्षक या नियामक द्वारा किसी लॉट को अनुपयुक्त घोषित करना — और धारकों को इसका प्रकटीकरण किया जाना अनिवार्य है। शमन: किसी जवाबदेह संस्था को सौंपें; प्रत्येक परिवर्तन कारण सहित एक इवेंट है।
जारीकर्ता धोखाधड़ी। ISSUER_ROLE ऐसा बैच बना सकती है जो भौतिक रूप से मौजूद नहीं है। टोकन इसे रोक नहीं सकता; वह इसे जिम्मेदार पक्ष से जोड़े जाने योग्य बनाता है (issuer, originRef, metadataHash) और AttestationHook के माध्यम से ट्रांसफ़र से पहले स्वतंत्र पक्षों (वेयरहाउस, निरीक्षक, रजिस्ट्री) के एटेस्टेशन की अपेक्षा करने देता है।
मेटाडेटा प्रतिस्थापन। setBatchMetadata हैश और URI बदलती है। शमन: भूमिका-गेटेड; BatchMetadataUpdated और URI इवेंट इतिहास रखते हैं; पुराने दस्तावेज़ पुराने हैश के विरुद्ध सत्यापन-योग्य रहते हैं।
transferCheck की फ़्रंट-रनिंग। प्री-फ़्लाइट जाँच ट्रांज़ैक्शन के निष्पादन से पहले पुरानी पड़ सकती है (हुक की स्थिति बदल जाती है)। ट्रांज़ैक्शन पुनः मूल्यांकन करता है; सबसे बुरी स्थिति सटीक कोड के साथ रिवर्ट है।
हुक के माध्यम से गैस ग्रीफ़िंग। प्रत्येक हुक प्रति चरण प्रति प्रभावित आईडी एक बाह्य कॉल जोड़ता है। असीमित लूप वाला हुक ट्रांसफ़र को वहन-योग्य नहीं रहने देता। शमन: हुक लेखन नियम (सीमाबद्ध check), पंजीकरण से पहले समीक्षा।
अपग्रेड-योग्य हुक पर विश्वास। प्रॉक्सी के पीछे डिप्लॉय किया गया हुक टोकन में किसी बदलाव के बिना ट्रांसफ़र नीति बदल सकता है। शमन: हुक प्रशासक कुंजियों को HOOK_ADMIN_ROLE जितनी ही सावधानी से संभालें; प्रोडक्शन के लिए इम्यूटेबल हुक को प्राथमिकता दें।
एक्सेस नियंत्रण मॉडल
OpenZeppelin AccessControl जिसमें टोकन पर आठ भूमिकाएँ और एटेस्टेशन रजिस्ट्री पर एक है; DEFAULT_ADMIN_ROLE उन सभी का प्रशासन करती है। अनुशंसित प्रोडक्शन लेआउट:
| भूमिका | धारक |
|---|---|
DEFAULT_ADMIN_ROLE, UPGRADER_ROLE, HOOK_ADMIN_ROLE | टाइमलॉक के पीछे गवर्नेंस मल्टीसिग |
ENFORCER_ROLE | प्रवर्तन मल्टीसिग (अनुपालन + विधिक) |
PAUSER_ROLE | घटना-प्रतिक्रिया कुंजी (तेज़) |
ISSUER_ROLE, STATUS_ROLE, TRANSFORMER_ROLE | न्यूनतम विशेषाधिकार वाली परिचालन सेवाएँ, रोटेट की गई |
ATTEST_ADMIN_ROLE | प्रमाणन प्राधिकरण या प्लेटफ़ॉर्म |
initialize सुविधा के लिए सब कुछ एक प्रशासक को दे देता है; डिप्लॉयमेंट चेकलिस्ट प्रोडक्शन से पहले पुनर्वितरण अनिवार्य करती है।
प्रवर्तन और पॉज़ शब्दार्थ
- पॉज़ मिंट, ट्रांसफ़र, बर्न और ट्रांसफ़ॉर्म को ब्लॉक करता है; यह बलपूर्वक ट्रांसफ़र को ब्लॉक नहीं करता, ताकि किसी घटना के दौरान वैध आदेश निष्पादित किया जा सके।
- बलपूर्वक ट्रांसफ़र
canSend/canReceiveऔर फ़्रीज़-बैलेंस जाँच को छोड़ देते हैं, फ़्रीज़ की गई राशि को शेष मात्रा तक घटा देते हैं, और फिर भी हुक कोOP_FORCED_TRANSFERके साथ चलाते हैं। संदर्भ हुक उस ऑपरेशन के लिएOKलौटाते हैं; प्रवर्तन को शासित करने वाला हुकdataमें आदेश संदर्भ अनिवार्य कर सकता है। - फ़्रीज़ बैलेंस से अधिक हो सकता है (ERC-7943), ताकि ग्रहणाधिकार भावी जमा को भी कवर कर सके।
अपग्रेड सुरक्षा
- UUPS;
_authorizeUpgradeUPGRADER_ROLEद्वारा गेटेड। - ERC-7201 नेमस्पेस्ड स्टोरेज स्ट्रक्ट; केवल-जोड़ने योग्य।
- OpenZeppelin अपग्रेड प्लगइन वैलिडेशन टेस्ट में चलते हैं और किसी भी अपग्रेड ट्रांज़ैक्शन से पहले CI में चलने चाहिए।
- प्रति-फ़ाइल
optimizer.runs = 1सेटिंग इम्प्लीमेंटेशन को EIP-170 के भीतर रखती है; इसे सीमा से ऊपर धकेलने वाला परिवर्तन कंपाइल समय पर चेतावनी के साथ और डिप्लॉयमेंट पर रिवर्ट के साथ विफल होता है।
डिपेंडेंसी और बिल्ड सुरक्षा
- OpenZeppelin Contracts और Contracts-Upgradeable 5.3.0 पर पिन किए गए; लॉकफ़ाइल कमिट की गई; CI
npm ciका उपयोग करता है। - Solidity 0.8.22, viaIR, EVM
paris(ट्रांज़िएंट स्टोरेज पर कोई निर्भरता नहीं, उन चेन पर भी डिप्लॉय-योग्य जिन्होंने Cancun नहीं अपनाया)। - कोई बाह्य लाइब्रेरी लिंक नहीं की गई; UUPS प्रॉक्सी के बाहर कोई delegatecall नहीं।
ऑडिट स्थिति
- संदर्भ कार्यान्वयन, हुक और एक्सटेंशन पर 46 टेस्ट ऊपर के प्रत्येक इनवेरिएंट को कवर करते हैं, जिनमें एक सीडेड यादृच्छिक इनवेरिएंट रन शामिल है।
- गैस और आकार रिपॉज़िटरी की स्क्रिप्टों द्वारा मापे जाते हैं।
ARexToken,ARexAttestationsऔर संदर्भ हुक का तृतीय-पक्ष ऑडिट प्रोडक्शन एंकर के लिए और ERC सबमिट करने के लिए एक घोषित पूर्व-शर्त है (देखें भावी विकास)।- पाइपलाइन इनवेरिएंट का औपचारिक सत्यापन रोडमैप पर है; इनवेरिएंट इतने छोटे हैं कि उन्हें प्रॉपर्टी के रूप में कहा जा सकता है।
शेष जोखिम जिन्हें मानक दूर नहीं करता
- लॉट का भौतिक अस्तित्व और गुणवत्ता एटेस्ट की जाती है, सिद्ध नहीं; टोकन दावों को जिम्मेदार पक्ष से जोड़े जाने योग्य बनाता है, सत्य नहीं।
- ऑफ़-चेन मेटाडेटा की उपलब्धता चुने गए स्टोरेज पर निर्भर करती है; हैश अखंडता की गारंटी देता है, उपलब्धता की नहीं।
- हुक और मॉड्यूल गवर्नेंस उतना ही अच्छा है जितनी उसे नियंत्रित करने वाली कुंजियाँ।