How to set up a user-friendly password for the posting private key? / 如何为posting private key 设置个友好的密码?

Everybody knows that the master password and owner key are very important for our steem account, the same goes for the active private key.

So it should be more security if we only use posting private key to login, post, comment and vote on steemit.com and other third party sites.

But It is impossible to remember a such long posting private key and it’s very annoying thing to copy&paste posting private key every time when we login steemit.com or other sites, for example, busy.org.


So is there a way to use posting private key just like the password? Or in other words, how to set up a user-friendly password for posting private key?

I try to figure out it then I found out a way to do so.

Steps

  • First, you must have steem-python installed on your machine or other computer you can access.
    Check github to find out how to install and more details information about it

  • Check your active private key at steemit.com.
    Wallet->Permissions->ACTIVE->SHOW PRIVATE KEY

  • Import the active private key to the local wallet of steem-python use following command.
    steempy addkey

    Pasted your active private key according to the prompt.

  • Write a simple script to generate posting private key & posting public key from password

    (Replace the account, passwd with your account and the password you want to use.)

  • Run the script

    (Now we got the posting private key & posting public key)

  • Now we will use steempy the command line tool for steem to finalize our operation.
    steempy allow --account oflyhigh.test STM8WgLmubC1KgbDiUgBuXeLuEzJYnkz8q8vnEmGapqCH4KWWuf6h

  • The result

  • Let’s we check the account oflyhigh.test on steemd.com.

    And here:

    Everything is correct.

Check Login

Now, It’s time to check on what we’ve done!

  • Logout from steemit, and open the login page
  • Input the account name oflyhigh.test and the password mypasswd
  • Click the LOGIN button, Now we login successfully and the welcome page shows.
  • Check our profile, all things right.
  • You can also login with the new posting private key we generated in above step, but it is not necessary.

Conclusions

It’s very tedious to log in steemit.com with the posting private key.

In this article, I had introduced you a method to set up a user-friendly password for posting private key. Now, we can use this password to log in steemit and other third party sites, It just works as same as the posting private key.

CAUTION!!


Use this script unless you really know what you’re doing! Improper operation may cause your account to be locked


中文

大家都知道主密码、所有者KEY、active私钥是非常重要的。

所以出于安全起见,建议大家用Posting私钥登陆网站、发帖、回复、投票等。

但是Post私钥很长根本记不住,每次复制粘贴还挺麻烦,有没有办法像使用密码一样使用呢?本文介绍了如何为posting私钥设置一个密码。详细步骤参见英文部分。

注意:除非你明确知道你在做什么,否则请慎重操作。


This page is synchronized from the post: How to set up a user-friendly password for the posting private key? / 如何为posting private key 设置个友好的密码?

微信公众号增加BTS价格(USD)以及USD/BTS喂价(Feed price)查询功能啦

BTS涨势喜人啊,同志们都上车没?(这句话怎么听起来这个耳熟呢?)

话说,之前在公众号里添加了BTS价格(CNY)查询功能,怕爆仓又增加了CNY/BTS喂价(Feed price)查询

详情可以参考:

money-2724241_960_720.jpg

之后有一些朋友就抱怨了,你以为大家都用CNY吗?,这世界上还有一种货币叫USD!

好吧,是我疏忽了,我以为至少用我公众号的,应该用CNY的居多呢。不过既然朋友们有这个需求,那么上刀山下火海在所不辞加上就是了。

如何查询

引用一句广告语:还是熟悉的配方,还是熟悉的味道

为了方便,将BTS的CNY价格、 USD价格、CNY喂价、USD喂价统统集成到一条指令中去。

公众号输入?bts指令,就可上述所有信息啦。
(注:价格信息来自于比特股内盘)

示例如下:

是不是超级简单实用呀?

价格又涨了,好开心。😀

BTS上车的小伙伴们快来试试吧,无聊的时候还可以调戏机器人,让他逗你开心哦。

相关文章

公众号添加方法

公众号在不断完善中,会提供越来越多的功能和便利

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

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

(封面图源 :pixabay)


This page is synchronized from the post: 微信公众号增加BTS价格(USD)以及USD/BTS喂价(Feed price)查询功能啦

体验Linode VPS Down机

今早凌晨临睡前,躺在床上习惯性的刷刷我的几个程序的状态报告,额,有俩程序怎么两个多小时没有新动态了?这不科学啊。好吧,估摸是网络故障啥的,一般网络故障,恢复后我的程序会自动重新连接,大可不必担心。又等了大约半个小时,发现状态还没有更新,我意识到事情可能有些不对劲了。

home-2910647_960_720.jpg

放在家里小设备上的程序一切正常,放在SOFTLAYER独立服务器上的程序一切,唯独放在VPS上的程序不正常,那么就登陆VPS的面板看看吧。我的几个VPS都放在Linode,登陆面板一下子就看到大大的黄色提示信息,说有重要的内容未查看。

点进去一看,果然有个紧急维护通知:
Emergency Maintenance

Hello,
We have detected an issue affecting the physical host your Linode resides on.
We’re working to resolve this as quickly as possible and will update this ticket as soon as we have more information for you.
Your patience and understanding is greatly appreciated.
Regards,
XXXX.

然后随后是一条更新:

Hello,
We have resolved the issue affecting the physical host at this time.
There is no need to issue boot jobs for your Linode. If your Linode was previously running, a boot job has been queued and your Linode will boot shortly. You can monitor the progress of your Linode’s boot from the Dashboard tab within the Linode Manager.
Please let us know if you have any additional questions or concerns.
Thank you for your patience and understanding.
Regards,
XXXX.

大概意思就是我VPS所在的服务器出故障啦,他们解决掉故障并帮我重启VPS啦。
可问题是我的程序没设置开机自动运行,所以虽然VPS重启起来了,但是我的程序并没有启动。

一边哀叹自己劳碌命,一边从床上爬起来,使用putty登陆vps,把程序启动起来,看了一眼,一切正常,迷糊糊的继续去睡。

睡了大概不到两个小时,乱七八糟的梦做了一大堆,总觉得有心事一般,醒了过来,又刷了一下状态报告,我晕,怎么还没有新动态,我明明已经把程序启动起来了啊。该不会又出问了吧?

登陆Linode的面板,果然又是大大的黄色提示信息

Hello,
We have detected an additional issue that is affecting the physical host your Linode resides on.
We’re working to resolve this as quickly as possible and will update this ticket as soon as we have more information for you.
We’re very sorry for the inconvenience. Your patience and understanding is greatly appreciated.
Kind Regards,
XXXXX
Linode Support

然后随后是一条更新:

Hello,
We have resolved the issue affecting the physical host at this time.
There is no need to issue boot jobs for your Linode. If your Linode was previously running, a boot job has been queued and your Linode will boot shortly. You can monitor the progress of your Linode’s boot from the Dashboard tab within the Linode Manager.
Please let us know if you have any additional questions or concerns.
Thank you for your patience and understanding.
Kind Regards,
XXXX
Linode Support

an issue, an additional issue, 话说你们确定不是再玩我?
又双叒叕出故障,又重启,能不能让我睡个安稳觉了?

好吧,起床,开机,登陆,重启程序,顺便把程序加到自动启动里。不管了,睡觉去,有能耐你再出故障?!

一觉醒来,一切正常,Linode也没再出故障,可惜一晚上,我只睡了两三个小时,害人不浅啊。不过倒是提醒了我,不能指望服务器/VPS永不DOWN机,要考虑到这种情况才对。

(封面图源 :pixabay)


This page is synchronized from the post: 体验Linode VPS Down机

微信公众号增加CNY/BTS喂价(Feed price)查询功能啦! / 防止爆仓啊😱

之前发过一篇帖子:

眼看BTS价格就要起飞,但是RMB如何入金还没太搞明白,用STEEM啥的转,还舍不得STEEM,毕竟感觉STEEM也在低点啊。

于是我一狠心,抵押BTS,借了点人民币,买BTS

之前有说过,抵押借款存在爆仓的风险,主要和两个因素有关:


分别是喂价(Feed price)(你的强平触发价)Your Call Price

其中(你的强平触发价)Your Call Price和你保证金比例有关。

我尝试找出其中的关系:

  • 保证金比例 = 抵押的BTS * 喂价 / 借款金额
  • 当保证金比例低于1.75,就可能触发强平
  • 由此推断,强平触发价 = 借款金额 * 1.75 / 抵押的BTS

亦即我们得到两个公式:

  • 公式一: `保证金比例 = 抵押的BTS 喂价 / 借款金额`*
  • 公式二: `强平触发价 = 借款金额 1.75 / 抵押的BTS`*

通过公式二可得,强平触发价是我们借款的时候就确定的了,除非我们调整借款金额和抵押的BTS数量,否则这个价格是不变的。

那么为了避免爆仓,我们只需关心喂价即可。

那么问题来了,除了登陆网页钱包,我们怎么获得喂价呢? 我好害怕爆仓。😱


经过一番刻苦专研以及得到专业人士的指点,我终于搞明白从bitshares系统读取喂价的方法啦。我将喂价集成到公众号查询当中,以后我随时可以查看喂价啦,一旦发现喂价临近爆仓价,我就得想办法处理啦(话说有啥办法?我的BTS都被抵押呢)

如何使用

为了简单易用,我将喂价直接集成到bts价格查询功能中:

公众号输入?bts指令,就可以返回BTS对CNY的价格以及喂价了。
(注:价格信息来自于比特股内盘)

示例如下:

红色方框部分就是喂价,是不是超级简单??

价格又涨了,好开心。😀

BTS上车的小伙伴们快来试试吧,无聊的时候还可以调戏机器人,让他逗你开心哦。

相关文章

公众号添加方法

公众号在不断完善中,会提供越来越多的功能和便利

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

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


This page is synchronized from the post: 微信公众号增加CNY/BTS喂价(Feed price)查询功能啦! / 防止爆仓啊😱

温故而知新 /比特币(Bitcoin)有关的 Base58 & Base58Check、私钥(Private KEY)、公钥(Public KEY)、地址(Address)

这两天在学习STEEM的交易签名,由于智商感人,所以进展缓慢。里边涉及有一些公钥私钥方面的内容,然后惊觉我之前对这部分内容的了解,已经忘干净了!从头再学,有些压力,还好之前学习的内容都记录在STEEMIT上,把之前的相关帖子都翻看一下,顺便摘录一些重点贴在这篇文章中,算是做笔记吧。

STEEM中照搬了借鉴了比特币(Bitcoin)的那一套东西,所以之前写的比特币(Bitcoin)一系列文章对自己还是很有参考价值的。

本文主要涉及以下方面内容:

  • Base58 & Base58Check
  • 私钥(Private KEY)
  • 公钥(Public KEY)
  • 地址(Address)

    Base58 & Base58Check

因为涉及私钥、公钥的时候经常要用到Base58 & Base58Check编解码,所以首先简要介绍一下这两个东西。

Base58

Base58简单地说,就是把数字表示成不容易输入错误的文本编码,因为这组不容易出错的文本编码一共包含58个字符,所以叫Base58

编解码规则也很简单,编码就是把文本表示数字串,转换成一个大整数,然后再按58进制表示。

58进制和16进制类似,16进制数字0-15和0x0 - 0xF是一一对应的,而这个0-57,需要查表对应,仅此而已!解码就是逆过程!

码表为:
BASE58_ALPHABET = b"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"

Base58Check

Base58Check在就是Base58基础上加上了版本信息以及校验,这样如果不小心输错一两个字符,就会检查出来。

Base58Check流程可以用下图表示:

Image source Here

整理成文字说明如下:

  • 把版本/程序信息字节和负载(payload)按字节连接到一起
  • 对结果一执行两次SHA256操作并取前四个字节
  • 按字节把结果一和结果二的四个字节连接起来
  • 把结果三当成一个大数字,对结果三执行Bash58编码
    (原链接第四步,分为4、5、6三个步骤,包括如何处理前导字节零)

    私钥(Private KEY)

私钥是什么

私钥就是一个256位,取值处于1到n - 1之间的随机数
其中: n = 1.158 1077*

私钥表示方式

私钥有几种表示方式

其中WIF亦即: Wallet Import Format (WIF)

  • 64位16进制串就是把私钥直接转换
  • Base58编码就是对64位16进制串直接编码 (https://blockchain.info中有用到)
  • WIF就是在64位16进制串对应的字节串前加上前缀0x80, 并用Base58Check编码
  • WIF-compressed就是在64位16进制串对应的字节串前加上前缀0x80,并加上后缀0x01, 并用Base58Check编码

私钥的生成

私钥可以用hashlib.sha256来生成(仅供参考,请勿使用)

1
2
3
4
5
>>> import hashlib
>>> from binascii import hexlify, unhexlify
>>> s = hashlib.sha256(bytes('Hello World', 'utf-8')).digest()
>>> print(hexlify(s).decode('ascii'))
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e


公钥(Public KEY)

涉及到椭圆曲线等数学知识我就方了,直接上干货吧。

如何生成公钥

  • 公钥(K)可以通过椭圆曲线运算由私钥(k)计算得出
  • 私钥(k)公钥(K)计算公式:K=k∗G
  • 生成过程使用secp256k1标准中定义的椭圆曲线以及一组数学常量
  • 私钥(k)公钥(K)结果是确定的,并且只能单向运算
  • 使用Python的ecdsa库,可以轻松实现私钥(k)公钥(K)的计算

关于K=k∗G

其中小k是我们的私钥G生成点K是结果亦即公钥曲线上的另外一个点

因为生成点对所有的比特币用户都是相同的,所以同一个私钥k乘以生成点G,总会得到相同的公钥K。所以从k到K是确定的,并且只能单向运算。这就是为何比特币地址(由公钥生成)可以告诉任何人不用担心泄露私钥。

公钥压缩

公钥(K)是通过私钥(k)乘以生成点(G)得到的,并且是椭圆曲线上的一个点P(x, y)

点P(x, y)表示成公钥其实就是加上前缀04并把x和y连接起来

一共是520bits (8 + 256 + 256),使用16进制字符串表示,要130个字节,浪费网络资源。

公钥压缩原理:
根据椭圆曲线的方程,我们是可以通过x求得y的,所以我们只要保留x部分就可以了

公钥压缩流程:

公钥压缩的示意图( Source: 《Mastering Bitcoin》)

示例代码:私钥生成公钥

1
2
3
4
5
6
7
8
9
10
11
12
13
import ecdsa
from binascii import hexlify, unhexlify
secret = unhexlify('a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e')
order = ecdsa.SigningKey.from_string(secret, curve=ecdsa.SECP256k1).curve.generator.order()
p = ecdsa.SigningKey.from_string(secret, curve=ecdsa.SECP256k1).verifying_key.pubkey.point
x_str = ecdsa.util.number_to_string(p.x(), order)
y_str = ecdsa.util.number_to_string(p.y(), order)
compressed = hexlify(bytes(chr(2 + (p.y() & 1)), 'ascii') + x_str).decode('ascii')
uncompressed = hexlify(bytes(chr(4), 'ascii') + x_str + y_str).decode('ascii')
p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
x = int(hexlify(x_str).decode('ascii'), 16)
y = int(hexlify(y_str).decode('ascii'), 16)
(x ** 3 + 7 - y**2) % p


地址(Address)

比特币地址由公钥按固定流程生成。

生成流程如下:

根据地址生成流程可知:

  • 压缩公钥生成对应压缩公钥的地址
  • 未压缩公钥生成对应未压缩公钥的地址

地址和私钥本身是不压缩的,只是代表对应的公钥是压缩的而已

示例代码:公钥生成地址

1
2
3
4
5
6
7
8
9
10
def ripemd160(s):
ripemd160 = hashlib.new('ripemd160')
ripemd160.update(unhexlify(s))
return ripemd160.digest()

def get_address(public_key):
pkbin = unhexlify(public_key)
addressbin = ripemd160(hexlify(hashlib.sha256(pkbin).digest()))
address = base58CheckEncode(0x00, hexlify(addressbin).decode('ascii'))
return address

参考资料(以前文章)

免责声明,本文为个人理解,示例仅供参考
因使用文中代码或地址造成的损失,概不负责!


This page is synchronized from the post: 温故而知新 /比特币(Bitcoin)有关的 Base58 & Base58Check、私钥(Private KEY)、公钥(Public KEY)、地址(Address)

列表复制导致的BUG,以及random.choices()的问题

近日查看程序生成的日志,发现有两个程序均出现一些重复的操作,尽管我程序中有判断,重复操作会被忽略,不会造成什么不良影响,但是有BUG总归是不好的,于是今天早晨抽出时间探究一下,看看到底是哪里出了问题。

列表复制导致的BUG

程序A很简单,把核心逻辑抽取出来大致是这样:

1
2
3
4
5
6
users = ['a', 'b', 'c', 'd']
for i in range(0, 10):
users_copy = users
users_copy.insert(0, 'z')
for user in users_copy:
print(user, " do something!")

很简单的几行代码,书写规范逻辑清晰(要脸要脸),为啥会出错呢?

Do something 啥的应该没啥错,继续简化一下代码:

1
2
3
4
5
users = ['a', 'b', 'c', 'd']
for i in range(0, 10):
users_copy = users
users_copy.insert(0, 'z')
print(users_copy)

运行一下瞧瞧:

OMG,这是什么鬼,为何插了好多’z’,之所以用user_copy,我就是想每次只更改copy的值啊。既然发现了结果的错误,就很轻易可以知道问题在哪里了。据说在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用

所以我上述代码中:
users_copy = users
除了帮我给users起了个外号以外,并没有帮我生成一份全新的copy,亏我那么信任它,给它起了个高大山的名字。

知道了这个问题后,再改起来就简单了。

1
2
3
4
5
users = ['a', 'b', 'c', 'd']
for i in range(0, 10):
users_copy = users[:]
users_copy.insert(0, 'z')
print(users_copy)

将代码改成上述样子,再执行一下:

这才是我想要的结果。

除了切片操作users_copy = users[:]还可以用list()函数users_copy = list(users),看起来更优雅一些?

上述修改只适合简单列表,嵌套列表等请使用copy.deepcopy(),反正对我的程序而言,这样的修改就足够了,就不再赘述了。

random.choices()的问题

搞定了程序A,我以为程序B肯定也是相同问题喽,毕竟二者的症状是一样一样的。

然而,我找了半天,我并没有进行插入之类的改变列表的操作,程序中打印了一下过程中的列表,一直没有变化,那重复是怎么产生的呢?

哎,还是老办法,简化一下逻辑,测试一下吧。

1
2
3
4
5
6
import random
users = ['a', 'b', 'c', 'd']
for i in range(0, 10):
users_selected = random.choices(users, k=2)
for user in users_selected:
print(user, " do something!")

就是从一组用户中随即选择两个让他们干活!这么简单的逻辑,怎么看都没啥问题啊?

好吧,继续简化:

1
2
3
4
5
import random
users = ['a', 'b', 'c', 'd']
for i in range(0, 10):
users_selected = random.choices(users, k=2)
print(users_selected)

运行一下:

大哥,你不是在玩我吧,我让你找俩人干活,不是让你找一个人干两份活! 我吐了一口老血。

该不会是 random.choices的BUG吧,毕竟这货是Python 3.6当中新引进进来的。之前我还特意发一篇文章比较几种方式呢:
《Python 随机选取元素的一些方法以及概率问题》

想到自己发现了一个了不得的BUG,为全人类做出了贡献,那是相当兴奋啊。不过提BUG之前,先好好看看文档吧。

random.choices(population, weights=None, *, cum_weights=None, k=1)
Return a k sized list of elements chosen from the population with replacement.

等等,人家文档里只说了从列表中选择k个元素,没说不能选重复元素啊?(抗议,这是陷阱!)

random.sample(population, k)
Return a k length list of unique elements chosen from the population sequence or set.

倒是人家sample函数好好的,才是我需要的东西,当初手贱把random.sample改成了random.choices

结论

尽管两个程序表现出相同的病症,但是一个是由于我想当然的认为Python中列表赋值会生成一个副本所导致,另外一个是我想当然的认为random.choices的选择结果不会重复所导致。

想当然害死人啊。

还好我只是写点滥程序自己玩,这要是写火箭发射或者卫星轨道控制啥的,画面太美我不敢想象。不过或许这也是人家不用我写火箭发射程序的原因吧😭。


This page is synchronized from the post: 列表复制导致的BUG,以及random.choices()的问题

Your browser is out-of-date!

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

×