37. 数字签名
WTF Solidity极简入门: 37. 数字签名 Signature
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将简单的介绍以太坊中的数字签名ECDSA,以及如何利用它发放NFT白名单。代码中的ECDSA库由OpenZeppelin的同名库简化而成。
数字签名
如果你用过opensea交易NFT,对签名就不会陌生。下图是小狐狸(metamask)钱包进行签名时弹出的窗口,它可以证明你拥有私钥的同时不需要对外公布私钥。
以太坊使用的数字签名算法叫双椭圆曲线数字签名算法(ECDSA),基于双椭圆曲线“私钥-公钥”对的数字签名算法。它主要起到了三个作用:
身份认证:证明签名方是私钥的持有人。
不可否认:发送方不能否认发送过这个消息。
...
36. 默克尔树
WTF Solidity极简入门: 36. 默克尔树 Merkle Tree
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我将介绍Merkle Tree,以及如何利用Merkle Tree发放NFT白名单。
Merkle Tree
Merkle Tree,也叫默克尔树或哈希树,是区块链的底层加密技术,被比特币和以太坊区块链广泛采用。Merkle Tree是一种自下而上构建的加密树,每个叶子是对应数据的哈希,而每个非叶子为它的2个子节点的哈希。
Merkle Tree允许对大型数据结构的内容进行有效和安全的验证(Merkle Proof)。对于有N个叶子节点的Merkle Tree,在已知root根值的情况下,验证某个数据是否有效(属于Mer ...
35. 荷兰拍卖
WTF Solidity极简入门: 35. 荷兰拍卖
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我将介绍荷兰拍卖,并通过简化版Azuki荷兰拍卖代码,讲解如何通过荷兰拍卖发售ERC721标准的NFT。
荷兰拍卖
荷兰拍卖(Dutch Auction)是一种特殊的拍卖形式。 亦称“减价拍卖”,它是指拍卖标的的竞价由高到低依次递减直到第一个竞买人应价(达到或超过底价)时击槌成交的一种拍卖。
在币圈,很多NFT通过荷兰拍卖发售,其中包括Azuki和World of Women,其中Azuki通过荷兰拍卖筹集了超过8000枚ETH。
项目方非常喜欢这种拍卖形式,主要有两个原因
荷兰拍卖的价格由最高慢慢下降,能让项目方获得最大的收入。
拍卖 ...
34. ERC721
WTF Solidity极简入门: 34. ERC721
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
BTC和ETH这类代币都属于同质化代币,矿工挖出的第1枚BTC与第10000枚BTC并没有不同,是等价的。但世界中很多物品是不同质的,其中包括房产、古董、虚拟艺术品等等,这类物品无法用同质化代币抽象。因此,以太坊EIP721提出了ERC721标准,来抽象非同质化的物品。这一讲,我们将介绍ERC721标准,并基于它发行一款NFT。
EIP与ERC
这里有一个点需要理解,本节标题是ERC721,这里又提到了EIP721,这两个是什么关系呢?
EIP全称 Ethereum Improvement Proposals(以太坊改进建议), 是以太坊开发者社区提 ...
33. 空投合约
WTF Solidity极简入门: 33. 空投合约
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
在币圈,最开心的一件事就是领空投,空手套白狼。这一讲,我们将学习如何使用智能合约发送ERC20代币空投。
空投 Airdrop
空投是币圈中一种营销策略,项目方将代币免费发放给特定用户群体。为了拿到空投资格,用户通常需要完成一些简单的任务,如测试产品、分享新闻、介绍朋友等。项目方通过空投可以获得种子用户,而用户可以获得一笔财富,两全其美。
因为每次接收空投的用户很多,项目方不可能一笔一笔的转账。利用智能合约批量发放ERC20代币,可以显著提高空投效率。
空投代币合约
Airdrop空投合约逻辑非常简单:利用循环,一笔交易将ERC20代币发送给多个地址。合 ...
32. 代币水龙头
WTF Solidity极简入门: 32. 代币水龙头
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
我们在第31讲学习了ERC20代币标准。这一讲,我们将学习ERC20水龙头的智能合约。在这个合约中,用户可以领到免费的ERC20代币。
代币水龙头
当人渴的时候,就要去水龙头接水;当人想要免费代币的时候,就要去代币水龙头领。代币水龙头就是让用户免费领代币的网站/应用。
最早的代币水龙头是比特币(BTC)水龙头:现在BTC一枚要$30,000,但是在2010年,BTC的价格只有不到$0.1,并且持有人很少。为了扩大影响力,比特币社区的Gavin Andresen开发了BTC水龙头,让别人可以免费领BTC。撸羊毛大家都喜欢,当时就有很多人去撸,一部分变为了 ...
31. ERC20
WTF Solidity极简入门: 31. ERC20
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍以太坊上的ERC20代币标准,并发行自己的测试代币。
ERC20
ERC20是以太坊上的代币标准,来自2015年11月V神参与的EIP20。它实现了代币转账的基本逻辑:
账户余额(balanceOf())
转账(transfer())
授权转账(transferFrom())
授权(approve())
代币总供给(totalSupply())
授权转账额度(allowance())
代币信息(可选):名称(name()),代号(symbol()),小数位数(decimals())
IERC20
IERC20是ERC20代币标准的 ...
30. Try Catch
WTF Solidity极简入门: 30. Try Catch
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
try-catch是现代编程语言几乎都有的处理异常的一种标准方式,Solidity0.6版本也添加了它。这一讲,我们将介绍如何利用try-catch处理智能合约中的异常。
try-catch
在Solidity中,try-catch只能被用于external函数或public函数或创建合约时constructor(被视为external函数)的调用。基本语法如下:
12345try externalContract.f() { // call成功的情况下 运行一些代码} catch { // call失 ...
28. Hash
WTF Solidity极简入门: 28. Hash
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
哈希函数(hash function)是一个密码学概念,它可以将任意长度的消息转换为一个固定长度的值,这个值也称作哈希(hash)。这一讲,我们简单介绍一下哈希函数及在Solidity的应用。
Hash的性质
一个好的哈希函数应该具有以下几个特性:
单向性:从输入的消息到它的哈希的正向运算简单且唯一确定,而反过来非常难,只能靠暴力枚举。
灵敏性:输入的消息改变一点对它的哈希改变很大。
高效性:从输入的消息到哈希的运算高效。
均一性:每个哈希值被取到的概率应该基本相等。
抗碰撞性:
弱抗碰撞性:给定一个消息x,找到另一个消息x',使得hash(x) = ...
29. 选择器
WTF Solidity极简入门: 29. 函数选择器Selector
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
函数选择器
当我们调用智能合约时,本质上是向目标合约发送了一段calldata,在remix中发送一次交易后,可以在详细信息中看见input即为此次交易的calldata
发送的calldata中前4个字节是selector(函数选择器)。这一讲,我们将介绍selector是什么,以及如何使用。
msg.data
msg.data是Solidity中的一个全局变量,值为完整的calldata(调用函数时传入的数据)。
在下面的代码中,我们可以通过Log事件来输出调用mint函数的calldata:
123456// event 返回m ...