# Solidity极简入门: 32. 代币水龙头 **Published by:** [0xAA](https://paragraph.com/@wtfacademy/) **Published on:** 2022-06-28 **URL:** https://paragraph.com/@wtfacademy/solidity-32 ## Content 我最近在重新学solidity,巩固一下细节,也写一个“Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 欢迎关注我的推特:@0xAA_Science 欢迎加入WTF科学家社区,内有加微信群方法:链接 所有代码和教程开源在github(1024个star发课程认证,2048个star发社群NFT): github.com/AmazingAng/WTFSolidity我们在第31讲学习了ERC20代币标准。这一讲,我们将学习ERC20水龙头的智能合约。在这个合约中,用户可以领到免费的ERC20代币。代币水龙头当人渴的时候,就要去水龙头接水;当人想要免费代币的时候,就要去代币水龙头领。代币水龙头就是让用户免费领代币的网站/应用。 最早的代币水龙头是比特币(BTC)水龙头:现在BTC一枚要$30,000,但是在2010年,BTC的价格只有不到$0.1,并且持有人很少。为了扩大影响力,比特币社区的Gavin Andresen开发了BTC水龙头,让别人可以免费领BTC。撸羊毛大家都喜欢,当时就有很多人去撸,一部分变为了BTC的信徒。BTC水龙头一共送出了超过19,700枚BTC,现在价值约6亿美元!ERC20水龙头合约这里,我们实现一个简版的ERC20水龙头,逻辑非常简单:我们将一些ERC20代币转到水龙头合约里,用户可以通过合约的requestToken()函数来领取100单位的代币,每个地址只能领一次。状态变量我们在水龙头合约中定义3个状态变量amountAllowed设定每次能领取代币数量(默认为100。不是一百枚,因为代币有小数位数)。tokenContract记录发放的ERC20代币合约地址。requestedAddress记录领取过代币的地址。 uint256 public amountAllowed = 100; // 每次领 100 单位代币 address public tokenContract; // token合约地址 mapping(address => bool) public requestedAddress; // 记录领取过代币的地址 事件水龙头合约中定义了1个SendToken事件,记录了每次领取代币的地址和数量,在requestTokens()函数被调用时释放。 // SendToken事件 event SendToken(address indexed Receiver, uint256 indexed Amount); 函数合约中只有两个函数:构造函数:初始化tokenContract状态变量,确定发放的ERC20代币地址。 // 部署时设定ERC2代币合约 constructor(address _tokenContract) { tokenContract = _tokenContract; // set token contract } requestTokens()函数,用户调用它可以领取ERC20代币。Remix演示1 首先,部署ERC20代币合约,并给自己mint 10000 单位代币。部署\`ERC20\`2 部署Faucet水龙头合约,初始化的参数填上面ERC20代币的合约地址。部署水龙头合约3 利用ERC20代币合约的trasnfer()函数,将 10000 单位代币转账到Faucet合约地址。给水龙头转账4 换一个新账户,调用Faucet合约requestTokens()函数,领取代币。可以在终端看到SendToken事件被释放。领取代币5 在ERC20代币合约上利用balanceOf查询账户余额,可以看到余额变为100,领取成功!领取成功总结这一讲,我们介绍了代币水龙头的历史和ERC20水龙头合约。大家觉得下一个BTC水龙头会在哪里? ## Publication Information - [0xAA](https://paragraph.com/@wtfacademy/): Publication homepage - [All Posts](https://paragraph.com/@wtfacademy/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@wtfacademy): Subscribe to updates - [Twitter](https://twitter.com/0xAA_Science): Follow on Twitter