集训课程表(Web3学习路线)概念小抄

  • 朴森
  • 发布于 3天前
  • 阅读 67

集训营课程表中的“概念小抄”,可以当作Web3技术随身小册,用于宏观理解Web3中的各类术语。

这是根据线下集训课程表(Web3学习路线)制作的概念“小抄”,新手可以通过这篇文章理解一下截止到目前的Web3知识框架;专家可以通读全文以复习巩固。其中各个部分的“一句话总结”只是作者的个人见解,如果有错误欢迎帮忙指出!

1. 区块链理论(Block chain theory)

一句话总结区块链的基础:通过分布式数据和共识机制解决中心化数据带来的可被篡改问题,它与中心化数据的唯一区别在于“修改需要共识”。其他的性质如可追溯性,隐私性等等中心化数据也能够做好,并不是二者的核心差别。从这个角度来讲:区块链技术发展的方向应该是与中心化解决方案有本质差异的场景,而不是相同的场景。

课程模块 时间安排(W:Week, D:DAY) 课程内容
区块链基础 W1D1 为什么需要区块链技术 如何实现基于代码的信任 比特币网络运行原理: 1. 去中心化网络 2. 区块链结构 3. 非对称密码学 4. POW 共识机制
区块链基础 W1D2 以太坊核心概念介绍: 1. 以太坊 POS 共识 2. 以太坊是如何执行代码的 3. 用 Solidity 编写第一个合约及 Remix 4. 以太坊的 gas 机制(EIP1559)以及 EVM 5. 区块链浏览器 6. 账户与钱包 7. 各种不同的网络与链:测试络、EVM 兼容链

一、区块链基础(W1D1 相关概念)

  1. 为什么需要区块链技术
    区块链解决了传统中心化系统的信任、透明性和数据篡改问题。比如金融交易中,无需银行等中介即可实现安全转账;供应链场景下,能让全流程数据不可篡改、可追溯,提升信任效率 。
  2. 如何实现基于代码的信任
    通过智能合约自动执行规则,结合密码学(如哈希、签名)确保数据真实,以及共识机制让网络节点达成一致,无需人工干预就能建立信任。例如智能合约收到触发条件,就自动执行转账、资产交割等操作 。
  3. 比特币网络运行原理
    • 去中心化网络:没有中心服务器,由全球矿工节点共同维护,避免单点故障和权力集中。
    • 区块链结构:交易打包成区块,按时间顺序链接成链,每个区块包含前一区块哈希,保证数据可追溯、难篡改 。
    • 非对称密码学:用公钥(类似地址)接收交易,私钥签名确认交易,既安全又能证明所有权 。
    • POW 共识机制(工作量证明):矿工比拼算力解决数学难题,谁先解出就打包区块、获得奖励,保证区块生成公平性和网络安全,但能耗较高 。

二、区块链基础(W1D2 相关概念)

  1. 以太坊核心概念
    • 以太坊 POS 共识(权益证明):取代比特币 POW,节点质押 ETH 参与记账,质押越多、在线越久,越易被选为记账节点,节能且提升效率 。
    • 以太坊执行代码方式:依托 EVM(以太坊虚拟机)运行智能合约代码,不管用户用什么语言写合约,都编译成 EVM 可执行的字节码,保证跨环境一致性 。
    • 用 Solidity 编写第一个合约及 Remix:Solidity 是以太坊智能合约编程语言,Remix 是在线 IDE(集成开发环境 ),能快速编写、编译、部署测试智能合约,降低开发门槛 。
    • 以太坊 gas 机制(EIP1559):执行合约、转账等操作需消耗 gas(计算费),EIP1559 优化后,设置基础费和优先费,基础费销毁,让 gas 费更可预测,缓解拥堵 。
    • 区块链浏览器:像以太坊浏览器 Etherscan,可查询区块、交易、地址、合约信息,透明化链上数据,比如查某地址转账记录、合约部署情况 。
    • 账户与钱包:以太坊有外部账户(私钥控制,用于转账、交互)和合约账户(智能合约代码控制);钱包是管理私钥、收发资产、交互 DApp 的工具,分硬件钱包(更安全 )、软件钱包等 。
    • 各种不同的网络与链
      • 测试络:如以太坊 Ropsten、Goerli 等,用于开发测试,不用真钱,降低试错成本 。
      • EVM 兼容链:像 BSC(币安智能链 )、Polygon,能运行以太坊智能合约,拓展生态、提升性能,让开发者复用以太坊工具和代码 。

2. Solidity

一句话总结Solidity:一种开发语言,用于运行在EVM虚拟机上,包含一系列接口屏蔽了区块链底层P2P网络之间的交互,可以简单地完成查询,交易,回调等操作;通过solidity编写的程序可以固定在区块链中,不可篡改并且能够自动执行,通过这项技术为用户提供了一种在数据共识之上的“规则的共识”。

课程模块 时间安排(W:Week, D:DAY) 课程内容
W1D3 实例介绍 Sol 语法: 变量数据类型:地址、合约类型、数组、 映射 理解链不同存储位置的差异,关注 gas 消耗 函数的定义:不同的可见性与可变性 (payable 等) 如何向合约转账:特殊的回调函数(receive 与 fallback) Solidity 内置变量与函数
Solidity 语言特性系统讲解 W1D4 函数修改器 错误处理:理解与传统开发语言错误的差异 合约接口:如何使用做合约之间的调用 继承与抽象合约
W1D5 理解合约调用的本质: ABI 理解底层调用:call 与 delegateCall 理解 EVM 调用的上下文环境的切换(msg.sender 及 tx.origin ) 合约事件的使用及什么时候该用事件 合约库(library)

Part 1

1. Sol 语法 & 变量数据类型

  • 地址(address):区块链世界的“账户标识”,类似银行账号,用于标识用户、合约地址。
    • 例:address user = 0x123...abc; ,可用来转账(user.transfer(1 ether) )、判断合约调用者(msg.sender == user )。
  • 合约类型(contract type):把其他合约当作类型引用,实现跨合约调用。
    • 例:MyToken token = MyToken(0x456...def); ,直接调用 token 合约的 transfer 函数。
  • 数组(array):存储一组同类型数据,分固定长度(uint[3] arr; )和动态长度(uint[] arr; )。
    • 注意:区块链存储昂贵,动态数组需谨慎使用,避免无限扩容(影响 Gas 费)。
  • 映射(mapping):类似字典/哈希表,用于键值对存储(如 mapping(address => uint) balances; )。
    • 常用场景:记录用户代币余额、NFT 持有者,但映射无法直接遍历(需结合数组辅助)。

2. 链存储位置差异与 Gas 消耗

  • 存储位置
    • storage(合约存储):永久存区块链上,修改成本极高(Gas 费贵),类似数据库持久化存储。
    • memory(内存):临时存函数执行过程中,调用结束销毁,Gas 费低,类似程序内存。
    • calldata(调用数据):外部调用传入的参数,只读,常用于函数参数(节省 Gas)。
  • Gas 影响:修改 storage 变量会触发区块链状态变更,需全网节点共识,所以 Gas 费远高于 memory/calldata 操作。

3. 函数定义:可见性与可变性

  • 可见性
    • public:外部、内部都能调用,自动生成 getter 函数(如 uint public count; )。
    • private:仅当前合约内部可调用,外部(包括继承合约)无法访问。
    • internal:当前合约及继承合约可调用,外部用户/合约无法直接访问。
    • external:仅外部可调用(如用户、其他合约),内部调用需加 this.this.myFunc() )。
  • 可变性(payable 等)
    • payable:函数可接收 ETH 转账,调用时需附带 value(如 myContract.myPayableFunc{value: 1 ether}() )。
    • view:只读函数,不修改区块链状态(查询数据),Gas 费极低(甚至免费)。
    • pure:更严格的只读,不访问任何 storage 变量,仅处理传入参数。

4. 向合约转账:receivefallback

  • receive 函数
    • 专用于处理纯 ETH 转账(无数据),是最简洁的收款方式。
    • 例:receive() external payable {} ,用户直接给合约转 ETH 时触发。
  • fallback 函数
    • 处理“无匹配函数调用”或“带数据的 ETH 转账”,需声明 external payable
    • 例:fallback() external payable { /* 自定义逻辑,如解析数据 */ } ,常用于兼容旧版调用、实现通用接收逻辑。

5. Solidity 内置变量与函数

  • msg.sender:当前调用者的地址(用户/合约),核心身份标识,用于权限控制(如 if (msg.sender == owner) { ... } )。
  • msg.value:调用时附带的 ETH 数量(仅 payable 函数可用 )。
  • block.number / block.timestamp:当前区块高度、时间戳,用于随机数生成(需注意安全性)、锁定期逻辑(如 if (block.timestamp > unlockTime) { ... } )。
  • tx.origin:最初发起调用的外部用户地址(区别于 msg.sendermsg.sender 可能是中间合约 ),慎用!存在钓鱼攻击风险(恶意合约可冒充用户)。

Part 2

函数修改器(Modifier)

  • 作用:复用函数前置/后置逻辑(如权限校验、状态检查),让代码更简洁。
  • 例:
modifier onlyOwner() {
    require(msg.sender == owner, "Not owner");
    _; // 执行原函数逻辑的位置
}

function setPrice(uint _price) external onlyOwner {
    price = _price;
}

调用 setPrice 时,先执行 onlyOwner 校验,通过后再执行函数内容。

2. 错误处理:与传统语言的差异

  • require / revert / assert
    • require(条件, "错误信息"):常用!校验输入、权限,失败则回滚交易,退还剩余 Gas。
    • revert("错误信息"):主动回滚交易,常用于复杂逻辑判断(如 if (balance < amount) revert("Insufficient balance"); )。
    • assert(条件):调试用,失败则触发 PANIC(消耗所有 Gas),生产环境少用
  • 与传统语言差异:区块链交易回滚是“全或无”,错误会撤销所有状态变更,且需明确返回错误信息(方便前端/用户调试)。

3. 合约接口(Interface)

  • 作用:定义合约“交互规范”(函数签名、事件),实现跨合约调用,无需依赖完整代码。
  • 例:
interface IERC20 {
    function transfer(address to, uint amount) external returns (bool);
}

contract MyDApp {
    function transferToken(IERC20 token, address to, uint amount) external {
        token.transfer(to, amount); // 调用其他合约的 transfer 函数
    }
}

只要其他合约实现了 IERC20 接口,就能被本合约调用,实现“解耦开发”。

4. 继承与抽象合约

  • 继承(Inheritance)
    • 复用父合约代码,支持多继承(但需注意冲突)。
    • 例:contract MyToken is ERC20, Ownable { ... } ,直接继承 OpenZeppelin 的 ERC20 代币标准、Ownable 权限管理。
  • 抽象合约(Abstract Contract)
    • 含未实现函数(function myFunc() external virtual; ),需被继承合约实现。
    • 作用:定义通用框架,强制子类实现关键逻辑(如 abstract contract Payment { function pay() external virtual; } )。

Part 3

1. 合约调用本质:ABI

  • ABI(Application Binary Interface):智能合约的“交互协议”,定义函数签名、参数编码、返回值解析方式。
    • 作用:前端/其他合约调用本合约时,需通过 ABI 编码数据(如 web3.eth.call({ to: 合约地址, data: ABI编码数据 }) )。
    • 例:函数 transfer(address to, uint amount) 的 ABI 编码,会把函数名、参数类型哈希成固定格式,让 EVM 识别调用逻辑。

2. 底层调用:calldelegateCall

  • call
    • 低级别调用,可动态传入函数签名和参数,类似“远程过程调用”。
    • 例:otherContract.call(abi.encodeWithSignature("transfer(address,uint256)", to, amount))
    • 特点:调用时,msg.sender 是当前合约地址(相当于“代理调用”)。
  • delegateCall
    • 关键!保留当前合约的 storage,执行目标合约的代码(常用于“合约升级”“代理模式”)。
    • 例:proxyContract.delegateCall(abi.encodeWithSignature("upgradeLogic()", ...)) ,让代理合约执行新逻辑合约的代码,但状态存在代理合约。
    • 风险:需严格校验目标合约,否则可能篡改存储(delegateCall 会按目标合约的存储布局操作当前合约存储 )。

3. EVM 调用上下文:msg.sendertx.origin

  • msg.sender:直接调用者的地址(可能是用户或合约)。
    • 例:用户 → 合约 A → 合约 B,合约 B 的 msg.sender 是合约 A。
  • tx.origin:最初发起交易的外部用户地址(始终是用户,不会是合约 )。
    • 风险:恶意合约可利用 tx.origin 钓鱼(如冒充用户调用高权限函数),建议优先用 msg.sender 做权限控制

4. 合约事件(Event)

  • 作用:记录关键操作(如转账、NFT 铸造),方便前端监听、链上数据索引(如 The Graph)。
  • 例:
event Transfer(address indexed from, address indexed to, uint amount);

function transfer(address to, uint amount) external {
    // 转账逻辑...
    emit Transfer(msg.sender, to, amount); // 触发事件
}
- `indexed`:标记可索引字段,让事件能被快速查询(但最多传 3 个 `indexed` 参数 )。  
- 优势:事件存储在“日志”中,不占合约存储(Gas 费低),是链上数据可视化的核心。

5. 合约库(Library)

  • 作用:复用代码(类似工具库),不占合约存储槽位(节省 Gas),且无法单独部署(需被合约引用)。
  • 例:OpenZeppelin 的 SafeMath 库(旧版),用于安全数学运算:
library SafeMath {
    function add(uint a, uint b) internal pure returns (uint) {
        require(a + b >= a, "Overflow");
        return a + b;
    }
}

contract MyToken {
    using SafeMath for uint; // 启用库,可直接调用 `uint.add()`
    function mint(uint amount) external {
        totalSupply = totalSupply.add(amount); // 安全加法
    }
}
- 特点:`library` 函数需声明 `internal` 或 `pure`/`view`,且通过 `using Library for Type;` 关联类型,实现语法糖。

3. OpenZepplin 库 Token 与 NFT 标准

一句话总结:Web3行业中存在ERC标准,用来统一多种区块链技术与应用的实现方式。OpenZepplin是根据标准实现的一套开发库,通过它可以屏蔽标准实现的底层细节,快速编写应用逻辑并接入到遵循这套标准的实现中。(类似于前端开发中的ES6) NFT是区块链技术的一个重要的应用,用于虚拟物品的确权。

课程模块 时间安排(W:Week, D:DAY) 课程内容
OpenZepplin 库 Token 及 NFT标准 W2D1 OpenZeppelin 代码库介绍 EIP 与 ERC标准 如何使用 ERC20 实现代币(Token) 理解 ERC20 授权与合约回调 实际使用 ERC20 的一些坑 ERC20 的拓展:ERC-777、ERC-1363 Token 交易所(DEX)初探
W2D2 使用 ERC721 实现 NFT 如何处理 NFT 的元数据 IPFS 、Arweare 去中心化存储 NFT 上架到 OpenSea ERC1155

一、W2D1 核心概念(Token 相关)

1. OpenZeppelin 代码库

  • 作用:区块链开发的“瑞士军刀”,提供经过审计、安全的智能合约模板(如 ERC20、ERC721、Ownable 等),避免重复造轮子 & 降低安全风险
  • 常用场景:发行代币直接继承 ERC20 合约(contract MyToken is ERC20 { ... } ),自动实现转账、授权等功能;用 Ownable 管理合约权限(仅 owner 可 mint 代币)。

2. EIP 与 ERC 标准

  • EIP(Ethereum Improvement Proposal):以太坊改进提案,是区块链生态的“技术规范文档”,决定新功能、标准(如 ERC20、NFT 标准)的落地。
  • ERC(Ethereum Request for Comments):基于 EIP 的具体实现标准,定义智能合约接口(如 ERC20 规定代币必须有 transferapprove 等函数 )。
  • 关系:EIP 是提案流程,ERC 是最终被社区认可的标准(类似“RFC 文档 → HTTP 协议”的关系 )。

3. ERC20 实现代币(Token)

  • 核心函数
    • transfer(address to, uint256 amount):直接转账(用户 → 用户)。
    • approve(address spender, uint256 amount):授权第三方(如 DEX 合约)代操作代币。
    • transferFrom(address from, address to, uint256 amount):第三方调用(需先授权 ),实现“代转账”(如 DEX 撮合交易)。
  • 示例
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {
    constructor() ERC20("MyToken", "MTK") {
        _mint(msg.sender, 1000 * 10**18); // 发行 1000 枚代币(考虑小数位)
    }
}

继承 ERC20 后,自动获得所有标准功能,无需重复编写。

4. ERC20 授权与合约回调

  • 授权(Approve)
    • 用户通过 approve 允许其他合约(如 Uniswap)操作自己的代币(如 approve(uniswapAddress, 100 * 10**18) )。
    • 风险:需警惕恶意合约无限授权(approve 多次调用会覆盖额度,建议用 increaseAllowance/decreaseAllowance )。
  • 合约回调
    • 当第三方合约调用 transferFrom 时,ERC20 标准无强制回调,但部分拓展标准(如 ERC777)会触发 tokensReceived 回调,用于实现“转账即触发逻辑”(如自动质押、分红 )。

5. ERC20 的“坑”

  • 小数位问题:ERC20 代币通常用 uint256 存总量,需手动处理小数位(如 1 ETH = 10^18 Wei ),否则易出现“发行 1 枚代币实际是 1 Wei”的错误。
  • 授权滥用:用户授权第三方后,若合约有漏洞,可能被恶意转走代币(需检查第三方合约安全性,或及时取消授权 )。
  • 重入攻击:早期 ERC20 未防御重入(如 transferFrom 调用外部合约时,对方再次调用 transferFrom ),虽 OpenZeppelin 已修复,但需了解历史风险。

6. ERC20 拓展(ERC-777、ERC-1363)

  • ERC-777
    • 增强版 ERC20,支持转账回调tokensReceived )、发送者/接收者黑名单、批量操作。
    • 优势:更灵活的业务逻辑(如转账时自动分成、触发其他合约),但需兼容 ERC20(否则无法被旧钱包识别 )。
  • ERC-1363
    • 专为“支付场景”设计,支持接收代币时回调onTransferReceived )、授权后回调(onApproveReceived )。
    • 常用场景:用户支付代币购买服务时,合约自动校验、完成业务(如 transferAndCall 一次性完成转账+回调 )。

7. Token 交易所(DEX)初探

  • DEX 原理
    • 去中心化交易所(如 Uniswap)通过“流动性池”实现代币兑换,无需中心化机构。
    • 核心逻辑:x*y=k 恒定乘积公式(如 ETH-USDT 池,ETH 增加则 USDT 减少,价格自动调整 )。
  • 与 ERC20 交互
    • DEX 合约通过 transferFrom 调用用户授权的代币,实现兑换(如用户授权 Uniswap 后,合约转走 ETH 并 mint 对应数量的 LP 代币 )。

二、W2D2 核心概念(NFT 相关)

1. ERC721 实现 NFT

  • 核心函数
    • mint(address to, uint256 tokenId):铸造 NFT(每个 tokenId 唯一 )。
    • transferFrom(address from, address to, uint256 tokenId):转移 NFT 所有权。
    • tokenURI(uint256 tokenId):返回 NFT 元数据链接(如 IPFS 地址 )。
  • 示例
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract MyNFT is ERC721 {
    constructor() ERC721("MyNFT", "MNFT") {}

    function mintNFT(address to, uint256 tokenId) external {
        _mint(to, tokenId); // 铸造 NFT
    }
}

继承 ERC721 后,自动支持 NFT 铸造、转移、查询所有权。

2. NFT 元数据(Metadata)

  • 作用:定义 NFT 的“灵魂”(名称、描述、图片等),通常是 JSON 格式:
{
  "name": "My NFT #1",
  "description": "A cool NFT",
  "image": "ipfs://Qm...abc", // 图片存储地址
  "attributes": [ { "trait_type": "Color", "value": "Blue" } ] // 属性
}
  • 存储:元数据需存去中心化存储(如 IPFS、Arweave ),避免中心化服务器关闭导致 NFT 失效。

3. IPFS、Arweave 去中心化存储

  • IPFS(星际文件系统)
    • 分布式文件存储网络,文件存多个节点,通过哈希(CID)访问。
    • 优势:去中心、抗审查;缺点:需“固定pin服务”(否则节点可能删除文件 )。
    • 示例:NFT 图片存 IPFS,元数据 JSON 里写 ipfs://Qm...
  • Arweave
    • 永久存储网络,付费后文件永久保存(基于区块链激励)。
    • 优势:真正永久,适合重要数据(如 NFT 元数据、高价值内容 );缺点:存储成本高于 IPFS。

4. NFT 上架到 OpenSea

  • 流程
    1. 部署 ERC721 合约并铸造 NFT。
    2. 在 OpenSea 绑定钱包,导入合约(或自动检测已部署合约 )。
    3. 设置 NFT 价格、销售条件(如固定价、拍卖 ),OpenSea 会调用合约 approve 授权平台转售。
  • 关键:确保合约实现 ERC721 标准,且元数据可访问(IPFS/Arweave 地址有效 )。

5. ERC1155

  • 特点:“多代币标准”,支持同一合约发行多种 NFT(每个 tokenId 代表一类 ),且可批量操作(如一次转移 10 个不同 tokenId )。
  • 优势
    • 节省 Gas(多代币共享合约存储 )。
    • 灵活适配游戏道具(如 100 把“剑”NFT,用 ERC1155 只需一个 tokenId ,铸造 100 份 )。
  • 示例
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";

contract MyMultiNFT is ERC1155 {
    constructor() ERC1155("ipfs://Qm.../{id}.json") {} // 元数据模板

    function mint(address to, uint256 tokenId, uint256 amount) external {
        _mint(to, tokenId, amount, ""); // 铸造 amount 个 tokenId 的 NFT
    }
}

4. Foundry

一句话总结: Foundry 相当于区块链开发的脚手架工具cli,和代码编辑器Cursor/VScode等共同组成IDE(intergrated Development environment 集成开发环境)

课程模块 时间安排(W:Week, D:DAY) 课程内容
Foundry 开发工具 W2D3 IDE 与 AI 编辑器 Foundry 工程化: 项目初始化、编译、测试、部署 Foundry 实战技巧: 管理依赖库 私钥管理:不同形式下安全(私钥、助记词与 keystore) 节点 RPC 配置 合约开源验证 cast 常用指令:转账、合约调用、编码
W2D4 深入 Foundry 测试 console.log 使用 测试指令与 gas 报告 常用测试作弊码:更改区块高度、更改余额、模拟交易发送者、重置 ERC20 余额 错误断言 fork 主网状态、分叉测试 模糊(Fuzz)测试 不变量(invariant)测试

一、W2D3 核心概念(Foundry 工程化基础)

1. IDE 与 AI 编辑器

  • IDE(集成开发环境):区块链开发常用 VSCode + Solidity 插件(如 Solidity Extension Pack ),支持语法高亮、智能提示、调试(结合 Foundry 命令 )。
  • AI 编辑器:如 Cursor(专为智能合约开发优化)、Copilot(代码补全 + 逻辑生成 ),能自动生成测试代码、优化 Solidity 语法,提升开发效率。

2. Foundry 工程化:项目初始化、编译、测试、部署

  • 项目初始化
    • 命令:forge init my-project ,自动生成标准 Foundry 项目结构(含 src/ 合约目录、test/ 测试目录、script/ 部署脚本 )。
    • 作用:规范项目结构,让团队协作、代码管理更清晰。
  • 编译
    • 命令:forge build ,编译 src/ 目录下的 Solidity 合约,输出字节码、ABI(存 out/ 目录 )。
    • 优势:比 Hardhat 更快(Rust 实现),支持自定义编译器版本(forge build --compiler-version 0.8.24 )。
  • 测试
    • 命令:forge test ,自动运行 test/ 目录下的测试用例(基于 Forge 测试框架 )。
    • 特点:支持Fuzz 测试(自动生成随机输入)、主网 Fork 测试(模拟主网状态 )。
  • 部署
    • 方式 1:forge create 直接部署合约(需填私钥、RPC 节点 )。
    • 方式 2:写部署脚本(script/Deploy.s.sol ),用 forge script 执行(支持多签、验证 )。

3. Foundry 实战技巧

  • 管理依赖库
    • forge install 安装依赖(如 forge install openzeppelin/openzeppelin-contracts ),自动关联 GitHub 仓库,支持版本锁定(lib/ 目录管理 )。
    • 优势:比 npm 更轻量,直接关联区块链生态的开源库。
  • 私钥管理:不同形式下安全
    • 私钥(Private Key):最原始的钱包凭证(64 字符十六进制),需绝对保密(泄漏则资产丢失 )。
    • 助记词(Mnemonic):12/24 个单词的种子短语,可推导私钥,需离线存储(如硬件钱包 )。
    • Keystore:加密后的私钥文件(带密码),适合服务端安全存储(forge wallet import 可导入 )。
    • Foundry 实践:测试时用 --private-key 或环境变量 PRIVATE_KEY 传入,生产环境建议用硬件钱包/安全托管。
  • 节点 RPC 配置
    • RPC(远程过程调用):连接区块链节点的接口(如 Infura、Alchemy 提供 ),Foundry 用 foundry.toml 配置:
rpc_endpoints = { mainnet = "https://mainnet.infura.io/v3/...", sepolia = "https://sepolia.infura.io/v3/..." }
- 作用:测试、部署时指定链环境(如 `forge test --fork-url mainnet` )。
  • 合约开源验证
    • 命令:forge verify-contract ,将已部署合约的字节码、源码提交到区块链浏览器(如 Etherscan ),实现“开源验证”(用户可查合约逻辑 )。
    • 关键:需填 API Key(Etherscan 等平台申请 ),确保编译参数与部署一致(--compiler-version )。
  • cast 常用指令:转账、合约调用、编码
    • cast:Foundry 命令行工具,用于链上交互(无需写 Solidity 脚本 )。
    • 示例:
      • 转账:cast send --private-key $PK $TO_ADDRESS --value 0.1ether
      • 调用合约:cast call $CONTRACT "balanceOf(address)" $OWNER_ADDRESS
      • 编码数据:cast sig "transfer(address,uint256)" $TO 100(生成函数签名哈希 )

二、W2D4 核心概念(Foundry 高级测试)

1. 深入 Foundry 测试

  • console.log 使用
    • 在 Solidity 测试合约中,用 vm.console.log() 打印变量(类似 JavaScript ),需导入 forge-std/Test.sol
import "forge-std/Test.sol";

contract MyTest is Test {
    function testLog() public {
        uint256 x = 100;
        vm.console.log("x value:", x); // 测试时输出日志
    }
}
- 作用:调试时快速查看变量值,比区块链浏览器查日志更高效。

2. 测试指令与 gas 报告

  • 测试指令
    • forge test --match-test testFunction:只运行指定测试函数。
    • forge test --gas-report:输出每个测试函数的 Gas 消耗报告(优化合约成本关键 )。
  • gas 报告解读
    • 显示“部署”“调用”阶段的 Gas 消耗,帮助定位高消耗代码(如循环、存储操作 )。

3. 常用测试作弊码

  • 作弊码(Cheatcodes):Foundry 提供的特殊函数(vm. 前缀 ),用于“模拟链上环境”(开发/测试专用,主网无效 )。
  • 示例:
    • 更改区块高度:vm.blockNumber(1000000);(测试区块高度相关逻辑 )。
    • 更改余额:vm.deal(address(this), 100 ether);(给合约地址发 ETH )。
    • 模拟交易发送者:vm.prank(attackerAddress);(让后续调用假装来自 attackerAddress )。
    • 重置 ERC20 余额:vm.setBalance(tokenAddress, userAddress, 1000 * 10**18);(测试代币操作 )。

4. 错误断言

  • require / assert / expectRevert
    • 在测试中,用 expectRevert 验证合约应抛出的错误:
function testTransferFail() public {
    vm.expectRevert("Insufficient balance"); // 期望抛出该错误
    token.transfer(recipient, 1000 ether); // 执行会失败的操作
}
- 作用:确保合约逻辑符合预期(如转账失败时回滚 )。

5. fork 主网状态、分叉测试

  • 主网 Fork
    • 命令:forge test --fork-url mainnet ,在本地模拟主网状态(复制区块、账户余额、合约数据 )。
    • 作用:安全测试“与主网交互的逻辑”(如测试 DEX 策略,无需真金白银 )。
  • 分叉测试
    • 修改 Fork 后的状态(如 vm.prank 模拟攻击、vm.setStorageAt 篡改存储 ),验证合约鲁棒性。

6. 模糊(Fuzz)测试

  • 原理:Foundry 自动生成随机输入(如 uint256 amount 传 0~2^256-1 的值 ),测试合约边界情况。
  • 示例:
function testTransferFuzz(uint256 amount) public {
    vm.assume(amount > 0 && amount <= balanceOf(msg.sender)); // 过滤无效输入
    token.transfer(recipient, amount); // 用随机 amount 测试
    assert(balanceOf(recipient) == oldBalance + amount); // 断言结果
}
- 优势:发现手动测试遗漏的漏洞(如溢出、极端值处理 )。

7. 不变量(invariant)测试

  • 原理:定义“无论如何调用,都应成立的条件”,Foundry 反复调用合约函数,验证条件是否始终成立。
  • 示例:
function invariant_totalSupply() public {
    assert(token.totalSupply() == 1000 ether); // 总供应量应始终为 1000 ETH
}
- 作用:检测合约状态是否被意外篡改(如 mint 函数是否超额发行 )。

5. Dapp(Decentralized Application)

一句话总结Dapp:核心数据通过区块链保存的应用程序(App),与传统App的不同在于需要链接“钱包”用于获取身份标识,底层核心数据通过区块链存储。(应用的逻辑性感觉需要好好思考一下)

课程模块 时间安排(W:Week, D:DAY) 课程内容
W2D5 DAPP 初探: 交易是如何发送到链上 外接与链技术的通道 JSON-RPC 各种交互库(JSON-RPC 的封装):Viem.sh 、ethers.js 、go-ethereum、alloy-rs 重点介绍 viem.js 使用: 钱包链接、私钥签名、转账、获取链上数据、监听事件等
W3D1 钱包开发: 如何创建钱包,理解钱包相关的标准BIP32、BIP44、BIP39 (各公链账户生成都遵循的标准) 私钥的加密 keystore 私钥的分片 MPC 如何构造一个交易、签名交易、发送交易 插件钱包和移动端钱包浏览器的实现原理 中心化钱包与去中心化钱包 硬件钱包与合约钱包、及多签钱包(Safe) AA 钱包:ERC4337 与 EIP7702
钱包及前后端与链交互开发 W3D2 DAPP 应用前端开发 使用 Wagmi 方便管理数据状态(与链同步) 钱包链接的多种方式: 常规方式、Wallet Connect 、使用 AppKit 及 Rainbow kit 理解 SIWE 以太坊登录 如何使用合约签名登录(EIP1271、EIP4494)
W3D3 以太坊签名与应用: 如何在合约中验证用户的签名 熟悉相关的签名标准: EIP191 、 EIP712 如何使用 ERC20-Permit 、 ERC721-Permit 优化体验 Permit2 的应用
W3D4 后端的数据索引: 理解 ABI 描述与 ABI 编解码 使用事件订阅获取最新数据 构建一个扫块服务,获取想要的链上数据

一、W2D5 核心概念(DApp 基础与交互库)

1. DAPP 初探

  • 交易发送到链上
    用户操作(如转账、 mint NFT )生成交易对象(含 tovaluedata 等字段 ),通过 RPC 节点(如 Infura )广播到区块链网络,矿工打包进区块后完成上链。
  • JSON-RPC
    区块链节点的“通信协议”,前端/后端通过 JSON 格式的请求(如 {"method": "eth_sendTransaction", "params": [...]} )调用节点 API,实现交易发送、数据查询。
  • 交互库封装
    • Viem.sh:轻量、现代的以太坊交互库(推荐!支持多链、智能合约交互,语法简洁 )。
    • ethers.js:老牌库,功能全但体积稍大,适合传统项目。
    • go-ethereum:Golang 版以太坊工具库,后端开发常用。
    • alloy-rs:Rust 生态的交互库,性能高,适合深度定制。
  • Viem.js 核心功能
    • 钱包链接:connectWallet() 关联 MetaMask 等钱包。
    • 私钥签名:signMessage() 用钱包私钥签名消息(非交易,用于身份验证 )。
    • 转账:sendTransaction() 发起 ETH 转账。
    • 链上数据查询:readContract() 调用合约 view 函数(如查余额 )。
    • 事件监听:watchContractEvent() 监听合约事件(如 Transfer )。

二、W3D1 核心概念(钱包开发全流程)

1. 钱包标准(BIP32/BIP44/BIP39)

  • BIP39(助记词):12/24 个单词生成种子短语,是钱包恢复的核心(mnemonic.toSeed() 推导私钥 )。
  • BIP32(分层确定性钱包):从种子生成层级私钥(如 m/44'/60'/0'/0/0 对应 ETH 主网第一个账户 ),实现“一套助记词管理多链、多账户”。
  • BIP44(多币种扩展):定义 BIP32 的路径规范(m/ purpose' / coin_type' / account' / change / address_index ),让不同链的账户路径统一(如 ETH 是 44'/60' ,BTC 是 44'/0' )。

2. 钱包核心技术

  • 私钥加密(keystore)
    私钥 → 用密码加密 → 生成 JSON 文件(keystore ),解密需密码(web3.eth.accounts.decrypt(keystore, password) ),平衡安全与存储。
  • 私钥分片(MPC)
    把私钥拆成多片(如 3 片),需多片协同签名(t-of-n 机制 ),防止单点泄漏风险(企业级钱包常用 )。
  • 交易构造与签名
    构造交易对象({ to, value, gas, data } )→ 用私钥签名(signTransaction() )→ 广播到链(sendRawTransaction() )。

3. 钱包类型与实现

  • 插件/移动端钱包
    • 原理:通过浏览器扩展(MetaMask)或 App 注入 window.ethereum 对象,实现 DApp 交互。
    • 开发:需适配钱包 API(如 eth_requestAccounts 申请连接、eth_sendTransaction 发交易 )。
  • 中心化 vs 去中心化钱包
    • 中心化:私钥由平台托管(如交易所钱包 ),方便但有跑路风险。
    • 去中心化:用户自己管私钥(如 MetaMask ),安全但需承担丢失风险。
  • 硬件钱包(Ledger/Trezor)
    私钥存在离线设备,交易签名在硬件内完成(防黑客窃取 ),需通过 USB/蓝牙与 DApp 交互。
  • 多签钱包(Safe)
    需多个私钥签名(如 2/3 多签 ),适合团队、DAO 管理资产(Safe 合约实现复杂权限 )。
  • AA 钱包(ERC4337/EIP7702)
    智能合约钱包(Account Abstraction ),支持自定义逻辑(如自动支付 Gas、批量交易 ),EIP7702 优化签名验证流程。

三、W3D2 核心概念(DApp 前端开发)

1. Wagmi 数据状态管理

  • 作用:简化 DApp 前端与区块链交互,自动同步链上数据(如钱包余额、合约状态 )。
  • 示例:
import { useAccount, useBalance } from 'wagmi';

function WalletInfo() {
    const { address } = useAccount(); // 自动获取钱包地址
    const { data: balance } = useBalance({ address }); // 自动查 ETH 余额

    return <div>Address: {address}<br>Balance: {balance?.formatted}</div>;
}
- 优势:无需手动写 RPC 请求,状态自动更新(链上变化时前端实时响应 )。

2. 钱包链接方式

  • 常规方式:直接调用 window.ethereum.request({ method: 'eth_requestAccounts' }) 连接 MetaMask。
  • Wallet Connect:跨钱包协议,支持扫描二维码连接(如连接 Trust Wallet、Rainbow ),代码示例:
import { createWalletConnectConnector } from 'wagmi/connectors/walletConnect';

const connector = createWalletConnectConnector({ chains, options: { projectId: '...' } });
await connector.connect(); // 弹出 Wallet Connect 二维码
  • AppKit/Rainbow kit
    前端组件库,快速搭建“钱包连接按钮、网络切换”等 UI(RainbowKit 内置多种钱包适配 )。

3. SIWE 与合约签名登录

  • SIWE(Sign-In with Ethereum)
    用以太坊钱包签名“登录消息”(如 I sign in to DApp at 2024-10-01 ),替代传统密码登录,实现“区块链身份认证”。
    • 流程:DApp 生成消息 → 用户签名 → 后端验证签名(ecrecover 确认是地址所有者 )。
  • EIP1271/EIP4494
    • EIP1271:智能合约钱包的签名验证标准(非 EOA 账户签名时,需合约实现 isValidSignature )。
    • EIP4494:优化签名格式,支持多链、多账户场景,让 SIWE 更通用。

四、W3D3 核心概念(以太坊签名与优化)

1. 合约验证用户签名

  • 原理:用户用私钥签名消息(signMessage ),合约用 ecrecover 函数恢复签名者地址,验证是否为目标地址:
function verifySignature(bytes32 message, bytes memory sig) public view returns (bool) {
    address signer = ecrecover(message, sig.v, sig.r, sig.s);
    return signer == expectedAddress;
}
  • 应用:无密码登录(SIWE)、授权操作(如批准某地址调用合约 )。

2. 签名标准(EIP191/EIP712)

  • EIP191:通用签名格式(支持任意数据签名 ),但易被篡改(如消息前缀不明显 )。
  • EIP712:结构化签名标准(定义消息类型、域名、版本 ),防止“签名伪造”(如伪造转账金额 ),示例:
struct Transfer {
    address to;
    uint256 amount;
}

function transfer(Transfer calldata req, bytes memory sig) public {
    // 验证 EIP712 签名
    bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(...)));
    address signer = ecrecover(digest, sig.v, sig.r, sig.s);
    require(signer == req.to, "Invalid signature");
    // 执行转账...
}

3. Permit 优化(ERC20-Permit/ERC721-Permit)

  • 传统授权问题:ERC20 授权需两步(approve + transferFrom ),易出错且耗 Gas。
  • Permit 方案
    用户签名“授权消息”(含金额、过期时间 ),合约直接用签名代替 approve,实现“一步授权+转账”:
function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
    // 验证签名,直接设置授权额度
    _approve(owner, spender, value);
}
  • Permit2:通用 Permit 标准,支持多代币、批量授权,减少重复开发(如 Uniswap 统一使用 Permit2 )。

五、W3D4 核心概念(后端数据索引与扫块)

1. ABI 编解码

  • ABI(应用二进制接口):合约函数的“调用规范”(参数类型、返回值、函数选择器 )。
  • 编解码
    • 编码:把函数调用(如 transfer(address,uint256) )转成字节码(data 字段 )。
    • 解码:把链上事件日志(topics + data )转回可读数据(如 Transfer(from, to, amount) )。

2. 事件订阅与扫块

  • 事件订阅
    后端用 RPC 节点的 eth_subscribe 监听合约事件(如 Transfer ),实时获取链上操作(如 DEX 监听交易对流动性变化 )。
  • 扫块服务
    定时遍历区块(eth_getBlockByNumber ),解析每个区块的交易和事件,提取目标数据(如统计某地址历史转账 )。
    • 优化:用 TheGraphDune 替代手动扫块,通过 GraphQL 查询链上数据(更高效 )。

6. Contract 合约

一句话总结Contract:正了八经在以太坊链上运行的合约需要考虑gas优化,安全等,在开发过程中需要熟悉一些技巧用于定位错误,调试等。

课程模块 时间安排(W:Week, D:DAY) 课程内容
合约开发进阶: EVM 、GAS 优化 如何写出更优秀的代码 W3D5 合约地址是如何生成的 创建合约的几个方式: CREATE、CREATE2、Create3(库) 最小代理的使用 理解如何预测合约地址、如何在不同链上生成相同的地址
W4D1 EVM 是如何运行的 查看 EVM 执行指令的过程 理解 EVM 中不同的存储区域及特性、尤其是 GAS 的差异 深入理解合约中定义变量的存储布局、Gas 优化的前提
W4D2 更多 GAS 优化技巧,如果做合理的数据设计和链上链下数据的平衡 介绍优秀的设计模式: 可迭代链表、默克尔树应用、MultiCall 交易打包
W4D3 如果做合约迁移(如果被攻击) 理解合约升级的设计:代理与实现合约分开 理解合约升级解决的几个问题:存储布局冲突、函数冲突 合约升级实战中的方案:透明代理、UUPS 理解钻石代理 和 信标代理的使用场景
W4D4 如何提升合约安全: 合约审计、最小化合约功能、完整测试、预案与演练 熟悉常见的安全漏洞: 重入攻击、Dos 拒绝服务、签名重用 溢出问题、精度损失、重入攻击、权限控制 CTF 资料推荐
W4D5 合约审计: 如何做审计、准备什么、怎么做代码分析、静态分析、动态分析、AI 分析、人工分析 合约监控及自动化: 监控哪些内容、如何自动化处理(Chinalink automation 等服务) 事故分析:分析资金流、定位错误

一、W3D5 核心概念(合约地址与创建方式)

1. 合约地址生成规则

  • CREATE 指令(传统方式)
    由部署者地址 + 部署次数(nonce)推导,公式:合约地址 = keccak256(rlp([部署者地址, nonce]))[12:]
    • 特点:每次部署地址变化(nonce 递增 ),无法预测。
  • CREATE2 指令(确定性部署)
    工厂合约地址 + 盐值(salt) + 合约字节码哈希推导,公式:合约地址 = keccak256(0xff + 工厂地址 + salt + keccak256(字节码))[12:]
    • 优势:在不同链/环境,只要参数相同,合约地址完全一致(可用于跨链兼容、代理升级 )。
  • Create3(库优化)
    基于 CREATE2 封装的库(如 Create3.sol ),简化盐值管理,让确定性部署更易用。

2. 最小代理(Minimal Proxy)

  • 原理:复用“基础实现合约”的字节码,通过代理转发调用(类似 EIP-1167 ),大幅减少部署 Gas。
  • 代码示例
// 最小代理字节码模板
bytes memory proxyCode = hex"3d602d80600a3d3981f3363d3d373d3d3d363d73bebebebebebebebebebebebebebebebebebebebebebe5af43d82803e903d91602b57fd5bf3";
address proxy = createProxy(proxyCode, implementationAddress);
- 作用:批量部署轻量级代理合约(如 NFT 铸币合约 ),节省成本。

3. 跨链相同地址生成

  • 核心:用 CREATE2 + 固定参数(工厂地址、salt、字节码 ),确保不同链(如 Ethereum、BSC )上部署时地址一致。
  • 应用:跨链桥、多链 DApp 统一合约地址,简化用户交互。

二、W4D1 核心概念(EVM 运行与存储优化)

1. EVM 运行原理

  • EVM(以太坊虚拟机):执行智能合约字节码的“沙盒环境”,基于栈式架构(操作数栈、内存、存储、调用数据 )。
  • 执行流程
    交易触发合约 → 字节码加载到 EVM → 逐指令执行(PUSH/POP/MSTORE 等 )→ 修改存储或返回结果。
  • 调试工具
    使用 forge debug 单步跟踪 EVM 指令,或通过 Tenderly 查看交易执行轨迹( opcode 级分析 )。

2. EVM 存储区域与 Gas 差异

  • 存储区域
    • storage(持久存储):存合约状态变量,修改成本极高(Gas 费贵,需共识 )。
    • memory(临时内存):函数执行时临时存储,调用结束销毁,Gas 费低。
    • calldata(调用数据):外部传入的只读数据,Gas 费最低(常用于函数参数 )。
  • Gas 优化关键
    减少 storage 写入(合并变量、用 memory 暂存计算结果 ),优先使用 calldata 传参。

3. 变量存储布局与 Gas 优化

  • 存储布局规则
    Solidity 按变量声明顺序,以 32 字节(一个槽位)为单位紧凑存储(如 uint256 a; uint256 b; 占 1 个槽位 )。
  • 优化技巧
    • 合并小变量(如 uint8 a; uint8 b; 可存到一个槽位 )。
    • 避免跨槽位存储(如 uint128 a; uint256 b; 会浪费空间 )。

三、W4D2 核心概念(GAS 优化与设计模式)

1. GAS 优化技巧

  • 数据设计平衡
    链上存储贵 → 把非关键数据(如用户昵称、等级 )存链下(IPFS/Arweave ),链上只存哈希或索引。
  • 优秀设计模式
    • 可迭代链表:用链表结构存储动态数据(如投票列表 ),减少 storage 操作。
    • 默克尔树(Merkle Tree):批量验证数据(如空投证明 ),用一个根哈希代替全量数据上链。
    • MultiCall 交易打包
      Multicall 合约批量调用多个函数(如一次更新多个状态 ),减少交易次数和 Gas(forge multicall 支持 )。

2. 设计模式实践

  • 可迭代链表示例
struct Node { uint256 data; address next; }
mapping(address => Node) nodes; // 链表存储
- 优势:插入/删除只需修改指针,无需遍历数组(节省 Gas )。
  • 默克尔树示例
    merkletreejs 生成根哈希,链上验证用户证明(verifyProof ),避免全量数据上链。

四、W4D3 核心概念(合约迁移与升级)

1. 合约迁移与升级场景

  • 迁移原因
    合约被攻击(如重入漏洞 )→ 需迁移资产到新合约;或功能迭代(如增加新特性 )→ 需升级逻辑。

2. 代理模式设计

  • 代理与实现分离
    • 代理合约(Proxy):存 storage,转发调用到“实现合约”(Logic )。
    • 实现合约(Logic):存业务逻辑,可替换升级。
  • 常见代理类型
    • 透明代理(Transparent Proxy):区分管理员和用户调用,防止管理员误操作。
    • UUPS(Universal Upgradeable Proxy Standard):实现合约内置升级逻辑(更省 Gas )。
    • 钻石代理(Diamond Proxy):支持多实现合约(模块化升级,适合复杂 DApp )。
    • 信标代理(Beacon Proxy):多代理共享同一个实现合约(批量升级高效 )。

3. 升级问题与解决方案

  • 存储布局冲突
    升级后新变量需放在未使用的槽位(用 __gap 占位符预留空间 )。
  • 函数冲突
    确保新函数选择器(bytes4(keccak256("func()")) )不与旧函数重复。

五、W4D4 核心概念(合约安全与漏洞防护)

1. 合约安全提升策略

  • 最小化功能:移除不必要的函数/权限(如 owner 仅保留关键操作 )。
  • 完整测试
    单元测试(forge test )+ Fuzz 测试(随机输入 )+ 主网 Fork 测试(模拟真实环境 )。
  • 预案与演练
    制定漏洞响应流程(如多签钱包紧急转移资产 ),定期演练攻击场景。

2. 常见安全漏洞

  • 重入攻击(Reentrancy)
    恶意合约在回调中重复调用原函数(如旧版 approve + transferFrom ),盗取资产。
    • 防御:使用 ReentrancyGuard(OpenZeppelin ),或“检查-生效-交互”模式。
  • DoS 拒绝服务
    攻击者制造大量无效数据(如填充数组 ),导致合约无法执行(如 for (uint i; i < arr.length; i++) { ... } 被无限扩容 )。
    • 防御:限制数组长度,或用默克尔树替代全量存储。
  • 签名重用
    攻击者复用用户签名(如 permit 授权未过期 ),重复调用函数。
    • 防御:添加 nonce 或时间戳校验。
  • 溢出/精度损失
    算术运算未检查边界(如 uint256 a = type(uint256).max; a++ 溢出 )。
    • 防御:用 SafeMath(旧版 )或 Solidity 0.8+ 自动溢出检查。

六、W4D5 核心概念(合约审计与监控)

1. 合约审计流程

  • 准备阶段:整理需求文档、合约功能清单、测试用例。
  • 分析阶段
    • 静态分析(slither 扫描代码漏洞 )。
    • 动态分析(forge test --fuzz 模拟运行 )。
    • AI 分析(如 ChatGPT 辅助找逻辑漏洞 )。
    • 人工审计(资深开发者逐行检查 )。

2. 合约监控与自动化

  • 监控内容
    交易异常(如大额转账、权限变更 )、函数调用频率、Gas 消耗异常。
  • 自动化工具
    使用 Tenderly 或自定义脚本(监听事件、RPC 调用 ),触发警报(如 Discord 通知 )。

3. 事故分析与复盘

  • 资金流分析:用区块链浏览器(Etherscan )追踪代币转移,定位漏洞利用路径。
  • 错误定位:结合 EVM 执行轨迹(debug_traceTransaction ),还原事故现场。

7. DeFi 去中心化金融(Decentralized Finance)

一句话总结DeFi:去中心化比中心化的交易效率提高很多,这在金融场景上是天然的优势,DeFi也是区块链技技术的重要应用之一,稳定币法案的发布似乎意味着去中心化金融与中心化金融的融合即将到来。

课程模块 时间安排(W:Week, D:DAY) 课程内容
去中心化金融(DEFI)<br/>去中心化金融(DEFI) W5D1 回顾行业发展关键事件 Token 的发行 IDO 与 LaunchPad 的实现 常见锁仓解锁机制及实现 探索代币经济模型
W5D2 DEX 去中心化交易所: AMM 做市商模型:K = x*y Uniswap 添加、移除流动性 如何兑换、滑点、够代码讲解 理解滑点 什么是三明治攻击(夹子机器人),如何实施
W5D3 继续深入 DEX: 1. ETH 与 WETH 2. 流动性提供的的无常损失 3. 什么是闪电兑换及应用 4. 如何获取 DEX价格(实时价格与时间加权价格)及 Chainlink价格预言机 5. Uniswap 的各版本迭代的优化(V3、V4,Uniswap X) 6. 其他的 DEX:SushiSwap、PancakeSwap 7. 交易聚合器 - 寻找最佳的交易路由(1Inch 等) SushiSwap 流动性挖矿:
W5D4 理解 1 池、2 池的不同 重点理解链上收益的单位累计的计算方式 核心挖矿的分析
W5D5 借贷协议分析 - Compound 与 Aave 重点介绍 Compound 超额抵押借贷模型、预言机评估存贷价值 如何使用闪电贷、如何根据借贷资金使用率来动利率模型 利率模型相关代码分析 理解 APR 与 APY 资不抵债时,如何进行清算 Vault 拓展 - EIP4626
W6D1 稳定币: 抵押型稳定币 - USDC(原 DAI)- 稳定币作为债务,以美元抵押的 USDC,USDT 算法稳定币:通过算法调节供需关系实现价格稳定 AmpL,理解 Rebase 机制 野生美联储 - Basis Cash FEI:理解 PCV:协议控制价值 Frax:渐进式稳定币 LUNAUST 的崩盘
W6D2 杠杆交易: 杠杆在金融的工作原理:杠杆倍数、头寸、保证金、PNL 等 理解杠杆的正与负,不同情况的盈利和亏损表现 Perpetual 为例,分析杠杆交易的的实现 理解 vamm 虚拟流动性的作用
W6D3 期货的由来、理解永续合约的工作原理 分析永续杠杆交易,不同方向的盈利和亏损表现 如何使用期货对冲,获取稳健收益 GMX 各模块及运行逻辑介绍 期权与期货的不同,如何使用期权对冲 债券与合成资产介绍
W6D4 什么是 DAO 与 DAO 治理 协议 DAO 治理的流程 常见的投票机制、锁仓投票机制 重点理解 ERC20 Token 投票的实现 TimeLock 时间延迟的应用
W6D5 什么是 MEV 常见的 MEV 策略:三明治(抢跑+尾随和)、不同市场套利、清算机会 MEV 案例分析、如何攻防 MEV Flashbots 介绍 如何发掘交易

一、W5D1 - W5D5 核心概念(DeFi 基础与 DEX 深度)

1. 行业发展与 Token 发行

  • Token 发行
    区块链项目通过“铸币”(如 ERC20 合约 _mint 函数 )生成原生代币,作为生态内的价值载体(如 Uniswap 的 UNI、Compound 的 COMP )。
  • IDO 与 LaunchPad
    • IDO(Initial DEX Offering):在 DEX 上进行代币发行(如在 Uniswap 启动交易对 ),替代传统 IEO/ICO,更去中心化。
    • LaunchPad:项目方发行代币的平台(如 Binance LaunchPad ),需通过审核,保障投资者权益。
  • 锁仓/解锁机制
    代币发行后,团队/投资者的代币会“锁定”一段时间(如 vesting 合约 ),分阶段解锁(防止砸盘 ),示例:
// 简化锁仓逻辑
function releaseToken(uint256 amount) public {
    require(block.timestamp > unlockTime, "Not unlocked");
    _transfer(owner, msg.sender, amount);
}

2. DEX 与 AMM 模型

  • AMM(自动做市商)
    用数学公式(如 x*y=k )替代传统订单簿,实现去中心化交易。
    • 例:Uniswap 中,ETH-USDC 交易对的流动性池存 x ETH 和 y USDC,交易时 x/y 变化,价格自动调整。
  • 添加/移除流动性
    用户向池子里存入代币(如 1 ETH + 1000 USDC ),获得 LP 代币(代表份额 ),可分享交易手续费。
  • 滑点(Slippage)
    交易时,因流动性不足导致实际成交价与预期价的偏差(如预期买 1 ETH 花 1000 USDC,实际花 1010 USDC ),滑点越高,冲击成本越大。

3. 三明治攻击(MEV)

  • 原理
    攻击者监控待打包交易(如大额 ETH-USDC 兑换 ),用更高 Gas 费插入“抢先交易”(先买后卖 ),赚取差价。
    • 例:用户 A 要卖 10 ETH → 攻击者 B 抢先买 ETH(推高价格 )→ 用户 A 以高价卖出 → 攻击者 B 再低价卖出,套利。
  • 防御
    使用“隐私交易”(如 Flashbots )或设置合理滑点(限制最大偏差 )。

4. DEX 深度与闪电兑换

  • ETH 与 WETH
    WETH 是 ETH 的 ERC20 封装代币(因 ETH 本身不是 ERC20 ),DEX 交易需用 WETH 与其他代币配对。
  • 无常损失
    liquidity provider(LP)因代币价格波动,比单纯持有代币损失更多价值的现象。
    • 例:存 1 ETH + 1000 USDC 入池,若 ETH 价格翻倍,LP 资产价值 < 持有 1 ETH + 1000 USDC 的价值。
  • 闪电兑换(Flash Swap)
    利用 DeFi 协议的原子性,“无抵押借入代币 → 交易 → 归还”(如用 Uniswap 闪电贷套利 ),示例:
function flashSwap() external {
    // 借入代币
    (uint256 amount0, uint256 amount1) = uniswapV3Pool.flash(fee, amount, data);
    // 套利操作...
    // 归还代币
    uniswapV3Pool.repay(amount0, amount1);
}

5. DEX 迭代与聚合器

  • Uniswap 版本迭代
    • V3:引入“集中流动性”(LP 可自定义价格区间 ),提升资金效率。
    • V4:计划支持挂钩(Hooks ),让用户自定义交易逻辑。
  • 交易聚合器(1Inch)
    扫描多个 DEX 的流动性池,自动选择最优交易路径(如跨池套利、最低滑点 ),实现“一笔交易,全网最优”。

二、W6D1 - W6D5 核心概念(稳定币、杠杆、衍生品、DAO、MEV)

1. 稳定币类型与机制

  • 抵押型稳定币(USDC/DAI)
    用美元/加密资产抵押发行(如 1 USDC = 1 美元储备 ),保持价格稳定。
  • 算法稳定币(AmpL/Basis Cash)
    通过算法调节供给(如 AmpL 价格高于 1 美元时增发,低于时销毁 ),但易受市场波动影响(如 LUNA/UST 崩盘 )。
  • 渐进式稳定币(Frax)
    混合抵押+算法,部分抵押(如 80% 美元储备 + 20% 算法调节 ),平衡稳定性与弹性。

2. 杠杆交易与永续合约

  • 杠杆原理
    通过抵押资产(如 1 ETH 抵押借 3 ETH ),放大收益/风险(如 ETH 涨 10%,杠杆 3 倍则收益 30% )。
  • 永续合约(Perpetual)
    无到期日的期货合约,用资金费率(Funding Rate )平衡多空双方,例:GMX 平台的 BTC/ETH 永续交易。
  • vAMM(虚拟做市商)
    衍生品平台(如 Perpetual )用虚拟流动性池模拟交易,无需真实资产抵押,提升资金效率。

3. 期货与期权对冲

  • 期货合约
    约定未来以特定价格买卖资产(如 BTC 期货 ),用于对冲风险(如矿工卖出 BTC 期货锁定未来收益 )。
  • 期权合约
    约定未来以特定价格“权利(非义务)”买卖资产(如买入 BTC 看涨期权,到期价格涨则行权盈利 ),GMX 等平台支持衍生品交易。

4. DAO 治理与链上投票

  • DAO(去中心化自治组织)
    用智能合约管理社区资产/规则,成员通过投票(如质押代币获得投票权 )决策(如 Uniswap DAO 投票升级协议 )。
  • 链上投票实现
    ERC20Votes 合约(OpenZeppelin )记录代币投票权重,TimeLock 延迟执行投票结果(防止闪电攻击 )。

5. MEV(最大可提取价值)

  • MEV 策略
    • 三明治攻击(抢跑+尾随和 ):如前所述,利用交易顺序套利。
    • 清算套利:监控抵押不足的借贷头寸,抢先清算赚取奖励。
    • 跨市场套利:不同交易所价格差套利(如 Binance 买 ETH,Uniswap 卖 ETH )。
  • 防御 MEV
    使用 Flashbots 提交交易,避免被公开 MEV 机器人捕获;或用隐私池(Private Pool )隐藏交易。

8. 链上数据分析

一句话总结链上数据分析:区块链技术的底层原理决定了所有链上数据都是可以公开访问的,因此可以用数据分析的方法进行链上数据的分析,找历史规律等。

课程模块 时间安排(W:Week, D:DAY) 课程内容
W7D1 各种数据服务介绍 自索引服务与第三方服务 TheGraph 数据索引服务 工作原理 如和使用 TheGraph 索引数据(子图开发) GraphQL 查询 TrueBlocks 开源索引器
协议数据分析 W7D2 DUNE 数据索引 Dune SQL 介绍 利用 DUNE 数据集 ( Transactions / Logs / dex.trades) 创建仪表板(Line, Bar, Pie, Table )

以下是对“协议数据分析”模块课程内容的概念拆解,帮你理解区块链数据索引与分析的核心工具和流程:

一、W7D1 核心概念(TheGraph 与数据索引)

1. 数据服务分类

  • 自索引服务:项目方自己搭建数据索引系统(如运行节点 + 数据库存储链上数据 ),灵活但成本高。
  • 第三方服务:使用现成的数据平台(如 TheGraph、Dune ),无需自己维护节点,专注数据分析。

2. TheGraph 工作原理

  • 角色分工
    • 子图(Subgraph):定义要索引的数据(如 Uniswap 的交易、NFT 铸造事件 ),用 GraphQL 描述查询规则。
    • 索引器(Indexer):运行节点,监听区块链事件,按子图规则存储数据到数据库。
    • 查询节点(Query Node):接收用户 GraphQL 查询,从数据库返回结果。
  • 流程:链上事件触发 → 索引器捕获并处理 → 存储到 TheGraph 数据库 → 用户通过 GraphQL 查询数据。

3. 子图开发与 GraphQL 查询

  • 子图开发步骤
    1. 定义 schema.graphql(声明要查询的数据结构,如 type Trade { id: ID!, amount: BigInt! } )。
    2. 编写 mapping.ts(映射链上事件到 schema,如监听 Uniswap Swap 事件,提取 amount 等字段 )。
    3. 部署子图到 TheGraph 平台(graph deploy 命令 )。
  • GraphQL 查询示例
query {
  trades(first: 10, orderBy: timestamp, orderDirection: desc) {
    id
    amount
    timestamp
  }
}
- 作用:查询最近 10 笔交易,按时间倒序排列,获取交易 ID、金额、时间戳。

4. TrueBlocks 开源索引器

  • 原理:直接解析区块链节点数据(如 geth 节点的 leveldb ),生成结构化数据(如地址交易历史、合约事件 )。
  • 优势:无需依赖第三方平台,适合深度定制化分析(如企业级私有链数据索引 )。

二、W7D2 核心概念(Dune 数据索引与分析)

1. Dune 数据索引

  • Dune 定位:区块链数据分析平台,把链上数据(交易、事件日志 )同步到 SQL 数据库,让用户用 SQL 查询。
  • 数据来源:Dune 运行以太坊节点,实时同步链上数据,整理成结构化表(如 transactionslogsdex.trades )。

2. Dune SQL 介绍

  • 常用表结构
    • transactions:存储所有链上交易(fromtovaluegas 等字段 )。
    • logs:存储合约事件日志(topic0 是事件签名,data 是事件参数 )。
    • dex.trades:Dune 整理的 DEX 交易数据(关联 transactionslogs,提取 token_intoken_outamount 等 )。
  • SQL 查询示例(统计 Uniswap 近 24 小时交易量 ):
SELECT 
  SUM(amount_in_usd) AS total_volume 
FROM 
  dex.trades 
WHERE 
  exchange_name = 'uniswap' 
  AND block_time >= NOW() - INTERVAL '24 HOURS';

3. 创建仪表板(Dashboard)

  • 作用:把 SQL 查询结果可视化(折线图、柱状图、饼图、表格 ),直观展示数据趋势(如 DEX 交易量变化、钱包地址活跃度 )。
  • 步骤
    1. 写 SQL 查询,保存为“查询(Query)”。
    2. 在“仪表板(Dashboard)”添加该查询,选择可视化类型(如用折线图展示 total_volume 随时间变化 )。

9. Layer2

一句话总结Layer2:针对Layer1区块链打包缓慢的问题,Layer2 通过批量向Layer1提交数据以提高Layer1的吞吐量,加快交易的确认。

Layer2 开发 W7D3 深入理解 POS 以太坊: 出块机制 epoch 与 slot 验证者质押与 LSD 、 EigenLayer 重新质押协议 为什么需要 Layer2 及 DA 层服务(4844、Celestia、 EigenDa) layer2: ZK Rollup、 OpRollup 运行原理及各自代表项目
W7D4 layer2 主流开发技术框架: Op-Stack、 Polygon CDK 、 Arbitrum Orbit、 ZkSync SuperChain 应用链: Cosmos-SDK 理解 Op-Stack 项目架构与各个组件(Sequencer、 Rollup Services、 Verifier、证明系统等) 如何基于 Op-Stack 开发 Layer2
W7D5 Op-Stack 跨链桥原理及实现 Op-Stack 的充值流程(一层到二层) Op-Stack 的取现流程(二层到一层) ETH 与 ERC20 的不同处理
W8D1 ZKEVM 项目演变,各 ZKEVM 项目不同技术路线 Polygon ZkEvm 的主要模块 Polygon CDK 技术框架 Polygon 桥实现

一、W7D3 核心概念(POS 以太坊与 Layer2 基础)

1. POS 以太坊核心机制

  • epoch 与 slot
    • slot:每 12 秒一个时间片,验证者可提议区块。
    • epoch:64 个 slot(~13 分钟),验证者分组(委员会)负责出块,保证共识安全。
  • 验证者质押与 LSD
    • 验证者需质押 32 ETH 参与 POS 共识,LSD(Liquid Staking Derivatives,流动性质押衍生品 )让质押 ETH 可流通(如 Lido 的 stETH ),解决 ETH 锁定问题。
  • EigenLayer 重新质押
    验证者可将质押的 ETH 同时用于多个 Layer2 或中间件协议的安全保障,提升资本效率(如 EigenLayer 让 stETH 支持其他协议共识 )。

2. Layer2 与 DA 层需求

  • 为什么需要 Layer2:以太坊主网(L1)性能有限(~15 TPS ),Layer2 把交易“批量处理后提交到 L1”,提升吞吐量(如 Arbitrum 可达 ~4000 TPS )。
  • DA 层(数据可用性层)
    Layer2 需向 L1 提交“交易数据”,确保数据可被验证。4844(以太坊 proto-danksharding 提案 )、Celestia(模块化区块链,专注 DA )、EigenDA(EigenLayer 生态的 DA 方案 )是主流 DA 技术。

3. Layer2 类型:ZK Rollup vs OpRollup

  • ZK Rollup(零知识 Rollup)
    用 ZK-SNARKs 生成“交易有效性证明”,提交到 L1,无需等待交易最终性(如 zkSync、StarkNet )。
    • 优势:验证高效, withdrawals 快(~10 分钟 )。
  • OpRollup(Optimistic Rollup)
    假设交易有效,若有人挑战则重新执行验证(如 Arbitrum、Optimism )。
    • 优势:开发简单(兼容 EVM ),但 withdrawals 慢(~7 天 挑战期 )。

二、W7D4 核心概念(Layer2 开发框架)

1. 主流 Layer2 框架

  • Op-Stack:Optimism 推出的模块化 Layer2 框架,可快速搭建自定义 Rollup(如 Base 链基于 Op-Stack )。
  • Polygon CDK:Polygon 推出的 Layer2 开发工具包,支持 ZK Rollup(如 Polygon zkEVM )和 OpRollup。
  • Arbitrum Orbit:Arbitrum 生态的 Rollup 框架,允许企业/开发者搭建专属 Layer2。
  • ZkSync SuperChain:ZkSync 推出的多链架构,让多个 ZK Rollup 共享安全性和流动性。

2. 应用链与 Cosmos-SDK

  • 应用链:为特定应用定制的区块链(如游戏链、DeFi 链 ),用 Cosmos-SDK 可快速开发(如 Osmosis 是 Cosmos 生态的 DEX 链 )。
  • Cosmos-SDK:模块化区块链开发框架,通过 IBC(跨链通信 )实现链间互操作。

3. Op-Stack 架构与开发

  • 核心组件
    • Sequencer:排序交易,生成批量数据提交到 L1。
    • Rollup Services:处理交易执行、状态存储。
    • Verifier:验证交易有效性(OpRollup 中是挑战期的争议解决者 )。
    • 证明系统:Op-Stack 用欺诈证明(Fraud Proof ),ZK Rollup 用 ZK 证明。
  • 开发流程
    基于 Op-Stack 模板,配置 Sequencer、Verifier 等组件,部署自定义 Layer2 测试网。

三、W7D5 核心概念(Op-Stack 跨链与资产流动)

1. Op-Stack 跨链桥原理

  • 跨链桥作用:实现 L1(以太坊)与 Layer2 之间的资产转移(如 ETH、ERC20 跨链 )。
  • 流程
    L1 资产锁定 → 跨链桥合约通知 Layer2 mint 对应资产 → 用户在 Layer2 使用;提现则反向操作(解锁 L1 资产,销毁 Layer2 资产 )。

2. 充值与取现流程

  • 充值(L1 → Layer2)
    用户在 L1 向跨链桥合约转账 → 合约触发 Layer2 mint 资产(如 ETH 跨链后变成 Layer2 ETH )。
  • 取现(Layer2 → L1)
    用户在 Layer2 发起提现 → 交易进入挑战期(OpRollup 需等待 7 天 )→ 挑战期结束后,L1 合约解锁资产。

3. ETH 与 ERC20 处理差异

  • ETH:原生资产,跨链时需处理“ETH 包装/解包”(如 Layer2 中 ETH 可能以 wETH 形式存在 )。
  • ERC20:代币资产,跨链时需同步代币余额、授权等状态(如 USDC 跨链需映射到 Layer2 的 USDC )。

四、W8D1 核心概念(ZK-EVM 与 Polygon 生态)

1. ZK-EVM 技术路线

  • ZK-EVM 目标:让 ZK Rollup 兼容以太坊 EVM ,降低迁移成本(开发者可直接部署 Solidity 合约 )。
  • 不同项目路线
    • Polygon zkEVM:完全兼容 EVM 指令,适合迁移现有 DApp。
    • zkSync Era:兼容 EVM 但做了优化,性能更高。

2. Polygon zkEVM 与 CDK

  • Polygon zkEVM 模块
    包含证明生成器(生成 ZK 证明 )、状态管理器(维护 Layer2 状态 )、跨链桥(连接 L1 和 Layer2 )。
  • Polygon CDK
    开发工具包,支持快速搭建 ZK Rollup 或 OpRollup,兼容 Polygon 生态(如共享安全、流动性 )。

3. Polygon 桥实现

  • 作用:连接 Polygon 生态不同链(如 Polygon PoS 链、Polygon zkEVM )的资产流动,实现跨链转账、消息传递。

10. Solona

一句话总结Solona:基于POH技术的超快速高吞吐量公链,但验证节点仅有2000余个,牺牲部分去中心化带来了高性能,基于Rust开发。

课程模块 时间安排(W:Week, D:DAY) 课程内容
Solana 开发 W8D2 Solana 核心概念: 理解 POH(历史证明)、共识算法、Solana 出块流程、账户模型、PDA 等 重点理解 Solana 数据与程序分开的账户模型
W8D3 与 Solana 链交互: 理解 SPL Token 如何使用 Web3.js 发起交易、创建第一个 Token 及 NFT
W8D4 Solana 合约开发基础: Rust 基础、 Solana Playground 、合约编译、部署
W8D5 Anchor 框架介绍 使用 Anchor 开发 Solana 程序 处理指令、管理状态、CPI Solana 程序测试
W9D1 Solana DApp 开发: 钱包接入、合约调用 DApp接入 Blinks 链上数据的索引

一、W8D2 核心概念(Solana 核心机制)

1. Solana 核心概念

  • POH(历史证明)
    Solana 独创的共识组件,通过“时间戳链”(类似哈希链表 )证明事件发生顺序,解决分布式系统中“时间同步”难题,让节点快速达成共识。
  • 共识算法(Tower BFT)
    结合 POH 和 BFT(拜占庭容错 ),验证者通过“塔状投票”确认区块,实现高吞吐量(~65000 TPS )。
  • 出块流程
    Solana 出块无需等待全节点确认,Leader 节点生成区块后,通过 Gossip 协议快速广播,验证者用 POH 确认顺序,实现秒级确认。
  • 账户模型
    Solana 账户分数据账户(存状态,如代币余额 )和程序账户(存智能合约代码 ),数据与程序分离,提升执行效率。
  • PDA(Program-Derived Address)
    由程序和种子(seed )生成的“无私钥账户”,用于自动化操作(如自动收款地址 ),公式:PDA = findProgramAddress([seed], programId)

二、W8D3 核心概念(Solana 链交互)

1. SPL Token

  • 定义:Solana 生态的代币标准(类似以太坊 ERC20 ),支持创建代币、NFT(SPL NFT )。
  • 功能:发行代币(create Mint )、转账(transfer )、授权(approve ),兼容 Solana 生态钱包/交易所。

2. Web3.js 交互

  • 作用:Solana 官方 JavaScript 库,实现前端与 Solana 链交互(如连接钱包、发起交易 )。
  • 示例(创建 Token ):
import { Connection, Keypair, LAMPORTS_PER_SOL } from '@solana/web3.js';
import { createMint } from '@solana/spl-token';

const connection = new Connection('https://api.devnet.solana.com');
const wallet = Keypair.generate();

// 创替代币
const mint = await createMint(connection, wallet, wallet.publicKey, null, 9);
console.log('Token Mint Address:', mint.toBase58());

三、W8D4 核心概念(Solana 合约开发基础)

1. Rust 基础

  • 原因:Solana 智能合约(程序)主要用 Rust 开发(性能高、内存安全 ),需掌握 Rust 语法(所有权、生命周期、模式匹配 )。

2. Solana Playground

  • 定义:在线 IDE,无需本地环境即可编写、编译、部署 Solana 程序,适合快速验证逻辑。

3. 合约编译与部署

  • 流程
    1. 用 Rust 编写程序(如 lib.rs )。
    2. solana-cli 编译:cargo build-bpf
    3. 部署到 Solana 网络:solana program deploy target/deploy/program.so

四、W8D5 核心概念(Anchor 框架与程序开发)

1. Anchor 框架

  • 作用:简化 Solana 程序开发(类似以太坊 Hardhat ),自动处理账户验证、指令解析,支持 TypeScript 测试。

2. 程序开发流程

  • 指令处理:定义 instruction 函数,处理链上操作(如转账、更新状态 )。
  • 状态管理:用 Account 结构体存程序状态,Anchor 自动序列化/反序列化。
  • CPI(Cross-Program Invocation)
    调用其他 Solana 程序(如 SPL Token 合约 ),实现跨程序协作(如 mint 代币时调用 SPL Token 程序 )。

3. 程序测试

  • 方法:用 Anchor 测试框架(基于 Mocha/Chai ),模拟 Solana 网络环境,测试指令执行、状态变更。

五、W9D1 核心概念(Solana DApp 开发)

1. 钱包接入

  • 方式:集成 Solana 钱包(如 Phantom、Sollet ),通过 window.solana 对象连接钱包、签名交易。

2. 合约调用

  • 流程:前端用 @project-serum/anchor 库加载程序 ID、调用指令(如 mint NFT ),与链上程序交互。

3. Blinks 接入

  • Blinks:Solana 生态的链下服务(如通知、数据聚合 ),DApp 接入后可实现实时提醒、链下数据同步。

4. 链上数据索引

  • 工具:用 HeliusSolana Beach 索引链上数据(交易、NFT 事件 ),构建 DApp 数据看板。
  • 原创
  • 学分: 0
  • 分类: 通识
  • 标签:
点赞 0
收藏 1
分享

0 条评论

请先 登录 后评论
朴森
朴森
0xD95F...a61c
Le vent se lève, il faut tenter de vivre