DeFi已經成為以太坊生態系統中一個非常流行的用例。在撰寫本文時,有超過10億美元被鎖定在DeFi協議中。以開放、分散式的替代方案取代現有金融產品的前景,迄今已證明非常受歡迎。
這些DeFi平臺之所以偉大,是因為它們易於開發人員使用。由於它們的開原始碼的性質,任何願意學習如何使用它們的人都可以使用它們。
其中最大的一個是Compound金融,已鎖定價值約為1.15億美元。任何人都可以向他們的協議提供資產,並從中賺取利息,但這個過程是如何工作的?
Compound金融是如何運作?
Compound目前在這九個市場發揮作用:BAT、DAI、ETH、REP、SAI、USDC、USDT、WBTC、ZRX。這些是你可以賺取利息的數字資產。
讓我們以DAI為例。你為Compound協議提供DAI後,該值將被協議鎖定,直到您決定撤回它為止。同時您同意該協議可以借出該代幣的價值,從而贏得整個資金池的利益,所以你可將其視為一個儲蓄帳戶。
存入其中後,您可以隨時檢視有多少DAI,當前利率是多少,借用其他資產等。
讓我們從技術上講講
從技術角度來看,這個供應過程是什麼樣的?
該協議將ERC20相容合約用於每個受支援的市場,它們稱為cToken。它們每個都有一個外部函式:mint,將提供的值傳送到該處。此函式接收提供的值,根據匯率計算等效數量的cToken,然後將其交換為提供的值。
例如,如果匯率為1:1,則提供一個ETH,那麼傳送方將會收到一個cETH。
與mint相反的是一個名為redeme的函式。當使用者想要提取其鎖定值時,使用所需數量的cETH代幣呼叫redeme將根據當前匯率返回ETH的等價值。
注意:還有一個redeemUnderlyinging函式,該函式使用基礎資產單位而不是cToken單位作為輸入。
編寫程式碼
先決條件:本演練假定您基本瞭解JavaScript、Web3和Ethereum智慧合約。
我們將按照以下步驟供應ETH並將其兌換成Compound金融:
1. 載入cETH合約。
2. 透過呼叫mint,鎖定ETH和接收cETH令牌來提供ETH。
3. 讀取我們的cETH餘額。
4. 讀取我們鎖定的ETH餘額。
5. 透過提供cETH從協議中兌換我們的ETH。
步驟1:載入cETH合約
每個令牌智慧合約在每個網路上都有一個不同的地址。cToken合約的ABI可從https://compound.finance/docs/abi/<network>/<cToken>公開獲得。
在我們的場景中,使用cETH和Kovan testnet,我們的URL是https://compound.finance/docs/abi/kovan/cETH。
在Compound的官方文件中可以找到每個網路上每個合約的地址。
使用web3,我們初始化合約例項如下:
constcEthInstance=newweb3.eth.Contract(cEthABI,addr);
步驟2:提供ETH
圖1顯示了使用web3的send函式mint cTokens是多麼容易:
cEthInstance.methods.mint().send({from:account,value:supplyValue}).once('transactionHash',(hash)=>{//Transactionhash}).on('confirmation',(number,receipt)=>{//Numberofconfirmations}).on('error',(error)=>{console.log(error);});
在此階段,我們的ETH將開始根據當前利率賺取利息(也可以使用數學公式來計算)。
步驟3:讀取我們的cETH餘額
由於cToken合約符合ERC20,因此它們提供了一個稱為balanceOf的函式。我們可以透過呼叫並向其傳遞帳戶地址來檢查我們的cETH餘額:
letb=awaitcEthInstance.methods.balanceOf(account).call();
第四步:讀取我們鎖定的ETH餘額
cToken合約還提供了一個名為balanceOfUnderlying的函式,該函式使用其擁有的cToken和當前匯率返回帳戶的基礎資產價值:
letu=awaitcEthInstance.methods.balanceOfUnderlying(account).call();
步驟5:從協議中贖回我們的ETH
將步驟4中的值u用作圖2中的redeemAmount,我們可以呼叫redeemUnderlying來贖回我們的以太幣:
cEthInstance.methods.redeemUnderlying(redeemAmount).send({from:account}).once('transactionHash',(hash)=>{//TransactionHash}).on('confirmation',(number,receipt)=>{//Numberofconfirmations}).on('error',(error)=>{console.log(error);})
或者我們可以使用redeem代替redeemUnderlying並將第3步中的值b作為redeemAmount傳遞。
結論
隨著DeFi變得越來越容易使用併為許多人所接受,在任何開發人員的工具箱中,學習如何與這些協議進行互動都是一種寶貴的工具。
-----------------------------------
原文作者:Alex Roan
原文連結:https://medium.com/better-programming/how-to-supply-assets-to-defi-protocols-using-javascript-df6c6d31e58d
譯者:鏈三豐
---------------------------------
相關文章閱讀:
區塊鏈研究實驗室|如何從DeFi協議獲取交易資料
區塊鏈研究實驗室|如何使用algotrade編寫比特幣的高階趨勢跟蹤策略