I'M LIANG DONG I'M LIANG DONG
Web3,聊聊技术 1617 次浏览 4 分钟阅读

区块链系列3 – 如何发布支持预授权的ERC20代币

接着上一篇“区块链系列2 – 如何发布一个支持黑名单管理的ERC20代币” ,对于发币来说,默认的只支持主动转账的ERC20代币有时会有限制,在传统银行业务中,还有一个场景是授权交易,比如A账户可以发起一个授权,允许B账户在一定时间内向自己的账户发起扣款X元,这里的B账户、时间范围、累计扣款金额就是三个参数,那是否可以基于区块链开发一个这样的智能合约?即允许一个钱包用户授权另一个钱包客户在一定时间范围内一定金额范围内向自己的钱包发起扣款。经过我尝试,是可以的。

智能合约

智能合约代码片段
合约发布后的log ,合约地址: 0xE3E0637B1b48030D6434039AB98357B6dc098Bd8

预授权功能实现

重点内容:自托管钱包比如MetaMask它只有基础的转账和收款功能,如果是一个授权,是需要调用智能合约的一个方法,MetaMask是做不到的,所以就需要一个独立的DApp才可以,在自己开发的DApp里主动让钱包的私钥签名后调用特定的授权方法。

DApp开发

现在都有很成熟的DApp开发框架,很多语言也都可以实现,为了实现方式,我才用了php。

开发好的网址是: https://token.liangdong.me ,如下图所示

选择链

使用Chrome浏览器打开这个网址,并预先安装MetaMask插件,选择测试链,点击保存。

管理员权限

MetaMask选择测试链,并选择发布合约相同的钱包,即可看到管理员的功能,可以看到有100万代币,精读是2。

创建预授权

现在准备验证发起预授权,首先使用另外一个钱包, 0x207C3fF50e568a6DfEFB34FdDAd36faB69648Aa6 ,先使用管理员钱包0xDb5206169c8c491BC8B17d294DbaFF6644df889B 向这个钱包铸币1000

切换到0x207C3fF50e568a6DfEFB34FdDAd36faB69648Aa6钱包后即可看到余额

现在就可以发起预授权,授权0xDb5206169c8c491BC8B17d294DbaFF6644df889B钱包可以在1小时内授权累计500,不区分次数,总额不超过500即可。

点击创建预授权时需要通过Meta Mask签名,签名时也会看到信息,

Authorize 0xDb5206169c8c491BC8B17d294DbaFF6644df889B to spend 50000 wei of IOCT4CM. Valid for 1 hours.

这笔签名需要Gas Fee

预授权成功

可查询到该笔预授权,关键信息时预授权ID,后续可以通过这个预授权ID发起扣款交易,当然前提是只有允许被授权的钱包0xDb5206169c8c491BC8B17d294DbaFF6644df889B才可以通过这个ID发起授权扣款,其他钱包不可以。

发起预授权

现在把MetaMask切回到可以发起预授权的钱包0xDb5206169c8c491BC8B17d294DbaFF6644df889B ,输入预授权ID,输入金额100,点击执行扣款。

可查询到钱包被授权钱包余额由1000变为900
该笔授权交易授额额度也由500变为400
被授权人可看到扣款记录
授权人也可看到交易记录

授权完成后各钱包查询

授权钱包余额900

发起预授权是执行了合约的一个方法0xb8990ec3
被授权人余额增加100

区块链浏览器可看到这笔授权执行交易。

I'M Liang Dong.

0

  1. 此文章尚无评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注