Compound V3 प्रोटोकॉल सेकंड के पैमाने पर ब्याज मापता है। Compound V3 का फ्रंटएंड इसे इंसानों के समझने में आसानी के लिए सालों के पैमाने तक बढ़ा देता है। जब हम Etherscan पर Compound V3 के लिए ब्याज दर पैरामीटर चेक करते हैं, तो हमें उधार लेने वालों (borrowers) के लिए निम्नलिखित पैरामीटर दिखाई देते हैं। अगले भाग में, हम Compound USDC Ethereum फ्रंटएंड पर जो देखते हैं, उसके साथ इन मापदंडों (parameters) की पुष्टि करेंगे।
यह लेख एक Solidity वॉकथ्रू है जो लाइन-दर-लाइन समझाता है कि कैसे यूटिलाइजेशन (utilization) ब्याज दरों को तय करता है।

पूर्व आवश्यकताएं
हम यह मानकर चल रहे हैं कि आपने crypto ब्याज दरें कैसे निर्धारित की जाती हैं पर हमारा लेख पहले ही पढ़ लिया है।
Compound V2 से प्रमुख बदलाव
Compound V2 (और Aave V3) में, सप्लाई ब्याज दरें (supply interest rates), उधार ब्याज दरों (borrow interest rates) को यूटिलाइजेशन से गुणा करने पर प्राप्त होती हैं। Compound V3 में, सप्लाई ब्याज दर सीधे तौर पर यूटिलाइजेशन का एक फंक्शन है और इसमें उधार दर शामिल नहीं होती है। उधार दर अपने स्वयं के ब्याज दर कर्व (curve) का पालन करती है।
ब्याज दर मॉडल के घटकों के लिए वेरिएबल के नाम
जिसे Aave V3 “optimal utilization” कहता है, उसे Compound V3 “kink” कहता है।
वेरिएबल borrowPerSecondInterestRateBase “intercept” है और वर्तमान में इसकी वैल्यू 317097919 है। इस भाग में हमारा लक्ष्य यह दिखाना है कि यह इंटरसेप्ट 1% APY के बराबर है। यानी, जब यूटिलाइजेशन शून्य होता है, तो उधारकर्ता 1% ब्याज का भुगतान करते हैं (वर्तमान मापदंडों के अनुसार, जिन्हें गवर्नेंस बदल सकता है)।

एक वर्ष में 31,536,000 सेकंड होते हैं (SECONDS_PER_YEAR), जिसमें लीप वर्ष और अन्य ग्रेगोरियन कैलेंडर की विचित्रताओं को शामिल नहीं किया गया है। यदि हम 31536000 (SECONDS_PER_YEAR) को 317097919 (borrowInterestRatePerSecond) से गुणा करते हैं तो हमें (लगभग) 0.01e18 (1e16) प्राप्त होता है। ऐसे पैमाने पर जहां 1 का मतलब 1e18 है, यह 1% उधार ब्याज दर के बराबर होता है।
वास्तव में, हम Ethereum पर USDC के लिए Compound मार्केट को देखकर इसकी पुष्टि कर सकते हैं।
यदि आप विभिन्न यूटिलाइजेशन स्तरों के लिए “Interest Rate Model” पर होवर करते हैं, तो आप देख सकते हैं कि अपेक्षित सप्लाई और उधार ब्याज क्या है। फ्रंटएंड आपको 0% यूटिलाइजेशन पर होवर करने की अनुमति नहीं देता है। हालाँकि, आप देख सकते हैं कि यूटिलाइजेशन में प्रत्येक 1% के बदलाव पर ब्याज में लगभग 0.03% का बदलाव होता है, इसलिए 0% यूटिलाइजेशन पर अपेक्षित ब्याज 1% होगा। नीचे दिया गया एनिमेशन देखें।
इसलिए, हम देख सकते हैं कि y इंटरसेप्ट वास्तव में 1% प्रति वर्ष है।
यह लिखते समय सच है और अन्य लेयर 2 पर अन्य बेस एसेट्स के लिए अलग हो सकता है।
ऊपर दिए गए एनिमेशन में, हम देखते हैं कि 0% यूटिलाइजेशन पर अपेक्षित “Earn APR” (जो ऋणदाता कमाते हैं) 0% है। यह उसी से मेल खाता है जो हम Etherscan पर देखते हैं। सप्लाई ब्याज दरों के लिए y-इंटरसेप्ट पैरामीटर को supplyPerSecondInterestRateBase कहा जाता है। चार्ट और Etherscan दोनों के अनुसार, इंटरसेप्ट शून्य है।

हम कैसे जानते हैं कि 0.01e18 का मतलब 1% है?
ऊपर दिए गए उदाहरण में, हमने अनुमान लगाया था कि 0.01e18 1% ब्याज के बराबर है। हम यह दिखाने के लिए कोडबेस के माध्यम से आगे बढ़ेंगे कि इसे कैसे प्राप्त किया जाता है। इसमें पांच चरण लगेंगे।
चरण 1: FACTOR_SCALE = 1e18 को समझना
CometCore.sol लाइन 57 में, हम देखते हैं कि Compound 1e18 के “FACTOR_SCALE” का उपयोग करता है (नीचे दिए गए स्क्रीनशॉट में नीला बॉक्स)।
हम SECONDS_PER_YEAR स्थिरांक (constant) भी देखते हैं (लाल बॉक्स) जिसका हमने ऊपर वाले भाग में उल्लेख किया था।

चरण 2: यूटिलाइजेशन को FACTOR_SCALE (1e18) में मापा जाता है
आइए Comet.sol में getUtilization() फंक्शन को देखते हैं।

हमें इस बिंदु पर यह नहीं पता है कि totalSupply_ और totalBorrow_ (नीला बॉक्स और हरा बॉक्स) किस स्केल का उपयोग कर रहे हैं, लेकिन यह मानना उचित है कि वे समान स्केल (डेसीमल की संख्या) का उपयोग कर रहे हैं और इस प्रकार उनके स्केल एक-दूसरे को कैंसिल कर देंगे (रिटर्न लाइन 464)। चूँकि अंश को FACTOR_SCALE से गुणा किया जाता है, (लाल बॉक्स) इसलिए यूटिलाइजेशन प्रतिशत को 18 डेसीमल के साथ मापा जाएगा।
अब आइए Etherscan पर getUtilization() की वर्तमान वैल्यू की तुलना उस वैल्यू से करें जो Compound ऐप दिखाता है

904869679838357231 का वर्तमान यूटिलाइजेशन जब FACTOR_SCALE से विभाजित किया जाता है (और दो डेसीमल तक राउंड ऑफ किया जाता है) तो यह 90.49% के बराबर होता है। यह वास्तव में 18 डेसीमल का उपयोग कर रहा है।
presentValueSupply और presentValueBorrow फंक्शन ऐसे शब्द नहीं हैं जिनसे हम उम्मीद करते हैं कि पाठक अभी परिचित होंगे — लेकिन इन्हें क्रमशः उधार देने के लिए उपलब्ध कुल पूंजी के डॉलर मूल्य और कुल उधार लिए गए डॉलर के रूप में सोचा जा सकता है।
चरण 3: Optimal utilization, या kink — [0-1e18] की रेंज में होते हैं
हमारे DeFi में ब्याज दरें लेख में, हमने बताया था कि लोकप्रिय ब्याज दर मॉडल पीसवाइज़ फंक्शन (piecewise functions) होते हैं जिनमें एक “optimal” यूटिलाइजेशन की धारणा होती है। Compound V3 इसे “kink” के रूप में संदर्भित करता है — जब ब्याज दरें अधिक तेज़ी से बढ़ने लगती हैं। ये दोनों अलग-अलग शब्द बिल्कुल एक ही कॉन्सेप्ट को दर्शाते हैं।
लिखते समय, Ethereum पर USDC के लिए ऑप्टिमल यूटिलाइजेशन 93% है जैसा कि नीचे दिखाया गया है।

चूंकि यूटिलाइजेशन को 18 डेसीमल फिक्स्ड पॉइंट नंबर के साथ मापा जाता है, इसलिए borrowKink और supplyKink को भी 18 डेसीमल फिक्स्ड पॉइंट नंबर के साथ मापा जाता है। ब्याज दर फंक्शन सीधे दोनों की तुलना करता है जैसा कि हम आगामी अगले भाग में देखेंगे।
चरण 4: mulFactor()
अन्य फिक्स्ड पॉइंट लाइब्रेरीज़ के mulDivDown से परिचित प्रोग्रामर्स को इस फंक्शन को समझने में आसानी होगी।
यह दो फिक्स्ड पॉइंट नंबर्स को लेता है और उन्हें गुणा करके एक और फिक्स्ड पॉइंट नंबर बनाता है। फंक्शन नीचे दिखाया गया है

चूँकि हम 18 डेसीमल वाले दो नंबरों को एक साथ गुणा कर रहे हैं, हमें 36-डेसीमल आउटपुट से बचने के लिए इसे FACTOR_SCALE से विभाजित करने की आवश्यकता है।
बस इस फंक्शन के बारे में ऐसे सोचें कि “यह दो 18 डेसीमल नंबरों को एक साथ गुणा करता है और उनके गुणनफल का प्रतिनिधित्व करने वाला 18 डेसीमल का नंबर लौटाता है।”
चरण 5: getSupplyRate() फैक्टर स्केल पर डेसीमल नंबर्स लौटाता है
अब हम यह देखने के लिए तैयार हैं कि Compound V3 ब्याज दरों को मापने के लिए 1e18 स्केल का उपयोग करता है।
Compound एक पीसवाइज़ लीनियर फंक्शन का उपयोग करता है जैसा कि हमने ब्याज दरों पर अपने लेख में चर्चा की थी। नीचे getSupplyRate() फंक्शन दिया गया है, जो ऋणदाताओं द्वारा अर्जित वर्तमान ब्याज दर लौटाता है जिसे वर्तमान यूटिलाइजेशन दर द्वारा निर्धारित किया जाता है। हम जानते हैं कि mulFactor(...) FACTOR_SCALE (18 डेसीमल) नंबर लौटाता है। इसलिए, हम जानते हैं कि supplyPerSecondInterestRate (पीला घेरा) भी एक FACTOR_SCALE नंबर होना चाहिए या हम मिसअलाइन्ड (misaligned) डेसीमल वाले नंबरों को जोड़ रहे होंगे। इसलिए, getSupplyRate() फंक्शन FACTOR_SCALE डेसीमल लौटाता है।

getBorrowRate फंक्शन भी इसी तरह व्यवहार करता है, इसलिए हम उसे यहाँ शामिल नहीं करेंगे।
कर्व के मापदंडों — इंटरसेप्ट, स्लोप, और किंक — इन सभी को गवर्नेंस द्वारा एडजस्ट किया जा सकता है।
काल्पनिक ब्याज दरों की गणना करना
यूटिलाइजेशन के एक फंक्शन के रूप में ब्याज दरों की गणना करने के लिए, यूज़र getUtilization() का उपयोग करके वर्तमान यूटिलाइजेशन प्राप्त कर सकते हैं और इसे getSupplyRate() तथा getBorrowRate() में डाल सकते हैं।
contract GetCurrentRatesComet {
function getRates(IComet comet)
external
returns (uint64, uint64) {
uint64 private constant SECONDS_PER_YEAR = 365 * 24 * 60 * 60;
uint256 utilization = comet.getUtilization();
// these are 18 decimal fixed point numbers
// measuring interest per second
uint64 supplyRate = comet.getSupplyRate();
uint64 borrowRate = comet.getBorrowRate();
// return them as APR
return (supplyRate * SECONDS_PER_YEAR,
borrowRate * SECONDS_PER_YEAR);
}
}
ब्याज दर एक्रुअल (Interest Rate Accrual)
हमने केवल यह दिखाया है कि Compound किसी एक निश्चित समय (snapshot) पर ब्याज दरों की गणना कैसे करता है। बाद के एक लेख में हम दिखाएंगे कि यह कैसे कंपाउंड होता है और ब्याज कैसे एक्रू (accrue) होता है।
सारांश
ब्याज दरों के लिए समय की इकाई सेकंड है। इन्हें 18 डेसीमल प्रिसिशन (precision) में मापा जाता है। यूटिलाइजेशन को भी 18 डेसीमल प्रिसिशन के साथ मापा जाता है।
RareSkills के साथ और जानें
अधिक जानने के लिए कृपया हमारा Blockchain Bootcamp देखें।
मूल रूप से 4 जनवरी, 2024 को प्रकाशित