当前位置: 首页 > 科技观察

用Python开发DeFi去中心化借贷应用

时间:2023-03-21 21:06:02 科技观察

Python中文社区(ID:python-china)简介传统的金融科技世界充满了让用户能够制作复杂算法交易模型和系统的工具。去中心化金融(DeFi)也为用户和开发者提供相同的工具,围绕底层金融协议和工具具有更高的透明度和灵活性,从而催生了DeFi量化交易和应用开发。DeFi开发人员和DeFi宽客甚至可以采用这些工具的衍生品,并将它们组合到新服务中,以创造传统金融科技世界所没有的创新金融头寸。DeFi开发人员的基本工具之一是以非托管方式借入和借入加密资产的能力。使用DeFi借贷协议的一些巨大优势包括:无摩擦卖空无需平仓即可获得流动性可以从您存入的抵押品中获得收益在传统金融世界中无法完成的事情,例如闪贷。由于出色的开发经验,金融科技领域的很大一部分都使用Python。借助智能合约,您可以使用与您熟悉的完全相同的Python工具。您无需了解Solidity或如何编写智能合约即可参与量化DeFi或启动您自己的加密货币对冲基金。但是,如果你决定学习Solidity,你的DeFi能力将成倍增加,因为你将能够更有效地参与去中心化量化金融并聚合资源。在本教程中,我们将学习如何:将抵押品存入Aave借贷池获取我们的抵押品与另一资产之间的对话率使用该抵押品借入不同的资产(贷款)还清贷款了解如何这将使我们能够利用DeFi生态系统中的交易在传统的金融科技世界中很难获得,有时甚至是不可能的。Web3.py和Brownie介绍与大多数系统一样,区块链世界目前有两个Pythonic接口:web3.py和brownie。Web3.py是与区块链交互的原始且最优雅的方式(除非您自己编写自己的web3.py包!)。Brownie是一个建立在web3.py之上的框架,它抽象了区块链上交易的许多难点。在本教程中,我们将向您展示如何编写这些脚本并使用Brownie进行链上交互。Brownie使我们的工作更轻松,如果您已经熟悉web3.py,您也可以将web3.py与Brownie一起使用。如果您更喜欢原始的web3.py,我们还在web3.py存储库中完成了所有示例。设置首先,让我们克隆repo。gitclonehttps://github.com/PatrickAlphaC/aave_brownie_pycdaave_brownie_py你会看到这样一个目录。如果您不熟悉路径文件,您也可以随时阅读自述文件以获得一些有用的提示。1.先安装Python,安装Nodejs可以更快的运行我们的测试和开发,但是我们暂时可以跳过这一步。安装Python后,让我们运行:pipinstall-rrequirements.txt这将安装eth-brownie和python-dotenv。eth-brownie是web3.py附带的brownie包。如果您遇到问题,您可以使用pipx安装eth-brownie:pipinstall--userpipxpipxensurepath#restartyourterminalpipxinstalleth-brownie如果您可以运行brownie--version并得到如下信息,您就会知道您做对了:Browniev1.14.6-Ethereum2的Python开发框架,获取ETH钱包并设置环境变量你需要一个以太坊钱包,你可以下载使用MetaMask。拥有MetaMask后,您将需要2个环境变量,WEB3_INFURA_PROJECT_ID和PRIVATE_KEY。您的WEB3_INFURA_PROJECT_ID将是您在Infura中的项目ID。Infura是一个节点基础设施解决方案,用于连接到以太坊区块链并与之交互。#DONOTSENDTHESETOGIT/GITHUBexportWEB3_INFURA_PROJECT_ID=exportPRIVATE_KEY=您可以将它们添加到标记为.env的文件中,然后运行??source.env以将环境变量添加到您的shell/终端。请注意,如果您关闭shell/终端,下次您打开shell/终端备份时,您必须在.env文件所在的位置运行source.env。3.获得一些测试网的ETH想要跑本地链的可以跳过这一步。如果您不明白我所说的“本地链”是什么意思,请继续阅读并按照以下步骤操作。使用此水龙头链接转到KovanFaucet。如果以下步骤不起作用,您可以随时访问Chainlink文档LINK令牌合约页面以查找最新的水龙头。输入您的新钱包地址并获得一些测试网ETH。您应该会在MetaMask中看到您的余额已更新。我们将在Kovan测试网上运行。测试网是与真实区块链交互的模拟。4.将您的ETH换成WETH如果您从2ETH开始,在这一步之后您将拥有大约0.99ishETH和1WETH的余额。让我们继续。为了与Aave协议交互,我们将把我们的ETH换成ERC20版本的ETH,称为WETH(也称为包装ETH)。它使我们更容易与AAVE协议进行交互。ERC20是以太坊上的通用令牌标准。brownierunscripts/get_weth.py--networkkovan对于那些想要在主网上(本地)运行的人,只需删除命令的--networkkovan部分。您应该会看到您的MetaMask余额减少了。这是因为我们正在用ETH交换WETH。要查看我们的新余额,请转到MetaMask并单击添加令牌。然后在CustomToken下输入地址0xd0a1e359811322d97991e03f863a0c30c2cf029c。这是Kovan测试网上WrappedEther代币的合约地址。您会注意到现在总共少于2个ETH(1+0.99!=2)。这是因为每次在区块链上进行交易,都需要支付少量的gas。Gas是一种向矿工和验证者支付小额交易费用的方式。随着了解的深入,你会发现gas有两种:1.TransactionGas2.OracleGas在本教程中,我们只需要关注交易gas。这就是您在测试网上的第一笔交易!5.放下抵押品,借LINK,然后归还借的金额,修复脚本brownierunscripts/aave_borrow.py--networkkovan或者,运行主网fork脚本:brownierunscripts/aave_borrow.py--networkmainnet-fork你应该得到anoutputlikethis:Browniev1.14.6-PythondevelopmentframeworkforEthereumAaveBrowniePyProjectistheactiveproject.Running'scripts/aave_borrow.py::main'...ApprovingERC20...Transactionsent:0x04b86b3c11d8b45ad410ecb580becb8f1ef57fb1f72d3ac3944365317b99ca2Gasprice:2.0gweiGaslimit:50695Nonce:3IERC20.approveconfirmed-Block:25241881Gasused:46087(90.91%)IERC20.approveconfirmed-Block:25241881Gasused:46087(90.91%)Approved!Depositing...Transactionsent:0xade4ab7c979e96dcb8ca6ebfda4206f8927d12fc078b32c59a723c3ae4883bcaGasprice:2.0gweiGaslimit:253974Nonce:4ILendingPool.depositconfirmed-Block:25241883Gasused:212742(83.77%)Deposited!Youhave0.100000012276459112worthofETHdeposited.Youhave0worthofETHborrowed.您可以借到价值0.08000000982116729的ETH。LETSBORROWITALLTheDAI/ETHpriceis0.0003642722357682Wearegoingtoborrow208.6351960638322DAITransactionsent:0x07b07852de7ac7cf492b34e0c929c65f38f1f83bf5953c14011ba9f659475247Gasprice:2.0gweiGaslimit:392549Nonce:5ILendingPool.borrowconfirmed-Block:25241886Gasused:351754(89.61%)ILendingPool.borrowconfirmed-Block:25241886Gasused:351754(89.61%)Congratulations!Wehavejustborrowed208.6351960638322Youhave0.100000036829377336worthofETHdeposited.Youhave0.076000009330108915worthofETHborrowed.Youcanborrow0.004000020133392954worthofETH.ApprovingERC20...Transactionsent:0xede77fa7f91db8cda493a9aad092b4771c3dcf16718b086da64fe1b3b20dda9fGasprice:2.0gweiGaslimit:50798Nonce:6IERC20.approveconfirmed-Block:25241888Gasused:46180(90.91%)IERC20.approveconfirmed-Block:25241888Gasused:46180(90.91%)Approved!Transactionsent:0xfda598cede32c2af0b8309b330bb93d08a8ccb2787adedef0de485220ee7d88aGasprice:2.0gweiGaslimit:242655Nonce:7ILendingPool.repayconfirmed-Block:25241889Gasused:187617(77.32%)ILendingPool.repayconfirmed-Block:25241889Gasused:187617(77.32%)已偿还!这个脚本产生了很多结果!让我们分解一下刚刚发生的事情...获取WETH所以我们在这里做的第一件事是用一些ETH交换WETH我们使用./scripts/get_weth.py脚本中的get_weth函数来完成此操作。defget_weth(account=None):"""MintsWETHbydepositingETH."""account=(accountifaccountelseaccounts.add(config["wallets"]["from_key"]))#addyourkeystoreIDasanargumenttothiscallweth=interface.WethInterface(config["networks"][network.show_active()]["weth_token"])tx=weth.deposit({"from":account,"value":1000000000000000000})print("Received1WETH")returntx对于以太坊上的交易或调用,如果你要修改区块链的状态,你必须始终来自一个帐户。我们正在修改区块链的状态,因为我们将修改我们的ETH和WETH余额。我们使用从配置中获取的帐户,位于brownie-config.yaml中。我们在底部附近看到它使用我们的PRIVATE_KEY环境变量。wallets:from_key:${PRIVATE_KEY}from_mnemonic:${MNEMONIC}现在不用担心MNEMONIC。我们将此帐户添加到我们的Brownie帐户列表中:accounts.add(config["wallets"]["from_key"])我们现在有一个可以在我们的脚本中使用的帐户。接下来,我们需要获取WETH合约对象以便与其进行交互。我们想将ETH存入合约,因此它会为我们铸造相同数量的WETH。我们可以随时使用此合约将WETH转换回ETH。所有ERC20代币(如LINK、WETH、AAVE等)本身都是链上合约。要与合约交互,我们需要两件事。ContractABI/InterfaceContractAddress我们的接口文件夹中有接口。我们也有ABI。编译后的项目将合约放在构建文件夹中。如果我们查看构建下的接口文件夹,我们可以看到一个名为WethInterface.json的文件。在该文件夹中,有一个名为abi的密钥。我们可以使用该接口,因为它编译为ABI。ABI代表APPBinaryInterface,是程序了解如何与合约(包括Python)交互的标准方式。我们可以将地址和ABI添加到一个对象中,以便我们通过创建一个weth变量来与之交互:weth=interface.WethInterface(config["networks"][network.show_active()]["weth_token"])我们再次从配置文件中获取weth_token地址。你会注意到不同的硬币有不同的地址,这取决于你处理的是哪个链。如果我们打印(type(weth)),我们会得到:一个Contract对象就像一个类,它代表链上的一个合约。那么我们就可以在链上调用这个合约的功能了。然后,我们在合约上调用存款功能:tx=weth.deposit({"from":account,"value":1000000000000000000})Solidity合约weth具有存款功能。其实我们可以看到链上的代码。此链接指向区块浏览器Etherscan。这是区块链可视化的一种方法。我们可以看到下面的代码部分,其中包含了合约中的所有代码。您有时会遇到没有代码部分的合同。这是因为它们尚未经过区块浏览器的验证。如果我们转到WriteContract部分,我们可以看到相同的存款功能。所以我们也可以通过这种方式收到WETH!每当我们进行函数调用并修改区块链的状态时,我们都会进行交易。在上面的输出中,我们看到如下内容:Transactionsent:0x888bb9d6657b1de2e5eec465bf9641b401647a61a2bd428b51d8a95d5a3e329a然后您可以将此交易哈希复制到区块浏览器中以查看该交易的详细信息。让我们回顾一下。我们在Python中获得了一个帐户我们学习了如何通过其地址和ABI与合约进行交互我们学习了如何通过函数调用发送交易我们学习了区块浏览器下一部分我们将重点关注借贷。