Solidity 预言机
Solidity 预言机入门一个尴尬的现实你写了一个很棒的 DeFi 合约,用户存入 ETH,你想按实时价格折算成 USDC 给用户。 然后你发现一件事:智能合约根本不知道 ETH 现在值多少钱。 它不知道自己当前的价格,不知道天气怎么样,不知道某场比赛谁赢了,甚至连当前时间都只能拿到区块时间(还不一定准)。 这不是 bug,是设计如此。以太坊节点必须能独立验证每一笔交易,如果合约可以随便发 HTTP 请求去外面查数据,那不同节点查到的结果可能不一样,共识就崩了。 所以区块链把自己关在了一个沙盒里——安全,但也与世隔绝。 预言机(Oracle)就是打破这堵墙的东西。 预言机到底是什么别被名字唬住了。它不是什么神秘组件,本质上就是一个中间人: 1链外数据源 → 预言机 → 链上合约 合约想要外部数据时,不是自己去拿,而是”喊一声”,预言机听到后去外面查好,再把结果送回来写到合约的存储里。 [!example]...
Solidity 存储与优化
Solidity 存储与优化进阶写 Solidity 最容易产生的错觉就是:它长得像 JavaScript,所以行为也应该像 JavaScript。 直到你部署了合约,看到一笔简单的交互烧掉了你半个月的测试网 ETH,才意识到:在 EVM 里,存储就是金钱,而金钱是很贵的。 这篇不扯什么“区块链改变世界”,只聊点实在的——怎么在存储这块把 Gas 压下来,顺便避开那些让新手头皮发麻的坑。 存储位置三剑客:storage / memory / calldata这三个词你肯定见过,但很多人只是机械地背:“状态变量用 storage,局部变量用 memory”。 稍微深究一下:为什么外部函数的参数推荐用 calldata 而不是 memory? 本质区别 **storage**:永久存在链上,读写最贵(SLOAD/SSTORE)。改它等于改账本。 **memory**:函数执行期间存在内存里,按字分配。每次调用都要花钱 copy 数据进来。 calldata:只读,数据直接躺在交易 payload 里。不用...
Ethernaut闯关解析
OpenZeppelin Ethernaut 闯关笔记概述Ethernaut 是 OpenZeppelin 创建的智能合约安全挑战平台,旨在帮助开发者学习 Solidity 和智能合约安全。本笔记涵盖前24关的详细解析。 环境说明:以下攻击代码适用于 Ethernaut 控制台环境(使用 Web3.js),部分攻击合约可在 Remix IDE 中部署测试。 Level 1: Fallback目标:成为合约 owner 并清空余额 solidity 123456789101112131415161718192021222324252627282930313233contract Fallback { mapping(address => uint) public contributions; address public owner; constructor() { owner = msg.sender; contributions[msg.sender] = 1000 * (1 ether); ...
以太坊虚拟机EVM
EVM 底层逻辑Solidity 只是皮囊,EVM(以太坊虚拟机)才是灵魂。 你写的每一行 if/else、每一次 mapping 读写,最终都会被编译成 EVM 能听懂的操作码(Opcodes)。不理解 EVM,写合约就像在开自动挡的车——能跑,但遇到陡坡就不知道该怎么换挡了。 这篇不背黄皮书公式,只看 EVM 真正干活的方式。 一、EVM 的“内存模型”EVM 是一台 256 位的栈式虚拟机。它没有寄存器,所有计算都在栈上完成。 1. 栈(Stack) 深度:最多 1024 层。 宽度:每层固定 256 bit(32 字节)。 规则:后进先出(LIFO)。PUSH1 0x05 把 5 压栈,ADD 弹出栈顶两个数相加,结果再压回去。 成本:极便宜(3 gas)。但深度超限直接 Stack Overflow。 2. 内存(Memory) 特性:易失性。交易结束就清空。 寻址:按字节寻址,但读写必须按 32 字节对齐(MLOAD / MSTORE)。 成本:动态计价。用得越多,扩展内存的 gas 呈二次方增长。 3....








