自动化工程实践:基于 DeepSeek 与 Hardhat 的 Web3 技术长文生成 Skill 实现

一、 前言

在 Web3 领域,技术迭代速度极快。对于开发者而言,深入理解并复现一个热门协议的架构,往往需要翻阅海量的文档、分析错综复杂的合约代码,并手动搭建繁琐的测试与部署环境。这不仅耗时,而且极易因环境配置问题中断研究思路。

为了解决这一痛点,我设计并实现了这个 Web3 自动化技术写作 Skill。该工具的核心初衷,是利用高性能大语言模型(DeepSeek)的强逻辑推理与代码生成能力,结合现代工程化标准(Solidity ^0.8.24, OpenZeppelin V5, Hardhat v3),实现"输入关键词,输出工程化全解"的自动化工作流。它不仅是文档生成器,更是一个能够辅助开发者快速验证技术设想的"工程助手"。

二、 项目介绍

该工具本质上是一个 LLM 驱动的模块化流水线 (Pipeline) 。它解决了开发者在进行 Web3 技术调研时的三个核心痛点:

  1. 架构与规范脱节 :许多旧项目仍在使用过时的 Solidity 版本,该工具强制统一升级至 ^0.8.24OpenZeppelin V5,确保代码具备现代安全性。
  2. 工程化交付门槛 :很多文章仅提供代码片段,缺乏配套的 Hardhat Ignition 部署模块与 loadFixture 驱动的单元测试,难以直接落地。
  3. 上下文衔接断层:通过多阶段链式提示词(Chain-of-Thought),确保后续生成的测试脚本与部署脚本能够精准匹配前序生成的合约逻辑。

三、 核心智能合约(设计逻辑)

该 Skill 的核心设计思想是模块化提示词工程(Modular Prompt Engineering) 。为了保证生产级代码质量,合约生成环节采用了严谨的约束:

  • 技术栈锁定 :强制使用 Solidity ^0.8.24
  • 安全范式 :全面禁用过时钩子(如 _beforeTokenTransfer),采用 OpenZeppelin V5 的 _update 机制;权限管理强制使用 Ownable2Step,防止所有权误转。

技术点评 :通过封装 callDeepSeekWithRetry 函数,我们为底层 API 请求添加了指数退避(Exponential Backoff)机制。这极大地提高了在复杂网络环境或高并发负载下,大模型生成任务的稳定性,避免了因单次请求失败导致整个文档生成链路的崩溃。

四、 测试与部署脚本(工程化实现)

在第二阶段,工具联动生成了工程化代码:

  • 测试脚本 :不仅是功能测试,更包含 expect().to.be.reverted 的负面用例,验证合约在非法调用下的防御能力。利用 loadFixture 优化了快照恢复,确保测试套件的高效运行。
  • 部署脚本 :采用了 Hardhat Ignition 声明式架构。通过 buildModule 定义部署逻辑,真正实现了"配置即部署",极大地降低了复杂协议在不同环境下的部署心智负担。

五、web3技术长文生成器skill实现

js 复制代码
import { OpenAI } from 'openai';
import * as fs from 'fs';
import * as path from 'path';
import 'dotenv/config';

const deepseek = new OpenAI({
    apiKey: process.env.LLM_API_KEY,
    baseURL: process.env.LLM_BASE_URL,
});

// 使用稳定、代码能力极强的模型生成结构化内容
const MODEL_NAME = 'deepseek-chat'; 

/**
 * 工业级防御工具函数:带有指数退避自动重试的大模型请求包装器
 */
async function callDeepSeekWithRetry(options, maxRetries = 3, baseDelay = 2000) {
    for (let attempt = 1; attempt <= maxRetries; attempt++) {
        try {
            const response = await deepseek.chat.completions.create(options);
            const content = response?.choices?.[0]?.message?.content;
            
            if (content && content.trim() !== '') {
                return content; // 成功获取到内容,直接返回
            }
            
            console.warn(`⚠️ [API 预警] 响应内容为空,准备开展第 ${attempt}/${maxRetries} 次重试...`);
        } catch (error) {
            console.warn(`⚠️ [API 异常] 第 ${attempt}/${maxRetries} 次请求遭遇错误: ${error.message}`);
            // 如果已经是最后一次尝试,则不再等待,直接向上抛出
            if (attempt === maxRetries) {
                console.error("❌ [API 溃败] 完整错误响应:", JSON.stringify(error));
                throw error;
            }
        }
        
        // 计算退避延迟时间:2s -> 4s -> 8s
        const delay = baseDelay * Math.pow(2, attempt - 1);
        console.log(`⏳ 正在等待 ${delay / 1000} 秒后重新送入请求...`);
        await new Promise(resolve => setTimeout(resolve, delay));
    }
    throw new Error("大模型在多次尝试后均未返回有效响应。");
}

/**
 * 核心 Skill 处理器:按照指定大纲全自动分段组装 Web3 技术长文
 */
async function generateFullWeb3Article(projectName, projectKeywords) {
    const outputDir = path.join(process.cwd(), 'output_articles');
    if (!fs.existsSync(outputDir)) {
        fs.mkdirSync(outputDir, { recursive: true });
    }

    console.log(`\n🚀 [Skill 启动] 正在为热门 Web3 项目 [${projectName}] 全自动撰写深度技术长文...`);

    const systemPrompt = `你是一个精通 Solidity 合约开发、智能合约安全审计与 Hardhat v3 工程化交付的 Web3 技术大牛。
请严格按照用户指定的目录大纲输出技术文章。代码部分必须符合 Solidity ^0.8.24 与 OpenZeppelin V5 标准。
只输出纯粹的 Markdown 文本,绝不能带有任何 HTML/Script 网页杂质代码。`;

    // ────────────────────────────────────────────────────────
    // 阶段 1:生成 前言 + 项目介绍 + 核心智能合约
    // ────────────────────────────────────────────────────────
    console.log('▶️ [Step 1/3] 正在生成:前言、项目介绍与重构后的核心智能合约源码...');
    const stage1Prompt = `
    请针对热门 Web3 项目 [${projectName}],编写技术文章的第一部分。
    该项目的核心关键词为:【${projectKeywords}】。
    
    请严格遵循以下大纲输出 Markdown:
    
    # 🚀 热门 Web3 项目现代化重构实战:深度解析 ${projectName}
    
    ## 一、 前言
    - 阐述该项目在当前 Web3 行业引发的热潮、行业地位与技术风向。
    - 说明本次技术重构的极客初衷(将其升级至现代安全的 Solidity ^0.8.24 与 OpenZeppelin V5 规范)。
    
    ## 二、 项目介绍
    - 深度拆解该项目的宏观业务逻辑、它解决了什么行业核心痛点。
    - 详细剖析该协议底层最核心的 3 个业务交互流程与资产流转路径。
    
    ## 三、 核心智能合约
    - 请为该项目编写一个生产级、高可读性的主智能合约 Solidity 源码(要求必须使用 Solidity ^0.8.24,且全面适配 OpenZeppelin V5,如废弃 _beforeTokenTransfer 钩子,改用 _update 实现转账拦截逻辑;权限管理采用 Ownable2Step 等)。
    - 代码请包裹在 \`\`\`solidity ... \`\`\` 块中。并在代码下方用精炼的语言对该合约的关键安全机制和优化点进行 200 字的技术点评。
    `;

    // ✨ 替换为高抗震重试请求
    const part1Text = await callDeepSeekWithRetry({
        model: MODEL_NAME,
        messages: [
            { role: 'system', content: systemPrompt },
            { role: 'user', content: stage1Prompt }
        ],
        temperature: 0.2
    });

    // ────────────────────────────────────────────────────────
    // 阶段 2:联动生成 测试脚本 + 部署脚本
    // ────────────────────────────────────────────────────────
    console.log('▶️ [Step 2/3] 正在基于核心合约,联动生成 Hardhat v3 测试脚本与部署脚本...');
    const stage2Prompt = `
    你现在是高级测试与运维工程师。基于上面已经写好的项目背景与核心业务逻辑,请为 [${projectName}] 继续撰写文章的工程化部分。
    
    请严格遵循以下大纲输出 Markdown(不要输出一级标题,直接从第四章开始):
    
    ## 四、 测试脚本
    - 请编写一个配套该合约的、功能完整的 Hardhat v3 JavaScript 测试脚本。
    - 必须引入 "@nomicfoundation/hardhat-toolbox/network-helpers" 中的 loadFixture 优化快照。
    - 包含至少 3 个核心业务用例测试(必须包含异常权限或条件拦截的 expect(...).to.be.reverted 异常断言)。
    - 代码请包裹在 \`\`\`javascript ... \`\`\` 块中。
    
    ## 五、 部署脚本
    - 请基于现代 Hardhat 推荐的标准,编写一个符合规范的 Hardhat Ignition 声明式 JavaScript 部署模块(使用 buildModule 定义并通过 module.exports 导出)。
    - 代码请包裹在 \`\`\`javascript ... \`\`\` 块中。
    `;

    // ✨ 替换为高抗震重试请求
    const part2Text = await callDeepSeekWithRetry({
        model: MODEL_NAME,
        messages: [
            { role: 'system', content: systemPrompt },
            { role: 'user', content: `这是项目的上下文信息:\n${part1Text}\n\n现在请为我续写第四章和第五章:\n${stage2Prompt}` }
        ],
        temperature: 0.2
    });

    // ────────────────────────────────────────────────────────
    // 阶段 3:生成 总结
    // ────────────────────────────────────────────────────────
    console.log('▶️ [Step 3/3] 正在撰写收尾总结并开展全景组装...');
    const stage3Prompt = `
    请为全篇关于 [${projectName}] 的拆解文章撰写收尾的总结章节。
    
    请遵循以下大纲:
    
    ## 六、 总结
    - 从系统架构师和开发者的双重视角,高度总结该项目的创新亮点和代码健壮性。
    - 给出开发者在基于该项目做二次开发或迁移生产环境时的工程踩坑防范建议(不少于 3 条)。
    `;

    // ✨ 替换为高抗震重试请求
    const part3Text = await callDeepSeekWithRetry({
        model: MODEL_NAME,
        messages: [
            { role: 'system', content: systemPrompt },
            { role: 'user', content: stage3Prompt }
        ],
        temperature: 0.3
    });

    // ────────────────────────────────────────────────────────
    // 成果汇编与静态清洗写盘
    // ────────────────────────────────────────────────────────
    const fullArticle = `${part1Text}\n\n${part2Text}\n\n${part3Text}`;
    
    let cleanedArticle = fullArticle;
    if (fullArticle.includes('</script>') || fullArticle.includes('__next_f')) {
        cleanedArticle = fullArticle.split('<script>')[0].trim();
    }

    const outputPath = path.join(outputDir, `${projectName}_Full_Technical_Guide.md`);
    fs.writeFileSync(outputPath, cleanedArticle.trim());

    console.log(`\n🎉 [完美出坞] 你的 Web3 技术大文已完美组装成功!`);
    console.log(`📂 最终生成的 Markdown 文章存放在:\n👉 ${outputPath}`);
    return cleanedArticle;
}

// 总控执行逻辑
// async function main() {
//     const targetProjectName = 'ModernPolymarketProtocol'; 
//     const targetKeywords = '去中心化预测市场, 条件代币(Conditional Tokens), 自动做市商AMM流动性拦截, 乐观预言机(UMA)数据仲裁';

//     try {
//         const article = await generateFullWeb3Article(targetProjectName, targetKeywords);
        
//         console.log("\n=================== 📝 文章生成大纲快照 ===================");
//         console.log(`1. 🚀 逆向解析 ${targetProjectName} (前言)`);
//         console.log(`2. 💡 项目介绍 (核心业务痛点解构)`);
//         console.log(`3. 📜 核心智能合约 (Solidity ^0.8.24 + OZ V5 源码实现)`);
//         console.log(`4. 🧪 测试脚本 (Hardhat v3 JavaScript + Chai 自动化夹具)`);
//         console.log(`5. 📦 部署脚本 (Hardhat Ignition 声明式部署模块)`);
//         console.log(`6. 🏁 总结 (系统闪光点与二次开发避坑指南)`);
//         console.log("==========================================================");
        
//     } catch (e) {
//         console.error("❌ Skill 流水线中途发生不可逆崩溃:", e.message);
//     }
// }
async function main() {
    // 读取命令行参数
    const args = process.argv.slice(2);
    if (args.length < 2) {
        console.log("❌ 参数不足,使用方式:");
        console.log('node doc.js 项目名称 "关键词1,关键词2,关键词3"');
        console.log('示例:node doc.js ModernPolymarketProtocol "去中心化预测市场,条件代币,AMM流动性拦截"');
        process.exit(1);
    }

    const targetProjectName = args[0];
    const targetKeywords = args[1];

    try {
        const article = await generateFullWeb3Article(targetProjectName, targetKeywords);
        
        console.log("\n=================== 📝 文章生成大纲快照 ===================");
        console.log(`1. 🚀 逆向解析 ${targetProjectName} (前言)`);
        console.log(`2. 💡 项目介绍 (核心业务痛点解构)`);
        console.log(`3. 📜 核心智能合约 (Solidity ^0.8.24 + OZ V5 源码实现)`);
        console.log(`4. 🧪 测试脚本 (Hardhat v3 JavaScript + Chai 自动化夹具)`);
        console.log(`5. 📦 部署脚本 (Hardhat Ignition 声明式部署模块)`);
        console.log(`6. 🏁 总结 (系统闪光点与二次开发避坑指南)`);
        console.log("==========================================================");
        
    } catch (e) {
        console.error("❌ Skill 流水线中途发生不可逆崩溃:", e.message);
    }
}
main();

六、skill使用以及效果展示

指令

js 复制代码
# 指令
node xxx.js mdname "key1,key2"
# 参数说明
xxx.js:对应的skill文件
mdname:输出的md文章名
"key1,key2":对应的关键字1,关键字2
# 案例
mode web3mdskill.js ousd "ousd稳定币,ousd"

效果展示

js 复制代码
node doc.js ousd "ousd稳定币,ousd"

🚀 [Skill 启动] 正在为热门 Web3 项目 [ousd] 全自动撰写深度技术长文...
▶️ [Step 1/3] 正在生成:前言、项目介绍与重构后的核心智能合约源码...
▶️ [Step 2/3] 正在基于核心合约,联动生成 Hardhat v3 测试脚本与部署脚本...
▶️ [Step 3/3] 正在撰写收尾总结并开展全景组装...

🎉 [完美出坞] 你的 Web3 技术大文已完美组装成功!
📂 最终生成的 Markdown 文章存放在:
👉 D:\ProjectDocuments\Agent\PolymarketAPI\output_articles\ousd_Full_Technical_Guide.md

=================== 📝 文章生成大纲快照 ===================
1. 🚀 逆向解析 ousd (前言)
2. 💡 项目介绍 (核心业务痛点解构)
3. 📜 核心智能合约 (Solidity ^0.8.24 + OZ V5 源码实现)
4. 🧪 测试脚本 (Hardhat v3 JavaScript + Chai 自动化夹具)
5. 📦 部署脚本 (Hardhat Ignition 声明式部署模块)
6. 🏁 总结 (系统闪光点与二次开发避坑指南)
==========================================================

成果部分片段

五、 总结

作为一个系统架构师,我认为该工具的价值在于将"技术研究"转化为"可执行的代码资产"。

开发者避坑建议:

  1. 代码审查 :LLM 生成的代码虽符合语法规范,但在处理极端复杂的金融业务逻辑(如 Flash Loan 攻击防御)时,务必结合 SlitherAderyn 等静态分析工具进行二次审计。
  2. 配置一致性 :确保项目中的 hardhat.config.js 编译器版本与生成出的 Solidity 版本保持一致,避免编译器不兼容问题。
  3. 增量开发:该工具适合作为项目的起点(Boilerplate)。在生成基础架构后,应在该框架上进行增量式的逻辑填充和功能迭代。

通过这个 Skill,我们不仅是在生成文章,更是在构建一套标准化的 Web3 工程化交付流程。

相关推荐
牧艺2 小时前
从 Chat 到 Agent:Tool Calling 全栈工程化实践
agent·ai编程·全栈
硬核子牙3 小时前
代码展示大模型的智能
linux·chatgpt·agent
smartfish_liu3 小时前
2026-07-17 LLM的自我总结: 今天上午我既不舒服, 又有点喜欢.
agent
AC赳赳老秦3 小时前
时间开销自动统计:OpenClaw 记录工作任务时长、分析时间分配、给出优化建议
java·大数据·开发语言·python·自动化·deepseek·openclaw
老梁agent5 小时前
Agent 记忆的四层存储模型:从 20 条滑窗到长期可演进记忆
agent
jvmind_dev5 小时前
第三章:GC 日志深度分析(上)——多版本、多收集器的统一解析
java·agent
xingxiliang5 小时前
ReliableAgent:类似工程级可用的agent示例
java·开发语言·agent
ArixBit5 小时前
用 Go 手撸 Agent 框架 #9:把最小 Agent 抽成 Runtime
go·agent
Luhui Dev5 小时前
用 AI 生成一道几何题配图:三角形四心作图案例
人工智能·数学·agent·luhuidev