资讯专栏INFORMATION COLUMN

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

Joyven / 1727人阅读

摘要:合约规定了公共职能部门,以创造新的投资和撤资,这将成为对冲基金的主要职能。对冲基金的用户通过其以太坊地址来识别,该地址相当于公钥。我发现与其他程序如程序的以太坊智能合约进行交互的最简单方法是使用他们的。

在以太坊和其他区块链中,仍有很多被证明的概念正在实施,开发人员在尝试如何应对这些新概念。作为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进行区块链以太坊开发的详解。

这里是原文

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42428.html

相关文章

  • Python以太区块链交互将数据存入数据库

    摘要:是一个用于连接以太坊区块链的库。网络执行以太坊协议,该协议定义节点彼此之间的交互规则及网络上的智能合约。数据库设计下一步是设计数据库。 关于区块链介绍性的研讨会通常以易于理解的点对点网络和银行分类账这类故事开头,然后直接跳到编写智能合约,这显得非常突兀。因此,想象自己走进丛林,想象以太坊区块链是一个你即将研究的奇怪生物。今天我们将观察该生物,并与其进行交互然后将有关它的所有数据收集到一...

    paulli3 评论0 收藏0
  • Python以太区块链交互将数据存入数据库

    摘要:是一个用于连接以太坊区块链的库。网络执行以太坊协议,该协议定义节点彼此之间的交互规则及网络上的智能合约。数据库设计下一步是设计数据库。 关于区块链介绍性的研讨会通常以易于理解的点对点网络和银行分类账这类故事开头,然后直接跳到编写智能合约,这显得非常突兀。因此,想象自己走进丛林,想象以太坊区块链是一个你即将研究的奇怪生物。今天我们将观察该生物,并与其进行交互然后将有关它的所有数据收集到一...

    baukh789 评论0 收藏0
  • python借助web3py以太区块链节点交互的几种方式

    摘要:通信服务提供接口是如何与区块链交互的关键。这通常通过将请求提交给基于或套接字的服务器来完成。初始化时会发生自动检测有时,无法自动检测节点的位置。使用自动检测的示例一些节点提供超出标准的。是套接字的文件系统路径。 通信服务提供接口是web3如何与区块链交互的关键。接口接受JSON-RPC请求并返回响应。这通常通过将请求提交给基于HTTP或IPC套接字的服务器来完成。 如果你已经愉快地连接...

    booster 评论0 收藏0

发表评论

0条评论

Joyven

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<