You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:10:59