การตีความการให้กู้ยืม DeFi อย่างครอบคลุม: องค์ประกอบ สูตร กรณีการใช้งาน
ชื่อเดิม: "แนวคิดการให้ยืม DeFi ตอนที่ 1: การให้ยืมและการยืม"
ผู้เขียนต้นฉบับ: Tal
การรวบรวมต้นฉบับ: Kxp, Blockbeats
ชื่อระดับแรก
สระว่ายน้ำให้ยืม
ในการเงินแบบดั้งเดิม (หรือ TradFi) การยืมและการให้ยืมจะประสานงานโดยสถาบันการเงินบุคคลที่สาม สถาบันการเงินเหล่านี้ได้รับมอบหมายหน้าที่หลักสองประการ ได้แก่ การบังคับจ่ายดอกเบี้ยจากผู้กู้ไปยังผู้ให้กู้ และการประเมินและป้องกันบุคคลที่เห็นว่าไม่น่าเชื่อถือจากการมีส่วนร่วมในกิจกรรมเหล่านี้
ในทางตรงกันข้าม ในระบบการเงินแบบกระจายอำนาจ (หรือ DeFi) ผู้กู้และผู้ให้กู้บุคคลที่สามไม่น่าเชื่อถือ การขาดความไว้วางใจนี้เป็นแรงบันดาลใจในการออกแบบนวัตกรรมเพื่ออำนวยความสะดวกในกระบวนการให้ยืมบนเครือข่าย
กลุ่มการให้ยืมเป็นสัญญาที่ชาญฉลาด ผู้ใช้โปรโตคอล DeFi สามารถฝากสินทรัพย์ (ปกติคือ ERC 20 Token) โดยมีวัตถุประสงค์เพื่อใช้สัญญาเพื่อให้ยืมสินทรัพย์ที่ฝากไว้ ผู้ใช้รายอื่นสามารถโต้ตอบกับกลุ่มการให้ยืมและเพลิดเพลินกับเงินกู้ทันที เช่น จำนองทรัพย์สินในกลุ่มเพื่อยืม
กลุ่มการให้ยืมมีข้อได้เปรียบที่สำคัญบางประการเมื่อพูดถึงการให้กู้ยืมเมื่อเทียบกับวิธีการทางการเงินแบบดั้งเดิม เช่น:
· ใน DeFi การให้ยืมไม่ได้ถูกจำกัดโดยความพร้อมของเงินทุนเงินกู้และจำนวนการยืมแบบ 1:1 แต่จะมีการรวมเงินทุนจากผู้ใช้โปรโตคอลทั้งหมดเข้าด้วยกัน สร้างคลังโทเค็นที่ใหญ่พอที่จะตอบสนองความต้องการในการให้ยืมได้ทันที
· DeFi ไม่ต้องการแผนการชำระคืน เงินกู้จะดำเนินการกับหลักประกันที่ฝากไว้ก่อนหน้านี้ และผู้ใช้สามารถเลือกที่จะชำระคืนเมื่อใดก็ได้
ณ จุดนี้ คุณอาจจะคิดว่า “ทำไมฉันถึงต้องการยืมสินทรัพย์ในสัญญาให้ยืม ถ้าฉันต้องวางสินทรัพย์ที่มีมูลค่าเท่ากัน (หรือแม้แต่มูลค่าสูงเกินไป) เป็นหลักประกัน ฉันไม่ควรขายหลักประกันแล้วซื้อ ทรัพย์สินที่ยืม?”
ในความเป็นจริง โปรโตคอลการให้ยืม DeFi นี้ดูเหมือนว่าจะอนุญาตเฉพาะสินเชื่อที่มีหลักประกันเต็มจำนวน (หรือมีหลักประกันเกิน) เท่านั้น ซึ่งเป็นการเปิดประตูสู่วิธี "ธุรกรรม" ที่น่าสนใจ นั่นคือ เลเวอเรจ
สมมติว่าคุณเป็นขาขึ้นใน WBTC และค่อนข้างแน่ใจว่ามูลค่าของมันจะพุ่งสูงขึ้น! คุณสามารถฝาก WBTC จำนวนหนึ่ง (มูลค่า $1,000) บนโปรโตคอลการให้ยืมที่คุณชื่นชอบ จากนั้นใช้สิ่งนั้นเพื่อยืมเหรียญ Stablecoins (เช่น USDC) จากนั้นใช้ Stablecoins เหล่านั้นเพื่อซื้อ WBTC เพิ่มในบางการแลกเปลี่ยน (สำหรับสถานการณ์ของเรา ให้ถือว่าครึ่งหนึ่งของเงินฝากเริ่มต้นของคุณ ซึ่งเท่ากับ 500 ดอลลาร์) ในกรณีนี้ การเปิดรับ WBTC ของคุณมีมูลค่า $1,500 และเงินฝากเริ่มต้นของคุณคือ $1,000 เท่านั้น
แต่ถ้าคุณฝากเงิน $500 ของหลักประกัน WBTC ลงในโปรโตคอลเพื่อยืม USDC เพิ่มล่ะ กระบวนการนี้เรียกว่าการใช้ประโยชน์มากเกินไป และคุณสามารถทำต่อไปได้จนกว่าคุณจะเกินความสามารถในการกู้ยืม และนโยบายของโปรโตคอลจะป้องกันไม่ให้คุณทำเช่นนั้น
ชื่อระดับแรก
โทเค็นแบ่งปัน
เช่นเดียวกับการเงินแบบดั้งเดิม ผู้ใช้ที่ฝากสินทรัพย์ลงในแหล่งเงินกู้จะได้รับแรงจูงใจให้รักษาเงินทุนไว้ในระยะยาวและรับดอกเบี้ยจากเงินฝาก ดอกเบี้ยจะเกิดขึ้นเมื่อเวลาผ่านไป คำนวณเป็นเปอร์เซ็นต์ของเงินฝากของผู้ใช้ในโปรโตคอล และอ้างสิทธิ์โดยผู้ใช้ที่ฝากเงินที่เกี่ยวข้อง ยิ่งผู้ใช้เก็บทรัพย์สินไว้ในกลุ่มเงินกู้นานเท่าใด พวกเขาก็ยิ่งได้รับดอกเบี้ยมากขึ้นเท่านั้น
โปรโตคอลติดตามการแบ่งปันของผู้ใช้แต่ละคนในกลุ่มอย่างไร เมื่อผู้ใช้ฝากสินทรัพย์ลงในพูล "ส่วนแบ่ง" ของพวกเขาจะเจือจางส่วนแบ่งของผู้ใช้ทั้งหมด และโปรโตคอลจะสะท้อนสิ่งนี้ตามนั้น อย่างไรก็ตาม แทนที่จะติดตามและอัปเดตการแชร์พูลของผู้ใช้แต่ละคนโดยตรง โปรโตคอลจะจัดการเฉพาะการเปลี่ยนแปลงการแชร์ของผู้ฝาก โดยไม่ต้องอัปเดตการแชร์ของผู้ใช้รายอื่นทุกครั้งที่ถอนหรือฝาก
คุณอาจคิดว่าข้อตกลงนี้อนุญาตให้คุณกินเค้กได้ แต่มันไม่ได้มีลักษณะเช่นนี้:
โปรโตคอลจัดการการจ่ายดอกเบี้ยโดยการสร้างและการเผาไหม้โทเค็น ERC 20 ซึ่งเราเรียกว่า "โทเค็นหุ้น" ซึ่งเป็นตัวแทนของหุ้นของผู้ให้กู้ (หรือสัดส่วนของสินทรัพย์เงินฝาก) ในกลุ่มเงินกู้ การออกแบบ "โทเค็นหุ้น" นี้จะปรับโดยอัตโนมัติสำหรับการลดสัดส่วนการแบ่งปันของ "ผู้ถือหุ้น" อื่น ๆ เพื่อสะท้อนถึงการสร้างและการเผาไหม้ของ "หุ้น" ตามสัดส่วนการฝากหรือถอนสินทรัพย์อ้างอิง
ชื่อระดับแรก
aToken: "Share Token" ของ AAVE
aToken เป็นโทเค็นการสร้างผลตอบแทนของ AAVE ซึ่งสร้างและเผาโดยกลุ่มการให้ยืมเมื่อทำการฝากและถอนสินทรัพย์
aToken เป็นโทเค็นที่คล้ายกับ ERC 20 ที่รวมเข้ากับโปรโตคอล AAVE ดังนั้นแต่ละตลาดที่แตกต่างกันที่ผู้ใช้สามารถเข้าถึงได้ (หลักประกันเงินฝาก) จึงมี aToken ที่สอดคล้องกัน
หากเราดูสัญญากลุ่มการให้ยืมของ AAVE เราจะเห็นการดำเนินการพื้นฐานที่เกิดขึ้นเมื่อผู้ใช้ฝากสินทรัพย์ลงในกลุ่ม:
เราจะเห็นว่า aToken ที่สอดคล้องกับตลาดที่ผู้ใช้ฝากจะถูกเรียกในฟังก์ชัน "minting"
เราจะเห็นว่าจำนวนจริงที่จะผลิตคือ:

ดังที่แสดงในภาพด้านบน ในตัวอย่างนี้ ผู้ใช้เข้าร่วมตลาดที่ได้รับดอกเบี้ยจากเงินฝากก่อนหน้านี้แล้ว สมการข้างต้นช่วยให้เราเข้าใจสิ่งนี้ เนื่องจากมันแสดงวิธีบัญชีสำหรับการคงค้างของดอกเบี้ยสำหรับผู้ใช้ทั้งหมดโดยใช้ดัชนีสากล ซึ่งได้รับการปรับปรุงในการดำเนินการต่างๆ (การฝาก การถอน ฯลฯ)
เมื่อผู้ใช้ถอนสินทรัพย์อ้างอิง ดัชนีสภาพคล่องจะถูกใช้เป็นตัวคูณในการคำนวณจำนวนโทเค็นที่เป็นหนี้ในการทำธุรกรรม
นี่คือข้อมูลโค้ดที่เกี่ยวข้องจากสัญญากลุ่มการให้ยืม:
ที่นี่ฟังก์ชั่นความสมดุลของสัญญา aToken ค่อนข้างแปลก ท้ายที่สุด เราเพิ่งพบว่าจำนวนของการสร้าง aToken ไม่เหมือนกับจำนวนของสินทรัพย์อ้างอิงที่ฝาก การเรียก IAToken(aToken).balanceOf(ที่อยู่(ผู้ใช้)) ให้ผลจำนวนสินทรัพย์อ้างอิงที่ผู้ใช้กำลังจะถอน (ดังที่แสดงที่ด้านล่างของฟังก์ชัน) อย่างไร เหตุผลมีดังนี้:
· เมื่อผู้ใช้ถอนทรัพย์สินของพวกเขา aTokens จะถูกทำลาย aTokens ที่ถูกเผาไหม้เหล่านี้จะรักษาจำนวนรวมของ aTokens ที่ผู้ใช้รายอื่นเป็นเจ้าของตามสัดส่วนของส่วนแบ่งหลังจากที่สินทรัพย์ของผู้ใช้ถูกถอนออกไป
· อัตราตลาดสำหรับผู้ใช้ในการถอนเงินจะได้รับการอัปเดตด้วยการถอนแต่ละครั้ง

ดังที่เราได้กล่าวไว้ก่อนหน้านี้ aToken เป็นโทเค็นที่คล้ายกับ ERC 20 เราเน้นย้ำว่าโทเค็นเหล่านี้ "คล้ายคลึง" กับโทเค็น ERC 20 เนื่องจากฟังก์ชัน BalanceOf มีคุณสมบัติเฉพาะตัว ในโทเค็น ERC 20 ปกติ ฟังก์ชัน balanceOf จะส่งคืนจำนวนโทเค็นที่แอดเดรสเป็นเจ้าของ
เนื่องจาก aToken แสดงถึงส่วนแบ่งของพูล แทนที่จะเป็นมูลค่าทันที ฟังก์ชัน balanceOf ของ aToken จึงส่งคืนจำนวน Base Token ที่โปรโตคอลเป็นหนี้ผู้ใช้เพื่อชดเชยเงินฝากของพวกเขา
ที่นี่ ฟังก์ชัน BalanceOf จะแทนที่ฟังก์ชัน BalanceOf ในสัญญา aToken ที่สืบทอดมา ด้วยเหตุนี้ ตรรกะ BalanceOf ในตรรกะตัวอย่างนี้จึงถูกดำเนินการแทนการค้นหาแผนที่ปกติ (สืบทอดมา) ของปริมาณโทเค็นของผู้ใช้
จำนวนโทเค็นที่กล่าวถึงข้างต้นจะถูกคูณด้วยผลลัพธ์ของ getReserveNormalizedIncome ซึ่งดำเนินการตามตรรกะต่อไปนี้:
เราสามารถระบุสาขาได้ที่นี่:
· หากข้อมูลสงวนได้รับการอัปเดตในบล็อคนี้: ส่งคืนค่าดัชนีสภาพคล่องของตลาดนี้ตามที่ได้รับการอัปเดต
· มิฉะนั้น เราต้องดูว่าเกิดอะไรขึ้นในการคำนวณ LinearInterest เพื่อหาโฟลว์ถัดไป
currentLiquidityRate และ lastUpdateTimestamp จากออบเจกต์ ReserveData ของตลาดปัจจุบันจะถูกส่งผ่านไปยังฟังก์ชันนี้ และผลลัพธ์ของฟังก์ชันคือ:

เรามาแยกย่อยส่วนประกอบของสมการนี้เพื่อทำความเข้าใจส่วนสำคัญของค่า Interest เชิงเส้นกันดีกว่า:
currentLiquidityRate: คิดว่านี่เป็นอัตราดอกเบี้ยต่อปี (APY) สำหรับตลาดของเรา
block_{timestamp} - lastUpdatedTimestamp: เวลาที่ผ่านไปตั้งแต่อัปเดตครั้งล่าสุด
หมายเหตุ: เนื่องจากเราเลือกสาขาที่สองใน getNormalizedIncome จึงรับประกันได้ว่ามูลค่าจะเป็นบวก ณ จุดนี้
ดังนั้นเราจึงสามารถคิดว่ากลไกการสะสมดอกเบี้ยนี้เป็นกลไกการทบต้นดอกเบี้ยอย่างง่าย ซึ่งจะทบต้นในแต่ละบล็อก ตอนนี้เราได้กำหนดจำนวนดอกเบี้ยที่จะเกิดขึ้นสำหรับผู้ใช้แล้ว เราเพียงแค่ต้องคูณค่านั้นด้วยดัชนีสภาพคล่อง จากนั้นทำการคูณรายได้ปกติของผู้ใช้ในฟังก์ชัน balanceOf:

ตอนนี้เราเข้าใจตรรกะเบื้องหลัง aToken แล้ว เรายังคงต้องไขปริศนาเกี่ยวกับวิธีการทำงานของดัชนีสภาพคล่อง
ในตัวอย่างด้านล่าง ดัชนีสภาพคล่องสามารถกำหนดเป็นดอกเบี้ยที่สะสมโดยเงินสำรองในช่วงระยะเวลาหนึ่ง:
เรียกคืนตัวแปร liquidityRate ที่กล่าวถึงก่อนหน้านี้ - ตอนนี้เราจะหารือเกี่ยวกับการใช้ตัวแปรนี้ในการคำนวณดัชนีสภาพคล่อง ดอกเบี้ยจะเกิดขึ้นก็ต่อเมื่ออัตราสภาพคล่องมากกว่า 0 กล่าวคือ ดอกเบี้ยจะเกิดขึ้นก็ต่อเมื่อมี APY ใดๆ ในตลาดนั้น มันสมเหตุสมผล
มาทบทวนกันอย่างรวดเร็วในการคำนวณเชิงเส้นความสนใจในการดำเนินการ:
ตรรกะข้างต้นสามารถแปลงเป็นสมการต่อไปนี้:

ตามที่เราเห็นในสัญญา DefaultReserveInterestRateStrategy.sol อัตราสภาพคล่องถูกกำหนดด้วยวิธีต่อไปนี้:
ดังนั้นจึงสามารถเขียนเป็น:

อัตราการกู้ยืมโดยรวม (overallBorrowRate) ถูกกำหนดเป็น:
เราสามารถเขียนสิ่งนี้เป็น:


อัตราการใช้ (utilizationRate) สามารถกำหนดเป็น:

เมื่อกำหนดการใช้ประโยชน์ จะง่ายกว่าในการพิจารณาอัตราส่วนระหว่างสภาพคล่องในการสำรอง (สภาพคล่องที่ให้ยืมในปัจจุบัน) และสภาพคล่องทั้งหมดในตลาด ซึ่งสามารถทำให้ง่ายขึ้นดังนี้:

ตอนนี้เราสามารถเขียนสมการสำหรับดัชนีสภาพคล่องโดยใช้คำจำกัดความทั้งสองนี้:

เนื่องจาก totalBorrows มีอยู่ทั้งตัวเศษและตัวส่วน เราจึงเขียนได้ดังนี้

ชื่อระดับแรก
cToken: Compound ของ "Share Token"
เรามาต่อกันที่ตัวอย่างโปรโตคอลการให้ยืมถัดไปของเรา นั่นคือ Compound
Compound จัดการการยืมและให้ยืมโดยใช้ "share tokens" ที่เรียกว่า cTokens โทเค็นนี้ใช้เพื่อบันทึกสินทรัพย์ทั้งหมดที่สามารถใช้สำหรับให้ผู้ใช้ยืมในโปรโตคอลแบบผสม
คล้ายกับที่เราพูดถึงใน AAVE V2 "โทเค็นการแบ่งปัน" ของ Compound นั้นถูกสร้างขึ้นและใช้เพื่อแลกสินทรัพย์อ้างอิง
Compound ใช้อัตราแลกเปลี่ยนที่คล้ายกับดัชนีสภาพคล่องของ AAVE V2 เพื่อกำหนดจำนวน cToken ที่ควรสร้าง อัตราแลกเปลี่ยนเป็นฟังก์ชันดังนี้:
ให้ฉันอธิบายคำศัพท์สำคัญที่นี่:
·totalCash: จำนวนโทเค็นพื้นฐาน ERC 20 ที่บัญชี cToken เป็นเจ้าของ
· totalBorrows: จำนวนโทเค็นพื้นฐาน ERC 20 ในตลาดที่ยืมโดยผู้ยืม
· totalReserves: โทเค็นพื้นฐาน ERC 20 จำนวนหนึ่งสงวนไว้ ซึ่งสามารถสกัดหรือถ่ายโอนผ่านการกำกับดูแล
· totalSupply: ฟังก์ชัน ERC 20 ที่คืนค่าการจัดหาทั้งหมดของ cToken
ด้วยพื้นหลังนี้ เราสามารถเขียนสมการอัตราแลกเปลี่ยนของสารประกอบ:

เมื่อผู้ใช้ฝากโทเค็น ERC 20 อัตราแลกเปลี่ยนจะกำหนดจำนวน cToken ที่จะได้รับผลตอบแทน:
ชื่อระดับแรก

eToken: "Share Token" ของออยเลอร์
เพื่อทำให้ความคล้ายคลึงกันระหว่างโปรโตคอลเหล่านี้แน่นแฟ้นยิ่งขึ้น ลองวิเคราะห์โปรโตคอลการให้ยืมอีกอันหนึ่ง ซึ่งก็คือออยเลอร์ และดูว่ามันจัดการกับการให้ยืมอย่างไร
ในตัวอย่างด้านล่าง ฟังก์ชันการฝากอนุญาตให้ผู้ใช้ฝากโทเค็น ERC 20 เพื่อแลกเปลี่ยนกับ eToken
อย่างที่เราเห็น internalAmount คือจำนวน eTokens ที่สร้างขึ้นสำหรับการโอนนี้
เป็นอีกครั้งที่มีการทับซ้อนโดยตรงกับชื่อและฟังก์ชัน exchangeRate ของสารประกอบ
ให้ฉันอธิบายพารามิเตอร์หลักที่ใช้ในการคำนวณอัตราแลกเปลี่ยน:
· poolSize: ในสัญญา ERC 20 โดยใช้สินทรัพย์อ้างอิง ผลลัพธ์ของการเรียกใช้ฟังก์ชัน balanceOf(address) กับที่อยู่ของสัญญารวม
· totalBorrows: จำนวนรวมของโทเค็นพื้นฐาน ERC 20 ที่ให้ยืมซึ่งไม่ได้อยู่ในกลุ่มในขณะนี้
· totalBalances: ยอดรวมของผู้ถือ eToken ทั้งหมด
สรุป
สรุป
เราได้ครอบคลุม 3 โปรโตคอลการให้ยืม:
· AAVE V2
· Compound
· Euler
เราได้ตรวจสอบวิธีการสร้าง “Share Tokens” และวิธีแลกเปลี่ยนเป็นสินทรัพย์เงินฝากผ่านแหล่งให้ยืม
สมการสามสมการที่เราเสนอสามารถลดลงเป็นสมการง่ายๆ:

โปรดจำไว้ว่าอัตราแลกเปลี่ยนสามารถกำหนดได้ด้วยวิธีใดก็ตามที่โปรโตคอลกำหนด อัตราแลกเปลี่ยนตามอำเภอใจเหล่านี้สามารถเพิ่มจำนวนโทเค็นที่สร้างเสร็จ (หากน้อยกว่า 1) และลดปริมาณหากมากกว่า 1
ใน AAVE V2 และ Compound เราได้เห็นความคล้ายคลึงกันบางประการกับตัวแปร someRate ใน Compound, someRate คือ:

สำหรับ AAVE V2 จะมีการกำหนด someRate ดังนี้:

ดัชนีสภาพคล่องถูกกำหนดเป็น:

แม้ว่าเราไม่สามารถสรุปอัตราแลกเปลี่ยนของแต่ละโปรโตคอลให้เป็นสูตรเดียวได้ แต่สำหรับ AAVE 2 และ Compound เราทราบดีว่าอัตราแลกเปลี่ยนเป็นฟังก์ชันของสภาพคล่องทั้งหมดในตลาด ย้อนกลับไปที่สมการของเรา เนื่องจาก TotalLiquidity คือจำนวนรวมของโทเค็นพื้นฐาน ERC 20 ในตลาด จากนั้นตัวเศษในการแสดงออกของอัตราแลกเปลี่ยนและตัวส่วนในการแสดงออกของอัตราสภาพคล่องจะทำงานเหมือนกัน
ลิงค์ต้นฉบับ


