用 Python 開發(fā) DeFi 去中心化借貸應用(下)

傳統(tǒng)的金融科技世界充滿了使用戶能夠制作復雜算法交易模型和系統(tǒng)的工具。而去中心化金融 (DeFi) 也同樣為用戶和開發(fā)人員提供了相同的工具,圍繞底層金融協(xié)議和工具具有更高的透明度和靈活性,從而催生了 DeFi 量化交易和應用開發(fā)。DeFi 開發(fā)人員和 DeFi quants 甚至可以利用這些工具的衍生品,并將它們組合成新的服務,以建立在傳統(tǒng)金融科技世界中沒有的創(chuàng)新金融頭寸。DeFi 開發(fā)人員的基本工具之一是能夠以非托管方式借出和借入加密貨幣資產。閱讀本文前請先查看:
用 Python 開發(fā) DeFi 去中心化借貸應用(上)
用 Python 開發(fā) DeFi 去中心化借貸應用(中)
獲取可借資產價值
現在,當我們借款時,我們會被告知我們擁有的以 ETH 表示的資產數量。然而,也許我們想借用一個不同的代幣,比如 DAI。如果我們要以 ETH 為抵押借入 DAI,我們首先要得到 ETH -> DAI 的兌換率。
Chainlink 是 DeFi 和智能合約生態(tài)系統(tǒng)中獲取數據和執(zhí)行外部計算的標準,也是 Aave 用來獲取費率的標準!他們有一個價格 Oracle 部分,描述了如何通過他們的智能合約 API 獲取 Chainlink 數據。如果你學會了一般地使用 Chainlink 數據,你可以跨協(xié)議使用它,即使他們沒有使用 Chainlink,或者沒有價格預言機機制!
Chainlink 通過去中心化的預言機網絡獲取數據,其中多個節(jié)點將跨多個 API 和服務的數據聚合到一個去中心化的來源,該來源經過驗證并記錄在鏈上供我們使用。我們可以在 data.chain.link 頁面或文檔上看到當前可用數據提要的列表。如您所知,數據是大多數量化系統(tǒng)、算法交易者和整個 DeFi 生態(tài)系統(tǒng)的支柱,因此您要始終確保自己是從去中心化系統(tǒng)中提取的,這樣您就可以獲得最準確、最可靠和最安全的數據。
此外,如果您不想要某些數據,您可以從任何 API 調用您的智能合約,獲得可證明的隨機數以及許多其他不同的服務。這些使得智能合約數據安全、可靠和去中心化。
但是讓我們回到 Python!
我們有一個名為 get_asset_price 的函數,它從 dai_eth_price_feed 中讀取數據,如下所示:
def get_asset_price():# For mainnet we can just do:# return Contract(f"{pair}.data.eth").latestAnswer() / 1e8dai_eth_price_feed = interface.AggregatorV3Interface(config["networks"][network.show_active()]["dai_eth_price_feed"])latest_price = Web3.fromWei(dai_eth_price_feed.latestRoundData()[1], "ether")print(f"The DAI/ETH price is {latest_price}")return float(latest_price)
我們從接口中提取的 Chainlink 合約 AggregatorV3Interface 已存儲在我們的配置文件中。在該合約中,我們調用 latestRoundData 函數。
你會注意到我們也不需要為這個做一個交易,這也是一個視圖函數!
你會看到通過brownie獲得 Chainlink 數據價格的另一種方式是:
from brownie import Contractprint(Contract(f"{pair}.data.eth").latestAnswer() / 1e8)
這是使用 ENS 來獲取價格對的地址。ENS 是一種獲取智能合約地址并使其可讀的方法。例如,您可以執(zhí)行以下操作:
print(Contract(f"eth-usd.data.eth").latestAnswer() / 1e8)以美元為單位獲取以太坊的最新價格。請注意,ENS 僅適用于主網網絡,因此您在運行 brownie 時必須使用 --network mainnet 或 --network mainnet-fork。
將價值轉換為借用
現在我們有了抵押品和我們想要借入的資產之間的轉換率,我們可以設置一個變量來確定我們想要借入多少。
amount_erc20_to_borrow = (1 / erc20_eth_price) * (borrowable_eth * 0.95)我們得到 ETH/DAI 價格的倒數,并將其乘以我們可以借入的金額(以 ETH 為單位)。為了安全起見,我們還將其乘以 0.95。然后,我們調用借用函數!
borrow_erc20(lending_pool, amount_erc20_to_borrow, account)def borrow_erc20(lending_pool, amount, account, erc20_address=None):erc20_address = (erc20_addressif erc20_addresselse config["networks"][network.show_active()]["aave_dai_token"])# 1 is stable interest rate# 0 is the referral codetransaction = lending_pool.borrow(erc20_address,Web3.toWei(amount, "ether"),1,0,account.address,{"from": account},)transaction.wait(1)print(f"Congratulations! We have just borrowed {amount}")
借用函數需要幾個參數:
?資產的地址(在我們的例子中是 DAI 代幣)?我們要借的金額,單位為 wei?interestRateMode,(0, 1, 2: 1 是穩(wěn)定的,2 是可變的……現在不用擔心 0)?推薦碼(忽略)?onBehalfOf 值,即誰將承擔債務
讓我們看一下 Etherscan 上這筆交易的樣本,以了解剛剛發(fā)生的事情。

按順序,代幣轉移的方向是:
?Aave 協(xié)議正在鑄造一些 aDAI?我們的錢包正在鑄造一些 Aave Stable Debt Bearing DAI?我們的錢包獲得了一些 DAI
重要說明:Aave 有時會更改其測試網token。通過檢查已部署的合約地址,確保您擁有正確的 testnet DAI 地址。并檢查官方 json 列表。
這一次,我們得到了一種不同類型的計息代幣,一種債務代幣。這是我們必須償還的金額,并且與 aToken 一樣,它的價值也會增長。如果你欠更多的債務(用這個債務代幣表示),有人可以清算你并拿走你所有的抵押品!所以要警惕你有多少債務。
通過添加新的代幣地址,我們可以再次在我們的 MetaNask 中看到借入的資產。我們還可以通過添加債務token地址來查看我們的債務。
這才是真正有趣的地方?,F在最簡單的賣空方法之一就是出售我們的資產。如果資產價格下跌,我們將不得不償還比借入的更少的錢。
然而,我越來越擔心我會被清算。讓我們償還我們的債務。
償還我們的債務
我們想弄清楚我們欠了多少,然后償還!我們可以用這些函數做到這一點:
borrowable_eth, total_debt_eth = get_borrowable_data(lending_pool, account)amount_erc20_to_repay = (1 / erc20_eth_price) * (total_debt_eth * 0.95)repay_all(amount_erc20_to_repay, lending_pool, account)
def repay_all(amount, lending_pool, account):approve_erc20(Web3.toWei(amount, "ether"),lending_pool,config["networks"][network.show_active()]["aave_dai_token"],account,)tx = lending_pool.repay(config["networks"][network.show_active()]["aave_dai_token"],Web3.toWei(amount, "ether"),1,account.address,{"from": account},)tx.wait(1)print("Repaid!")
總結
我們已經完成了與 Aave 合作的所有步驟。
?抵押?拿出貸款?償還貸款
您接下來還可以做一些事情,比如:
?使用 Synthetix 或 Bancor 等協(xié)議交易資產?申請閃貸?了解如何質押和參與治理
您還可以學習如何成為智能合約開發(fā)人員,在 Solidity 中構建去中心化協(xié)議,并發(fā)現智能合約的廣泛功能。你的旅程才剛剛開始!




點擊下方閱讀原文加入社區(qū)會員
