娱乐贴:狗年买了点狗币 / Dogecoin

话说,最近空气币都飞上天际,我看着那是眼红不已啊。EOS、BTS、BTC、STEEM这些适合做长线,虽然涨势良好,不过和空气币一比就小巫见大巫了,几百倍涨幅得等到猴年马月。买点啥好啊,最好也翻它个成千上万倍,让我也实现个人生小目标,先赚它一个亿。

选来选去,觉得币圈水太深,那些空气币尽管一直翻啊翻啊,可惜就是不敢下手,也许我没买人家能翻滚着上到山顶,我一买估计就要滚到悬崖下了,没办法反指功力就是这么强。一旦因为我的入场,翻到悬崖下,我损失点人民币倒是小事,我拖累其它投资者和我一起损失就罪过大了。

那有没有介于空气币和山寨币之间的投资品种呢,还别说,我真发现一个我觉得不错的,那就是传说中的狗币Dogecoin。先来一个睿智的凝视。

狗币诞生于2013,在虚拟币市场还没有这么火爆的时候,也算是知名币种啦,至少好多乱七八糟的币我是听都没听过,但是狗币却耳熟能详。好了,让我将狗币一些技术参数啥的,对我这种币圈小白而言那是太难了。不过我看中他以下几点:

  • 我比较喜欢狗币的头像(吉祥物),一看就很喜庆
  • 狗币价格便宜,很亲民
  • 狗币生命力顽强,活了这么多年,足以证明一切
  • 狗年嘛,买点狗币是不是很应景

好吧,其实以上诸多理由都是我瞎胡扯的,我就是觉得狗币这么便宜,稍微投一点,以后出去就可以和朋友吹嘘自己有几万枚虚拟币了,这样子是不是很拉风?没办法,爱慕虚荣的毛病改不了啦。

既然狗币这么可以满足我的虚荣心这么拉风,我当然要叫上朋友们一起扯蛋一起发财了。于是我在好几个微信群建议朋友们来买狗币,到狗币的交易市场里做大庄家,简称狗庄。结果响应者寥寥无几😭。


于是我只好自己闷声发大财了玩了,前天在0.125的价位买了一些,不过这点量还做不成狗庄的。结果昨天一路跌倒0.09,纠结要不要清仓跑路的时候,看它又有所回升,那就姑且放着吧。

今天早晨一看,哇,最高涨到接近0.15了,于是在0.135的价格果断补仓,补完之后,狗币果断跌到0.13。不过,我是要做拥有几万枚虚拟币的拉风男子,狗币的价格涨涨跌跌又与我何干呢?


当然了,万一狗币涨到1W一枚,我也不做神马拉风男子了,果断清仓,先弄它个几亿。至于,是拉风还是邋遢又有何妨呢?

注:本文纯属自娱自乐,不构成投资建议


This page is synchronized from the post: 娱乐贴:狗年买了点狗币 / Dogecoin

重要提示: steem-python 代码内部使用旧的RPC节点,可能会导致你的脚本失效 / 如何修复

今天,微信群里一个朋友遇到带宽超限无法操作的问题,向我求助,于是我打算代理给他两个2个SP,这样就能解决这个问题了。结果却遇到了问题,解决问题以后,我想大家可能会遇到类似情况,就写出来分享一下,希望对遇到类似问题的朋友有所帮助。


(图源 :pixabay)

代码出问题了

在我的程序中,我使用如下函数来处理SP代理

1
2
3
4
5
6
def delegate(steem, from_a, to, sp):
try:
vests = '{} VESTS'.format(Converter().sp_to_vests(sp))
steem.delegate_vesting_shares(to, vests, from_a)
except:
print('Something Wrong!')

其中steem是Steem类示例,from、to不用解释啦,sp是要代理的SP数量。

因为这段代码以前一直好用,我也没想太多,直接执行,结果等了半天没有响应。杀掉程序后,我就想哪出问题了呢?后来想起来节点 steemd.steemit.com 在1月6日停止使用了,为此我还特意发帖给大家提示,没想到我的旧代码居然还没更新节点。

定位问题

为了更好的理解这个问题,我做了如下测试:

脚本会一直等待下去

如果换成

脚本响应正常。

于是将我脚本创建Steem类实例的代码由:

steem=Steem()

更新为

steem=Steem(nodes=['https://api.steemit.com'])

信心满满的再次运行,这次总归该代理成功了吧?嗯,怎么还是运行半天没有响应?这不科学呀,又是灵异事件,问题会出在哪里呢?最终我的目光锁定在Converter().sp_to_vests(sp)这句代码上。

看了一下Converter类的初始化代码,其中有如下语句:

self.steemd = steemd_instance or shared_steemd_instance()

也就是说,如果不传入steemd,则使用共享steemd实例,而共享steemd实例尚不存在的话,使用如下代码创建

_shared_steemd_instance = stm.steemd.Steemd(nodes=get_config_node_list())
注:此处nodes=get_config_node_list()是多余的,详见下边代码

而如果我们没有配置node列表,Steemd实例初始化中就会使用代码中默认的节点

nodes = get_config_node_list() or ['https://steemd.steemit.com']

看到问题了吗?
代码中还在使用https://steemd.steemit.com这个已经停用的节点!

解决问题

好了,我们已经发现了问题所在

  • 一个是创建Steem类实例的时要使用新节点
  • 一个是共享Steem类实例使用了代码旧的节点

那么要解决这些问题就很简单了。

解决方法

  • 创建实例时使用:
    steem=Steem(nodes=['https://api.steemit.com'])
  • 调用Converter类时指定实例:
    Converter(steemd_instance=steem).sp_to_vests(sp)

其它方法

上边的解决方法是手工指定节点nodes并且避免使用了共享节点。那么还有其它办法解决吗?当然有,还不止一个:

  • 将steem-python库代码中的https://steemd.steemit.com替换为https://api.steemit.com
  • 设置默认节点列表:steempy set nodes https://api.steemit.com

使用第二种方法后,再执行上边的代码

一切正常。

总结

steem RPC节点更新 以及 steem-python 内部使用旧的RPC节点导致了我们以前可用的程序出现了问题。

本文详细分析了Steem类实例创建过程中指定节点的问题,以及共享节点存在的问题,并从多个方向给出了如何解决这个问题。

看来,升级无小事啊,原本以为不过是改个节点而已,谁知道会出这么些问题呢。

我正在撰写本文时,CN区一位网友向我反应他使用steem-python实现的收取收益代码出现了问题,因为他这个问题和我文中描述的问题基本一致,所以就让他等我发文后看我文章就好了。偷个懒好爽😀


This page is synchronized from the post: 重要提示: steem-python 代码内部使用旧的RPC节点,可能会导致你的脚本失效 / 如何修复

再谈收益分享,以及当前行情下的思考 / Comment Reward Beneficiaries

在以前的帖子中,我介绍和测试过收益分享(Comment Reward Beneficiaries)功能。所谓的收益分享,或者字面翻译的评论奖励受益者,简单的来讲就是可以把你帖子/回复的收益和其它人一起分享。


(图源 :pixabay)

收益分享的用途

这是个很有趣也很有用的功能,可以从以下两个方面理解:

  • 将帖子收益分发给别人
  • 从别人的帖子收益中获取提成

将帖子收益分发给别人

一种情况是,我们想将自己发表的帖子的收益分发给他人一部分。

慈善捐款

举例说,我发个帖子给生活中战区的儿童募捐,然后声明帖子的95%收益将会发放给某个战区儿童专项慈善基金。那么传统的方式是,我募集到资金后,提现到我个人账户,然后通过我个人账户转账给某某基金。这种情况,我募集的资金是否捐赠给某某基金,以及捐赠的比例是多少很难去核实。因为帖子是7天以后结算,除非有人盯着我的账户看结算记录,然后再找我要转账凭证来证实我确实转了相应的比例。

如果使用了收益分享(Comment Reward Beneficiaries),这个事情就简单了。只需在发表帖子的时候,设置相应的受益者,那么帖子结算时,收益自动发送给受益人。

1
2
3
beneficiaries = [
{'account': 'xxxfund', 'weight': 9500}
]

注:联合国儿童基金会账户已经被注册了,但是看起来不像是官方的

合伙人分享收益

除了上述慈善捐款外,合伙人分享收益也是收益分享功能一个重要的应用。

举例说,如果老道茶馆的收益,每次都留存50%,剩下50%发放给五个股东。那么我们就可以通过收益分享设置如下受益人即可。

1
2
3
4
5
6
7
beneficiaries = [
{'account': 'laodr', 'weight': 1000},
{'account': 'deanliu', 'weight': 1000},
{'account': 'ace108', 'weight': 1000},
{'account': 'rivalhw', 'weight': 1000},
{'account': 'lemooljiang', 'weight': 1000}
]

这样避免了每次手工转账奖励的麻烦,也避免了转账出错。

从别人的帖子收益中获取提成

从别人的帖子收益中获取提成,这个听起来挺诱人,不过前提是你提供的产品或者服务能为别人提供便利或者受益。

之前,busy.org、esteem、chainbb、dtube,都曾设置过收益分享功能。也就是说,你通过上述网站/APP发帖,它们会设置帖子收益的一定比例到他们账户。

你可能要问,既然我从他们网站/APP发帖,收入要被扣除一定比例,那么我为何不直接使用steemit呢?原因可能有三点:

  • 图便利,比如在手机上使用esteem;或者使用dtube发视频
  • 图利益,可能获得来自所有者的点赞(为了推广、赚更多的回报等)
  • 纯支持,为这些第三方网站/APP做贡献,支持其发展

现在,这些网站/APP的收益分享设置如下:

  • busy可能取消了收益分享设置。
  • dtube收益分享比例为25%
  • chainbb收益分享比例为10%
  • esteem收益分享比例为5%

收益分享的发放

《关于收益分享功能理解的终极版(专家指点 & 代码核证)》这个帖子中,我们曾经对着代码,详细研究了收益分享的发放机制。并得出如下结论:

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

当前行情下的思考

根据上述结论,我们提取出一个关键信息就是收益分享部分的奖励,按代币(vesting亦即SP)发放给受益者的。

我们曾经不止一次探讨过在当前行情下,发文奖励比例选择很重要,比如这篇文章:《STEEM圣诞发糖果,发文千万不要选择 “Power Up 100%”》

那么这和收益分享又有什么关系呢?简而言之,收益分享这部分比例的收入相当于 “Power Up 100%”

那么如果是我们主动将帖子收益分发给别人,使用收益分享功能,就会少赚好多好多。比如说laodr一篇帖子最终作者收入100SBD,如果按每人20%设置收益分享,分发给五个股东,那么当前行情下,我们约少赚600多美元。
注:按17天前行情估算,懒得重新算了

所以,如果我们要主动分享给他人,这种行情下,还是变通一种办法吧。

对于从别人的帖子收益中获取提成,这种情况,如果我们是被剥削发帖的这一方,也无需考虑太多,赚多赚少,人家都按一定比例收,对我们的收益不构成影响。

参考链接


This page is synchronized from the post: 再谈收益分享,以及当前行情下的思考 / Comment Reward Beneficiaries

来听歌吧,使用Raspberry Pi 搭建自己的WIFI HIFI音响系统

晚上用IPad连接我自己的DIY的无线音箱,喝着咖啡听着歌,觉得很是惬意。但是突然回想起我当时是如何搭建的这个WIFI无线音箱呢?竟然发现忘得一干二净。其实相比一个WIFI音箱,我更享受折腾的乐趣,如果哪天只会使用WIFI音箱听歌,而不会折腾了,我会觉得很无聊的。

找了一下,当初折腾这个音箱是10多个月以前,当时 dan 宣布离开STEEMIT,而且STEEM币价低迷,一个帖子多说只能得一两块钱,整个社区都很萧条。于是我闲着没事折腾了这个WIFI音箱,听听歌,放松一下。

现在STEEM和STEEMIT网站都很热,与十个月前的低迷形成了鲜明的对比,但是是不是也应该听听歌,放松一下呢?十个月前的帖子,没有记录自己怎么弄的,现在重新折腾一下吧。

音箱图和RaspberryPi 就不重新拍啦,懒。

下载和烧写Raspberry Pi 系统

我这个设备是Raspberry Pi B+,大概4年以前的设备啦,比较老。不过无论新老设备使用都差不多啦。

首先,来这里下载系统:
https://www.raspberrypi.org/downloads/raspbian/

如何烧写系统参考这里:
https://www.raspberrypi.org/documentation/installation/installing-images/README.md

配置网络

如果你使用网线,那么无需做啥配置,直接用DHCP就可以啦。到路由器的设备管理中,找到对应设备,看一下IP,就可以用 Putty登陆啦。默认的用户名密码为:pi/raspberry

如果要配置无线网,相对麻烦点。我比较懒,直接改配置文件:

sudo vi /etc/network/interfaces

1
2
3
4
5
6
7
8
allow-hotplug wlan0
iface wlan0 inet static
wpa-ssid MYWIFI
wpa-psk 12345678
address 192.168.1.52
netmask 255.255.255.0
gateway 192.168.1.1
network 192.168.1.0

其中wpa-ssid对应你WIFI的网络ID,wpa-psk对应你WIFI的密码

哦,对了,Raspberry Pi新出的型号都自带无线网卡,老型号则需要自己安装无线网络,可以搜索一下适用于Raspberry Pi的免驱网卡,我用的EDUP什么黄金版的免驱网卡,之前自己弄个TPLINK的,驱动起来费了九牛二虎之力,现在也早就忘记当时咋驱起来的。

升级系统

在进行操作之前,先升级一下系统软件。
sudo apt-get update
sudo apt-get upgrade

安装和配置shairport

安装必要的软件包

首先,需要安装一些必要的软件包,否则下边的步骤可能出错
sudo apt-get install git libao-dev libssl-dev libcrypt-openssl-rsa-perl libio-socket-inet6-perl libwww-perl avahi-utils libmodule-build-perl

安装Perl Net-SDP

1
2
3
4
5
6
7
git clone https://github.com/njh/perl-net-sdp.git
cd perl-net-sdp
perl Build.PL
sudo ./Build
sudo ./Build test
sudo ./Build install
cd ..

安装shairport

1
2
3
git clone https://github.com/hendrikw82/shairport.git
cd shairport
make

运行如下指令:
./shairport.pl -a AirPlay

我们就可以从IPad或者IPhone等苹果设备连接我们的无线音箱啦。

测试没问题的话,使用如下指令完成安装:

1
2
3
4
5
sudo make install
sudo cp shairport.init.sample /etc/init.d/shairport
cd /etc/init.d
sudo chmod a+x shairport
sudo update-rc.d shairport defaults

来听歌吧

现在就可以享受我们的WIFI无线HIFI系统啦,不要纠结到底HIFI不HIFI,自己HIGH就好,哈哈。哦,对了, 别忘记把树莓派和音箱连接起来,否则你懂的。

WeChat Image_20180106195346.png

WeChat Image_20180106195332.png

看到弹出来的菜单吗,多出来的设备就是我们的树莓派AirPlay系统啦。如果不喜欢这个名字,可以自己改一下啦

sudo vi /etc/init.d/shairport

DAEMON_ARGS="-w $PIDFILE"
改成:
DAEMON_ARGS="-w $PIDFILE -a MyAirPlay"

这回安静地听歌吧。

参考链接


This page is synchronized from the post: 来听歌吧,使用Raspberry Pi 搭建自己的WIFI HIFI音响系统

微信公众号支持比特股内盘OPEN.BTC、OPEN.ETH、GDEX.BTC、GDEX.ETH查询啦

这两天BTC和ETH价格暴涨,BTC兑人民币价格回升至13W左右,目测还会继续回升,ETH价格也涨到了7K+,涨势挡不住。作为只会在比特股内盘玩的小小菜鸟当然希望能随时知道BTC和ETH的价格啦,万一咱也操作一笔,就因此发家了呢?😀


(图源 :pixabay)

最近对OpenLedger非常失望,充值总卡币,这不昨天冲了点ETH到OPEN.ETH,已经一天多了,还没到账,区块链上查询都已经进入到OpenLedger提供的ETH地址了😵。提了个Ticket给他们,好半天没有答复,又催了一次,给了个格式化的回复,哎😡

看了一下内盘,还好现在除了OPEN.BTCOPEN.ETHGDEX.BTCGDEX.ETH交易量也很靠前。那么就把OPEN.BTC、OPEN.ETH、GDEX.BTC、GDEX.ETH都加上吧,至于用哪个,再说吧,即便不用,也有个参考价值不是吗?

如何查询

为了方便大家,直接输入资产名称就可以查询啦。

OPEN.BTC

OPEN.ETH

GDEX.BTC

GDEX.ETH

指令不区分大小写
同时给出对应资产的CNY、USD、BTS报价以及交易量等信息

有了这些消息,我们就可以随时了解行情了,想不发家都难啊。

其它信息

除了OPEN.BTC、OPEN.ETH、GDEX.BTC、GDEX.ETH查询,公众号还有很多好玩的功能。

可以输入帮助来显示帮助信息


另外,公众号还集成了一个机器人助手萌蛋,没事的话,可以去调戏他啊。
萌蛋又回来了,欢迎来调戏 / Turing chat robot

公众号添加方法

  • 方式一:
    进入微信通讯录->点击公众号->点右上角加号->搜索steemit,关注即可。

  • 方式二:
    直接扫描以下二维码:

欢迎大家多提宝贵意见啊。


This page is synchronized from the post: 微信公众号支持比特股内盘OPEN.BTC、OPEN.ETH、GDEX.BTC、GDEX.ETH查询啦

继续探索python-bitshares的Memo类 / Pub(Alice) * Priv(Bob) = Pub(Bob) * Priv(Alice)

在昨天的帖子《python-bitshares 边学边记 (九) / Memo类》中,我学习了Memo类。


(图源 :pixabay)

Memo 类

Memo类提供了bitshares区块链Memo信息加密和解密的方法。其中,

  • encrypt方法用于加密Memo
  • decrypt方法用于解密Memo
  • 加密Memo需要发送者账户(from_account)的Memo/Active私钥
  • 解密Memo需要接收者账户(to_account)的Memo/Active私钥

发送者查看已发送的Memo的问题

一般情况,我们作为发送者,加密Memo,发送给接收者;或者我们作为接收者,解密Memo,查看明文信息,这些都没问题。

在上文中的例子中,我们从账户test2018发送Memo至oflyhigh-bts

然后从区块链浏览器中获取加密的Memo数据

然后使用如下代码解密Memo

1
2
3
4
5
6
7
8
9
10
from bitshares.memo import Memo
m = Memo("1.2.534782", "1.2.170436")
enc = {
"from": "BTS6Eq6kGgYRuujDpFtYduCAjdgMfvkHZ3f8SbHVmsjSC9HgCnxFt",
"message": "33b980c72e22f942454a8ae6b6740a54",
"nonce": "387853483215441",
"to": "BTS8HbXtZPbLACch1pvfrZEPH2xbt74VMPMD4ZSZwYeT96jwkpHFo"}

plaintext_msg = m.decrypt(enc)
print(plaintext_msg)


在这个例子中,我们假定自己是接收者(oflyhigh-bts),并且我们拥有oflyhigh-bts的私钥,所以上述例子没什么问题。

但是考虑这样一种情况,如果作为发送者,我们想查看自己已发送的Memo,并且我们没有接收者的Memo/Active私钥,这时会报如下错误:

raise MissingKeyError(“Memo key for %s missing!” % self.to_account[“name”])
bitshares.exceptions.MissingKeyError: Memo key for oflyhigh-bts missing!

也就是说使用python-bitshares库的Memo类,发送者无法解密已发送Memo.

如何解决

发送者无法查看自己已经发送的Memo,这听起来有点奇怪,我给别人写了一些信息,过几天想起来想看看我写的是啥,发现我看不了。如果实在想看,只能去问接收者了:“喂喂,我前两天给你发的消息说啥来着?” 这会不会有些尴尬?

还好,网页钱包中,我们可以通过解锁钱包来查看我们发送的Memo

避免了我们上述尴尬情景。

但是,作为程序员,遇到这种问题岂能善罢甘休。

我们来了解一下Memo实现的核心机制,除了加密解密等乱七八糟的东西以外,核心的内容就是: shared secret,具有如下特性:

`Pub(Alice) Priv(Bob) = Pub(Bob) Priv(Alice)`

也就是说,无论是用Pub(Alice)以及 Priv(Bob)或者是Pub(Bob)以及 Priv(Alice)都是可以生成的。换句话讲,无论是加密memo还是解密memo,并不存在谁是发送者谁是接收者的问题!

知道了这个原理,那么问题就好办了。

原本的解密代码如下:

基于上述代码,我们可以轻易实现一个简单解密代码,用于解密已发送Memo

假设我给abit发了一条消息,那么调用上述我实现的代码来解密Memo的示例如下:

请注意,我并没有abit的私钥,但是成功地解密了消息。

总结

  • python-bitshares的Memo类 不支持解密已发送Memo
  • Memo的实现机制核心为:shared secret
  • shared secret符合`Pub(Alice) Priv(Bob) = Pub(Bob) Priv(Alice)`
  • 根据上述原理和原本解密代码,实现了解密已发送信息的代码

参考链接


This page is synchronized from the post: 继续探索python-bitshares的Memo类 / Pub(Alice) Priv(Bob) = Pub(Bob) Priv(Alice)

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×