主页 > imtoken钱包地址 > Python使用web3py与以太坊智能合约交互

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

imtoken钱包地址 2023-01-26 05:19:41

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

以太坊和其他区块链中仍有许多经过验证的概念正在实施,开发人员正在努力弄清楚如何处理这些新概念。 作为 dInvest 系列的一部分,我也在研究以太坊并尝试在区块链中实施对冲基金。 在上一篇文章中,我讨论了如何在 python 中启动和运行量化框架。 在这篇文章中以太坊 智能合约,我将描述如何将 python 程序与以太坊智能合约集成。 出于某种原因,人们也可能面临这个问题,虽然以太坊提供了一种图灵完备的语言,但并不是所有事情都可以完成。

假设您已经在以太坊中创建了一个简单的教程合约,现在想看一些更高级的东西。 我个人喜欢 Manuel Aráoz 的 Hitchhiker 智能合约指南,作为开始使用更复杂代码、设置 testrpc 和 truffle 的一种方式。 我建议你看一看。

dInvest 智能合约

dInvest 由一个智能合约组成,负责进行投资、验证投资标准和分配回报。 该合同规定了创建新投资和撤资的公共职能,这将是对冲基金的主要职能。 对冲基金的用户通过他们的以太坊地址来识别,这相当于一个公钥。 关于投资策略和策略执行的建议是在具有以太坊地址的不同代理中完成的。 这些代理仅由合约创建者设置。 当用户创建投资时,他或她可以根据标准行业分类代码指定由两位数字标识的行业部门列表。 这些行业可以在投资时被识别为黑名单。 因此,用户有能力控制对冲基金将投资的行业。

该合同可以在 GitHub 存储库中找到。

与智能合约的交互

要与智能合约交互,有多种选择,包括 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 的最简单方法是复制/粘贴你的代码。 然后按右上角的编译按钮将接口字段中的整个字符串复制到您的合同名称.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。 也可以看看。 确保在启动程序之前运行您最喜欢的以太坊客户端(例如 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开发区块链以太坊的详细介绍。

这里是原文