将您的代码从 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.toUtf8
因toText()
被移除。Web3.fromUtf8
因toHex()
被移除。Web3.toAscii
因toBytes()
被移除。Web3.fromAscii
因toHex()
被移除。Web3.fromDecimal
因toHex()
被移除。
提供商访问
在 v4 中,w3.currentProvider
被删除,取而代之的是w3.providers
。
消除字符串输入的歧义
在许多情况下,任意字符串输入可能是十六进制编码的字节串,也可能是文本中的 unicode 字符。它们在 Web3.py 中被命名为hexstr
和text
,你可以通过使用适当的关键字参数来指定你拥有哪种 str
。参见 编解码助手 中的例子。
在 v3 中,一些方法接受了一个 str
作为第一个位置参数。在 v4 中,必须将字符串作为hexstr
或text
关键字参数之一进行传递。
不再接受不明确字符串的著名方法:
sha3()
toBytes()
合约
- 当合约返回 ABI 类型
string
时,Web3.py v4 现在通过使用 UTF-8 解码底层字节来返回一个str
值。 - 当合约返回 ABI 类型
bytes
(任意长度)时,Web3.py v4 现在返回一个bytes
值
个人 API
w3.personal.signAndSendTransaction
不再可用。用w3.personal.sendTransaction()
代替。