區塊鏈研究實驗室 | 如何使用Python部署智慧合約

買賣虛擬貨幣


在本文中,我們將使用Python部署智慧合約。


我喜歡Python,它具備著開發人員出色的經驗。能夠寫作print("hi")而又不會過於冗長System.out.println("hi")。許多人(包括金融科技界人士)都認同這一觀點。我曾與許多對沖基金都使用Python作為主要語言。


Python它有很多不錯的功能,並且可以使用Python進行部署。剛開始使用Solidity,我使用了Remix,這是一個功能強大的Web IDE,讓您視覺化智慧合約。但是在單個IDE之外可以實現很多工作效率。這是我開始學習Truffle和HardHat的時候,它們是用於部署智慧合約的Node.js框架。


這些是到目前為止我所見過的主要框架,這一切都很棒,但是我們不喜歡Javascript,我們喜歡Python。所以我很高興找到Python和web3.py ,一個用於部署智慧合約的Python框架和一個用於處理區塊鏈的開源回購協議。


為什麼選擇Python?


Python被很多資料科學家,學者和金融科技機構所使用是有原因的。它是一種多用途的語言,讓開發人員輕鬆獲得,使用時更容易上手。頂級defi專案意識到這一點後,後續諸如yearn.finance之類的專案使用python來部署其所有生產程式碼。Yearn.finance由一群非常有才華的金融科技工程師經營,他們轉向了區塊鏈,他們運用著熟悉和喜愛的Python工具。

什麼是Brownie?



Brownie是由Ben Hauser建立的開源Python智慧合約框架,又名“非絕對人類”的一件藝術品。這是yearn.finance使用此框架來部署和維護合同的工具。您可以使用簡單的命令啟動專案,然後立即可以使用程式碼。



使用Python部署您的第一個智慧合約

1.安裝 Brownie



Brownie具有“baking”功能,可讓您使用一些基線程式碼啟動儲存庫,因為大多數專案都需要很多相同的部分,就像create-eth-app.要開始使用一樣,我們只需要以安裝其他Python軟體包的相同方式來安裝Brownie 。
pip install eth-brownie


我們還需要安裝ganache-cli一個用於部署本地區塊鏈的軟體包。需要為此安裝npm和nodejs。
npm install -g ganache-cli


我們將使用chainlink-mix來開始使用,因為許多頂級defi專案都使用Chainlink來獲取其資產資料。
brownie bake chainlink-mixcd chainlink


快速ls命令將向我們展示專案的佈局


  • build :這是專案跟蹤已部署的智慧合約和已編譯合約的地方

  • contracts:合同的原始碼,通常以solidity或vyper

  • interfaces:處理已部署合同所需的介面布局。每次與合同的互動都需要一個ABI和一個地址。介面是獲取合同的ABI的好方法

  • scripts :我們建立的指令碼可自動執行合同工作

  • tests :測試

  • brownie-config.yaml:這是我們擁有布朗尼所有資訊的地方,以瞭解如何使用我們的智慧合約。我們想部署到什麼區塊鏈?我們是否需要設定任何特殊引數?所有這些都在配置檔案中設定。



您可以忽略requirements.txt,README.md,LICENSE,和.gitignore,因為您在練習時會了解它們的用途。

2.設定環境變數



如果您熟悉區塊鏈開發,那麼您就會知道本地區塊鏈,testnet區塊鏈和mainnet區塊鏈之間的區別。我們將部署到測試網,以便我們可以與真實的實時區塊鏈進行互動。


您需要一個 WEB3_INFURA_PROJECT_ID 可以透過建立Infura帳戶來檢索的。這就是我們用來連線到我們的測試網路的東西。



您還需要獲取一個metamask或其他Web3以太坊錢包,並用一些ETH進行資助。對於此演示,我們要使用Kovan測試網路。


如果您從未使用過Metamask,您可以跳過有關LINK資金的部分,我們只需要testnet ETH。我們也不會使用Ropsten,而是使用Kovan。如果您已經有了錢包,可以搶些Kovan Ether。



有了Metamask錢包,就可以將私鑰匯出到PRIVATE_KEY環境變數。


如果您感到困惑,無須擔心,這只是一個測試錢包,請隨時PRIVATE_KEY用您的私鑰替換程式碼,然後單擊WEB3_INFURA_PROJECT_ID。

3.部署您的智慧合約



在我們的scripts資料夾中,我們有一個名為deploy_price_consumer_v3.py的指令碼,該指令碼將部署我們的智慧合約,該合約讀取以美元為單位的以太坊價格。



brownie run是我們可以用來執行指令碼的命令。如果僅執行brownie,則可以看到所有命令的列表。
brownie run scripts/price_feed_scripts/deploy_price_consumer_v3.py --network kovan


network kovan允許我們設定要使用的網路。我們正在kovan為此示例使用testnet。您將需要Kovan ETH來做到這一點!您將獲得很大的輸出,但最終會得到類似以下結果:
Running 'scripts/price_feed_scripts/deploy_price_consumer_v3.py::main'...Transaction sent: 0x23d1dfa3937e0cfbab58f8d5ecabe2bfffc28bbe2349527dabe9289e747bac56Gas price: 20.0 gwei Gas limit: 145600 Nonce: 1339PriceFeed.constructor confirmed - Block: 22721813 Gas used: 132364 (90.91%)PriceFeed deployed at: 0x6B2305935DbC77662811ff817cF3Aa54fc585816


如果此方法正常執行,我們可以轉到kovan etherscan並找到我們部署的合同。上面的連結顯示了此示例中部署的合同。

4.閱讀您的智慧合約



現在我們已經部署了智慧合約,我們可以從剛剛部署的合約中讀取以太坊的價格。我們將使用另一個具有的指令碼:
brownie run scripts/price_feed_scripts/read_price_feed.py --network kovan


我們將得到類似以下的輸出:
Brownie v1.12.2 - Python development framework for EthereumChainlinkProject is the active project.Running 'scripts/price_feed_scripts/read_price_feed.py::main'...Reading data from 0x6B2305935DbC77662811ff817cF3Aa54fc58581662322000000


其中62322000000是ETH當前的美元價格!Solidity無法解讀小數,因此我們知道此示例有8個小數,因此價格為$623.22。


您剛剛使用Python和Brownie部署了您的第一個智慧合約!

5.使用web3.py



Brownie使用一種稱為的工具web3.py來使您的生活更輕鬆,可以直接在沒有框架的情況下使用合同。Web3.py是一個原始程式包,我們可以使用它來更直接地處理合同。


為此,我們只需要上面的Kovan infura專案ID。
請記住,要與任何智慧合約進行互動,您需要做兩件事:


  • 合同ABI
  • 合同地址


Brownie會在後臺處理很多此類工作,但我們也可以手動進行。這是透過web3.py從鏈上合同中讀取的內容。


首先,我們需要安裝web3.py。
pip install web3

然後,我們可以在檔案中執行以下內容:
web3 = Web3(Web3.HTTPProvider('https://kovan.infura.io/v3/<infura_project_id>')) abi = '[{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]' addr = '0x9326BFA02ADD2366b30bacB125260Af641031331' contract = web3.eth.contract(address=addr, abi=abi) latestData = contract.functions.latestRoundData().call() print(latestData)


執行上述操作將在我們的控制檯中獲取以美元為單位的ETH的最新價格。

作者:鏈三豐,來源:區塊鏈研究實驗室

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读