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



预授权功能实现
重点内容:自托管钱包比如MetaMask它只有基础的转账和收款功能,如果是一个授权,是需要调用智能合约的一个方法,MetaMask是做不到的,所以就需要一个独立的DApp才可以,在自己开发的DApp里主动让钱包的私钥签名后调用特定的授权方法。
DApp开发
现在都有很成熟的DApp开发框架,很多语言也都可以实现,为了实现方式,我才用了php。
开发好的网址是: https://token.liangdong.me ,如下图所示

选择链

管理员权限
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,点击执行扣款。







授权完成后各钱包查询

授权钱包余额900




0