使用Python的開發(fā)框架Brownie部署以太坊智能合約
介紹
我希望可以在任何開發(fā)場(chǎng)景都盡量用Python。在區(qū)塊鏈開發(fā)中,常用的是以太坊虛擬機(jī)智能合約語言Solidity,它具有許多不錯(cuò)的功能,并且仍然可以使用 Python 進(jìn)行部署。剛開始使用Solidity時(shí),我使用了Remix(https://remix.ethereum.org/),這是一個(gè)強(qiáng)大的Web IDE,可讓您進(jìn)行智能合約可視化。Remix很棒,我現(xiàn)在仍然使用它,但是在單個(gè)IDE之外可以實(shí)現(xiàn)很多其他功能。后來我開始學(xué)習(xí)Truffle(https://www.trufflesuite.com/)和HardHat(https://hardhat.org/guides/mainnet-forking.html),它們是用于部署智能合約的Node.js框架。
這些是到目前為止我所見過的主要框架,這些框架都不錯(cuò),但是我更喜歡Python。所以當(dāng)我發(fā)現(xiàn)Brownie 和web3.py:一個(gè)用于部署智能合約的Python框架和一個(gè)用于區(qū)塊鏈開發(fā)的開源協(xié)議之后非常興奮。我們將在本文中同時(shí)介紹Brownie和Web3.py。
為什么選擇Python?
有這么多數(shù)據(jù)科學(xué)家、學(xué)者和金融科技機(jī)構(gòu)使用Python是有原因的。它用途廣泛,具有輕松的開發(fā)體驗(yàn),并且與各種第三方庫(kù)緊密結(jié)合在一起。頂級(jí) defi 項(xiàng)目開始意識(shí)到這一點(diǎn),諸如yearn.finance之類的項(xiàng)目使用python來部署其所有生產(chǎn)代碼。Yearn.finance由一群非常有才華的金融科技工程師經(jīng)營(yíng),他們轉(zhuǎn)向了區(qū)塊鏈,帶著他們熟悉和喜愛的Python工具。
Brownie是什么?
Brownie是由Ben Hauser創(chuàng)建的Python智能合約開源框架,又名“iamdefinitelyahuman”(中文意思“非絕對(duì)人類”),是一件藝術(shù)品。這就是yearn.finance團(tuán)隊(duì)用來部署和維護(hù)智能合約的工具。您可以使用簡(jiǎn)單的命令啟動(dòng)項(xiàng)目,然后立即開始使用代碼。
用Python部署您的第一個(gè)智能合約
1. 安裝 Brownie 和 bake
Brownie具有“baking”功能,可讓您使用一些基礎(chǔ)代碼啟動(dòng)存儲(chǔ)庫(kù),因?yàn)榇蠖鄶?shù)項(xiàng)目都需要很多相同的部分,類似于create-eth-app。要開始使用,和其他所有Python軟件包的安裝方式一樣。
pipinstalleth-brownie
我們還需要安裝ganache-cli一個(gè)用于部署本地區(qū)塊鏈的軟件包。為此,您需要安裝npm和nodejs。
npminstall-gganache-cli
準(zhǔn)備開始!我們將使用chainlink-mix入門,因?yàn)樵S多頂級(jí)defi項(xiàng)目都使用Chainlink來獲取其資產(chǎn)數(shù)據(jù)。
browniebakechainlink-mix cdchainlink
通過ls命令將向我們展示項(xiàng)目的結(jié)構(gòu)布局
Brownie項(xiàng)目布局
build:Thisiswheretheprojectkeepstrackofyourdeployedsmartcontractsandcompiledcontracts contracts:Thesourcecodeofyourcontracts,typicallywritteninsolidityorvyper interfaces:Alayoutofinterfacesyou'llneedtoworkwithdeployedcontracts.EveryinteractionwithacontractneedsanABIandanaddress.Interfacesaregreatwaystogetacontract'sABI scripts:Scriptswecreatetoautomateprocessesofworkingwithourcontracts tests:Tests brownie-config.yaml:Thisiswherewehavealltheinformationforbrownietounderstandhowtoworkwithoursmartcontract.Whatblockchaindowewanttodeployto?Arethereanyspecialparameterswewanttoset?Allthesearesetintheconfigfile.
requirements.txt,README.md,LICENSE和.gitignore可以忽略,您將在后面了解它們的用途。
2.設(shè)置環(huán)境變量
如果您熟悉區(qū)塊鏈開發(fā),就會(huì)知道本地區(qū)塊鏈,測(cè)試網(wǎng)區(qū)塊鏈和主網(wǎng)區(qū)塊鏈都是不同的東西。我們將部署到測(cè)試網(wǎng),以便我們可以與真實(shí)的實(shí)時(shí)區(qū)塊鏈網(wǎng)絡(luò)進(jìn)行交互。您需要一個(gè)WEB3_INFURA_PROJECT_ID,可以通過創(chuàng)建Infura帳戶來檢索該WEB3_INFURA_PROJECT_ID。這就是我們用來連接到測(cè)試網(wǎng)絡(luò)的東西。我們還將獲得一個(gè)metamask或其他web3以太坊錢包,并用一些ETH進(jìn)行注資。對(duì)于這個(gè)demo,我們要使用Kovan測(cè)試網(wǎng)絡(luò)。
您可以跳過有關(guān)LINK資金的部分,我們只需要testnet ETH。我們也不會(huì)使用Ropsten,而是使用Kovan。如果您已經(jīng)有了錢包,請(qǐng)從https://gitter.im/kovan-testnet/faucet獲取一些Kovan Ether。
安裝,配置和Metamask
一旦有了Metamask錢包,就可以將私鑰導(dǎo)出到PRIVATE_KEY環(huán)境變量。在此處(https://www.twilio.com/blog/2017/01/how-to-set-environment-variables.html)閱讀有關(guān)設(shè)置環(huán)境變量的信息。如果這仍然使您感到困惑,并且這只是一個(gè)測(cè)試錢包,請(qǐng)隨意將代碼中的PRIVATE_KEY替換為您的私鑰和WEB3_INFURA_PROJECT_ID。
3.部署您的智能合約
在我們的腳本文件夾中,我們有一個(gè)名為deploy_price_consumer_v3.py的腳本,該腳本將部署我們的智能合約,該合約讀取以太坊的美元價(jià)格。如果您想更輕松地了解該合約的功能以及如何部署它,請(qǐng)隨時(shí)查看有關(guān)部署價(jià)格訂閱合同的Chainlink教程(https://docs.chain.link/docs/beginners-tutorial/)。brownie run是我們可以用來運(yùn)行腳本的命令。如果僅運(yùn)行brownie,則可以看到所有命令的列表。
brownierunscripts/price_feed_scripts/deploy_price_consumer_v3.py--networkkovan
--network kovan允許我們?cè)O(shè)置要使用的網(wǎng)絡(luò)。我們正在使用kovan testnet進(jìn)行此演示。您將需要Kovan ETH來做到這一點(diǎn)!您將獲得很多輸出內(nèi)容,但最終會(huì)得到類似以下結(jié)果:
Running'scripts/price_feed_scripts/deploy_price_consumer_v3.py::main'... Transactionsent:0x23d1dfa3937e0cfbab58f8d5ecabe2bfffc28bbe2349527dabe9289e747bac56 Gasprice:20.0gweiGaslimit:145600Nonce:1339 PriceFeed.constructorconfirmed-Block:22721813Gasused:132364(90.91%) PriceFeeddeployedat:0x6B2305935DbC77662811ff817cF3Aa54fc585816
如果此方法正常運(yùn)行,我們可以轉(zhuǎn)到kovan etherscan并找到我們部署的合約。上面的鏈接顯示了此示例中部署的合約。
4.讀取您的智能合約
現(xiàn)在我們已經(jīng)部署了智能合約,我們可以從剛剛部署的合約中讀取以太坊的價(jià)格。我們將運(yùn)行另一個(gè)腳本:
brownierunscripts/price_feed_scripts/read_price_feed.py--networkkovan
得到類似以下的輸出:
Browniev1.12.2-PythondevelopmentframeworkforEthereum ChainlinkProjectistheactiveproject. Running'scripts/price_feed_scripts/read_price_feed.py::main'... Readingdatafrom0x6B2305935DbC77662811ff817cF3Aa54fc585816 62322000000 Where62322000000isthecurrentpriceofETHinUSD!Soliditydoesn'tunderstanddecimals,andweknowthatthisexamplehas8decimals,sothepriceis$623.22.
您剛剛使用Python和Brownie部署了您的第一個(gè)智能合約!
使用web3.py
Brownie使用名為web3.py的工具讓您的開發(fā)更輕松,但是如果機(jī)智點(diǎn),則我們始終可以直接在沒有框架的情況下使用合約。Web3.py是一個(gè)原始程序包,我們可以使用它來更直接地處理合同。為此,我們只需要上面的Kovan infura項(xiàng)目ID。請(qǐng)記住,要與任何智能合約進(jìn)行交互,您需要做兩件事:
- 智能合約ABI
- 智能合約地址
Brownie 會(huì)在后臺(tái)處理很多此類工作,但我們也可以手動(dòng)進(jìn)行。這是通過web3.py從鏈上合同中讀取的內(nèi)容。首先,我們需要安裝web3.py。
pipinstallweb3
然后,我們可以在文件中運(yùn)行以下內(nèi)容。
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)
運(yùn)行上述操作后將在我們的控制臺(tái)中打印以美元為單位的ETH的最新價(jià)格。請(qǐng)查看Chainlink文檔以確定是否有問題。
結(jié)論
您可以從他們的文檔中了解有關(guān)Web3.py和Brown的更多信息。這兩個(gè)項(xiàng)目都是開源的,任何人都可以做出貢獻(xiàn)!
https://github.com/eth-brownie/brownie
https://github.com/ethereum/web3.py
以上就是使用Python的開發(fā)框架Brownie部署以太坊智能合約的詳細(xì)內(nèi)容,更多關(guān)于Python部署智能合約的資料請(qǐng)關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。