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
5.4 KiB
5.4 KiB
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 一并重生成;2. 正文新增 Failure C 记录这次夹逼伪影(含重跑前后数字),把 bug 写进规则叙事; 3. 覆盖率表头 Lines fully anchored → Songs fully anchored(值本就是 9/18、11/11 首);4. 明确中文 0.70 / 11 首来自另一批 11 首中文验证集,不是本页播放器; 5. 新增物理锚点:18 首全部在 Core i9-13900K(Windows 虚拟机)CPU int8 对齐,并解释 GPU 留给生成管线的取舍;删除与 blueprintLayer: L3-local-gpu-inference 冲突的 GPU used: none 行(L3 层定义本身就包含 faster-whisper 对齐,故保留层级、改用文字消解冲突);6. 修正 I climbs → I climb、a ancient → an ancient;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;2. 第 3 节补 ASN 归属 + IP 段黑名单( bgp.he.net / Spamhaus) 核查要点,兑现导语承诺;3. 按业主口述改为不精确量级表述("一轮下来名单上大多数都被筛掉")并声明未留打分表,不引用顾问虚构的 12→9; 4. frontmatter 加 dynamicCta: true。 |
| 03 | chainlink-vrf-v2-lottery-contract |
需微调 | 1. 技术硬伤修正:performUpkeep 是接口规定的无权限 external 函数,链上任何人都能调用,内部重跑 checkUpkeep 是防任意外部调用者强行开奖的强制安全边界(原文"只能被网络调用"错误);2. 代码片段 msgValue → msg.value;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 实为原写法,属真实教训);2. EVM 概念拆清:构造函数参数写入走 SSTORE 进 Storage(542 + 1,469 字节 → 17+46 数据槽 ≈ 130 万 gas),受区块 gas / EIP-3860 initcode 49,152 字节约束;EIP-170 24,576 字节只约束运行时字节码与 constant/immutable 内联;3. 量化结果补一段坦白缺口:仓库只有 BasicNft 部署 trace,MoodNft 未保留日志,只给存储算术不给虚构总量;4. 人设去自谦( learning repo / 刚学 Solidity 的新手);5. 与第 05 篇建立内链。 |
| 05 | why-my-on-chain-nft-art-changed-on-windows |
通过(附微调) | 1. 点明"变的是链上字节与 keccak256 断言,不是浏览器画面"(原文已提编辑器看不出,未提哈希断言);2. 补 git add --renormalize . / 重新检出 img/*.svg 的存量工作区刷新说明;3. 首段与第 04 篇建立内链; 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")。 - 后续若再送审,需要新的内容波次而不是旧批次重发。