python使用web3py与以太坊智能合约交互

在以太坊和其他区块链中,仍有很多被证明的概念正在实施,开发人员在尝试如何应对这些新概念。作为dInvest 系列文章一部分,我也在研究以太坊并尝试在区块链中实施对冲基金。在上一篇文章中,我讨论了如何在python中启动和运行定量框架。在这篇文章中,我将介绍如何将python程序与以太坊智能合约集成。出于这样或那样的原因,可能也面临着这个问题,尽管以太坊提供了图灵完备语言,但并不是所有事情都能完成。

假设你已经在以太坊创建了一个简单的教程合约,现在想要看一些更高级的东西。我个人喜欢ManuelAráoz的Hitchhiker智能合约指南,以边可以开始使用更复杂的代码,设置testrpctruffle。建议大家看看。

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 FabricTendermint,旨在解决与其他编程语言兼容的问题,交易吞吐量等。因为他们是需要许可证的区块链我还没有给尝试他们,但有机会看看可能会很有趣。

当然,python用web3.py库开发以太坊来说非常的方便,有兴趣的用户可以关注我们的python以太坊教程,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。

这里是原文

    原文作者:malakashi
    原文地址: https://segmentfault.com/a/1190000016362460
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞