使用Python開發DeFi項目
目前,智能合約的開發由JavaScript語言主導,部分原因在于JavaScript是地球上最常用的語言,而且因為Node.js帶來的“JavaScript無處不在”的思想,使得構建全棧應用程序變得更加容易。但是,對金融科技界中的定量分析師,股票交易員和對沖基金來說,情況則有所不同。大多數金融科技公司中出于各種原因而選擇使用Python
在本文教程中,我們將詳細介紹如何 使用Python開發DeFi項目 。去中心化金融(DeFi)是區塊鏈和智能合約世界里最重要的進步之一,且常常被稱作“新金融科技”。目前,智能合約的開發由JavaScript語言主導,部分原因在于JavaScript是地球上最常用的語言,而且因為Node.js帶來的“JavaScript無處不在”的思想,使得構建全棧應用程序變得更加容易。但是,對金融科技界中的定量分析師,股票交易員和對沖基金來說,情況則有所不同。大多數金融科技公司中出于各種原因而選擇使用Python:
- 出色的開發者體驗
- 強大的AI和機器學習支持
- 配套的金融科技軟件工具包
- 全面的分析工具
- 生產環境中的可靠性
來源:eFinancialCareers
為什么有眾多數據科學家,學者和金融科技機構使用Python是有一定原因的。DeFi領域中的某些項目,如yearn.finance,也認可這種想法,并已經使用Python和Solidity構建了他們的整個DeFi平臺。因為有了web3.py和Brownie之類的庫和框架,我們才能夠有機會看到這些項目的誕生。Brownie是一個類似Truffle的框架,能夠支持項目部署,編寫腳本,測試等,且能夠進行端到端的開發。
Web3.py和Brownie也能“混合”使用,你可以預先打開一個項目并在其中使用一些樣板代碼。這就是我們今天將要使用的Chainlink Brownie mix。
現在思考一下我們為什么要使用Chainlink Python?正如Python是金融科技領域中的首選編程語言,Chainlink事實上也是將鏈下數據帶到DeFi智能合約中的首選預言機解決方案,當前正守護著超過750億美金的頂級DeFi協議的價值。這兩種技術的結合為安全去中心化金融科技領域提供了強大的框架支撐。
要開始使用Brownie和Python構建DeFi應用,首先需要安裝Python。目前建議Python的版本不低于3.6,因此,如果你使用的版本低于3.6,請先進行升級。你可以通過運行以下命令查看你的Python版本并驗證它是否已正確安裝:
1 python --version
或者,如果用的是Python3:
1 python3 --version
你還需要安裝Ganache。Ganache是用Python編寫的一鍵式區塊鏈,它可讓你很容易啟動一個本地區塊鏈。但你必須通過npm和node.js來下載它,這將是唯一需要與之交互的JavaScript相關的內容。
首先,需要安裝node.js和npm。Node.js會隨npm一起安裝。下載后,可以通過運行以下命令來檢查它是否正確安裝:
1 npm --version2 node --version
然后你可以通過命令行安裝Ganache。
1 npm install -g ganache-cli
安裝完這些后,我們來安裝eth-brownie。推薦使用pipx而不是pip,這樣我們就可以在它自己的環境中安裝eth-brownie。
首先安裝pipx:
1 python3 -m pip install --user pipx2 python3 -m pipx ensurepath
然后關閉并重啟終端。如果使用的是VSCode,點擊那個看起來像垃圾桶的圖標。現在pipx應該成功安裝了,可以通過pipx –version檢查。然后可以安裝eth-brownie。
如果你想在沒有虛擬環境的情況下安裝,可以使用pip或pip3:“
1 pip3 install eth-brownie
如果你能在終端執行brownie命令,就表示安裝成功,并且得到的輸出類似于:
1 Brownie v1.17.0 - Python development framework for Ethereum 2 Usage: brownie[...] [options] 3 Commands: 4 init Initialize a new brownie project 5 bake Initialize from a brownie-mix template 6 pm Install and manage external packages 7 compile Compile the contract source files 8 console Load the console 9 test Run test cases in the tests/ folder 10 run Run a script in the scripts/ folder 11 accounts Manage local accounts 12 networks Manage network settings 13 gui Load the GUI to view opcodes and test coverage 14 analyze Find security vulnerabilities using the MythX API 15 Options: 16 --help -h Display this message 17 --version Show version and exit18 Type 'brownie--help' for specific options and more information about19 each command.
另外,你還需要一個MetaMask或其他以太坊錢包。如果你以前從未使用過ETH錢包,則可以觀看下面的視頻輔助設置。需要注意的是,這個視頻也展示了在Ropsten網絡上獲取ETH測試代幣,但Chainlink已經不再支持了。如果你想按照視頻操作,請使用Kovan測試網絡。
最后,請確保你的ETH錢包中有一些測試網LINK代幣和Kovan測試網ETH代幣。你可以在LINK水龍頭和ETH Kovan水龍頭中獲取一些。
開啟一個Chainlink項目
要開始使用Brownie,我們可以使用Brownie mix為我們提供樣板代碼。在本文的示例中,我們將部署一個簡單的Chainlink Price Feed,來了解Brownie框架。現在我們就開始創作chainlink-mix項目吧。
1 brownie bake chainlink-mix2 cd chainlink
我們會進入到一個包含一些默認代碼的新項目。如果運行ls命令,我們可以看到文件的布局如下:
- build:這是項目用來跟蹤已部署的智能合約和已編譯合約的文件夾
- contracts:合約的源代碼,通常以Solidity或Vyper語言編寫
- interfaces:和已部署合約交互所需要的接口文件夾。每次與合約的交互都需要一個ABI和合約地址。接口是獲取合約的ABI的好方法
- scripts:我們創建的用于自動執行合約流程的腳本
- tests:測試文件
- brownie-config.yaml:這個文件為Brownie提供了理解如何對待我們的智能合約所需要的所有信息。我們想部署到什么區塊鏈網絡?我們要設置任何特殊參數嗎?所有這些內容都在此配置文件中設置。
requirements.txt , README.md , LICENSE , 以及 .gitignore 等文件現在可以忽略。你將在練習過程中了解它們的用途。
設置環境變量
雖然我們剛剛安裝好了Ganache進行本地測試,我們仍希望能夠連接到以太坊主網和測試網,這樣我們就可以將合約部署在真實的測試網上。為此,我們需要設置WEB3_INFURA_PROJECT_ID字段。你可以從Infura網站免費獲得一個Infura ID,也可以使用其他web3 providers或者自己的節點,但是你需要做更多配置。
在brownie-config.yaml文件中,你可以設定帶有host字段的網絡配置,如果不想使用MetaMask,還可以定義要連接的URL。
現在有了web3 ID,我們需要將私鑰作為環境變量來使用,這樣我們可以在錢包中使用我們的帳戶。如果你使用的是MetaMask,請找到 export key選項(以導出私鑰)。使用MetaMask的話,你可能必須在私鑰的開頭添加0x。為了以防萬一,建議在測試和導出密鑰時使用與主帳戶不同的帳戶。
重要提示:請不要將你的私鑰發送到 GitHub或任何公共場所!如果有人獲得了你的私鑰,他們將可以訪問你帳戶中的所有資金!我們強烈建議你使用與持有資金的賬戶不同的賬戶進行測試。
現在我們需要讓它們成為環境變量。我們將使用一種簡單的方法來設置環境變量,創建一個.env文件,并添加以下內容:
1 export PRIVATE_KEY=0x96789…..2 export WEB3_INFURA_PROJECT_ID=’dog cat mouse….’
PRIVATE_KEY是MetaMask錢包中的私鑰,WEB3_INFURA_PROJECT_ID是來自Infura的項目ID。然后,創建一個brownie-config.yaml文件(如果文件已存在,給它添加下面的內容)并添加以下行:
1 dotenv: .env
現在我們就可以部署到測試網和本地網絡了!
部署你的智能合約
現在我們已經完成了所有設置,我們將進一步把智能合約部署到Kovan測試網上!
在scripts文件夾中,我們有一個名為deploy_price_consumer_v3.py的腳本。這將部署我們的智能合約,該合約會讀取以美元計價的以太坊的價格數據。
如果你想看到一個更加易懂的闡述該合約的功能以及如何部署它的教程,隨時查看Chainlink的部署喂價合約的教程。
只需使用brownie run命令即可使用此部署腳本:
1 brownie run scripts/price_feed_scripts/deploy_price_consumer_v3.py --network kovan
你會看到以下輸出內容:
1 Running 'scripts/price_feed_scripts/deploy_price_consumer_v3.py::main'...2 Transaction sent: 0x23d1dfa3937e0cfbab58f8d5ecabe2bfffc28bbe2349527dabe9289e747bac56Gas price: 20.0 gwei 3 Gas limit: 145600 Nonce: 13394 PriceFeed.constructor confirmed - Block: 22721813 Gas used: 132364 (90.91%)5 PriceFeed deployed at: 0x6B2305935DbC77662811ff817cF3Aa54fc585816
如果腳本工作正常,我們可以到Kovan區塊瀏覽器上查看我們部署的合約。上面的鏈接顯示了此示例中部署的合約。
讀取你的智能合約
現在我們已經部署好了智能合約,我們可以從剛剛部署的合約中讀取以太坊的價格。我們將使用另一個腳本:
1 brownie run scripts/price_feed_scripts/read_price_feed.py --network kovan
我們將得到如下輸出:
1 Brownie v1.12.2 - Python development framework for Ethereum2 ChainlinkProject is the active project.3 Running 'scripts/price_feed_scripts/read_price_feed.py::main'...4 Reading data from 0x5A….5 122322000000
其中122322000000是ETH當前的美元價格!Solidity無法理解小數,而我們知道Chainlink喂價具有8位小數,因此價格為$1,223.22。
至此你就完成了使用Python和Brownie部署你的第一個智能合約!
測試你的智能合約
這也是一個很好的關于如何測試智能合約的例子。我們甚至可以使用模擬對象在本地進行測試!
只需運行:
1 brownie test
你的測試將在本地Ganache實例上運行!
你還可以使用以下內容在測試網上進行測試:
1 brownie test --network kovan
這些測試具有一些可以知曉你是否正在使用測試網的功能。如果你在本地工作,它將部署預言機代碼的虛擬對象或“模擬對象”,因此我們可以通過它們進行測試。
更進一步
現在你知道了如何使用Python來部署智能合約,就可以開始基于此框架進行構建以做更多有趣的事情。Python具有諸如Numpy,Scikit,Pandas和TensorFlow等強大的軟件包,可以用于定量工作,機器學習等等。最終將這些技術結合在一起是在金融科技新時代成功的秘訣:去中心化金融。
Chainlink是一個靈活的框架,用于將外部金融數據和系統引入到鏈上,并無縫集成這些與以數據為中心的軟件包,如Numpy和Pandas。