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

在以太坊和其餘區塊鏈中,仍有不少被證實的概念正在實施,開發人員在嘗試如何應對這些新概念。做爲dInvest 系列文章一部分,我也在研究以太坊並嘗試在區塊鏈中實施對衝基金。在上一篇文章中,我討論瞭如何在python中啓動和運行定量框架。在這篇文章中,我將介紹如何將python程序與以太坊智能合約集成。出於這樣或那樣的緣由,可能也面臨着這個問題,儘管以太坊提供了圖靈完備語言,但並非全部事情都能完成。php

假設你已經在以太坊建立了一個簡單的教程合約,如今想要看一些更高級的東西。我我的喜歡ManuelAráoz的Hitchhiker智能合約指南,以邊能夠開始使用更復雜的代碼,設置testrpctruffle。建議你們看看。html

dInvest智能合約

dInvest由一份智能合約組成,負責進行投資,驗證投資標準和回報分配。合約規定了公共職能部門,以創造新的投資和撤資,這將成爲對衝基金的主要職能。對衝基金的用戶經過其以太坊地址來識別,該地址至關於公鑰。投資策略和策略執行的建議在具備以太坊地址的不一樣代理中完成。這些代理僅由合約建立者設置。當用戶建立投資時,能夠根據標準行業分類代碼指定由兩位數字標識的行業部門列表。在進行投資時,這些部門能夠被肯定爲黑名單。所以,用戶有能力控制對衝基金將投資的行業。java

合同能夠在the GitHub repo中找到。node

與智能合約的互動

要與智能合約進行交互,有幾個選項,包括RPC或JavaScript API。我發現與其餘程序(如python程序)的以太坊智能合約進行交互的最簡單方法是使用他們的web3 JavaScript API。由於dInvest的大部分都是用python編寫的,因此我想堅持使用該語言而不是包含JS。幸運的是,python中有一個web3實現。爲了啓動並運行dInvest設置,我切換到virtualenv,我還安裝了zipline,而後使用pip install web3安裝web3。python

使用web3,有三個步驟可讓你啓動並運行以與智能合約進行交互:android

  • 獲得你的ABI
  • 設置RPC鏈接
  • 與智能合約互動

在接下來的部分中,我將詳細介紹如何實現這三個步驟。我主要使用它做爲其餘程序的python模塊。最後咱們的python模塊結構可能以下所示:git

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

獲得你的ABI

如今,要與任何智能合約進行交互,你須要合同定義的應用程序二進制接口(ABI)。ABI是一種靜態的強類型接口。不管什麼時候建立新合約或更改現有合約,你的ABI也可能發生變化。根據個人經驗,得到智能合約的當前ABI的最簡單方法(多是你的或任何你有源代碼的合約)是去https://ethereum.github.io/browser-solidity/並複製/粘貼你的代碼。而後按右上側的Compile按鈕,將Interface字段中的整個字符串複製到your-contract-name.json文件中。擁有該JSON後,你的web3接口將知道如何與合約進行交互。程序員

設置RPC提供程序

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

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)

我更喜歡將個人配置放在一個單獨的文件中。有不少方法能夠作到這一點,彷佛python中沒有標準。我想使用txt文件並非最好的選擇,我很快打算切換到yml。另請參見https://martin-thoma.com/configuration-files-in-python/。確保在開始程序以前運行你最喜好的以太坊客戶端(例如geth --rpc)。web

與智能合約互動

注意:在與你本身的賬戶進行交互以前,你須要先將其解鎖。這是經過web3實現的:

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

若是要在合約中調用函數,能夠經過調用ABI合約定義的命令來執行此操做。在咱們的dInvest示例中,有一個合約調用它爲咱們的可持續投資返回黑名單公司。它能夠這樣調用:

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

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

最後的說明

最後,我想指出,還有其餘區塊鏈解決方案,如Hyperledger FabricTendermint,旨在解決與其餘編程語言兼容的問題,交易吞吐量等。由於他們是須要許可證的區塊鏈我尚未給嘗試他們,但有機會看看可能會頗有趣。

固然,python用web3.py庫開發以太坊來講很是的方便,有興趣的用戶能夠關注咱們的python以太坊教程,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。

另外其餘語言能夠學習的以太坊教程以下:

  • web3j教程,主要是針對java和android程序員進行區塊鏈以太坊開發的web3j詳解。
  • 以太坊教程,主要介紹智能合約與dapp應用開發,適合入門。
  • 以太坊開發,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • php以太坊,主要是介紹使用php進行智能合約開發交互,進行帳號建立、交易、轉帳、代幣開發以及過濾器和事件等內容。
  • C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括帳戶管理、狀態與交易、智能合約開發與交互、過濾器和事件等。

匯智網原創翻譯,轉載請標明出處。這裏是原文

相關文章
相關標籤/搜索