这篇文章介绍了RareSkills提供的Solidity课程,适用于不同水平的开发者,涵盖了从基础到高级的多个主题,如Tornado Cash、Compound V3等技术细节。课程内容免费提供,旨在通过深度理解和优化代码来提升开发者的技能。
此课程适合有经验的程序员。如果你还不知道怎么编程,建议先学习 Python 或 JavaScript,然后再回来。
如果你是 Solidity 新手,请从头开始。
然而,所有水平的 Solidity 开发者都可以从这里的资源中受益 —— 后面的章节讨论非常先进的主题,例如 Tornado Cash 的工作原理。我们还提供了对 Compound V3 代码库的唯一协议 walkthrough。
虽然这并不是一门智能合约安全课程,但智能合约安全研究人员经常引用这里的资源。我们的理念是,安全源于对自己所做之事的深入理解。
因此,我们不会仅仅为了列出很多话题而生成一个大清单。我们深入研究那些即使是经验丰富的 Solidity 工程师也可能忽视的非显而易见问题;通过我们 Solidity Bootcamp 的授课经验,我们知道知识差距常常在哪里。
深入理解应是任何编写管理他人加密资产的代码的人的期望。因此,我们的教程优先生成强大的心理模型,即使这需要付出更多的努力。
最后,我们鼓励你将我们的教程与其他在同一主题上的教程(以及那些由人工智能聊天机器人生成的内容)进行比较。
我们相信你会对我们文章的深度、全面性和清晰度感到震撼。
不需要电子邮件!这为有经验的程序员准备,他们想快速切入主题并立即在高度优化的主题顺序中练习他们刚刚获得的信息。我们强调 Solidity 语言中的意外和不寻常的方面,同时略过那些我们可以合理假设对称职开发者是显而易见的内容。除了偶尔的幽默评论外,我们将教程做得尽可能简短(但不更短)。虽说这是一个 Solidity 初学者教程,但它是为经验丰富的编码者设计的。
了解一种语言和了解一个领域是有区别的。知道 Python 并不意味着你是一名数据科学家,知道 JavaScript 并不意味着你是一名前端开发者,知道 Kotlin 也并不意味着你是一名 Android 开发者。同样,知道 Solidity 并不意味着你是以太坊智能合约开发者。然而,Solidity 是开发智能合约的先决条件。
设置 Remix
Solidity 是一种类型语言
2024 年最流行的开发框架
在 Solidity 中进行数学运算的快速概述
关于条件运算符的快速课程
迭代运算符的语法
无限制大小的数据类型
二维和三维数据类型
在 Web3 中使用“数据库”
持久性列表
持久性列表
具有多个层级的持久性哈希映射
13. msg.sender 和 address(this)
确定哪个钱包在调用智能合约
在部署时配置智能合约
保护智能合约免受恶意参数的影响
去中心化金融最基本构件的介绍
批量组合值
Solidity 推荐的二进制编码格式
了解 Solidity 中的可组合性如何运作
你第一个 DeFi 应用
通过函数调用转移以太币
智能合约如何接收 ETH 交易
23. Block.timestamp 和 block.number
今天的日期和时间是什么?
在智能合约中留下审计痕迹
在大型智能合约中组织代码
为 Solidity 函数添加可重用功能
只写一次的变量
如何避免“魔法数字”
与世界分享你的 NFT
开源 NFT 的代码
处理大数字的方便关键词
如何将数据保持在组内
字符串组合、UTF-8 编码等
如何在 Foundry 中编写专业的单元测试
在此时,你已经有足够的知识构建从头到尾的智能合约项目。如果你是 Solidity 新手,我们强烈建议你构建这些项目,而不是跳过它们。通过阅读教程,你只能学到这么多,有些知识只能通过实践获益。
本文的目的是不重复官方 Solidity 风格指南,建议你阅读它。
每个人都会犯错误,但有些错误比其他更常见。
你现在有足够的知识来构建以下任何项目。知识来源于学习,但技能来自实践。
如果你已经了解一些 Solidity,但准备进入下一个层次,这一部分适合你开始。
本文描述了三种在 Solidity 中确定地址是否为智能合约的方法:
函数选择器是一个 4 字节标识符,Solidity 用于在底层识别函数。
ERC721(或 ERC-721)是最广泛使用的以太坊非同质化代币标准。
ERC-1155 代币可以在单个合约中保存多种同质和非同质代币。
ERC4626 是一个代币化保管箱标准,利用 ERC20 代币代表一些其他资产的份额。
可枚举的 ERC721 是一种 ERC721,具有附加功能,使智能合约能够列出某地址拥有的所有 NFT。
ERC-1363 让智能合约能够检测并响应代币的传入转移。
Uint256 最大值可以使用 type(uint256).max 获取。
Solidity 带符号整数在智能合约中支持使用负数。本文记录了它们在 EVM 层面上的使用。
staticcall 类似于常规以太坊调用,但如果发生状态变化则会回滚。
onlyOwner 修饰符可能是 Solidity 中最常见的模式之一。
要测试一个内部 Solidity 函数,可以创建一个从被测试合约继承的子合约。
Solidity 事件是 Ethereum 中最接近“打印”或“console.log”语句的东西。
本文的目的是描述 Solidity gasleft() 函数的行为及其用途。
重入攻击只能在你的智能合约通过函数调用或发送以太币来调用另一个智能合约时发生。
区块链上的随机性很棘手,因为区块链是确定的,而随机性需要非确定性(否则它变得可预测)。
一些构建块和设计模式在 DeFi 应用中出现得如此频繁,以至于最好直接研究它们。不要只是阅读这些教程,练习结尾处的问题。
MasterChef 和 Synthetix 的质押算法根据用户对池的时间加权贡献,在一个固定奖励池中分配给质押者。
定点数是一个整数,仅存储分数的分子——而分母隐含在其中。
闪电贷是智能合约之间的贷款,必须在同一交易中偿还。
Chainlink 价格预言机是具有公共视图函数的智能合约,该函数返回以特定资产以美元计价的价格。
跟踪贷款人存款的直观方式是记录他们存入的 USDC 量及其存入时间。Compound V3 并不是这样做的。
Uniswap V2 是 DeFi 中分叉次数最多的协议,并且启发了更多项目。Uniswap V2 书是对该协议逐行检查的文档。
Uniswap 是一款 DeFi 应用,允许交易者以无信任方式进行代币兑换。
本文解释了如何在自动化市场做市商(AMM)中确定交易对的价格结算。
Uniswap V2 的交换函数设计巧妙,但许多开发者第一次遇到时发现其逻辑令人困惑。
Uniswap V2 的生命周期的第一步是某人首次铸造流动性提供者(LP)代币(注入流动性,即代币到池中)。
Uniswap V2 设计为将六分之一的交换费用分配到协议中。由于交换费用为 0.3%,其中的六分之一为 0.05%,因此每笔交易的 0.05% 将汇入该协议。
假设我们在一个池中有 1 Ether 和 2000 USDC。这意味着以太币的价格为 2000 USDC。
Uniswap V2 Library 简化了一些与配对合约的交互,并被路由合约广泛使用。
路由合约为安全铸造和销毁流动性提供者(LP)代币(添加和移除流动性)提供了用户面向的智能合约。
使用现代 Solidity 从头重建 Uniswap V2 是非常有教育意义的(或者如果你真的想硬核的话,可以使用 Huff)。
ABI 编码是用于向智能合约发起函数调用的数据格式。这也是智能合约在呼叫其他智能合约时编码数据的方式。
存储变量在底层的工作方式
在 Solidity 中,合约可以通过两种方法调用其他合约:通过合约接口,这被认为是高层调用,或使用 call 方法,这是底层方法。
本文详细解释了 delegatecall 的工作原理。以太坊虚拟机(EVM)提供了四个 OPCODE 用于在合约之间进行调用:
EIP 1967 是一个关于存储代理合约执行所需信息的标准。
ERC-7201(前称 EIP-7201)是通过一个称为命名空间的公共标识符将存储变量分组的标准。
透明可升级代理是一个设计模式,用于在消除函数选择器冲突的可能性的同时升级代理。
EIP 1967 是一个关于存储代理合约执行所需信息的标准。
EIP-1167,也被称为最小代理合约,是一种常用的 Solidity 模式,用于便宜地创建代理克隆。
最小代理标准允许我们参数化克隆的创建,但这需要额外的初始化交易。
nodelegatecall 修饰符防止 delegatecall 被发送到合约。
ERC20 快照解决了双重投票的问题。
ERC20 投票实际上并不会处理进行投票,它仍然是一个正常的 ERC20 代币,具有快照和委派投票的能力。
许多 DeFi 应用遵循的治理模式受到 Compound Finance 实现的深远影响。
Compound V2 是最多次分叉的借贷协议,但不再使用,因此我们的 walkthrough 关注于 Compound V3。几乎所有现代借贷协议都从 Compound 获得灵感,因此如果你完全理解代码库,你将能够轻松理解其他 DeFi 借贷协议。
Compound 是 DeFi 中最重要的借贷协议之一,影响了多个区块链上几乎所有借贷协议的设计。
Compound V3 协议在秒的计量上计算利息。Compound V3 前端将其数值扩大到年份,以便于人们理解。
跟踪贷款人存款的直观方法是记录他们存入的 USDC 数量和时间。
cUSDC V3(Comet)作为非标准的重置代币。 CometExt.sol
Compound V3 合约的行为类似于重置 ERC20 代币。重置代币是指其供应量以算法方式调整的代币,而不是固定的。
在这一章中,我们将研究以下关于 Compound V3 的主题:抵押评估。
Compound 按照借贷者和借款者在市场中占据的比例,以 COMP 代币发放奖励。
Uniswap V2 Library 简化了一些与配对合约的交互,并被路由合约广泛使用。
路由合约为安全铸造和销毁 LP 代币(添加和移除流动性)提供用户面向的智能合约。
Compound V3 中的 Bulker 合约类似多重调用的合约,用于批处理多个交易。
OG gas 优化课程。
以太坊访问列表交易通过提前声明将访问哪些合约和存储槽,节省了跨合约调用的 gas。
超过 80 条 gas 优化技巧与窍门。
我们的 Yul 课程(Udemy)
当 Solidity 为将要部署的智能合约生成字节码时,它在字节码末尾附加有关编译的元数据。
智能合约创建成本可在 10 到 2000 美元之间,假设以太币的价格在 1500 到 2000 美元之间。
本文解释了当构建以太坊智能合约时,字节码级别上发生了什么,以及构造函数参数是如何解释的。
EIP-150 或以太坊改进提案 150 是以太坊区块链的协议升级。
智能合约中的错误可能代价高昂。因此,尽可能多地使用工具将最大化你在对抗漏洞和黑客时的成功机会。
在 Foundry 中进行不变检测在本文中,我们将讨论不变性(invariants)以及如何使用 foundry 测试套件对 solidity 智能合约进行不变性测试。
突变测试是一种检查测试套件质量的方法,通过故意在代码中引入错误并确保测试能够捕捉到这些错误。
第二前像攻击(Second Preimage Attack)
Merkle 树中的第二前像攻击可能发生在当 Merkle 树中的一个中间节点被作为叶子节点呈现时。
预编译智能合约(Precompiled smart contracts)
以太坊的预编译在行为上就像嵌入以太坊协议中的智能合约。这九个预编译位于地址 0x01 到 0x09。
Solidity 中的 RSA 签名(RSA Signatures in Solidity)
创建一个给特定地址赋予权限的合约有几种名称:空投(airdrops)、预售(presale)、白名单(whitelist)、允许名单(allowlist)等。
Tornado Cash 是怎么工作的(How does tornado cash work)
Tornado Cash 是一个加密货币智能合约混合器,使用户能够用一个地址存入加密货币,并用另一个钱包提款。
- 原文链接: rareskills.io/learn-soli...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!