# 用 Python 开发 DeFi 去中心化应用（上）

By [quantbang](https://paragraph.com/@quantbang) · 2022-03-24

---

![](https://storage.googleapis.com/papyrus_images/6134b35abf506d5a278fa033078cc1a246d77812d4cd36ba1ad82225d5c4a916.png)

在本教程中，我们将介绍如何使用 Python 开发 DeFi 项目。去中心化金融 (DeFi) 是区块链和智能合约世界最重要的进步之一，通常被称为“新金融科技”。目前，智能合约开发由 JavaScript 主导，部分原因可能是 JavaScript 是地球上最常用的语言，并且与 Node.js 配合构建全栈应用程序更容易。然而，量化分析师、股票交易员和对冲基金的金融科技世界并非如此。大多数金融科技公司出于各种原因使用 Python：

*   更高效的开发体验
    
*   强大的人工智能和机器学习
    
*   捆绑的金融科技包
    
*   综合分析工具
    
*   生产环境中的可靠性
    

![](https://storage.googleapis.com/papyrus_images/05eb883ee7c4451cae8f1818833e55f6c3c38314b09e3c3c759c20b26fa42a47.png)

如此多的数据科学家、学者和金融科技机构使用 Python 是有原因的。DeFi 领域的一些项目，如yearn.finance，分享了这种观点，并使用 Python 和 Solidity 构建了他们的整个 DeFi 平台。正是由于像 web3.py 和 Brownie 这样的库和框架，我们才能看到这些项目变得生动起来。Brownie 是一个类似于 Truffle 的框架（它们都非常“sweet”），它维护您的部署、脚本、测试，并允许您制作端到端的后台。

Web3.py和Brownie还提供了“mix”，你可以在其中使用一些样板代码预打开项目。这就是我们今天将使用的Chainlink Brownie mix。

现在我们为什么要使用 Chainlink + Python？正如 Python 是金融科技事实上的编程语言一样，Chainlink 是将链下数据提供给 DeFi 智能合约的事实上的预言机解决方案，目前为顶级 DeFi 协议提供了超过 7B 美元的价值。这两种技术的结合为去中心化金融科技领域提供了一个安全而强大的框架。

以下是 Chainlink 在 2020 年启用的一些功能的快速浏览。

![](https://storage.googleapis.com/papyrus_images/23c1ba9fb87bb6164b6cfc8ca16db29c748de98eb776ea790065290a4e41a03d.png)

要开始使用 Brownie 和 Python 构建 DeFi 应用程序，您首先需要安装 Python。此时不建议 Python 低于 3.4 版本，因此如果您的版本低于 3.4，请升级。您可以通过运行以下命令查看您的 Python 版本并验证它是否已正确安装：

    python --version
    

或者，如果使用 python3：

    python3 --version
    

您还需要安装 Ganache。Ganache 是一个用 Python 编写的一键式区块链应用，可让您轻松启动本地区块链。尽管您必须使用 npm 和 node.js 下载它，但这将是您必须与之交互的唯一 JavaScript 片段。

首先，您需要安装 node.js 和 npm。Node.js 随 npm 一起安装。下载后，您可以通过运行以下命令来检查它是否正确完成：

    npm -v
    

然后，您可以通过命令行安装 Ganache。

    npm install -g ganache-cli
    

安装完成后，我们将像安装所有 Python 存储库一样使用 pip 安装 eth-brownie！

    pip install eth-brownie
    

或者如果使用 pip3：

    pip3 install eth-brownie
    

如果您在终端中运行 brownie，您就会知道您做对了，您会得到类似于以下内容的输出：

    Brownie v1.13.0- Python development framework forEthereum
    Usage:  brownie &lt;command> [&lt;args>...] [options &lt;args>]
    Commands:
      init               Initialize a new brownie project
      bake               Initializefrom a brownie-mix template
      pm                 Installand manage external packages
      compile            Compile the contract source files
      console            Load the console
      test               Run test cases in the tests/ folder
      run                Run a script in the scripts/ folder
      accounts           Managelocal accounts
      networks           Manage network settings
      gui                Load the GUI to view opcodes and test coverage
      analyze            Find security vulnerabilities using the MythX API
    Options:
    --help -h          Displaythis message
    --version          Show version andexit
    Type'brownie &lt;command> --help'for specific options and more information about
    each command.
    

此外，您还需要一个 MetaMask 或其他以太坊钱包。请使用 Kovan测试网获得ETH。请确保您的 ETH 钱包中有一些 testnet LINK 和 Kovan ETH。您可以在 LINK faucet 和 ETH Kovan faucet 中找到一些。

**启动 Chainlink 项目**

要开始使用Brownie,，我们可以使用所谓的Brownie mix 来为我们提供样板代码。在这个例子中，我们将部署一个简单的 Chainlink Price Feed 作为了解 Brownie 框架的一种方式。让我们bake chainlink-mix。

    brownie bake chainlink-mix
    cd chainlink
    

这将使我们进入一个新项目，其中已经为我们构建了一些默认代码。如果我们运行 ls 我们可以看到文件的布局是什么样的：

*   `build` ：这是项目跟踪您部署的智能合约和编译的合约的地方
    
*   `contracts`：合同的源代码，通常用 Solidity 或 Vyper 编写
    
*   `interfaces` ：您需要使用已部署合同的接口布局。与合约的每次交互都需要一个 ABI 和一个地址。接口是获取合约 ABI 的好方法
    
*   `scripts`：我们创建的脚本来自动化处理我们的合同的过程 测试
    
*   `tests`：测试
    
*   `brownie-config.yaml` ：这是我们为 Brownie 了解如何使用我们的智能合约提供所有信息的地方。我们要部署到哪个区块链？有没有我们想要设置的特殊参数？所有这些都在配置文件中设置。
    

现在可以忽略 `requirements.txt` 、 `README.md` 、 `LICENSE` 和 `.gitignore`。当您练习时，您会发现它们的用途。

**设置环境变量**

尽管我们只是安装了 Ganache 来进行本地测试，但我们也希望能够连接到 ETH 主网和测试网，以便我们可以将它们部署在真实的测试网上。为此，我们需要设置 `WEB3_INFURA_PROJECT_ID`。您可以从 Infura 站点免费获得一个 Infura ID。您也可以使用其他 web3 提供程序或您自己的节点，但您必须为此做更多的配置。

在您的 `brownie-config.yaml` 文件中，您可以使用主机密钥设置网络，并定义您不想使用 MetaMask 时想要连接的 URL。

现在您有了 web3 ID，我们需要将我们的私钥作为环境变量，以便我们可以将我们的帐户与我们的钱包一起使用。如果您使用 MetaMask，请查找导出密钥。使用 MetaMask，您可能需要在私钥的开头添加 `0x`。建议在测试和导出密钥时使用与主帐户不同的帐户，以防万一。

现在，要使它们成为环境变量，只需在终端中运行以下命令：

    export PRIVATE_KEY=0x96789…..
    export WEB3_INFURA_PROJECT_ID=’dog cat mouse….’
    

如果你运行 `printenv` 并在那里看到你的环境变量，你就会知道你做对了。

**部署您的智能合约**

现在我们已经设置好了一切，我们甚至可以继续将智能合约部署到 Kovan 测试网！

在我们的脚本文件夹中，我们有一个名为 `deploy_price_consumer_v3.py`的脚本。这将部署我们的智能合约，以美元读取以太坊的价格。

只需使用 brownie run 即可使用部署脚本：

    brownie run scripts/price_feed_scripts/deploy_price_consumer_v3.py --network kovan
    

你会看到这样的东西：

    Running'scripts/price_feed_scripts/deploy_price_consumer_v3.py::main'...
    Transaction sent: 0x23d1dfa3937e0cfbab58f8d5ecabe2bfffc28bbe2349527dabe9289e747bac56
    Gas price: 20.0 gwei   Gas limit: 145600Nonce: 1339
    PriceFeed.constructor confirmed - Block: 22721813Gas used: 132364(90.91%)
    PriceFeed deployed at: 0x6B2305935DbC77662811ff817cF3Aa54fc585816
    

如果这工作正常，我们可以去 Kovan Etherscan 并找到我们部署的合约。上面的链接显示了此示例中部署的合约。

---

*Originally published on [quantbang](https://paragraph.com/@quantbang/python-defi)*
