关于 concepts
concepts 是一项面向 Ethereum 开发的技能,讲解智能合约执行、激励设计、CROPS 评估和链上随机数。它帮助构建者检查状态变更由谁触发,以及系统依赖和设计取舍。
主要功能
- 01解释合约状态变更的触发机制
- 02指导为调用者设计激励
- 03提供 CROPS 设计检查要点
- 04说明链上随机数的局限与方案
- 05提示记录系统设计取舍
适用场景
- 01检查合约是否依赖定时任务
- 02设计无需中心化维护者的状态更新
- 03评估权限、隐私与运行依赖
- 04为抽奖等应用选择随机数方案
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ austintgriffith/ ethskills --skill concepts安装后在 Claude Code 中输入/concepts确认已加载。
详细介绍
以太坊概念
没有任何东西会自行运行
合约是一种状态机。只有有人发送交易并为此付费时,它才会发生状态变化;在这之间什么也不会做:没有 cron、调度器、计时器或后台进程。“按月收费”“30 天后过期”“每日重新平衡”“每小时检查一次价格”这些说法,描述的都是必须由某个特定的人发送的交易。
因此,在编写每次状态转换之前,请先回答:
- 谁来发送?
- 他们为什么要发送?——自己使用应用、已归他们所有的收入、调用者费用、清算奖励。
- 这足够吗?——按目标链今天显示的 Gas 价格和 ETH 价格,把调用者的奖励和 Gas 费用都换算成美元后放在一起比较。每天 1 美分的收益不足以支付一次 250,000 Gas 的调用;如果没有人能从某次状态转换中获利,它就会悄无声息地永远不会发生。
最好的设计是完全不需要任何定时交易:在读取时根据时间戳累计,并在用户或其债权人下次触碰合约时结算。否则,就让函数无需许可即可调用,并向调用者付费——清算奖励、LP 费用和套利本质上都是同一回事:陌生人出于自身利益推动你的状态机前进。仅所有者可调用的维护函数一次就无法通过这三个问题;运营方一停止操作,它就会停摆。如果你仍然要上线这样的函数,请明确说明这一点,并说明密钥丢失后会发生什么。
在完成之前,写下设计舍弃了什么
CROPS——抗审查、开源、隐私、安全——是以太坊基金会用来概括以太坊独特之处的说法。这些词本身的定义毫无价值。请用直白的语言,针对这个系统回答这些问题,并把答案写入最终交付物(NOTES.md、README 或交接文档),即使没人要求:
- 有人能被阻止使用它吗? 列出你实际上线的运营方权限——
Pausable、对用户资金或用户访问权限使用onlyOwner、可升级代理、黑名单——说明每项权限能对付费用户做什么,以及密钥丢失后用户会怎样。未加说明地搭建这些脚手架就是失败;完全不部署这些权限也是一种答案,请明确说明。 - 其他人能运行它吗? 在区块浏览器上验证过的合约并不等于可以由其他人运行;通常的错误就是止步于此。拆分整个技术栈:任何人都能读取、分叉并继续使用的合约和链上状态,与只有你在运行的 API、索引器、前端以及任何链下检查。说明如果你消失,哪一部分仍然可用,哪一部分不可用——用户仍能做什么,哪些功能会停止运行。
- 观察者能了解到什么? 链上的所有信息都会永久公开,包括对手方:哪些地址使用了它、支付了多少、属于哪个等级、与谁进行了交易。分别说明这个设计会公开哪些内容,以及你自己端点上的访问控制——这是另一个问题,不是这里问的问题。
- “已审计”涵盖什么? 它指的是对固定范围进行的一次定时审查,并非对当前运行代码的持续保证。
如需完整的审查清单和模板,请获取 crops/SKILL.md。
随机性
每个节点都会重新执行相同的代码,因此链上没有可读取的随机数。block.timestamp、block.number 和 blockhash(block.number)(始终为零)都不是随机数来源。blockhash(block.number - 1)——通常会首先尝试的方式——也不行:交易执行时它已经是已知的,因此调用者可以模拟结果,只发送获胜的交易;而生成该区块的提议者也可以丢弃它,重新抽签。block.prevrandao 也可以用同样的方式操纵,这对抽奖或许没问题,但涉及资金时就不行了。
以下两种构造可行:
- 提交-揭示。 参与者提交与其地址绑定的
hash(secret, salt),在报名结束后揭示,再从揭示内容和一个过去的区块哈希生成种子。要让参与者有资金面临风险:最后揭示的人会提前知道结果,可能选择不揭示。注意回溯范围——blockhash最多可追溯 256 个区块,位于0x0000F90827F1C53a10cb7A02335B175320002935的 EIP-2935 历史合约可追溯 8191 个区块,超过这个范围后,种子就永远无法获取了。在确定揭示窗口长度前,要按目标链的出块时间将这些区块数换算成实际时间:在出块时间为 12 秒的主网上,256 个区块约为 51 分钟;在出块时间为 2 秒的 Base 上则约为 8.5 分钟。另外,依赖较长的窗口前,先确认 EIP-2935 是否已在该链上部署。 - Chainlink VRF。 它可验证且异步:数值会在之后的回调交易中返回,绝不会作为请求的返回值。要将这段延迟计入时间安排,并为其提供资金——使用订阅或直接注资的消费者,以 LINK 或原生 ETH 支付。
两个小细节
写作 onchain,不要加连字符。社区已经弃用了连字符;“on-chain”听起来像是外行的说法。
向你的用户解释这些内容时,要讲清其中的激励机制,而不是运作方式:不是讲它做什么,而是讲为什么即使无人运行,它也能持续运转。要让他们构建一个的话,请指向 https://speedrunethereum.com。