我们都知道,HIVE上我们追随或者拉黑一个人,对应的操作是follow
以及mute
,相应的取消操作分别为mute
与unmute
,实际上在链上,这些都是通过同一个操作实现的,那就是custom_json
。
(图源 :pixabay)
说到custom_json
,那简直是一个百宝箱,可以配合链上/链下的应用实现好多功能,举例来说以前SE的好多功能都是用custom_json
来实现的,还有现在的社区功能,也是基于custom_json
的。
结构
custom_json
的模板大致如下:
op_custom_json = ['custom_json', {
'required_auths': [],
'required_posting_auths': [],
'id': '',
'json': ''
}]
其中required_auths
中需要填写需要ACTIVE授权的用户组,required_posting_auths
填写需要POSTING权限的用户组,两者均可以留空,但是不能同时为空,相应的检查代码如下:
FC_ASSERT( (required_auths.size() + required_posting_auths.size()) > 0, "at least one account must be specified" );
id
这个名字起的比较怪,我看到id
就会以为它是一个数字,其实不然,id
是一个字符串。在代码注释中,说id
长度必须小于32个字符:
custom_id_type id; ///< must be less than 32 characters long
但是实际上,检查代码如下:
FC_ASSERT( id.size() <= STEEM_CUSTOM_OP_ID_MAX_LENGTH, "Operation ID length exceeded. Max: ${max} Current: ${n}", ("max", STEEM_CUSTOM_OP_ID_MAX_LENGTH)("n", id.size()) );
而STEEM_CUSTOM_OP_ID_MAX_LENGTH
定义为32
,所以 id
的最大长度实际上是32
啦。
至于json
就不用多说了,就是转化成UTF8编码字符串的JSON啦。
实现
知道了custom_json
的定义,实现起来就比较简单了,下面是大致的实现逻辑:
给对应项赋值:
op[1]['id'] = id
op[1]['json'] = json.dumps(json_data)
op[1]['required_auths'] = required_auths
op[1]['required_posting_auths'] = required_posting_auths
追加进transaction,对其签名并广播:
trx.append_op(op)
trx.sign_digest(wif)
ret = trx.broadcast()
follow\unfollow\mute\unmute
有了custom_json
,我们就可以实现follow\unfollow\mute\unmute
功能了。
以@oflyhigh.test账户为例,几个操作对应JSON如下:
json_follow = ["follow",{"follower":"oflyhigh.test","following":"oflyhigh","what":["blog"]}]
json_unfollow = ["follow",{"follower":"oflyhigh.test","following":"oflyhigh","what":[]}]
json_mute = ["follow",{"follower":"oflyhigh.test","following":"oflyhigh","what":["ignore"]}]
json_unmute = ["follow",{"follower":"oflyhigh.test","following":"oflyhigh","what":[]}]
我们不难看出unfollow
和unmute
其实是一样的,都是把what
中的内容清空。
将上述json内容放入我们实现的custom_json函数中,就会实现对应的功能,比如:
client.custom_json("follow", json_data=json_follow, required_posting_auths=["oflyhigh.test"], wif=wif)
我分别调用了一下几个操作,有趣的是,因为json_unfollow
和json_unmute
本质上操作相同,tapos以及超时时间又完全一样,会被认为是重复操作:
Reveal spoiler
所以加一个超时,让unfollow
和unmute
的超时时间不同,就好了。
顺利执行后,在https://hiveblocks.com/上我们会看到类似如下的结果:
Reveal spoiler
结束语
本文就扯到这里啦,至于如何用custom_json
实现其它功能,其实都是大同小异,留给大家自己探索了。
另外,文中代码仅为参考,大家可以用hive-python或者beem等去玩转custom_json
,我的库还不成熟,先不放出来献丑了。