关于收益分享功能理解的终极版(专家指点 & 代码核证)

in #cn7 years ago


昨天发了个帖子

讲了对帖子使用收益分享功能发奖后金额的一些疑问,主要有两个方面:

  • 收益分享,分享的是去除点赞者收益后作者实际收益的百分比吗?
  • 收益分享的SP核算价格,是current_median_history_price 还是市场价格?

收益分享功能没问题

然后经过专家级人物耐心细致的指点,大致搞明白了这个问题

其核心就是: 我看到的帖子金额,是收益分享的剩余金额

所以,就我的那个帖子而言:

  • 分给受益者(Beneficiaries):3.504 * 5 = 17.52 占了25% (5%*5)
  • 分给作者(Author): 3.504*15 = 52.56 占75% (100%-25% = 75%)
    分两部分发放, SP 26.28 , SBD 43.177
  • 分给点赞者(Curators): $20.64

一切没毛病,如果一定要找出毛病,那就是steemit UI上少显示了一部分内容,总奖励应该包含:

  • 点赞者 / Curators
  • 受益人 / Beneficiaries
  • 作者 / Curators

而STEEMIT UI上只显示了两项,造成我巨大的误解,也耽误了专家大量时间。😡

从代码上验证这个问题

尽管专家已经帮我找出了问题所在
但是今天还是粗略浏览了一下代码,看看是否真的如此

代码真的好复杂,吐血
发奖代码在process_comment_cashout()这个函数
大致就是做一些准备和判断工作,然后遍历每个Comment调用:
auto reward = cashout_comment_helper( ctx, comment );
所以这个就是为帖子发奖的代码啦: cashout_comment_helper()

其中我们需要知道是,comment.net_rshares 决定你的帖子有多少钱。
除去一些设置和初始化之类的:

const share_type reward = util::get_rshare_reward( ctx );
uint128_t reward_tokens = uint128_t( reward.value );

这个就是帖子的总收益/代币tokens

share_type curation_tokens = ( ( reward_tokens * get_curation_rewards_percent( comment ) ) / STEEMIT_100_PERCENT ).to_uint64();
share_type author_tokens = reward_tokens.to_uint64() - curation_tokens;

代币分为作者的以及点赞者的,按比例分配

author_tokens += pay_curators( comment, curation_tokens );

发放点赞者代币,但是呢,因为有些有早鸟惩罚,所以会剩一些,统统奖励给作者

            for( auto& b : comment.beneficiaries )
            {
               auto benefactor_tokens = ( author_tokens * b.weight ) / STEEMIT_100_PERCENT;
               auto vest_created = create_vesting( get_account( b.account ), benefactor_tokens, has_hardfork( STEEMIT_HARDFORK_0_17__659 ) );
               push_virtual_operation( comment_benefactor_reward_operation( b.account, comment.author, to_string( comment.permlink ), vest_created ) );
               total_beneficiary += benefactor_tokens;
}

这部分就是给受益人发放奖励啦
由此可见,它是以刨除点赞者收益以后的作者总收益为基础按比例发放。

            author_tokens -= total_beneficiary;

            auto sbd_steem     = ( author_tokens * comment.percent_steem_dollars ) / ( 2 * STEEMIT_100_PERCENT ) ;
            auto vesting_steem = author_tokens - sbd_steem;

            const auto& author = get_account( comment.author );
            auto vest_created = create_vesting( author, vesting_steem, has_hardfork( STEEMIT_HARDFORK_0_17__659 ) );
            auto sbd_payout = create_sbd( author, sbd_steem, has_hardfork( STEEMIT_HARDFORK_0_17__659 ) );

最终给作者的收益(减掉了受益人部分),根据设置,按比例发放

通过这部分代码,我们得知:

  • 帖子的收益,除去其它一些因素,由comment.net_rshares决定
  • get_rshare_reward 根据系统因素以及comment设置(拒绝收益,最大收益等)计算帖子总应得代币
  • 总应得代币按比例分成作者以及点赞者代币
  • 点赞者代币发放的剩余部分(早鸟惩罚),增加给作者
  • 作者总应得代币(作者部分+早年惩罚剩余部分)按比例分给受益者(Beneficiaries)
  • 分给受益人以后的剩余部分,按照设置发放给作者

再回头看我在专家指点下对帖子收益分享功能的理解,没毛病。

另外,经过分析,我们回头看昨天提出的问题,答案已经不言而喻了。

STEEM 以及 STEEM UI 需要改进的地方

STEEM在计算和发放奖励后,会对帖子执行一些更新操作,比如加上发奖时间,以及分给点赞者和作者的实际收益等等。但是却没有加上给受益人的收益这一信息

而STEEMIT UI上,更是只显示了

  • 作者/Author收益
  • 点赞者 / Curators 收益

并且粗暴的把这两项加到一起,显示为帖子收益(总奖励)
这能不让人误会嘛,害我拿小算草本计算半天😡

所以建议如下:

  • 链上对结算后的Comment 加上
    beneficiaries_payout_value

  • UI上对结算的帖子,加上
    受益人 / Beneficiaries 收益

顺便补充一个最重要的结论: 收益分享功能不会倒搭钱的😭


感谢阅读 / Thank you for reading.
欢迎upvote、resteem以及 following me @oflyhigh 😎

Sort:  

读代码的时候想到的问题,忘记写到帖子里了
补充在这:

通过阅读代码,我们可以发现,
系统先是计算总奖励,之后再发放奖励
所以,如果帖子设置了拒绝收益 /Decline Payout
comment.max_accepted_payout = 0
那么总奖励为0

asset max_steem = to_steem( ctx.current_steem_price, ctx.max_sbd );
payout = std::min( payout, uint64_t( max_steem.amount.value ) );

所以点赞者是拿不到点赞回报的
这也是为何拒绝收益的帖子一般情况没人点,除非你对其内容表示高度认可。

人工置顶

读代码的时候想到的问题之二:

帖子收益之类的都是已代币计算了,以及STEEM
之前讨论过100% Power UP 是亏是赚的问题
现在答案来了

  • 100% POWER UP, 一点也不亏,因为系统内就是按代币算的
  • 50% / 50% 你赚了,因为系统内的SBD/STEEM价格,比市场价格偏高

人工置顶

学习了

great post

why payments for post stopped??? whales please upvote minor posts or you will loose people,

每一件偉大的工作,每一個偉大的成就,通過堅持的願景,通常在大的成就之前,顯然是失敗和沮喪,形成了表現。
偉大的工作我親愛的

very informative

i dont understant it

Coin Marketplace

STEEM 0.20
TRX 0.14
JST 0.030
BTC 63718.61
ETH 3390.60
USDT 1.00
SBD 2.62