目前大多数去中心化应用都具有分红功能,因为分红能够帮助应用吸引新用户加入,增强老用户粘性。不同于不断抬高售价的简单资金盘功能,分红功能实现比较复杂。本文主要讲解目前流行的资金盘分红功能,以及如何实现。
什么是分红
分红就是通过已投入的资金来对后流入资金的收取红利。一般会定义分红比例,每笔流入资金会拿出分红比例的金额最为分红,放入分红池。这笔资金由当时所有已有资金平均分配。这样,先投入的资金,除了获得应用本身提供的价值为,还可以源源不断的获得后来资金的红利,越早投入收益越大,极大地提高了用户加入的积极性。一个典型的例子就是EOS曾经的现象级应用 - 像素大师。
为什么分红实现困难
应用可以接受多个用户的资金,每个用户可以多次投入资金。每笔投资都应平均分配给当时已存的资金,用户的每笔投资享受的红利开始时刻都不相同。下面举例说明这个过程。
应用APP具有分红功能,分红比例为10%。用户1,用户2,用户3分别调用应用APP各投入3笔资金。资金投入顺序及每次分红计算如下表所示,粗体数字表示每笔资金投入后计算的用户数据。
次序 | 用户 | 投入金额 | 累计投入金额 | 分红金额 | 用户1累计投入额 | 用户2累计投入额 | 用户3累计投入额 | 用户1本次分红额 | 用户2本次分红额 | 用户3本次分红额 |
---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 100 | 100 | 10 | 100 | 0 | 0 | 10 | 0 | 0 |
2 | 2 | 100 | 200 | 10 | 100 | 100 | 0 | 5 | 5 | 0 |
3 | 3 | 200 | 400 | 20 | 100 | 100 | 200 | 5 | 5 | 10 |
4 | 2 | 100 | 500 | 10 | 100 | 200 | 200 | 2 | 4 | 4 |
5 | 3 | 300 | 800 | 30 | 100 | 200 | 500 | 3.75 | 7.5 | 18.75 |
6 | 1 | 200 | 1000 | 20 | 300 | 200 | 500 | 6 | 4 | 10 |
7 | 3 | 250 | 1250 | 25 | 300 | 200 | 750 | 6 | 4 | 15 |
8 | 2 | 250 | 1500 | 25 | 300 | 450 | 750 | 5 | 7.5 | 12.5 |
1500 | 150 | 42.75 | 37 | 70.25 |
由上表可见,用于用户A投入资金较早,虽然他的投入金额比用户B少,但却得到更多的分红金额。
当用户数众多,交易频繁时,计算每笔交易分红变得非常困难。即使在中心化系统中,完成它也需要耗费很多资源,更不要说要在去中心化的区块链应用中实现。目前区块链操作无法支持复杂运算,否则会严重影响出块速度和系统响应。
如何实现分红
实现区块链应用分红关键有两点
- 变推为拉 - 采用拉代替推模式,让用户主动提取分红,而非应用发放分红给用户。
- 考虑每笔投入 - 针对每笔投入资金计算全局分红,而不计算每个用户分红。但由于每笔金额只能享受它后面资金的分红,这里的重点是需要扣除它前面的全局分红值。
具体算法如下
- 定义总投入金额
total_amount
,分红比例profit_percent
,以及总分红金额profit_amount
- 定义单位分红值
profit_per_amount
,即profit_amount / total_amount
的单位分红额度。 - 定义用户投入金额
user_amount
,此值基于用户,每个用户的可能都不同。 - 定义用户的分红扣除金额
user_profit_mask
, 此值基于用户,每个用户的可能都不同。 - 每次用户投入资金后,假设投入资金为
amount1
,做如下操作
5.1 计算总投入金额,total_amount = total_amount + amount1
5.2 计算总分红值,profit_amount = profit_amount + amount1 * profit_percent
5.3 计算本次投入的扣除分红值,
user_profit_mask = user_profit_mask + amount1 * user_profit_mask
5.4 计算单位分红值,profit_per_amount = profit_per_amount + profit_amount / total_amount
5.5 计算用户投入金额,user_amount = user_amount + amount1
- 用户提取分红时,做如下操作
6.1 计算用户分红值,user_profit_amount = user_amount * profit_per_amount - user_profit_mask
6.2 如果值大于0,将其转账给用户,同时更新分红扣除值,
user_profit_mask = user_profit_mask + user_profit_amount
根据上面例子计算结果如下表所示,红色表示每笔资金投入后计算的用户数据
次序 | 用户 | 投入金额 | 累计投入金额 | 分红金额 | 单位分红值 | 用户1累计投入额 | 用户2累计投入额 | 用户3累计投入额 | 用户1扣除分红额 | 用户2扣除分红额 | 用户3扣除分红额 |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 100 | 100 | 10 | 0.10000000 | 100 | 0 | 0 | 0 | 0 | 0 |
2 | 2 | 100 | 200 | 10 | 0.15000000 | 100 | 100 | 0 | 0 | 10 | 0 |
3 | 3 | 200 | 400 | 20 | 0.20000000 | 100 | 100 | 200 | 0 | 10 | 30 |
4 | 2 | 100 | 500 | 10 | 0.22000000 | 100 | 200 | 200 | 0 | 30 | 30 |
5 | 3 | 300 | 800 | 30 | 0.25750000 | 100 | 200 | 500 | 0 | 30 | 96 |
6 | 1 | 200 | 1000 | 20 | 0.27750000 | 300 | 200 | 500 | 51.5 | 30 | 96 |
7 | 3 | 250 | 1250 | 25 | 0.29750000 | 300 | 200 | 750 | 51.5 | 30 | 165.375 |
8 | 2 | 250 | 1500 | 25 | 0.31416667 | 300 | 450 | 750 | 51.5 | 104.375 | 165.375 |
用户1分红 | 42.75 | 用户2分红 | 37 | 用户3分红 | 70.25 |
从上表可以看出,每笔资金只需计算和投入用户相关的数据,最终结果完全正确。
网友评论