Coder Social home page Coder Social logo

amazingang / wtf-solidity Goto Github PK

View Code? Open in Web Editor NEW
10.2K 139.0 1.8K 128.91 MB

我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用,每周更新1-3讲。Now supports English! 官网: https://wtf.academy

Home Page: https://wtf.academy

License: Other

Solidity 97.18% JavaScript 1.42% Makefile 0.03% Nix 0.01% HTML 1.36%
airdrop auction blockchain dapp dapps erc20 erc721 ethereum merkle-tree nft

wtf-solidity's Introduction

🌐 English / Español / Português Brasileiro 🌐

WTF Solidity

我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。

路线图根据本仓库star数量来定:

入门

第1讲:三行代码HelloWeb3代码 | 文章 | Mirror

第2讲:值类型代码 | 文章 | Mirror

第3讲:函数 (external/internal/public/private, pure/view, payable)代码 | 文章 | Mirror

第4讲:函数输出(returns/return)代码 | 文章 | Mirror

第5讲:变量作用域和数据存储 (storage/memory/calldata)代码 | 文章 | Mirror

第6讲:数组(array)和结构体(struct)代码 | 文章 | Mirror

第7讲:映射(mapping)代码 | 文章 | Mirror

第8讲:变量初始值代码 | 文章 | Mirror

第9讲:常量(constant/immutable)代码 | 文章 | Mirror

第10讲:控制流和插入排序代码 | 文章 | Mirror

第11讲:构造函数(constructor)和修饰器(modifier)代码 | 文章 | Mirror

第12讲:事件(events)代码 | 文章 | Mirror

第13讲:继承代码 | 文章 | Mirror

第14讲:抽象合约(abstract)和接口(interface)代码 | 文章 | Mirror

第15讲:异常(errors)代码 | 文章 | Mirror

进阶

第16讲:函数重载代码 | 文章 | Mirror

第17讲:库合约(library)代码 | 文章 | Mirror

第18讲:Import代码 | 文章 | Mirror

第19讲:接收ETH(fallback/receive)代码 | 文章 | Mirror

第20讲:发送ETH(transfer/send/call)代码 | 文章 | Mirror

第21讲:调用其他合约代码 | 文章 | Mirror

第22讲:Call代码 | 文章 | Mirror

第23讲:Delegatecall代码 | 文章 | Mirror

第24讲:在合约中创建新合约代码 | 文章 | Mirror

第25讲:Create2代码 | 文章 | Mirror

第26讲:删除合约代码 | 文章 | Mirror

第27讲:ABI编码解码代码 | 文章 | Mirror

第28讲:Hash代码 | 文章 | Mirror

第29讲:函数选择器(selector)代码 | 文章 | Mirror

第30讲:Try-Catch代码 | 文章 | Mirror

应用

第31讲:ERC20代码 | 文章 | Mirror

第32讲:代币水龙头代码 | 文章 | Mirror

第33讲:空投合约代码 | 文章 | Mirror

第34讲:ERC721代码 | 文章 | Mirror

第35讲:荷兰拍卖代码 | 文章 | Mirror

第36讲:Merkle Tree代码 | 文章 | Mirror

第37讲:数字签名代码 | 文章 | Mirror

第38讲:NFT交易所代码 | 文章 | Mirror

第39讲:随机数代码 | 文章 | Mirror

第40讲:ERC1155代码 | 文章 | Mirror

第41讲:WETH代码 | 文章 | Mirror

第42讲:分账代码 | 文章 | Mirror

第43讲:线性释放代码 | 文章 | Mirror

第44讲:代币锁代码 | 文章 | Mirror

第45讲:时间锁代码 | 文章 | Mirror

Degen

第46讲:代理合约代码 | 文章 | Mirror

第47讲:可升级合约代码 | 文章 | Mirror

第48讲:透明代理代码 | 文章 | Mirror

第49讲:通用可升级代理UUPS代码 | 文章 | Mirror

第50讲:多签钱包代码 | 文章 | Mirror

第51讲:ERC4626 代币化金库代码 | 文章

第52讲:EIP712 类型化数据签名代码 | 文章

第53讲:ERC2612 ERC20Permit代码 | 文章

第54讲:跨链桥代码 | 文章

第55讲:多重调用代码 | 文章

第56讲:去中心化交易所代码 | 文章

第57讲:闪电贷代码 | 文章

合约安全

S01:重入攻击代码 | 文章 | Mirror

S02:选择器碰撞代码 | 文章 | Mirror

S03:中心化代码 | 文章 | Mirror

S04:权限管理代码 | 文章 | Mirror

S05:整型溢出代码 | 文章 | Mirror

S06:签名重放代码 | 文章 | Mirror

S07:坏随机数代码 | 文章 | Mirror

S08:绕过合约检查代码 | 文章 | Mirror

S09:拒绝服务漏洞代码 | 文章 | Mirror

S10:貔貅 Honeypot代码 | 文章 | Mirror

S11:抢先交易代码 | 文章

S12:tx.origin钓鱼代码 | 文章

S13:未检查的低级调用代码 | 文章

S14:操纵区块时间代码 | 文章

S15:操纵预言机代码 | 文章

S16:NFT重入攻击代码 | 文章

S17:“跨服”重入攻击文章

EVM 操作码

OP01:Hello Opcodes代码 | 文章

OP02:Opcodes分类代码 | 文章

OP03:堆栈指令代码 | 文章

OP04:算数指令代码 | 文章

OP05:比较指令代码 | 文章

OP06:位级指令代码 | 文章

OP07:内存指令代码 | 文章

OP08:存储指令代码 | 文章

OP09:控制流指令代码 | 文章

OP10:区块信息指令代码 | 文章

OP11:堆栈指令2代码 | 文章

OP12:SHA3指令代码 | 文章

OP13:账户指令代码 | 文章

OP14:交易指令代码 | 文章

OP15:Log指令代码 | 文章

OP16:Return指令代码 | 文章

OP17:Revert指令代码 | 文章

OP18:Call指令代码 | 文章

OP19:Delegatecall指令代码 | 文章

OP20:Staticcall指令代码 | 文章

OP21:Create指令代码 | 文章

OP22:Create2指令代码 | 文章

OP23:Selfdestruct指令代码 | 文章

OP24:Gas指令代码 | 文章

OP25:优化最小代理合约 EIP-7511代码 | 文章

Solidity 内部规则

SI01:基础存储布局Code | 文章

SI02:映射和动态数组的存储布局Code | 文章

SI03:字节数组和字符串的存储布局Code | 文章

SI04:内存布局Code | 文章

SI05:ABI编码基础Code | 文章

SI06:动态类型的ABI编码Code | 文章

SI07:ABI编码公式Code | 文章

SI08:calldata/returndata的ABI编码Code | 文章

SI09:事件的ABI编码Code | 文章

SI10:Error的ABI编码Code | 文章

主题

开发工具

第1讲:Remix, 最易用的Solidity IDE代码】 【文章

第2讲:Infura, 连接链下与链上的桥梁文章

第3讲:Ganache,搭建本地测试网络文章

第4讲:Alchemy, 区块链API和节点基础设施文章

第5讲:Dune,使用Dune可视化区块链数据文章

第6讲:Hardhat,以太坊开发环境文章

第7讲:Foundry,以Solidity为中心的开发工具包代码】【文章

链上威胁分析

第1讲:工具篇文章】 | 【English

第2讲:热身篇文章】 | 【English

第3讲:漏洞概念验证-上篇文章】| 【English

第4讲:漏洞概念验证-中篇文章】| 【English

第5讲:漏洞概念验证-下篇文章】| 【English

第6讲:Rugpull 分析文章】| 【English

第7讲:Nomad 跨链桥事件分析文章】| 【English

NFT

第1讲:ERC721库:Address, Strings, Context代码】 【文章

第2讲:ERC721相关接口代码】 【文章

第3讲:ERC721主合约代码】 【文章

第4讲:BAYC主合约和严重漏洞代码】 【文章

第5讲:Loot代码】 【文章

翻译

第1讲:Metamask项目方给Solidity程序员的16个安全建议文章】 【Mirror

第2讲:深入EVM文章

WTF贡献者

贡献者是WTF学院的基石

捐赠

参考

wtf-solidity's People

Contributors

0xc25fee20 avatar 0xkookoo avatar alphafitz11 avatar amazingang avatar azleal avatar buttonwild avatar cjh20000613 avatar easychris avatar hongchenglong avatar hotsjf avatar huitaila avatar jie1789 avatar jonthdiaz avatar justinasdz avatar lcy101u avatar lokiscripter avatar marcelojsilva avatar mosamorphing avatar muhongweiwei avatar quantum-proof avatar reborn-sama avatar rulesbreaker avatar scguaquetam avatar sean329 avatar seasidejuvenile666 avatar shuxunoo avatar sunweb3sec avatar wishucry avatar xdpcs avatar xiaoyao-0 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wtf-solidity's Issues

第38讲细节

十分感谢分享!
第38讲,如果按例子顺序执行,那么用NFTSwap合约的update()函数,将NFT价格更新为77 wei, 后面的 购买 1gwei就不够了。。要么把购买的价格设为78gwei,这样还能顺带测试下找零?

介绍中reference的链接有误

目前WTFSolidity极简教程已经有接近30讲,但仍然没有经过严格的编辑审核,有的部分也少一些概念的示意图或程序运行的截图,不利于新手学习。
为了让WTFSolidity极简教程更好,我发起“审核+图片补充”计划,每一讲由1个社区成员认领,负责审核校对,并添加一些图片。
赏金:20,000 $PEOPLE 代币,根据工作量分配。
在这个帖子下面回复就能认领(目前1人最多认领5讲,完成后可认领新的)。
有用的资料:

  1. Markdown书写规则:https://www.markdownguide.org/cheat-sheet/
  2. 审核并添加图片后的例子:https://github.com/AmazingAng/WTFSolidity/tree/main/02_ValueTypes

认领情况:
第1讲:三行代码HelloWeb3
0xAA 已完成

第2讲:数值类型
@Lokiscripter 已完成,PR

第3讲:函数类型 (external/internal/public/private, pure/view/payable)
@Lokiscripter 已完成,PR

第4讲:变量作用域和数据存储 (storage/memory/calldata)
@Lokiscripter 已完成,PR

第5讲:数组(array)和结构体(struct)
@Lokiscripter 已完成,PR

第6讲:映射(mapping)
@lcy101u 已完成,PR

第7讲:控制流(control flow)和插入排序(insertion sort)
@lcy101u 已完成,PR

第8讲:构造函数(constructor)和修饰器(modifier)
@wishucry 已完成,PR

第9讲:事件(events)
@wishucry 已完成,PR

第10讲:继承(inheritance)
@Eanam 已完成,PR

第11讲:抽象合约(abstract)和接口(interface)
@Eanam 已完成,PR

第12讲:库合约(library)
@wishucry 已完成,PR

第13讲:异常(errors)
@Rulesbreaker 已完成,PR

第14讲:常量(constant/immutable)
@Rulesbreaker 已完成,PR

第15讲:函数重载(overloading)
@wishucry 已完成,PR

第16讲:接收ETH(fallback/receive)
@wishucry 已完成,PR

第17讲:发送ETH(transfer/send/call)
@Hongchenglong 已完成,PR

第18讲:函数输出(returns/return)
@HuiTaiLa 已完成,PR

第19讲:调用其他合约
@XiaoYao-0 已完成,PR

第20讲:变量初始值
@HuiTaiLa 已完成,PR

第21讲:Call
@Hongchenglong 已完成,PR

第22讲:Delegatecall
@xxycfhb 已完成,PR

第23讲:在合约中创建新合约
@jie1789 已完成,PR

第24讲:Create2
@tangminjie 已完成,PR

第25讲:删除合约
@tangminjie 已完成,PR

第26讲:ABI编码解码
@HuiTaiLa 已完成,PR

第27讲:Hash
@HuiTaiLa 已完成,PR

第28讲:函数选择器(selector)
@XiaoYao-0 已完成,PR

第29讲:Try-Catch
@jie1789 已完成,PR

第30讲:Import
@JustinAsdz 已完成,PR

交叉审核
讲 审核人
1 @wishucry 
2 @wishucry 
3 @wishucry 
4 @wishucry 
5 @wishucry 
6 @Rulesbreaker (完成)
7 @Rulesbreaker (完成)
8 @Lokiscripter
9 @Lokiscripter
10 @lcy101u 
11 @lcy101u 
12 @Lokiscripter
13 @HuiTaiLa
14 @HuiTaiLa
15 0xAA
16 @Lokiscripter
17 @Eanam
18 @XiaoYao-0
19 @Hongchenglong
20 @XiaoYao-0
21 @Eanam
22 @jie1789
23 @xxycfhb 
24 @HuiTaiLa (完成)
25 @HuiTaiLa
26 @tangminjie (完成)
27 @tangminjie 
28 @Hongchenglong
29 @JustinAsdz (完成)
30 @jie1789

WTF Solidity极简教程第一次审核赏金,共 20,000 $PEOPLE 发放完毕,由我个人出资。学solidity赚 $PEOPLE 听起来不错。
感谢12位贡献者的付出!What's next?
开源教程链接:https://github.com/AmazingAng/WTFSolidity

交易hash:https://bscscan.com/tx/0xcf66e73cd4adaeade00e4e23edb38f5d130e5c35d94fa4ed5a02f7720d19d99f

Originally posted by @AmazingAng in #18

ERC721/Address.sol文件中首行笔误

ERC721/Address.sol文件中首行笔误

SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;
...

应为

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;
...

Solidity极简入门: 24. Create2 章节中歧义

原文:
工厂合约(PairFactory2)有两个状态变量getPair是两个代币地址到币对地址的map,方便根据代币找到币对地址;allPairs是币对地址的数组,存储了所有代币地址

最后一句应该改为:储存了所有币对地址

第10章插入排序一个直观的实现

contract Sort {
    function sort(uint[] memory array) public pure returns(uint[] memory) {
      uint i = 1;
      while (i < array.length) {
        uint j = i;
        while (j > 0 && array[j-1] > array[j]) {
          (array[j-1], array[j]) = (array[j], array[j-1]);
          j--; 
        }
        i++;
     }
     return(array); 
    } 
}

第34讲 ERC721审核

1.没有EIP721和ERC721关系说明
2.没有说明为什么直接说ERC165
3.没有发行NFT的图片案例

require和assert的gas消耗对比问题

理论上require的报错会将余下的gas返回给user,而assert会全部没收,而15_Error中实验结果,是assert比require更少的损耗,问题出在哪里

关于Solidity版本差异产生的一些困惑

问题:【合约安全第一讲】第5点关于Fallback的用法

fallback function不仅在普通以太传输(没有msg.data)时调用....

与【入门第十六讲】receive和fallback的区别产生的一点小困惑

msg.data不为空或不存在receive时,会触发fallback()....

经过 @AmazingAng 的解答,知道是Solidity 0.5.0时还没有receive函数且fallback函数当时也直接声明为function()。
因此对这份新手教程有个小建议。

建议:

  1. 作为现阶段的入门文章,考虑大部分是新手的情况,大家基本都是从0.8.4版本开始学习这门语言。因此,如果在讲解一些经典案例或者经典合约时,希望可以标注下案例和合约中Solidity与当下学习的版本的一些差异性。
  2. 也可以将Solidity几个重要版本更新的差异点作为一篇单独的文章,也可以带领大家理解这些升级背后的深层考虑(我愿意在对Solidity有更好掌握之后,对此文章献出绵薄之力)

第十二讲演示部分有疑问

  1. 在etherscan上查询事件中的链接,使用的账号与上面步骤的数据不一致。
  2. 在自己测试中,数据不能实时上链查询,是否和出块事件间隔有关系?

31. ERC20审核

1.说明ERC20与IERC20的关系
2.优化图片说明
3.以函数为例,讲解具体参数

第24讲 create2,小错误。

CREATE2如何计算地址

1)[ 0xFF:一个常数,避免喝CREATE冲突。],(喝)应为(和)错别字笔误。

2)[新地址 = hash("0xFF",创建者地址, nonce, bytecode) ],nonce 应该为 salt 。

第十三讲细节

十分感谢分享!我是一名solidity的初学者,在学习第十三讲的时候有一点疑惑:
QQ截图20220912174707

在关于super关键字的描述中,教程中写到用super关键字只会调用最近父合约,但对于菱形继承问题,则有些偏差:

父合约有两个子合约,在调用子合约时会将全部的parent function 调用,而不是从右到左只调用一个。

来自solidity-by-example的例子

复现代码如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

/* Inheritance tree
   A
 /  \
B   C
 \ /
  D
*/

contract A {

    event Log(string message);

    function foo() public virtual {
        emit Log("A.foo called");
    }

    function bar() public virtual {
        emit Log("A.bar called");
    }
}

contract B is A {
    function foo() public virtual override {
        emit Log("B.foo called");
        A.foo();
    }

    function bar() public virtual override {
        emit Log("B.bar called");
        super.bar();
    }
}

contract C is A {
    function foo() public virtual override {
        emit Log("C.foo called");
        A.foo();
    }

    function bar() public virtual override {
        emit Log("C.bar called");
        super.bar();
    }
}

contract D is B, C {

    function foo() public override(B, C) {
        super.foo();
    }

    function bar() public override(B, C) {
        super.bar();
    }
}

在这个例子中,调用D合约的bar函数时,会看到A、B、C合约都会被调用。如果按照教程所说,只调用最近的父合约函数的话,调用顺序应该是C->A,并不会涉及到B合约;但实际部署调用后,会发现B合约也被调用

1

相关细节,我找到一个YouTube上的视频,讲解如下:
image-20220904214028406

关于这个特性的讲解,具体到复现的代码为4:17秒左右

用super函数会调用所有的parent functions

参考

关于solidity继承中的调用关系与多继承
SolidityByExample中的Calling Parent Contracts

Solidity官方文档中关于super关键字的部分

错别字

36讲MerkleTree的readme115行有个小小的错误,Merkle树写成Merkle书

错别字

TOOL03_Ganache中,有个地方写错了,网络prc server,应该是网络rpc server

13.异常 表达有误

assert命令一般用于程序员写程序debug,因为他不能解释抛出异常的原因(比require少个字符串)。他的用法很简单,require(检查条件),当检查条件不成立的时候,就会抛出异常。

require(检查条件)应该是assert(检查条件)

21讲建议细化合约名的描述

原文:我们可以利用合约的地址和合约代码(或接口)来创建合约的引用:_Name(_Address),其中_Name是合约名,_Address是合约地址。然后用合约的引用来调用它的函数:_Name(_Address).f(),其中f()是要调用的函数。

读的时候没读懂合约代码(或接口)是如何在调用时使用的。所以建议细化一下描述修改为:

我们可以利用合约的地址和合约代码(或接口)来创建合约的引用:_Name(_Address),其中_Name是合约名,应与合约代码(或借口)中标注的合约名保持一致,_Address是合约地址。然后用合约的引用来调用它的函数:_Name(_Address).f(),其中f()是要调用的函数。

Solidity极简入门: 7---小错误


映射的规则
规则2:映射的存储位置必须是storage,因此可以用于合约的状态变量,函数中的stoage变量。不能用于public函数的参数或返回结果中。

stoage --> storage

31讲IERC20文件补充建议

31讲中所依赖的IERC20.sol文件只介绍了几个方法名,未展示方法具体写法。小白没法在remix里动手运行
image

第三十一讲 ERC20的demo有一处小bug

// @dev 实现approve` 函数, 代币授权逻辑
function approve(address spender, uint amount) external override returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}

// @dev 实现`transferFrom`函数,代币授权转账逻辑
function transferFrom(
    address sender,
    address recipient,
    uint amount
) external override returns (bool) {
    allowance[sender][msg.sender] -= amount;
    balanceOf[sender] -= amount;
    balanceOf[recipient] += amount;
    emit Transfer(sender, recipient, amount);
    return true;
}

`

这两个函数的 allowance 的索引应该统一,不然授权合约的时候会出现bug,应分别改为 allowance[msg.sender][spender] = amount; 和
allowance[msg.sender][sender] = amount;

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.