将您的代码从 v4 迁移到 v5
原文:https://web3py.readthedocs.io/en/stable/v5_migration.html
Web3.py 遵循语义版本化,这意味着版本 5 引入了向后不兼容的变化。如果你的项目依赖于 Web3.py v4,那么你可能需要做一些改变。
以下是最常见的必需更新:
不再支持 Python 3.5
您需要升级到 Python 3.6 或 3.7
不再支持 v1
您需要将eth-abi
依赖项升级到 v2
对基础 API 的更改
JSON-RPC 更新
在 v4 中,JSON-RPC 调用查找事务或块,但没有找到它们,返回None
。现在,如果没有找到一个事务或块,将根据情况抛出一个BlockNotFound
或TransactionNotFound
错误。这适用于以下 web3 方法:
getTransaction()
会抛出一个TransactionNotFound
错误getTransactionReceipt()
会抛出一个TransactionNotFound
错误getTransactionByBlock()
会抛出一个TransactionNotFound
错误getTransactionCount()
会抛出一个BlockNotFound
错误getBlock()
会抛出一个BlockNotFound
错误getUncleCount()
会抛出一个BlockNotFound
错误getUncleByBlock()
会抛出一个BlockNotFound
错误
移除的方法
contract.functions.buildTransaction.<method name>
的contract.buildTransaction
被移除contract.constructor.transact
的contract.deploy
被移除contract.functions.<method name>.estimateGas
的contract.estimateGas
被移除contract.<functions/events>.<method name>.call
的contract.call
被移除contract.<functions/events>.<method name>.transact
的contract.transact
被移除contract.events.<event name>.createFilter
的contract.eventFilter
被移除middleware_stack
更名为middleware_onion()
web3.miner.hashrate
是hashrate()
的重复,已被删除。web3.version.network
是version()
的副本,已被移除。web3.providers.tester.EthereumTesterProvider
和web3.providers.tester.TestRPCProvider
已被删除为EthereumTesterProvider()
web3.eth.enableUnauditedFeatures
被删除web3.txpool
被移至txpool()
web3.clientVersion
的web3.version.node
被移除web3.version.ethereum
被删除为protocolVersion()
- 重新定位个人 RPC 端点以反映奇偶校验和 Geth 实施:
web3.personal.listAccounts
被删除为listAccounts()
或listAccounts()
或web3.personal.importRawKey
被删除为importRawKey()
或importRawKey()
或web3.personal.newAccount
被删除为newAccount()
或newAccount()
或web3.personal.lockAccount
被删除为lockAccount()
web3.personal.unlockAccount
被删除为unlockAccount()
或unlockAccount()
或web3.personal.sendTransaction
被删除为sendTransaction()
或sendTransaction()
或
- 将
web3.admin
模块重新定位到web3.geth
名称空间 - 将
web3.miner
模块重新定位到web3.geth
名称空间
不推荐的方法
预计 v6 中将删除以下方法:
web3.sha3
已被弃用于keccak()
web3.soliditySha3
已被弃用于solidityKeccak()
chainId()
被弃用为chainId()
。详情请见第 #1293 期web3.eth.getCompilers()
已被弃用,不会被替换getTransactionFromBlock()
已被弃用于getTransactionByBlock()
已弃用的简明合约和隐含合约
在版本 6 中,已经不推荐使用 ConciseContract 和 ImplicitContract,并且将被删除。
ImplicitContract 实例将需要使用详细语法。例如:
contract.functions.<function name>.transact({})
已经用 ContractCaller API 替换了 ConciseContract。现在,您可以使用以下方法,而不是使用简明合约工厂:
contract.caller.<function_name>
或者经典的合约语法:
contract.functions.<function name>.call()
。
一些更具体的例子可以在合约呼叫者文档中找到
经理供应商
在 v5 中,只允许一个供应商。虽然允许多个供应商是我们希望在未来支持的一个特性,但是 v4 中处理多个供应商的方式并不理想。他们唯一能做的就是撤退。没有任何循环机制,也没有任何选择供应商的控制。最终,想法是扩展管理器 API,以支持将定制逻辑注入到供应商选择过程中。
目前来看,manager.providers
改成了manager.provider
。同样的,web3.providers
的实例被改成了web3.provider
。
测试网变化
Web3.py 将不再自动在 IPCProvider 中查找 testnet 连接。应该用类似from web3.auto.infura.ropsten import w3
的东西来代替。
实体
Web3.py 已经停止推断域名的.eth
TLD。如果使用域名而不是地址,您需要指定 TLD。如果 TLD 丢失,将抛出一个InvalidTLD
错误。
必需的 Infura API 密钥
为了在 2019 年 3 月 27 日之后与 Infura 交互,您需要设置一个名为WEB3_INFURA_PROJECT_ID
的环境变量。你可以通过访问https://infura.io/register获得一个项目 id。