<<WTF-Solidity>>学习笔记(part 29-32)

part 30:

Solidity中,try-catch只能被用于external函数或public函数或创建合约时constructor(被视为external函数)的调用。基本语法如下:

try externalContract.f() {
    // call成功的情况下 运行一些代码
} catch {
    // call失败的情况下 运行一些代码
}

其中externalContract.f()是某个外部合约的函数调用,try模块在调用成功的情况下运行,而catch模块则在调用失败时运行。

同样可以使用this.f()来替代externalContract.f()this.f()也被视作为外部调用,但不可在构造函数中使用,因为此时合约还未创建。

如果调用的函数有返回值,那么必须在try之后声明returns(returnType val),并且在try模块中可以使用返回的变量;如果是创建合约,那么返回值是新创建的合约变量。

part 31 :

这一讲,我们将介绍以太坊上的ERC20代币标准,并发行自己的测试代币。

ERC20

ERC20是以太坊上的代币标准,来自2015年11月V神参与的EIP20。它实现了代币转账的基本逻辑:

  • 账户余额(balanceOf())
  • 转账(transfer())
  • 授权转账(transferFrom())
  • 授权(approve())
  • 代币总供给(totalSupply())
  • 授权转账额度(allowance())
  • 代币信息(可选):名称(name()),代号(symbol()),小数位数(decimals())

IERC20

IERC20ERC20代币标准的接口合约,规定了ERC20代币需要实现的函数和事件。 之所以需要定义接口,是因为有了规范后,就存在所有的ERC20代币都通用的函数名称,输入参数,输出参数。 在接口函数中,只需要定义函数名称,输入参数,输出参数,并不关心函数内部如何实现。 由此,函数就分为内部和外部两个内容,一个重点是实现,另一个是对外接口,约定共同数据。 这就是为什么需要ERC20.solIERC20.sol两个文件实现一个合约。

事件

IERC20定义了2个事件:Transfer事件和Approval事件,分别在转账和授权时被释放

/**
 * @dev 释放条件:当 `value` 单位的货币从账户 (`from`) 转账到另一账户 (`to`)时.
 */
event Transfer(address indexed from, address indexed to, uint256 value);

/**
 * @dev 释放条件:当 `value` 单位的货币从账户 (`owner`) 授权给另一账户 (`spender`)时.
 */
event Approval(address indexed owner, address indexed spender, uint256 value);

函数

IERC20定义了6个函数,提供了转移代币的基本功能,并允许代币获得批准,以便其他链上第三方使用。

part 32: 

代币水龙头

当人渴的时候,就要去水龙头接水;当人想要免费代币的时候,就要去代币水龙头领。代币水龙头就是让用户免费领代币的网站/应用。

最早的代币水龙头是比特币(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记录领取过代币的地址。
index.html是我的前端页面:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>儿童肠梗阻医疗辅助诊断系统</title> <link rel="stylesheet" href="/static/css/style.css"> </head> <body> <header> <div class="header-content"> <h1>儿童肠梗阻医疗辅助诊断系统</h1> <div class="contact-info"> <span>400-XXX-XXXX</span> </div> </div> </header> <div class="login-form"> <h2>账号登录</h2> <form action="/login" method="post"> <div class="form-group"> <!-- <label for="username">用户名/邮箱/工号/学号</label> --> <input type="text" id="userid" name="userid" placeholder="请输入账号" required> </div> <div class="form-group"> <!-- <label for="password">密码</label> --> <input type="password" id="password" name="password" placeholder="请输入密码" required> </div> <div class="form-group"> <button type="submit">登录</button> </div> <div class="form-group"> <a href="#">忘记密码?</a> </div> <div class="agreement"> <input type="checkbox" id="agree" required> <label for="agree">我已阅读并同意 <a href="#">《服务条款》</a> 和 <a href="#">《隐私政策》</a></label> </div> </form> </div> </body> </html> # 登录路由 @app.route('/login', methods=['POST']) def login(): userid = request.form.get('userid') password = request.form.get('password') ... 这是我用flask处理登录逻辑的代码,要求获得userid和password之后,通过userid查询数据库对应的password,正确则跳转页面到home.html
03-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值