跳转至

将您的代码从 v3 迁移到 v4

原文:https://web3py.readthedocs.io/en/stable/v4_migration.html

Web3.py 遵循语义版本化,这意味着版本 4 引入了向后不兼容的变化。如果你的项目依赖于 Web3.py v3,那么你可能需要做一些改变。

以下是最常见的必需更新:

Python 2 到 Python 3

v4 仅支持 Python 3。如果你运行的是 Python 2,是时候升级了。我们推荐使用 2to3 ,这可以让你的大部分代码自动与 Python 3 兼容。

与 Web3.py 相关的最重要的更新是新的 bytes 类型。在整个库中,每当处理不能保证是文本的数据时,都会定期使用它。

Web3.py 中的许多不同方法都接受文本或二进制数据,如合约方法、事务细节和加密函数。下面的例子使用了sha3(),但是同样的模式也适用于其他地方。

在 v3 & Python 2 中,您可能已经这样计算了二进制数据的散列:

>>> Web3.sha3('I\xe2\x99\xa5SF')
'0x50a826df121f4d076a3686d74558f40082a8e70b3469d8e9a16ceb2a79102e5e' 

或者,您可能已经这样计算了文本数据的散列:

>>> Web3.sha3(text=u'I♥SF')
'0x50a826df121f4d076a3686d74558f40082a8e70b3469d8e9a16ceb2a79102e5e' 

在切换到 Python 3 之后,这些将被执行为:

>>> Web3.sha3(b'I\xe2\x99\xa5SF')
HexBytes('0x50a826df121f4d076a3686d74558f40082a8e70b3469d8e9a16ceb2a79102e5e')

>>> Web3.sha3(text='I♥SF')
HexBytes('0x50a826df121f4d076a3686d74558f40082a8e70b3469d8e9a16ceb2a79102e5e') 

注意,返回值也是不同的:您可以像对待任何其他字节值一样对待 hexbytes.main.HexBytes ,但是控制台上的表示向您显示了这些字节的十六进制编码,以便于直观比较。

这需要一点时间来适应,但新的 py3 型要好得多。我们保证。

过滤

过滤器通常不像人们希望的那样工作。

解决这些问题的第一步是通过删除轮询逻辑来简化它们。现在,您必须明确请求更新您的过滤器。这意味着请求过程中的任何异常都会出现在您的代码中。

在 v3 中,那些异常(比如“没有找到过滤器”)被自动轮询逻辑默默地吞噬了。下面是在新的块散列出现时打印它们的调用:

>>> def new_block_callback(block_hash):
...     print "New Block: {0}".format(block_hash)
...
>>> new_block_filter = web3.eth.filter('latest')
>>> new_block_filter.watch(new_block_callback) 

在 v4 中,同样逻辑:

>>> new_block_filter = web3.eth.filter('latest')
>>> for block_hash in new_block_filter.get_new_entries():
...     print("New Block: {}".format(block_hash)) 

调用者负责轮询来自get_new_entries()的结果。参见 异步过滤器轮询 获取 web3 v4 的过滤器事件处理示例。

TestRPCProvider 和 EthereumTesterProvider

这些供应商相当罕见。如果你不认识这些名字,你可以跳过这一部分。

但是,如果您使用 web3.py 测试合约,您可能已经使用了 TestRPCProvider 或 EthereumTesterProvider。

在 v4 中有一个新的EthereumTesterProvider,旧的 v3 实现已经被移除。Web3.py v4 在引擎盖下使用了eth_tester.main.EthereumTester,而不是 eth-testrpc。虽然eth-tester仍处于测试阶段,但许多部分已经比 testrpc 更好了,所以我们决定在 v4 中替换它。

如果您正在使用 TestRPC,或者正在显式地导入 EthereumTesterProvider,比如:from web3.providers.tester import EthereumTesterProvider,那么您将需要更新。

用 v4 你应该用from web3 import EthereumTesterProvider导入。和以前一样,您需要安装 Web3.py 和额外的tester来获得这些特性,比如:

$ pip install web3[tester] 

对基本 API 便利方法的更改

Web3.toDecimal()

为了更加清晰,v4 中的Web3.toDecimal()被重命名为toInt()。它不返回一个 decimal.Decimal ,它返回一个 int

移除的方法

  • Web3.toUtf8toText()被移除。
  • Web3.fromUtf8toHex()被移除。
  • Web3.toAsciitoBytes()被移除。
  • Web3.fromAsciitoHex()被移除。
  • Web3.fromDecimaltoHex()被移除。

提供商访问

在 v4 中,w3.currentProvider被删除,取而代之的是w3.providers

消除字符串输入的歧义

在许多情况下,任意字符串输入可能是十六进制编码的字节串,也可能是文本中的 unicode 字符。它们在 Web3.py 中被命名为hexstrtext,你可以通过使用适当的关键字参数来指定你拥有哪种 str 。参见 编解码助手 中的例子。

在 v3 中,一些方法接受了一个 str 作为第一个位置参数。在 v4 中,必须将字符串作为hexstrtext关键字参数之一进行传递。

不再接受不明确字符串的著名方法:

  • sha3()
  • toBytes()

合约

  • 当合约返回 ABI 类型string时,Web3.py v4 现在通过使用 UTF-8 解码底层字节来返回一个 str 值。
  • 当合约返回 ABI 类型bytes(任意长度)时,Web3.py v4 现在返回一个 bytes

个人 API

w3.personal.signAndSendTransaction不再可用。用w3.personal.sendTransaction()代替。



回到顶部