ERC-6932: 基于订阅的代币
提供对需要定期支付的服务或产品的访问权限的 ERC-20 扩展。
Authors | 360 Core <hello@360coreinc.com>, Robin Rajput (@0xRobinR) |
---|---|
Created | 2023-04-25 |
Discussion Link | https://ethereum-magicians.org/t/erc-subscription-based-erc20-token/13964 |
Requires | EIP-20 |
摘要
这种基于订阅的 ERC-20 代币通过 subscribe
和 unsubscribe
函数扩展了基本的 ERC-20 代币标准,允许用户订阅或取消订阅订阅服务。subscriptionFee
和 subscriptionFrequency
变量定义了订阅的成本和频率。nextPaymentDate
映射跟踪每个订阅者的下一个付款日期。
这种代币标准将允许从用户余额中自动定期扣除,由商户订阅者确定。简化和精简以太坊网络上基于订阅的服务,为用户和商户提供更高的便利性和效率。
renewSubscription
方法,将被代币持有者用来续订他们对需要以代币形式定期支付的服务或产品的订阅。
动机
基于订阅的商业模式的兴起需要一种标准化的方法来处理以太坊区块链上的循环支付。目前,用户通常手动发起订阅支付,导致不便和可能的服务交付中断。通过引入订阅代币,用户可以无缝授权定期扣款,从而实现对订阅服务的无中断访问。
基于订阅的 ERC-20 代币提供了一种更灵活和方便的方式来管理循环支付。它可以用于各种需要定期支付的服务和产品,例如基于订阅的内容平台、游戏服务等。
订阅代币确保跨不同实现的一致性和互操作性。主要功能包括:
-
自动扣款:作为订阅者的商家可以为其服务设置订阅间隔和相关的支付金额。此信息编码在订阅代币合约中,允许从用户余额中定期自动扣款,而无需手动干预。
-
余额检查:用户可以随时验证其订阅代币的剩余余额。这种透明度使使用者能够监控他们的订阅,并对他们对服务的持续承诺做出明智的决定。
-
灵活性:订阅代币框架适用于各种订阅模式,例如每月、每季度或每年的账单周期。此外,商家可以选择定义试用期、升级/降级计划和取消政策,从而为各种基于订阅的业务提供通用的基础。
-
安全性:订阅代币采用已建立的安全措施,包括使用加密签名,以确保与订阅相关的交易的完整性和真实性。这可以保护用户和商家免受未经授权的访问和潜在的恶意活动。
规范
以下是标准所需的实现:
SubscriptionToken
subscribers
返回订阅代币合约的已订阅 addresses
(地址)列表。
subscriptionInfo
订阅的元数据信息,例如 - subscriptionID
、subscriptionName
、subscriptionDesc
和 subscriptionTandC
。
subscriptionFee
当地址订阅订阅代币合约时,指定的订阅金额将在 subscriptionFrequency
间隔内扣除。
subscriptionFrequency
订阅频率,即收取 subscriptionFee
的间隔。例如,每 1 天、1 周或 1 个月,以秒为单位表示。
subscribe
用于将地址订阅到订阅代币合约的方法。
unsubscribe
通过订阅的地址从订阅代币合约中撤销订阅。
interface ISubscriptionERC20 {
/// @dev 映射订阅者地址,如果未找到 `idx`,则返回 address(0)
/// @param idx: 映射值的键
/// @return 订阅者映射中键 `idx` 处的地址
function subscribers(uint idx) external view returns (address);
/// @dev 订阅代币合约的信息
/// @return subscriptionID, subscriptionName, subscriptionDesc, subscriptionTandC
function subscriptionInfo() external view returns ( uint, string memory, string memory, string memory );
/// @dev 订阅订阅,可以支付
function subscribe() external;
/// @dev 取消订阅
function unsubscribe() external;
/// @dev 可以使用 view 或 pure
/// @return 订阅费
function subscriptionFee() external view returns (uint256);
/// @dev 可以使用 view 或 pure
/// @return 获取订阅频率
function subscriptionFrequency() external view returns (uint);
}
原理
订阅代币合约通过使用数学公式定期从订阅地址扣款来继承订阅的基础知识。
uint256 intervals = ( block.timestamp - info.start ) / info.frequency;
uint256 amount = info.amount * intervals;
uint256 localEffectiveBalance = effectiveBalance[account];
if ( (totalAmount + amount) > localEffectiveBalance ) {
amount = localEffectiveBalance;
}
totalAmount += ( localEffectiveBalance - amount );
在这里,地址的代币余额使用来自正在进行的订阅的锁定余额和地址的有效余额(每当进行转账时更新)来计算。
向后兼容性
未发现向后兼容性问题。
安全考虑
订阅代币可能需要用户签署交易或提供与订阅相关的操作的加密证明。应遵循适当的密钥管理实践,以保护用户的私钥并防止未经授权的访问。鼓励使用硬件钱包或安全密钥存储解决方案可以减轻密钥泄露的风险。
版权
版权和相关权利通过 CC0 放弃。
Citation
Please cite this document as:
360 Core <hello@360coreinc.com>, Robin Rajput (@0xRobinR), "ERC-6932: 基于订阅的代币 [DRAFT]," Ethereum Improvement Proposals, no. 6932, April 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-6932.