在以太坊和其他区块链中,仍有很多被证明的概念正在实施,开发人员在尝试如何应对这些新概念。作为dInvest 系列文章一部分,我也在研究以太坊并尝试在区块链中实施对冲基金。在上一篇文章中,我讨论了如何在python中启动和运行定量框架。在这篇文章中,我将介绍如何将python程序与以太坊智能合约集成。出于这样或那样的原因,可能也面临着这个问题,尽管以太坊提供了图灵完备语言,但并不是所有事情都能完成。
假设你已经在以太坊创建了一个简单的教程合约,现在想要看一些更高级的东西。我个人喜欢ManuelAráoz的Hitchhiker智能合约指南,以边可以开始使用更复杂的代码,设置testrpc
和truffle
。建议大家看看。
dInvest智能合约
dInvest由一份智能合约组成,负责进行投资,验证投资标准和回报分配。合约规定了公共职能部门,以创造新的投资和撤资,这将成为对冲基金的主要职能。对冲基金的用户通过其以太坊地址来识别,该地址相当于公钥。投资策略和策略执行的建议在具有以太坊地址的不同代理中完成。这些代理仅由合约创建者设置。当用户创建投资时,可以根据标准行业分类代码指定由两位数字标识的行业部门列表。在进行投资时,这些部门可以被确定为黑名单。因此,用户有能力控制对冲基金将投资的行业。
合同可以在the GitHub repo中找到。
与智能合约的互动
要与智能合约进行交互,有几个选项,包括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进行区块链以太坊开发的详解。
这里是原文