<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 4217字,需瀏覽 9分鐘

           ·

          2021-07-05 17:56


          傳統(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() / 1e8   dai_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_address       if erc20_address       else config["networks"][network.show_active()]["aave_dai_token"]   )   # 1 is stable interest rate   # 0 is the referral code   transaction = 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ū)會員

          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲黄片免费看 | 小泽玛利亚av在线 | 成人午夜激情视频 | 五月骚逼 | 成人黄色AV网址 |