前提工作中碰到一个需求:如何在ton链上实现定阅功能,用户授权之后,项目方可以根据订阅条件进行扣款,比如项目方法推出会员机制,每月收费1Ton,但是不想用户自己发起支付交易,太麻烦,想要主动去扣费。
工作中碰到一个需求:如何在ton链上实现定阅功能,用户授权之后,项目方可以根据订阅条件进行扣款,比如项目方法推出会员机制,每月收费1Ton,但是不想用户自己发起支付交易,太麻烦,想要主动去扣费。
正好有次看到ton的官方文档中好像有介绍这个功能
官方文档:https://docs.ton.org/mandarin/participate/wallets/contracts#%E9%92%B1%E5%8C%85v4 官方walletV4和plugin源码:ton-blockchain/wallet-contract
官方的文档只给出了源码,没有示例,研究之后写了一个demo。分享出来互相学习一下。
demo的地址:https://github.com/erick785/ton-walletV4-plugin.git
初始化: yarn
我们看walletV4的源码(上面的官方仓库中有)会发现:
在合约中recv_external 接收外部消息方法有四个op操作码。这四个操作码,分别对应:
在合约中recv_internal 接受内部消息有两个op 操作码
在op == 0x706c7567 的代码逻辑中,会向plugin 插件合约发送一个op为0x706c7567 | 0x80000000的Message。
在op == 0x64737472 也有类似的逻辑。
所以我们plugin合约中要实现这个两个op操作,让钱包合约去调用。
经过上述分析,我们来实现两个操作码:
在plugin合约的recv_internal 方法中,处理接收到op后需要进行的操作,收款人都是admin
那现在我们要怎么去操作,才能通过plugin 去扣款用户的钱呢?就是触发WalletV4的请求付款操作。 所以要在plugin再加一个操作码,通过调用plugin合约 ==> 触发用户WalletV4 合约==>触发plugin合约 这样的方式,来对用户进行扣款。 下面的事新增的op操作
所以扣款的逻辑就变成了这样:
具体实现,看demo仓库中的plugin.fc
这个时候会打印 plugin合约的地址和plugin 合约地址的hash,记录下来
这是我测试的合约地址:EQBwsl7FTjVMPRSrFumW6kZxamxldPBemnflvVGpM6c7OGHD plugin合约地址Hash:0x70b25ec54e354c3d14ab16e996ea46716a6c6574f05e9a77e5bd51a933a73b38
1.打开payRequest.ts 脚本,替换插件合约地址,和要扣款的用户的地址。
在详情中我们就可以看到整个流程
和intsall 类似,大家可以自己试试。
当用户完成intsall插件,插件就可不经过用户同意进行扣款。实话说风险确实很高,而且用户install插件是向钱包WalletV4发送 外部消息,现在市面的ton钱包都是不支持向钱包合约发送外部消息的。所以项目最后也没有使用这个功能去实现业务。而且这个功能只能扣除用户的ton,不能扣除jetton token,也是个缺点。不过听说walletV5的会有更强大的插件功能,有机会去看看,学习一下。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!