Web3智能合约部署报错:VM执行回滚问题求助
部署智能合约时触发VM Exception (revert) 错误求助
在使用Web3部署智能合约时,部署过程触发错误导致合约执行回滚,错误信息显示交易处理时出现VM Exception,具体提示为“revert”。预期合约能成功部署,目标是在指定网络上部署具备给定ABI和bytecode的可用合约,寻求解决该问题的方法。
相关代码
import solcx from web3 import Web3 import json def compile_source_file(file_path): compiled_file = solcx.compile_files([file_path], output_values=["abi", "bin-runtime"], solc_version="0.8.0") return compiled_file def deploy_smart_contract(compiled_details): abi = next(iter(compiled_details.values()))["abi"] bytecode = next(iter(compiled_details.values()))["bin-runtime"] w3 = Web3(Web3.HTTPProvider("HTTP://127.0.0.1:7545")) account = w3.eth.accounts[0] Greeter = w3.eth.contract(abi=abi, bytecode=bytecode) tx_hash = Greeter.constructor().transact() tx_receipt = w3.eth.wait_for_transaction_receipt(tx_hash) contract = w3.eth.contract( address=tx_receipt.contractAddress, abi=abi ) greeting_value = contract.functions.greet().call() print("Greeting Value:", greeting_value) sol_file_path = "contract.sol" sol_compiled_file = compile_source_file(sol_file_path) deploy_smart_contract(sol_compiled_file)
报错信息
Traceback (most recent call last): File "D:\Accumulate\new_02_02\document_2.py", line 34, in <module> deploy_smart_contract(sol_compiled_file) File "D:\Accumulate\new_02_02\document_2.py", line 20, in deploy_smart_contract tx_hash = Greeter.constructor().transact() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\eth_utils\decorators.py", line 18, in _wrapper return self.method(obj, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\contract\contract.py", line 624, in transact return self.w3.eth.send_transaction(self._get_transaction(transaction)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\eth\eth.py", line 381, in send_transaction return self._send_transaction(transaction) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\module.py", line 75, in caller result = w3.manager.request_blocking( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\manager.py", line 325, in request_blocking response = self._make_request(method, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\manager.py", line 213, in _make_request return request_func(method, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\middleware\gas_price_strategy.py", line 100, in middleware return make_request(method, (transaction,)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\middleware\formatting.py", line 126, in middleware response = make_request(method, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\middleware\attrdict.py", line 43, in middleware response = make_request(method, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\middleware\formatting.py", line 126, in middleware response = make_request(method, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\middleware\formatting.py", line 126, in middleware response = make_request(method, params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\middleware\buffered_gas_estimate.py", line 40, in middleware hex(get_buffered_gas_estimate(w3, transaction)), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\_utils\transactions.py", line 154, in get_buffered_gas_estimate gas_estimate = w3.eth.estimate_gas(gas_estimate_transaction) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\eth\eth.py", line 311, in estimate_gas return self._estimate_gas(transaction, block_identifier) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\module.py", line 75, in caller result = w3.manager.request_blocking( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\manager.py", line 326, in request_blocking return self.formatted_response( ^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\manager.py", line 287, in formatted_response apply_error_formatters(error_formatters, response) File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\manager.py", line 104, in apply_error_formatters formatted_resp = pipe(response, error_formatters) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "cytoolz\\functoolz.pyx", line 680, in cytoolz.functoolz.pipe File "cytoolz\\functoolz.pyx", line 655, in cytoolz.functoolz.c_pipe File "D:\Accumulate\new_02_02\env\Lib\site-packages\web3\_utils\contract_error_handling.py", line 154, in raise_contract_logic_error_on_revert raise ContractLogicError(f"execution reverted: {message}", data=data) web3.exceptions.ContractLogicError: execution reverted: VM Exception while processing transaction: revert
问题排查与修复方案
1. 核心错误:字节码类型使用错误
代码中编译时获取的是bin-runtime(合约运行时代码),但部署合约需要的是bin(合约创建字节码)。bin-runtime不包含构造函数执行逻辑,用它部署会直接触发revert。
修复代码:
修改编译函数的output_values,并调整部署时的字节码获取:
def compile_source_file(file_path): compiled_file = solcx.compile_files([file_path], output_values=["abi", "bin"], # 替换bin-runtime为bin solc_version="0.8.0") return compiled_file def deploy_smart_contract(compiled_details): abi = next(iter(compiled_details.values()))["abi"] bytecode = next(iter(compiled_details.values()))["bin"] # 替换bin-runtime为bin # 后续代码不变
2. 其他可能的排查点
- 构造函数逻辑检查:查看
contract.sol中的构造函数,是否有require、revert语句,或者需要传入参数但部署时未提供。如果构造函数需要参数,部署时要在Greeter.constructor(参数).transact()中传入对应值。 - 账户余额验证:确保
w3.eth.accounts[0]有足够的ETH支付gas费,可通过print(w3.eth.get_balance(account))查看余额。 - 网络连接确认:检查Ganache或本地测试节点是否正常运行,端口7545是否可访问。
- 版本兼容性:确认Solidity合约代码是用0.8.0版本编写的,避免语法不兼容问题。
内容的提问来源于stack exchange,提问作者abhishek kale
相关产品推荐
相关产品推荐

