今天, 不小心给一些YY股东发了两篇利息, 比如 @angerlina6688 美女,
24 minutes ago Transfer 0.009 SBD to angelina6688 Thank you for supporting @justyy ! Your 70.02 SP gives you daily interests of 0.009 SBD (5% APR) - (2017-12-29): 1 STEEM = 3.233 SBD 24 minutes ago Transfer 0.009 SBD to angelina6688 Thank you for supporting @justyy ! Your 70.02 SP gives you daily interests of 0.009 SBD (5% APR) - (2017-12-29): 1 STEEM = 3.233 SBD
就算行长给大家的新年礼物!
原因
每天利息都是用 crontab 定时在凌晨00:02分的时候用程序自动发的(然后会在 01:02, 02:02 … 每天前6个小时内再次检查补发), 已经很好的运行101天了, 以下是从日表得到的数据:
YY银行一共运行了: 101 天. YY银行一共有: 107 位股东(包括已经离开的). YY银行一共支付了: 222.28 SBD 的利息. 平均每天YY银行需支付: 2.20 SBD 的利息. 平均每周YY银行需支付: 15.41 SBD 的利息. 平均每月YY银行需支付: 66.02 SBD 的利息.
今天发两次的情况说来也真是有意思:
- 我记错时间了, 当00:01的时候我发现利息没有发出, 我以为程序挂掉了, 其实程序还没开始跑呢.
- 于是我在00:01将近00:02的时候手动跑程序发利息.
- 结果在00:02分的时候有一段时间两个同样的程序都在发利息, 所以有一部分是重复发的.
怎么样判断已经发过了?
我用了以下两个技巧:
- STEEMSQL 查询, 但是SteemSQL 会有8分钟的延时(每8分钟 SteemSQL 从区块链上取数据更新缓存)
- 本地文件做记号, 大概代码是:
1 2 3 4 5 6 7
fname = id + "_" + today + ".txt" if os.path.isfile(fname): print("transferred today already.") else: if steem.transfer(id, amount=x, asset='SBD', memo=interest, account='justyy') != None: print("transfered!") touch(fname)
fname = id + "_" + today + ".txt" if os.path.isfile(fname): print("transferred today already.") else: if steem.transfer(id, amount=x, asset='SBD', memo=interest, account='justyy') != None: print("transfered!") touch(fname)
两个程序都会先发完才做标记, 碰巧发利息的时候 steem.transfer 是比较耗时的(需要广播到STEEM区块链上), 所以两个程序就发了两次.
当然可以把 touch(fname) 做标记移到 steem.transfer 前, 也就是先标记, 然后再去发, 不过以前试过, 一旦标记上但是偶尔发不成功的话, 那么在1:02, 2:02 等第二次第三次机会发利息就会以为已经发成功了.
这次就算YY银行发糖果, 这个程序如果一个时候只跑一个的情况下鲁棒性还是挺强的, 这次分叉从实际上证明了可能存在的问题.
GD Star Rating
loading...
本文一共 493 个汉字, 你数一下对不对.loading...
上一篇: 糊里糊涂的2017年 | 2018年个人计划
下一篇: 我在STEEM发文的动力
扫描二维码,分享本文到微信朋友圈