第十二天:账户、签名与 Gas——把协议层弄明白
到今天为止,你已经能跑通 DApp 全流程。今天慢下来,把底层的三个概念一次讲透:账户模型、签名机制、Gas 计费。这些不搞清,排错时永远是雾里看花。
EOA 与合约账户
以太坊账户只有两种:EOA(外部拥有账户,由私钥控制,MetaMask 里那种)和合约账户(由代码控制,不能主动发起交易)。一切交易的起点必须是一个 EOA 的签名。这个模型简单,但”合约不能主动行动”催生了很多复杂设计——直到 EIP-4337 账户抽象出现,才开始让合约也能像账户一样用(gas 代付、社交恢复、批量交易)。Smart Account 是当前生态的重要方向,值得标记一个”下一篇进阶阅读”。
签名:EIP-191 与 EIP-712
签名不止用于发交易。离线签名 + 链上验证是很多协议的核心(第七天提到的 permit 就是签名授权)。两代标准:
- EIP-191:对原始消息签名,钱包展示的是一段文字,用户看不懂内容是什么含义;
- EIP-712:结构化签名,钱包把消息渲染成表格(要授权什么代币、多少、给谁),可读可防重放(域分隔符绑定 chainId 和合约地址)。**现代 DApp 一律用 EIP-712**。
// 合约侧验证 EIP-712 签名的骨架(用 OpenZeppelin 的 EIP712 基类)
import {EIP712} from "@openzeppelin/contracts/utils/EIP712.sol";
contract PermitBox is EIP712 {
constructor() EIP712("PermitBox", "1") {}
function verify(address signer, bytes calldata signature) external view {
bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(...)));
address recovered = ECDSA.recover(digest, signature);
require(recovered == signer, "bad signature");
}
}Gas:EIP-1559 之后怎么算钱
一笔交易的费用 = gasUsed × (baseFee + priorityFee)。baseFee 由全网拥堵程度协议自动定价并销毁(这就是 ETH 有通缩叙事的原因),priorityFee 是给验证者的小费。开发视角的省钱三板斧:少写 storage(改 storage 比读贵 100 倍)、能用 calldata 别用 memory、批量操作合并进单笔交易。 forge snapshot 能输出每个函数的 gas 消耗,优化前后对比一目了然。
今天的作业:用 cast 给自己发一条 EIP-712 签名消息并验证;跑一次 forge snapshot 记录你合约最贵的函数。下一篇是整个课程最重要的一篇——合约安全。
读完了点一下,作者能得积分
赞赏
如果这篇内容帮到了你,不妨请作者喝杯咖啡
赞赏
如果这篇内容帮到了你,不妨请作者喝杯咖啡
选个金额
微信扫码扫一下,金额 ¥6
- 扫码后按所选金额支付即可
- 赞赏完全自愿,与积分、红包互不影响
发表评论