python如何使用web3py與以太坊投資智能合約交互

在以太坊和其他區(qū)塊鏈中,仍有很多被證明的概念正在實(shí)施,開(kāi)發(fā)人員在嘗試如何應(yīng)對(duì)這些新概念。作為dInvest 系列文章一部分,我也在研究以太坊并嘗試在區(qū)塊鏈中實(shí)施對(duì)沖基金。在上一篇文章中,我討論了如何在python中啟動(dòng)和運(yùn)行定量框架。在這篇文章中,我將介紹如何將python程序與以太坊智能合約集成。出于這樣或那樣的原因,可能也面臨著這個(gè)問(wèn)題,盡管以太坊提供了圖靈完備語(yǔ)言,但并不是所有事情都能完成。

假設(shè)你已經(jīng)在以太坊創(chuàng)建了一個(gè)簡(jiǎn)單的教程合約,現(xiàn)在想要看一些更高級(jí)的東西。我個(gè)人喜歡ManuelAráoz的Hitchhiker智能合約指南,以邊可以開(kāi)始使用更復(fù)雜的代碼,設(shè)置testrpc和truffle。建議大家看看。

dInvest智能合約

dInvest由一份智能合約組成,負(fù)責(zé)進(jìn)行投資,驗(yàn)證投資標(biāo)準(zhǔn)和回報(bào)分配。合約規(guī)定了公共職能部門(mén),以創(chuàng)造新的投資和撤資,這將成為對(duì)沖基金的主要職能。對(duì)沖基金的用戶通過(guò)其以太坊地址來(lái)識(shí)別,該地址相當(dāng)于公鑰。投資策略和策略執(zhí)行的建議在具有以太坊地址的不同代理中完成。這些代理僅由合約創(chuàng)建者設(shè)置。當(dāng)用戶創(chuàng)建投資時(shí),可以根據(jù)標(biāo)準(zhǔn)行業(yè)分類(lèi)代碼指定由兩位數(shù)字標(biāo)識(shí)的行業(yè)部門(mén)列表。在進(jìn)行投資時(shí),這些部門(mén)可以被確定為黑名單。因此,用戶有能力控制對(duì)沖基金將投資的行業(yè)。

合同可以在the GitHub repo中找到。

與智能合約的互動(dòng)

要與智能合約進(jìn)行交互,有幾個(gè)選項(xiàng),包括RPC或JavaScript API。我發(fā)現(xiàn)與其他程序(如python程序)的以太坊智能合約進(jìn)行交互的最簡(jiǎn)單方法是使用他們的web3 JavaScript API。因?yàn)閐Invest的大部分都是用python編寫(xiě)的,所以我想堅(jiān)持使用該語(yǔ)言而不是包含JS。幸運(yùn)的是,python中有一個(gè)web3實(shí)現(xiàn)。為了啟動(dòng)并運(yùn)行dInvest設(shè)置,我切換到virtualenv,我還安裝了zipline,然后使用pip install web3安裝web3。

使用web3,有三個(gè)步驟可以讓你啟動(dòng)并運(yùn)行以與智能合約進(jìn)行交互:

得到你的ABI

設(shè)置RPC連接

與智能合約互動(dòng)

在接下來(lái)的部分中,我將詳細(xì)介紹如何實(shí)現(xiàn)這三個(gè)步驟。我主要使用它作為其他程序的python模塊。最后我們的python模塊結(jié)構(gòu)可能如下所示:

contract|-- __init__.py|-- ContractHandler.py|-- your-contract-name.json

得到你的ABI

現(xiàn)在,要與任何智能合約進(jìn)行交互,你需要合同定義的應(yīng)用程序二進(jìn)制接口(ABI)。ABI是一種靜態(tài)的強(qiáng)類(lèi)型接口。無(wú)論何時(shí)創(chuàng)建新合約或更改現(xiàn)有合約,你的ABI也可能發(fā)生變化。根據(jù)我的經(jīng)驗(yàn),獲得智能合約的當(dāng)前ABI的最簡(jiǎn)單方法(可能是你的或任何你有源代碼的合約)是去https://ethereum.github.io/browser-solidity/并復(fù)制/粘貼你的代碼。然后按右上側(cè)的Compile按鈕,將Interface字段中的整個(gè)字符串復(fù)制到y(tǒng)our-contract-name.json文件中。擁有該JSON后,你的web3接口將知道如何與合約進(jìn)行交互。

設(shè)置RPC提供程序

下一步,你需要連接到RPC提供程序。在你的python文件(例如ContractHandler.py)中包含這些代碼行:

from web3 import Web3, TestRPCProviderclassContractHandler:def__init__(self):self.web3 = Web3(RPCProvider(host='localhost', port='8545'))? ? with open(str(path.join(dir_path,'contract_abi.json')),'r') asabi_definition:self.abi = json.load(abi_definition)self.contract_address = your_contract_addressself.contract =self.web3.eth.contract(self.abi,self.contract_address)

我更喜歡將我的配置放在一個(gè)單獨(dú)的文件中。有很多方法可以做到這一點(diǎn),似乎python中沒(méi)有標(biāo)準(zhǔn)。我想使用txt文件并不是最好的選擇,我很快打算切換到y(tǒng)ml。另請(qǐng)參見(jiàn)https://martin-thoma.com/configuration-files-in-python/。確保在開(kāi)始程序之前運(yùn)行你最喜愛(ài)的以太坊客戶端(例如geth --rpc)。

與智能合約互動(dòng)

注意:在與你自己的帳戶進(jìn)行交互之前,你需要先將其解鎖。這是通過(guò)web3實(shí)現(xiàn)的:

self.web3.personal.unlockAccount(your_ethereum_account,your_ethereum_password)

如果要在合約中調(diào)用函數(shù),可以通過(guò)調(diào)用ABI合約定義的命令來(lái)執(zhí)行此操作。在我們的dInvest示例中,有一個(gè)合約調(diào)用它為我們的可持續(xù)投資返回黑名單公司。它可以這樣調(diào)用:

blacklist= self.contract.call().blackListCompanies()

GitHub代碼中有更多示例可用。

最后的說(shuō)明

最后,我想指出,還有其他區(qū)塊鏈解決方案,如Hyperledger Fabric或Tendermint,旨在解決與其他編程語(yǔ)言兼容的問(wèn)題,交易吞吐量等。因?yàn)樗麄兪切枰S可證的區(qū)塊鏈我還沒(méi)有給嘗試他們,但有機(jī)會(huì)看看可能會(huì)很有趣。

當(dāng)然,python用web3.py庫(kù)開(kāi)發(fā)以太坊來(lái)說(shuō)非常的方便,有興趣的用戶可以關(guān)注我們的python以太坊教程,主要是針對(duì)python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開(kāi)發(fā)的詳解。

另外其他語(yǔ)言可以學(xué)習(xí)的以太坊教程如下:

web3j教程,主要是針對(duì)java和android程序員進(jìn)行區(qū)塊鏈以太坊開(kāi)發(fā)的web3j詳解。

以太坊教程,主要介紹智能合約與dapp應(yīng)用開(kāi)發(fā),適合入門(mén)。

以太坊開(kāi)發(fā),主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn),適合進(jìn)階。

php以太坊,主要是介紹使用php進(jìn)行智能合約開(kāi)發(fā)交互,進(jìn)行賬號(hào)創(chuàng)建、交易、轉(zhuǎn)賬、代幣開(kāi)發(fā)以及過(guò)濾器和事件等內(nèi)容。

C#以太坊,主要講解如何使用C#開(kāi)發(fā)基于.Net的以太坊應(yīng)用,包括賬戶管理、狀態(tài)與交易、智能合約開(kāi)發(fā)與交互、過(guò)濾器和事件等。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文:Smart contracts 正如我們?cè)赱intro]中看到的那樣,以太坊中有兩種不同類(lèi)型的帳戶:外部擁有...
    Jisen閱讀 5,119評(píng)論 1 7
  • 在以太坊和其他區(qū)塊鏈中,仍有很多被證明的概念正在實(shí)施,開(kāi)發(fā)人員在嘗試如何應(yīng)對(duì)這些新概念。作為dInvest 系列文...
    編程狂魔閱讀 1,070評(píng)論 0 1
  • 1. 文章摘要 【本文目標(biāo)】了解ETH生態(tài)下DAPP去中心化應(yīng)用程序的框架和交互流程,了解WEB3.JS的作用和接...
    筆名輝哥閱讀 6,200評(píng)論 0 49
  • 前一段時(shí)間忽然想到同理心這個(gè)詞,百度一下大概意思就是說(shuō)要從對(duì)方的心理才揣度問(wèn)題,而不是自我出發(fā),以己度人。比如將心...
    墨韻書(shū)香閱讀 1,270評(píng)論 7 0
  • 1.昨天和同事在樓下食堂吃飯,人多、擠,不僅要排隊(duì)打飯,還要排隊(duì)付款,高峰期要20分鐘才能吃上飯。怎么樣才能提高效...
    空靈一月閱讀 303評(píng)論 0 0

友情鏈接更多精彩內(nèi)容