Vibecoding On‑Chain — 使用 AI 原型化 Solidity 合约(安全)

发布: (2026年1月8日 GMT+8 14:01)
8 min read
原文: Dev.to

Source: Dev.to

我过去常打开 Remix,盯着一张空白的 Solidity 文件发呆,结果卡住了。根本不知道从哪里开始。于是我照大家说的那样:“多写点代码”。我从教程里复制模式,稍微改动几行,然后点 Deploy

但仍然感觉自己并没有真正学会智能合约是怎么工作的。

奇怪的地方在于?

  • 并不是缺少练习。
  • 而是我练习的 方式

有一天我尝试了不同的做法:

  • 我不再从零开始,而是改为使用 AI 进行 “vibecoding”
  • 这不是作弊,而是想看看如果把 AI 当作草图艺术家,而把自己当作编辑,会发生什么。

这个实验最终演变成了今天的文章。

这是一段 60 天 Web3 之旅的第 28 天,仍处于第 3 阶段:开发。
今天的目标是了解什么是 “vibecoding”,如何使用 AI 工具搭建 Solidity 合约的框架,以及如何审查并加固这些代码,使其真正安全可部署。

什么是 Web3 中的 “vibecoding”?

Vibecoding 是一种从“氛围”和提示而非空文件开始构建的理念:你用自然语言描述想要的内容,让 AI 工具生成代码的第一版。

在 Web3 中,这意味着使用 AI 来搭建 Solidity 合约、测试用例,甚至完整的 dApp 骨架,从而更快地迭代想法。

思维方式的转变

传统方法Vibecoding 方法
“打开 VS Code → 盯着空文件 → 与编译器搏斗。”“详细描述合约 → 获得初稿 → 审核、修复并改进。”

AI 成为处理样板代码的协作者,而你仍然负责架构、安全以及产品思考。

为什么 vibecoding 在基础之后是完美的

在过去的两天里,你:

  • 学习了 Solidity 语法、变量、函数,以及合约如何公开状态。
  • 使用数组、映射、结构体和事件升级了你的 Web3 Journey Logger,以处理多个条目和多个用户。

现在 vibecoding 让你能够:

  • 将这些知识转化为 更好的提示(例如,用 mapping(address => Entry[]) 加上结构体,而不是 “给我写一个 NFT”。)
  • 将 AI 视为合作伙伴:它编写样板代码;你负责审查、保持不变式以及处理边界情况。
  • 练习阅读和批评 Solidity——这是 DevRel、审计或技术内容创作中最重要的技能之一。

你并没有跳过学习;你是在利用 AI 消除繁重的工作,从而有更多时间去理解代码的实际作用。

如何为合约编写提示

良好的 vibecoding 从优秀的提示开始。模糊的 “写一个 staking 合约” 往往会产生奇怪且不安全的代码。

一个完整的提示通常会:

  1. 描述合约的目标
  2. 指定数据模型(struct、mapping、数组)。
  3. 提及 事件访问控制
  4. 明确 Solidity 版本

示例提示

“Write a Solidity 0.8.x contract called StudyBuddy where:
– users can log study sessions with topic (string) and minutes (uint256)
– each user can record many sessions
– use a struct Session { string topic; uint256 minutes; } and mapping(address => Session[])
– emit an event whenever a new session is logged
– include view functions to read a user’s total sessions and a session by index
– avoid using tx.origin, and use SPDX + a recent 0.8 compiler pragma”

这个提示会引导 AI 使用你已经从 Journey Logger V2 中了解的模式,只是应用在不同的场景下。

示例:vibecoding 一个 StudyBuddy 合约

假设你将上面的提示输入到你的 AI 工具中。合理的输出可能如下所示:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract StudyBuddy {
    struct Session {
        string topic;
        uint256 minutes;
    }

    mapping(address => Session[]) private sessionsByUser;

    event SessionLogged(
        address indexed user,
        string topic,
        uint256 minutes,
        uint256 index
    );

    function logSession(string calldata _topic, uint256 _minutes) external {
        Session memory newSession = Session({topic: _topic, minutes: _minutes});
        sessionsByUser[msg.sender].push(newSession);

        uint256 index = sessionsByUser[msg.sender].length - 1;
        emit SessionLogged(msg.sender, _topic, _minutes, index);
    }

    function getSession(address _user, uint256 _index)
        external
        view
        returns (string memory topic, uint256 minutes)
    {
        require(_index < sessionsByUser[_user].length, "Index out of bounds");
        Session storage s = sessionsByUser[_user][_index];
        return (s.topic, s.minutes);
    }
}

注意: 如果 AI 编造了你从未见过的内容,请保持怀疑。询问它为何做出该选择,或明确提示它遵循已知的模式。

规则 3:添加测试和人工审查

即使是小型演示合约,也应目标是:

单元测试(或 Foundry/Hardhat 测试),应当

  • • 使用典型输入调用每个函数。
  • • 尝试边界情况(索引越界、零值、最大值)。
  • • 检查事件是否正确触发。

手动推理:

  • • 谁可以调用每个函数以及他们能修改什么。
  • • 数据随时间的增长方式(是否可能被人刷存储?)。
  • • 是否存在隐藏假设(例如,“单个用户只会有少量会话”)。

AI 在生成草稿代码甚至草稿测试方面表现出色,但理解行为和风险的责任在于人类。

Vibecoding 如何帮助你作为学习者和未来的 DevRel

  • 更快原型化教程: 生成一个演示合约,然后将审查/修复的过程转化为内容。
  • 调试 AI 能提升你的 Solidity 思维模型: 你捕捉的每一个错误都会加深你的理解。
  • 培养对初学者的同理心: 许多新开发者会大量依赖 AI;你的角色可以是教他们如何安全使用,而不是盲目信任它。

可复用的内容模式

  1. 从一个纯英文的想法开始(例如,“我想在链上跟踪 X”。)
  2. 向 AI 提示生成合约。
  3. 在文章或视频中逐步讲解代码,重点说明:
    • 好的地方。
    • 缺失的部分。
    • 部署前你所做的修改。
  4. 将改进后的版本部署到测试网,并给读者一个扩展它的挑战。

通过这样做,你的定位不仅是“编写 Solidity 的人”,更是帮助他人驾驭全新 AI 辅助构建方式的指南。

进一步阅读

在以下平台关注系列:

加入 Telegram 讨论群:Web3ForHumans – 我们将一起头脑风暴 Web3。

Back to Blog

相关文章

阅读更多 »

踏入 agentic coding

使用 Copilot Agent 的经验 我主要使用 GitHub Copilot 进行 inline edits 和 PR reviews,让我的大脑完成大部分思考。最近我决定 t...