python和web3py類庫(kù)以太坊投資智能合約交互

在以太坊和其他區(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è)置testrpctruffle猜嘱。建議大家看看。

dInvest智能合約

dInvest由一份智能合約組成嫁艇,負(fù)責(zé)進(jìn)行投資朗伶,驗(yàn)證投資標(biāo)準(zhǔn)和回報(bào)分配。合約規(guī)定了公共職能部門步咪,以創(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è)分類代碼指定由兩位數(shù)字標(biāo)識(shí)的行業(yè)部門列表。在進(jìn)行投資時(shí)禽翼,這些部門可以被確定為黑名單屠橄。因此族跛,用戶有能力控制對(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)類型接口。無(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ù)制到your-contract-name.json文件中。擁有該JSON后舔痕,你的web3接口將知道如何與合約進(jìn)行交互评抚。

設(shè)置RPC提供程序

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

from web3 import Web3, TestRPCProvider

class ContractHandler:
  def __init__(self):
    self.web3 = Web3(RPCProvider(host='localhost', port='8545'))
    with open(str(path.join(dir_path, 'contract_abi.json')), 'r') as abi_definition:
      self.abi = json.load(abi_definition)
    self.contract_address = your_contract_address
    self.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 FabricTendermint模她,旨在解決與其他編程語(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ā)溺忧,適合入門咏连。
  • 以太坊開(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ò)濾器和事件等惕稻。

匯智網(wǎng)原創(chuàng)翻譯竖共,轉(zhuǎn)載請(qǐng)標(biāo)明出處。這里是原文

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俺祠,一起剝皮案震驚了整個(gè)濱河市公给,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜘渣,老刑警劉巖淌铐,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宋梧,居然都是意外死亡匣沼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門捂龄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)释涛,“玉大人,你說(shuō)我怎么就攤上這事倦沧〈角耍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵展融,是天一觀的道長(zhǎng)窖认。 經(jīng)常有香客問(wèn)我,道長(zhǎng)告希,這世上最難降的妖魔是什么扑浸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮燕偶,結(jié)果婚禮上喝噪,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布沈善。 她就那樣靜靜地躺著,像睡著了一般晚唇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盗似,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天哩陕,我揣著相機(jī)與錄音,去河邊找鬼。 笑死萌踱,一個(gè)胖子當(dāng)著我的面吹牛葵礼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播并鸵,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扔涧!你這毒婦竟也來(lái)了园担?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枯夜,失蹤者是張志新(化名)和其女友劉穎弯汰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體湖雹,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咏闪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摔吏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸽嫂。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖征讲,靈堂內(nèi)的尸體忽然破棺而出据某,到底是詐尸還是另有隱情,我是刑警寧澤诗箍,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布癣籽,位于F島的核電站,受9級(jí)特大地震影響滤祖,放射性物質(zhì)發(fā)生泄漏筷狼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一匠童、第九天 我趴在偏房一處隱蔽的房頂上張望埂材。 院中可真熱鬧,春花似錦俏让、人聲如沸楞遏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寡喝。三九已至,卻和暖如春勒奇,著一層夾襖步出監(jiān)牢的瞬間预鬓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工赊颠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留格二,地道東北人劈彪。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像顶猜,于是被迫代替她去往敵國(guó)和親沧奴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容