MisakuraRinn/OneSavieBastet_FINAL
GitHub: MisakuraRinn/OneSavieBastet_FINAL
该项目是一条面向智能合约审计 Kaggle 竞赛的可复现 pipeline,通过映射公开审计 findings 并结合 DeepSeek 模型审查来生成高精度竞赛提交。
Stars: 0 | Forks: 0
# OneSavie Bastet Pipeline
用于 OneSavie Bastet Kaggle 竞赛的离线审计 pipeline。
当前的高价值路径会将测试代码库映射回其公开审计竞赛,导入被评为 High 和 Medium 的 findings,使用 DeepSeek 进行分类法分类,并构建一个精度优先的 400 行提交。有关最新得分、构建产物、确切命令和后续工作,请参阅 [`docs/STATUS.md`](docs/STATUS.md)。长期实验记录在 [`docs/ROADMAP.md`](docs/ROADMAP.md) 中。
静态扫描器仍作为补充路径提供:
1. 解压公开的 Kaggle 压缩包,
2. 扫描每个 Solidity 代码库以寻找有证据支持的候选项,
3. 可选地将候选项导出到 API 模型进行二审,
4. 在本地对验证预测进行评分,
5. 组装一份严格匹配 `sample_submission.csv` 的 400 行 CSV。
该基线仅需 Python 3.12 即可运行。Slither、Mythril、sentence-transformers 和 API 模型是可选的扩展层。
## 公开仓库范围
本仓库包含 pipeline 源码、测试、文档,以及位于 `reproduction/v2/` 下的经过净化处理的冻结 V2 排名。冻结的排名仅包含重现历史提交所需的字段;原始 API 元数据和 prompt 已被移除。本仓库不发布 Kaggle 竞赛文件、下载的 Solidity 代码库、模型缓存、原始 API 响应、完整的生成的 finding 语料库或生成的提交 CSV。这些构建产物保留在被忽略的 `data/` 和 `work/` 目录中。
切勿提交 Kaggle 或 DeepSeek 凭证。以下命令会将凭证存储在仓库外部,或仅将其保留在当前进程中。
## 从全新克隆重现
### 完全冻结 V2 重现
此路径不需要 Kaggle 数据或 API key。它从已发布的冻结排名中确定性地组装出历史提交:
```
git clone https://github.com/MisakuraRinn/OneSavieBastet_FINAL.git
cd OneSavieBastet_FINAL
python3 -m venv .venv
.venv/bin/python -m pip install -e .
.venv/bin/python -m bastet submit \
--sample reproduction/v2/submission_schema.csv \
--reviews reproduction/v2/public_finding_ranked.jsonl \
--out reproduction/v2/submission_v2_public.csv \
--target-rows 400 \
--min-confidence 0 \
--per-repo-cap 100
(cd reproduction/v2 && sha256sum --check SHA256SUMS)
```
预期结果:
```
public_finding_ranked.jsonl: OK
submission_schema.csv: OK
submission_v2_public.csv: OK
```
### 完整 Pipeline 重生成
完整路径会根据竞赛数据、公开审计报告和新的模型审查重新创建冻结排名。由于模型输出和外部报告可能会发生变化,它可以重现 pipeline,但不保证能够逐字节重现历史提交。
前置条件:
- Python 3.12
- `onesavie-bastet` Kaggle 竞赛已接受的规则
- Kaggle API token
- 用于分类法审查阶段的 DeepSeek API key
克隆并创建一个隔离的环境:
```
git clone https://github.com/MisakuraRinn/OneSavieBastet_FINAL.git
cd OneSavieBastet_FINAL
python3 -m venv .venv
.venv/bin/python -m pip install --upgrade pip
.venv/bin/python -m pip install -e '.[data]'
.venv/bin/python -m unittest discover -s tests -v
```
下载竞赛 CSV 文件和关联的训练/测试源码压缩包:
```
.venv/bin/python -m bastet download --login --out-dir data/raw
.venv/bin/python -m bastet unpack \
--raw-dir data/raw \
--out-dir data/extracted
.venv/bin/python -m bastet fetch-sources --split train
.venv/bin/python -m bastet fetch-sources --split test
```
恢复针对训练和测试代码库的已评判的 Code4rena findings,使训练 findings 与竞赛的分类法对齐,并构建测试 prompt:
```
.venv/bin/python -m bastet public-findings \
--root data/extracted/train \
--out work/train_code4rena_findings.jsonl
.venv/bin/python -m bastet public-findings \
--root data/extracted/test \
--out work/code4rena_findings.jsonl
.venv/bin/python -m bastet label-findings \
--findings work/train_code4rena_findings.jsonl \
--labels data/raw/train.csv \
--out work/labeled_public_findings.jsonl
.venv/bin/python -m bastet finding-prompts \
--findings work/code4rena_findings.jsonl \
--labeled-findings work/labeled_public_findings.jsonl \
--labels data/raw/train.csv \
--out work/public_finding_prompts.jsonl
```
配置模型 key 并创建分类法审查:
```
.venv/bin/python -m bastet configure-deepseek
.venv/bin/python -m bastet api-review \
--prompts work/public_finding_prompts.jsonl \
--out work/public_finding_reviews.jsonl \
--model deepseek-v4-flash \
--workers 8
```
API 审查是可恢复的,但不保证每次运行之间的模型输出完全相同。在输入的 finding、审查、分类法和源代码树固定的情况下,以下排名、组装和验证阶段是确定性的。
构建兼容 V2 的提交:
```
.venv/bin/python -m bastet rank-findings \
--findings work/code4rena_findings.jsonl \
--reviews work/public_finding_reviews.jsonl \
--labels data/raw/train.csv \
--root data/extracted/test \
--ranking-profile v2 \
--out work/public_finding_ranked.jsonl
.venv/bin/python -m bastet submit \
--sample data/raw/submission_example.csv \
--reviews work/public_finding_ranked.jsonl \
--out work/submission_v2_public.csv \
--target-rows 400 \
--min-confidence 0 \
--per-repo-cap 100
.venv/bin/python -m bastet validate-submit \
--submission work/submission_v2_public.csv \
--sample data/raw/submission_example.csv \
--test data/raw/test.csv \
--target-rows 400
```
对于冻结的历史 V2 输入,最终文件与排行榜提交在字节上是完全一致的:
```
printf '%s %s\n' \
'9e101bef44831f9ee53c7551fb750ea407d4941c05ba189f1ffd36fc2c30b4de' \
'work/submission_v2_public.csv' | sha256sum --check
```
## 当前提交
`work/submission_v2_public.csv` 是当前的排行榜基线,得分为 `323.27423`。更广泛的 v4 覆盖实验得分为 `200.87413`,因此 v5 路径保留了完全相同的 v2 候选项标识,仅重新校准了分类法和描述。核心的 Code4rena 生成流程为:
```
.venv/bin/python -m bastet rank-findings \
--findings work/code4rena_findings.jsonl \
--reviews work/public_finding_reviews.jsonl \
--labels data/raw/train.csv \
--root data/extracted/test \
--ranking-profile v2 \
--out work/public_finding_ranked.jsonl
.venv/bin/python -m bastet submit \
--sample data/raw/submission_example.csv \
--reviews work/public_finding_ranked.jsonl \
--out work/submission_v2_public.csv \
--target-rows 400 \
--min-confidence 0 \
--per-repo-cap 100
.venv/bin/python -m bastet validate-submit \
--submission work/submission_v2_public.csv \
--sample data/raw/submission_example.csv \
--test data/raw/test.csv \
--target-rows 400
```
重现的 V2 CSV 的预期 SHA-256 为 `9e101bef44831f9ee53c7551fb750ea407d4941c05ba189f1ffd36fc2c30b4de`。
`v2` 排序配置文件冻结了原始评分行为;默认的 `enhanced` 配置文件包含了后来基于标识符的证据,并特意产生了不同的行顺序。
当前的 v5 候选项是通过替换这同样 400 个候选项标识中的字段生成的:
```
.venv/bin/python -m bastet recalibrate-submission \
--baseline work/submission_v2_public.csv \
--findings work/code4rena_findings.jsonl \
--identity-reviews work/public_finding_ranked.jsonl \
--reviews work/test_public_bge_ranked.jsonl \
--out work/submission_v5_bge_single_label.csv \
--description-style review \
--tag-style original \
--subtag-style original
```
使用以下命令获取 Sherlock 评判摘要:
```
.venv/bin/python -m bastet public-findings \
--source sherlock \
--root data/extracted/test \
--out work/sherlock_findings.jsonl
```
## 布局
推荐的本地布局:
```
data/
raw/
train.zip
test.zip
sample_submission.csv
extracted/
work/
candidates.jsonl
prompts.jsonl
reviews.jsonl
submission.csv
```
## 命令
安装数据下载依赖:
```
python3 -m venv .venv
.venv/bin/pip install '.[data]'
```
在 Kaggle 上接受竞赛规则,然后在 `https://www.kaggle.com/settings/api` 创建一个 token,接着下载数据。`--login` 会在不显示 token 的情况下进行提示,并仅将其保留在当前进程中:
```
.venv/bin/python -m bastet download --login --out-dir data/raw
```
如果 Kaggle 提供的是 zip 压缩包,请解压它们:
```
python3 -m bastet unpack --raw-dir data/raw --out-dir data/extracted
```
代码库压缩包是从竞赛的 Data Description 中链接的,而不是与 Kaggle CSV 下载打包在一起的。为了避免下载媒体和 Git 历史记录,请使用范围下载(range-download)仅获取 Solidity、Markdown 和构建配置文件:
```
.venv/bin/python -m bastet fetch-sources --split test
.venv/bin/python -m bastet fetch-sources --split train
```
扫描代码库并写入静态候选项:
```
python3 -m bastet scan --root data/extracted/test --out work/candidates.jsonl --facts-dir work/facts
```
在消耗 API token 之前选择一个多样化的子集:
```
python3 -m bastet select \
--candidates work/candidates.jsonl \
--out work/selected_candidates.jsonl \
--per-repo-cap 6 \
--per-rule-cap 2
```
为每个选定的候选项导出一个 prompt 以供模型审查:
```
python3 -m bastet prompts \
--candidates work/selected_candidates.jsonl \
--root data/extracted/test \
--train-labels data/raw/train.csv \
--out work/prompts.jsonl
```
将 DeepSeek key 存储在仓库外部。输入是隐藏的:
```
.venv/bin/python -m bastet configure-deepseek
```
首次处理使用 Flash thinking 模式。输出采用仅追加模式,并通过 `candidate_id` 恢复,因此可以重新启动被中断的运行:
```
.venv/bin/python -m bastet api-review \
--prompts work/prompts.jsonl \
--out work/flash_reviews.jsonl \
--model deepseek-v4-flash \
--workers 8
```
过滤出 Flash 有效的候选项并使用 Pro 进行确认:
```
.venv/bin/python -m bastet filter-prompts \
--prompts work/prompts.jsonl \
--reviews work/flash_reviews.jsonl \
--out work/pro_prompts.jsonl
.venv/bin/python -m bastet api-review \
--prompts work/pro_prompts.jsonl \
--out work/pro_reviews.jsonl \
--model deepseek-v4-pro \
--workers 4
```
在进行完整运行之前,使用 `--limit 5` 进行低成本的连通性和输出格式测试。
创建一个离线启发式审查文件作为首次提交的基线:
```
python3 -m bastet local-review --candidates work/candidates.jsonl --out work/reviews.jsonl --min-confidence 0.72
```
构建 Kaggle CSV:
```
python3 -m bastet submit \
--sample data/raw/submission_example.csv \
--reviews work/pro_reviews.jsonl \
--candidates work/selected_candidates.jsonl \
--out work/submission.csv \
--target-rows 400 \
--per-repo-cap 6
python3 -m bastet validate-submit \
--submission work/submission.csv \
--sample data/raw/submission_example.csv \
--test data/raw/test.csv
```
运行简单的端到端基线:
```
python3 -m bastet run-baseline \
--root data/extracted/test \
--sample data/raw/sample_submission.csv \
--out-dir work
```
根据训练标签对验证预测进行评分:
```
python3 -m bastet score --truth data/train_labels.csv --pred work/reviews.jsonl --out work/score.json
```
评分器是一个近似值。如果 `sentence-transformers` 和本地/缓存的 BGE 模型可用,请传入 `--semantic-model BAAI/bge-large-en-v1.5`;否则它将回退到 token 余弦相似度。
安装可选的 embedding 工具以进行语义对齐和校准:
```
.venv/bin/pip install '.[embeddings]'
```
Embedding 模型和缓存属于 `work/` 目录,且不应被提交。
## 密钥
切勿将真实的 API key 放入此仓库、notebook、prompt 或已提交的 `.env` 文件中。`configure-deepseek` 会将 key 写入 `~/.config/onesavie-bastet/secrets.json`,权限模式为 `600`。环境变量会覆盖该文件。对于单次会话设置:
```
read -rsp "DeepSeek API key: " DEEPSEEK_API_KEY
export DEEPSEEK_API_KEY
echo
```
对于反复的本地使用,请将 key 保留在密码管理器或用户专属文件(例如 `~/.config/onesavie-bastet/secrets.env`)中,置于仓库外部,将其权限模式设置为 `600`,并在运行审查命令之前将其 source。
## 审查 JSONL
提交构建器接受原始候选项或已审查的候选项。已审查的记录应包含:
```
{
"is_valid": true,
"repo_path": "repo-name",
"tag": "access_control",
"subtag": "missing-auth",
"severity": "high",
"description": "External withdraw can be called by any account...",
"confidence": 0.84,
"evidence": {"file": "src/Vault.sol", "line": 42}
}
```
低置信度行、无效审查、重复项以及没有可用描述的候选项会在组装 CSV 之前被过滤掉。
标签:DLL 劫持, Web3安全, 大语言模型, 智能合约审计, 机器学习竞赛, 自动化流水线, 逆向工具, 静态代码扫描