Deploy / build (push) Successful in 22s
- performUpkeep: external callable, re-check is mandatory security (not stale-data hygiene) - BasicNft.tokenURI: ownerOf -> _ownerOf, dead custom error explained - storage (SSTORE) vs EIP-170 runtime bytecode separated, derived ~1.3M gas for the two SVGs - subs-15 retimed from a fresh faster-whisper word alignment (10.84s first line, was 28.22s) + SRT regenerated - RDAP needs curl -L (bootstrap 302), ASN/Spamhaus blocklist check added - learning-project framing -> Sepolia reference implementation / testnet validation build - dynamicCta on the two posts that ended with no conversion block - cross-links between the two NFT posts; tracker 91/91 approved
39 lines
5.4 KiB
Markdown
39 lines
5.4 KiB
Markdown
# `blog.hoelee.com` 外部顾问审阅报告 — Batch-04 复审(5 篇 · tutorials + web3)
|
||
|
||
> **批次**:`Batch-04`(tracker 内部编号) 5 篇:2 篇 `tutorials` + 3 篇 `web3`,双语共 10 个文件
|
||
> **顾问结论分布**:需微调 3 篇 · 局部重构 1 篇 · 通过(附微调)1 篇
|
||
> **落地状态**:5 篇全部修改完成,`audit-tracker.json` 已标记 `approved`(全库 91/91)
|
||
> **验证**:`npm run build` 通过(Pagefind 索引 319 页 / 35,342 词,0 build error)
|
||
|
||
---
|
||
|
||
## 逐篇落地执行
|
||
|
||
| # | Slug | 顾问结论 | 已落地修改 |
|
||
| --- | --- | --- | --- |
|
||
| 01 | `generating-subtitles-for-songs-without-timestamps` | 需微调 | 1. **Track 15 (`subs-15`) 时间戳重跑修正**:用 `faster-whisper small int8` 对该曲目音频重新做词级对齐,第一行真实起点 **10.84 s**(原稿 28.22 s),整段主歌原本被压成 6×1.20 s 硬下限;LRC 与 `/subs/green-train-to-the-sea.srt` 一并重生成;<br>2. 正文新增 **Failure C** 记录这次夹逼伪影(含重跑前后数字),把 bug 写进规则叙事;<br>3. 覆盖率表头 `Lines fully anchored` → `Songs fully anchored`(值本就是 9/18、11/11 首);<br>4. 明确中文 0.70 / 11 首来自**另一批 11 首中文验证集**,不是本页播放器;<br>5. 新增物理锚点:18 首全部在 **Core i9-13900K**(Windows 虚拟机)CPU int8 对齐,并解释 GPU 留给生成管线的取舍;删除与 `blueprintLayer: L3-local-gpu-inference` 冲突的 `GPU used: none` 行(L3 层定义本身就包含 faster-whisper 对齐,故保留层级、改用文字消解冲突);<br>6. 修正 `I climbs` → `I climb`、`a ancient` → `an ancient`;<br>7. frontmatter 加 `dynamicCta: true` 补齐转化闭环。 |
|
||
| 02 | `how-to-verify-a-hosting-provider-before-you-buy` | 需微调 | 1. `curl -s` → `curl -sL`(`rdap.org` 是 bootstrap,302 到注册局),`python` → `python3`,并补一段说明不加 `-L` 会 `Expecting value: line 1 column 1`;<br>2. 第 3 节补 **ASN 归属 + IP 段黑名单(`bgp.he.net` / Spamhaus)** 核查要点,兑现导语承诺;<br>3. 按业主口述改为**不精确量级**表述("一轮下来名单上大多数都被筛掉")并声明未留打分表,不引用顾问虚构的 12→9;<br>4. frontmatter 加 `dynamicCta: true`。 |
|
||
| 03 | `chainlink-vrf-v2-lottery-contract` | 需微调 | 1. **技术硬伤修正**:`performUpkeep` 是接口规定的无权限 `external` 函数,链上任何人都能调用,内部重跑 `checkUpkeep` 是防任意外部调用者强行开奖的强制安全边界(原文"只能被网络调用"错误);<br>2. 代码片段 `msgValue` → `msg.value`;<br>3. 人设升级:`learning project` → **Sepolia 参考实现与验证沙盒**(首尾两处),并指向文末四项主网加固。 |
|
||
| 04 | `fully-on-chain-svg-nfts` | 局部重构 | 1. **合约死代码修正**:`BasicNft.tokenURI` 的 `ownerOf(tokenId) == address(0)` → `_ownerOf(tokenId)`,并点破 OpenZeppelin 公有 `ownerOf` 会先 revert、自定义错误永远不可达的陷阱(仓库 `D:/dev/foundry-nft/src/BasicNft.sol` 实为原写法,属真实教训);<br>2. **EVM 概念拆清**:构造函数参数写入走 `SSTORE` 进 **Storage**(542 + 1,469 字节 → 17+46 数据槽 ≈ **130 万 gas**),受区块 gas / EIP-3860 `initcode` 49,152 字节约束;**EIP-170 24,576 字节**只约束运行时字节码与 `constant`/`immutable` 内联;<br>3. 量化结果补一段**坦白缺口**:仓库只有 `BasicNft` 部署 trace,`MoodNft` 未保留日志,只给存储算术不给虚构总量;<br>4. 人设去自谦(`learning repo` / `刚学 Solidity 的新手`);<br>5. 与第 05 篇建立内链。 |
|
||
| 05 | `why-my-on-chain-nft-art-changed-on-windows` | 通过(附微调) | 1. 点明"变的是链上字节与 `keccak256` 断言,不是浏览器画面"(原文已提编辑器看不出,未提哈希断言);<br>2. 补 `git add --renormalize .` / 重新检出 `img/*.svg` 的存量工作区刷新说明;<br>3. 首段与第 04 篇建立内链;<br>4. `learning project` → 测试网验证工程。 |
|
||
|
||
---
|
||
|
||
## 顾问意见的采纳判定(三类)
|
||
|
||
- **直接采纳并修复**:`performUpkeep` 权限描述、`msg.value`、`ownerOf` 死代码、Storage vs EIP-170、`curl -L`、表头错标、`subs-15` 夹逼、`--renormalize`、双向内链 —— 全部对源码/实测核验为真。
|
||
- **修正后采纳(顾问建议本身有误)**:
|
||
- 文章 02 的"12 家筛掉 9 家"是顾问编的数字 → 改为不精确量级表述 + 声明无打分表。
|
||
- 文章 01 的"8 核 AMD EPYC / Xeon"是顾问编的硬件 → 改用业主真实机器 **i9-13900K**。
|
||
- 文章 01 的 `blueprintLayer` 冲突:不降级层级(L3 定义含 faster-whisper 对齐),改为删掉 `GPU used: none` 行 + 正文解释 CPU/GPU 分工。
|
||
- 文章 04 "缺 MoodNft gas 表":原文已声明日志只有 `BasicNft`;本次改为"存储算术 + 明确写缺口",不给未实测的总量。
|
||
- 顾问补丁里的内链是 `https://www.google.com/search?q=/posts/...` 伪链接 → 全部改为真实站内路径(`/posts/...`、`/posts/zh/...`)。
|
||
- **不做**:不做无实测基础的数字包装(MoodNft 总 gas、采购淘汰率)。
|
||
|
||
---
|
||
|
||
## 待办 / 后续
|
||
|
||
- 全库 91 篇已 `approved`,`batches/` 已清空(`manage_review.py generate` 报告 "All posts are approved")。
|
||
- 后续若再送审,需要新的内容波次而不是旧批次重发。
|