Vibecoding On‑Chain — 使用 AI 原型化 Solidity 合约(安全)
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 合约” 往往会产生奇怪且不安全的代码。
一个完整的提示通常会:
- 描述合约的目标。
- 指定数据模型(struct、mapping、数组)。
- 提及 事件 和 访问控制。
- 明确 Solidity 版本。
示例提示
“Write a Solidity 0.8.x contract called
StudyBuddywhere:
– users can log study sessions withtopic(string) andminutes(uint256)
– each user can record many sessions
– use astruct Session { string topic; uint256 minutes; }andmapping(address => Session[])
– emit an event whenever a new session is logged
– includeviewfunctions to read a user’s total sessions and a session by index
– avoid usingtx.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;你的角色可以是教他们如何安全使用,而不是盲目信任它。
可复用的内容模式
- 从一个纯英文的想法开始(例如,“我想在链上跟踪 X”。)
- 向 AI 提示生成合约。
- 在文章或视频中逐步讲解代码,重点说明:
- 好的地方。
- 缺失的部分。
- 部署前你所做的修改。
- 将改进后的版本部署到测试网,并给读者一个扩展它的挑战。
通过这样做,你的定位不仅是“编写 Solidity 的人”,更是帮助他人驾驭全新 AI 辅助构建方式的指南。
进一步阅读
- Solidity 文档 – Contracts & Security Considerations
- OpenZeppelin 合约 – Reference Implementations & Guides
- Cyfrin Updraft – Using AI to Help with Solidity Development
- Paradigm – Smart Contract Security & Best Practices
- Solidity AI CodeGen – AI‑Assisted Solidity Templates (CredShields)
在以下平台关注系列:
加入 Telegram 讨论群:Web3ForHumans – 我们将一起头脑风暴 Web3。