一个用于分析智能合约和二进制文件的符号执行工具(貌似不止可以分析以太坊智能合约)
manticore example.sol
# 或
manticore project
'
Ethereum flags:
--verbose-trace 为每个状态转储一个额外的verbose追踪(默认:False)。
--txlimit TXLIMIT 运行的最大符号交易数(正整数)(默认:无)。
--txnocoverage 不使用覆盖率作为停止标准(默认:False)。
--txnoether 不尝试向合约发送乙醚(默认:False)。
--txaccount TXACCOUNT 符号交易中用作调用者的账户,可以是 "攻击者 "或 "所有者 "或 "combo1"(同时使用)(默认:攻击者)
--txpreconstrain 制约人类交易,以避免在合同函数调度器中出现异常(默认:False)。
--contract CONTRACT 在有多个合同的情况下要分析的合同名称(默认:无)
--avoid-constant 避免探索人类交易的常量函数(默认:False)。
--limit-loops 限制循环深度(默认:False)
--no-testcases 在分析结束后,不为发现的状态生成测试案例(默认为False)
--only-alive-testcases 分析结束后,不为无效/抛出的状态生成测试案例(默认为False)。
--thorough-mode 配置Manticore进行更详尽的探索。评估气体,为无效状态生成测试用例,探索常量函数,并运行一套小型的检测器。(默认:False)
Ethereum detectors:
--list-detectors 列出可用的检测器 (默认: False)
--exclude DETECTORS_TO_EXCLUDE 逗号分隔的应该被排除的探测器列表(默认: )
--exclude-all 排除所有探测器(默认为False)。
'
from manticore.ethereum import ManticoreEVM
m = ManticoreEVM() # 启动一个新区块链
user_account = m.create_account(balance=1*10**18) # 创建账户
# 读取合约源码
with open('example.sol') as f:
source_code = f.read()
# 部署合约
contract_account = m.solidity_create_contract(source_code, owner=user_account)
symbolic_var = m.make_symbolic_value() # 创建符号值
# symbolic_data = m.make_symbolic_buffer(320) # 创建符号字节数组
contract_account.f(symbolic_var) # 执行测试
print("Results are in {}".format(m.workspace)) # 测试结果输出到m.workspace
m.finalize() # stop the exploration # 停止测试
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
contract Simple {
function f(uint a) payable public{
if (a == 65) {
revert();
}
}
}
