macOS Monterey下Mythril分析智能合约plyvel报错咨询
问题描述
执行myth analyze <file>命令,使用Mythril v0.23.3分析智能合约时程序抛出异常退出,运行环境为2014年末款Mac Mini、macOS Monterey、Python 3.9,完整报错信息如下:
JX:Attack juanxavier$ myth analyze Counter.sol Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.9/bin/myth", line 33, in <module> sys.exit(load_entry_point('mythril==0.23.3', 'console_scripts', 'myth')()) File "/Library/Frameworks/Python.framework/Versions/3.9/bin/myth", line 25, in importlib_load_entry_point return next(matches).load() File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/importlib/metadata.py", line 86, in load module = import_module(match.group('module')) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 680, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 850, in exec_module File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed File "/Users/juanxavier/Library/Python/3.9/lib/python/site-packages/mythril/interfaces/cli.py", line 26, in <module> from mythril.mythril import ( File "/Users/juanxavier/Library/Python/3.9/lib/python/site-packages/mythril/mythril/__init__.py", line 3, in <module> from .mythril_config import MythrilConfig File "/Users/juanxavier/Library/Python/3.9/lib/python/site-packages/mythril/mythril/mythril_config.py", line 14, in <module> from mythril.ethereum.interface.leveldb.client import EthLevelDB File "/Users/juanxavier/Library/Python/3.9/lib/python/site-packages/mythril/ethereum/interface/leveldb/client.py", line 13, in <module> from mythril.ethereum.interface.leveldb.eth_db import ETH_DB File "/Users/juanxavier/Library/Python/3.9/lib/python/site-packages/mythril/ethereum/interface/leveldb/eth_db.py", line 3, in <module> import plyvel File "/Users/juanxavier/Library/Python/3.9/lib/python/site-packages/plyvel/__init__.py", line 6, in <module> from ._plyvel import ( # noqa ImportError: dlopen(/Users/juanxavier/Library/Python/3.9/lib/python/site-packages/plyvel/_plyvel.cpython-39-darwin.so, 0x0002): symbol not found in flat namespace '__ZTIN7leveldb10ComparatorE'
报错原因
报错触发点是Python加载plyvel动态库时找不到LevelDB对应的符号__ZTIN7leveldb10ComparatorE:
plyvel是Mythril依赖的Python-LevelDB绑定库,用于对接以太坊节点的LevelDB格式链上数据- 该问题是macOS平台下的典型依赖不兼容问题:pip默认安装的plyvel预编译wheel包,编译时链接的LevelDB版本和本地系统/Homebrew安装的LevelDB版本符号表不匹配,在macOS Monterey这类版本上极易出现动态链接失败的问题。
修复步骤
按顺序执行以下操作即可解决:
- 卸载当前已安装的异常版本依赖
pip uninstall -y mythril plyvel
- 通过Homebrew安装LevelDB及相关编译依赖
brew install leveldb snappy
- 强制从源码编译安装plyvel,跳过预编译wheel包,确保链接到本地安装的正确版本LevelDB
pip install plyvel --no-binary :all:
如果编译时提示找不到LevelDB头文件/库文件,执行以下命令指定编译路径后重新安装plyvel:
CFLAGS="-I$(brew --prefix leveldb)/include -L$(brew --prefix leveldb)/lib" pip install plyvel --no-binary :all:
- 重新安装对应版本的Mythril
pip install mythril==0.23.3
- 执行
myth --version验证命令可正常启动后,重新运行原分析命令即可。
内容的提问来源于stack exchange,提问作者JuanXavier
相关产品推荐
相关产品推荐

