54. 跨链桥
WTF Solidity极简入门: 54. 跨链桥
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们介绍跨链桥,能将资产从一条区块链转移到另一条区块链的基础设施,并实现一个简单的跨链桥。
1. 什么是跨链桥
跨链桥是一种区块链协议,它允许在两个或多个区块链之间移动数字资产和信息。例如,一个在以太坊主网上运行的ERC20代币,可以通过跨链桥转移到其他兼容以太坊的侧链或独立链。
同时,跨链桥不是区块链原生支持的,跨链操作需要可信第三方来执行,这也带来了风险。近两年,针对跨链桥的攻击已造成超过20亿美元的用户资产损失。
2. 跨链桥的种类
跨链桥主要有以下三种类型:
Burn/Mint:在源链上销毁(burn)代币,然后在目标链上创建(mint ...
53. ERC-2612 ERC20Permit
WTF Solidity极简入门: 53. ERC-2612 ERC20Permit
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们介绍 ERC20 代币的一个拓展,ERC20Permit,支持使用签名进行授权,改善用户体验。它在 EIP-2612 中被提出,已纳入以太坊标准,并被 USDC,ARB 等代币使用。
ERC20
我们在31讲中介绍了ERC20,以太坊最流行的代币标准。它流行的一个主要原因是 approve 和 transferFrom 两个函数搭配使用,使得代币不仅可以在外部拥有账户(EOA)之间转移,还可以被其他合约使用。
但是,ERC20的 approve 函数限制了只有代币所有者才能调用,这意味着所有 ERC20 代币的 ...
无题
ERC20Permit Signature Example
ERC20Permit Signature Example
Name:
Chain ID:
Contract Address:
Spender:
Amount:
Nonce:
Deadline:
Connect MetaMask
Sign ERC20Permit
钱包地址:
ChainID:
ETH 余额:
签名数据:
v:
r:
s:
import { ethers } from "https://cdnjs.cloudflare.com/ajax/libs/ethers/6.3.0/ethers.js"; const ethereumButton = document.querySelector('.connect');
const showAccount = document.q ...
无题
import { ethers } from "ethers";
// 初始化两条链的provider
const providerGoerli = new ethers.JsonRpcProvider("Goerli_Provider_URL");
const providerSepolia = new ethers.JsonRpcProvider("Sepolia_Provider_URL://eth-sepolia.g.alchemy.com/v2/RgxsjQdKTawszh80TpJ-14Y8tY7cx5W2");
// 初始化两条链的signer
// privateKey填管理者钱包的私钥
const privateKey = "Your_Key";
const walletGoerli = new ethers.Wallet(privateKey, providerGoerli);
const walletSepolia = new ethers.Wallet(privateKey, providerSepolia);
// 合约地址和ABI
const cont ...
52. EIP712 类型化数据签名
WTF Solidity极简入门: 52. EIP712 类型化数据签名
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们介绍一种更先进、安全的签名方法,EIP712 类型化数据签名。
EIP712
之前我们介绍了 EIP191 签名标准(personal sign) ,它可以给一段消息签名。但是它过于简单,当签名数据比较复杂时,用户只能看到一串十六进制字符串(数据的哈希),无法核实签名内容是否与预期相符。
EIP712类型化数据签名是一种更高级、更安全的签名方法。当支持 EIP712 的 Dapp 请求签名时,钱包会展示签名消息的原始数据,用户可以在验证数据符合预期之后签名。
EIP712 使用方法
EIP712 的应用一般包含链下签名 ...
51. ERC4626 代币化金库标准
WTF Solidity极简入门: 51. ERC4626 代币化金库标准
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
我们经常说 DeFi 是货币乐高,可以通过组合多个协议来创造新的协议;但由于 DeFi 缺乏标准,严重影响了它的可组合性。而 ERC4626 扩展了 ERC20 代币标准,旨在推动收益金库的标准化。这一讲,我们将介绍 DeFi 新一代标准 ERC4626,并写一个简单的金库合约。教学代码参考 openzeppelin 和 solmate 中的 ERC4626 合约,仅用作教学。
金库
金库合约是 DeFi 乐高中的基础,它允许你把基础资产(代币)质押到合约中,换取一定收益,包括以下应用场景:
收益农场: 在 Yearn Finan ...
无题
EIP-712 Signature Example
EIP-712 Signature Example
Name:
Chain ID:
Contract Address:
Spender:
number:
Connect MetaMask
Sign Permit
钱包地址:
ChainID:
ETH 余额:
签名数据:
import { ethers } from "https://cdnjs.cloudflare.com/ajax/libs/ethers/6.3.0/ethers.js"; const ethereumButton = document.querySelector('.connect');
const showAccount = document.querySelector('.showAccount');
const showChainID = document.que ...
50. 多签钱包
WTF Solidity极简入门: 50. 多签钱包
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
V神曾说过,多签钱包要比硬件钱包更加安全(推文)。这一讲,我们将介绍多签钱包,并且写一个极简版多签钱包合约。教学代码(150行代码)由gnosis safe合约(几千行代码)简化而成。
多签钱包
多签钱包是一种电子钱包,特点是交易被多个私钥持有者(多签人)授权后才能执行:例如钱包由3个多签人管理,每笔交易需要至少2人签名授权。多签钱包可以防止单点故障(私钥丢失,单人作恶),更加去中心化,更加安全,被很多DAO采用。
Gnosis Safe多签钱包是以太坊最流行的多签钱包,管理近400亿美元资产,合约经过审计和实战测试,支持多链(以太坊,BSC,Poly ...
49. 通用可升级代理
WTF Solidity极简入门: 49. 通用可升级代理
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍代理合约中选择器冲突(Selector Clash)的另一个解决办法:通用可升级代理(UUPS,universal upgradeable proxy standard)。教学代码由OpenZeppelin的UUPSUpgradeable简化而成,不应用于生产。
UUPS
我们在上一讲已经学习了"选择器冲突"(Selector Clash),即合约存在两个选择器相同的函数,可能会造成严重后果。作为透明代理的替代方案,UUPS也能解决这一问题。
UUPS(universal upgradeable proxy s ...
48. 透明代理
WTF Solidity极简入门: 48. 透明代理
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍代理合约的选择器冲突(Selector Clash),以及这一问题的解决方案:透明代理(Transparent Proxy)。教学代码由OpenZeppelin的TransparentUpgradeableProxy简化而成,不应用于生产。
选择器冲突
智能合约中,函数选择器(selector)是函数签名的哈希的前4个字节。例如mint(address account)的选择器为bytes4(keccak256("mint(address)")),也就是0x6a627842。更多关于选择器的内容见WTF Solidi ...