将您的代码从 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。
