在以太坊和其余区块链中,仍有不少被证实的概念正在实施,开发人员在尝试如何应对这些新概念。做为dInvest 系列文章一部分,我也在研究以太坊并尝试在区块链中实施对冲基金。在上一篇文章中,我讨论了如何在python中启动和运行定量框架。在这篇文章中,我将介绍如何将python程序与以太坊智能合约集成。出于这样或那样的缘由,可能也面临着这个问题,尽管以太坊提供了图灵完备语言,但并非全部事情都能完成。html
假设你已经在以太坊建立了一个简单的教程合约,如今想要看一些更高级的东西。我我的喜欢ManuelAráoz的Hitchhiker智能合约指南,以边能够开始使用更复杂的代码,设置testrpc
和truffle
。建议你们看看。python
dInvest由一份智能合约组成,负责进行投资,验证投资标准和回报分配。合约规定了公共职能部门,以创造新的投资和撤资,这将成为对冲基金的主要职能。对冲基金的用户经过其以太坊地址来识别,该地址至关于公钥。投资策略和策略执行的建议在具备以太坊地址的不一样代理中完成。这些代理仅由合约建立者设置。当用户建立投资时,能够根据标准行业分类代码指定由两位数字标识的行业部门列表。在进行投资时,这些部门能够被肯定为黑名单。所以,用户有能力控制对冲基金将投资的行业。git
合同能够在the GitHub repo中找到。github
要与智能合约进行交互,有几个选项,包括RPC或JavaScript API。我发现与其余程序(如python程序)的以太坊智能合约进行交互的最简单方法是使用他们的web3 JavaScript API。由于dInvest的大部分都是用python编写的,因此我想坚持使用该语言而不是包含JS。幸运的是,python中有一个web3实现。为了启动并运行dInvest设置,我切换到virtualenv,我还安装了zipline,而后使用pip install web3
安装web3。web
使用web3,有三个步骤可让你启动并运行以与智能合约进行交互:编程
在接下来的部分中,我将详细介绍如何实现这三个步骤。我主要使用它做为其余程序的python模块。最后咱们的python模块结构可能以下所示:json
contract |-- __init__.py |-- ContractHandler.py |-- your-contract-name.json
如今,要与任何智能合约进行交互,你须要合同定义的应用程序二进制接口(ABI)。ABI是一种静态的强类型接口。不管什么时候建立新合约或更改现有合约,你的ABI也可能发生变化。根据个人经验,得到智能合约的当前ABI的最简单方法(多是你的或任何你有源代码的合约)是去https://ethereum.github.io/browser-solidity/并复制/粘贴你的代码。而后按右上侧的Compile
按钮,将Interface
字段中的整个字符串复制到your-contract-name.json
文件中。拥有该JSON后,你的web3接口将知道如何与合约进行交互。框架
下一步,你须要链接到RPC提供程序。在你的python文件(例如ContractHandler.py
)中包含这些代码行:dom
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进行区块链以太坊开发的详解。
这里是原文