從python和web3py互動以太坊合約
在以太坊和其他區塊鏈中,仍有很多被證明的概念正在實施,開發人員在嘗試如何應對這些新概念。作為ofollow,noindex">dInvest 系列文章 一部分,我也在研究以太坊並嘗試在區塊鏈中實施對衝基金。在上一篇文章中,我討論瞭如何在python中啟動和執行定量框架。在這篇文章中,我將介紹如何將python程式與以太坊智慧合約整合。出於這樣或那樣的原因,可能也面臨著這個問題,儘管以太坊提供了圖靈完備語言,但並不是所有事情都能完成。
假設你已經在以太坊建立了一個簡單的教程合約,現在想要看一些更高階的東西。我個人喜歡ManuelAráoz的Hitchhiker智慧合約指南
,以邊可以開始使用更復雜的程式碼,設定testrpc
和truffle
。建議大家看看。
dInvest智慧合約
dInvest由一份智慧合約組成,負責進行投資,驗證投資標準和回報分配。合約規定了公共職能部門,以創造新的投資和撤資,這將成為對衝基金的主要職能。對衝基金的使用者通過其以太坊地址來識別,該地址相當於公鑰。投資策略和策略執行的建議在具有以太坊地址的不同代理中完成。這些代理僅由合約建立者設定。當用戶建立投資時,可以根據標準行業分類程式碼指定由兩位數字標識的行業部門列表。在進行投資時,這些部門可以被確定為黑名單。因此,使用者有能力控制對衝基金將投資的行業。
與智慧合約的互動
要與智慧合約進行互動,有幾個選項,包括RPC或JavaScript API。我發現與其他程式(如python程式)的以太坊智慧合約進行互動的最簡單方法是使用他們的web3 JavaScript API。因為dInvest的大部分都是用python編寫的,所以我想堅持使用該語言而不是包含JS。幸運的是,python中有一個web3實現。為了啟動並執行dInvest設定,我切換到virtualenv,我還安裝了zipline,然後使用pip install web3
安裝web3。
使用web3,有三個步驟可以讓你啟動並執行以與智慧合約進行互動:
- 得到你的ABI
- 設定RPC連線
- 與智慧合約互動
在接下來的部分中,我將詳細介紹如何實現這三個步驟。我主要使用它作為其他程式的python模組。最後我們的python模組結構可能如下所示:
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
)中包含這些程式碼行:
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)。
與智慧合約互動
注意:在與你自己的帳戶進行互動之前,你需要先將其解鎖。這是通過web3實現的:
self.web3.personal.unlockAccount(your_ethereum_account, your_ethereum_password)
如果要在合約中呼叫函式,可以通過呼叫ABI合約定義的命令來執行此操作。在我們的dInvest示例中,有一個合約呼叫它為我們的可持續投資返回黑名單公司。它可以這樣呼叫:
blacklist = self.contract.call().blackListCompanies()
GitHub程式碼中 有更多示例可用。
最後的說明
最後,我想指出,還有其他區塊鏈解決方案,如Hyperledger Fabric
或Tendermint
,旨在解決與其他程式語言相容的問題,交易吞吐量等。因為他們是需要許可證的區塊鏈我還沒有給嘗試他們,但有機會看看可能會很有趣。
當然,python用web3.py庫開發以太坊來說非常的方便,有興趣的使用者可以關注我們的python以太坊教程,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
另外其他語言可以學習的以太坊教程如下:
- web3j教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
- 以太坊教程,主要介紹智慧合約與dapp應用開發,適合入門。
- 以太坊開發,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和事件等內容。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和事件等。
匯智網原創翻譯,轉載請標明出處。這裡是原文