使用bitshares账户密码以及python-bitshares直接获取私钥以及公钥

在昨天的帖子中,我介绍了如何导出导入私钥等操作:

然而,作为一个程序猿,总觉得登陆来登陆去,点啊点啊的太麻烦,那么有没有方便快捷的方法获取私钥呢?前一阶段在学习python-bitshares,好吧,我承认我挖的坑还没有填完,以后慢慢填吧,让我先来尝试一下能否用账户密码以及python-bitshares直接获得私钥。


(图源 :pixabay)

使用PasswordKey类获取私钥

经过一番学习,发现python-bitshares中有个PasswordKey

用这个类,可以获取账户密码的对应私钥,简单的示例代码如下:

from bitsharesbase.account import PasswordKey

account = "test2018"
passwd = "P5JiDXtCaDdCTgCrkXAG2fEzVUjrBxSJbx9MsXXXXXX"
role = "active"

pwkey = PasswordKey(account, passwd, role=role)
private_key = pwkey.get_private()

print("Account:", account)
print("Passwd:",  passwd)
print("PrivateKey:",  private_key)

运行结果如下:

我们成功的获取了这个账户对应的Active Private Key.

为了校验一下我们获取的私钥是否正确,我登陆网页钱包查看了一下私钥:

对比上述私钥,可知我们获得的结果是正确的。

如何获得公钥

我们已经可以使用PasswordKey类获取私钥,但是为了校验我们获得的私钥是否正确,还特意登陆了网页钱包查看了一下私钥。这岂不是多此一举!既然还需要登陆网页钱包,那么直接获得私钥就好了,何必还用程序生成。

那么有啥办法来查看我们生成的私钥是否是账户对应的私钥呢?
很简单,对比一下公钥就可以了。

为了对比公钥,我们需要获得账户的公钥,以及用程序生成公钥。

账户的公钥可以通过区块链浏览器查看

以上为我这个账户的公钥,我们暂且以Active KEY为例。

将上述代码的下半部分更新成如下内容:

pwkey = PasswordKey(account, passwd, role=role)
private_key = pwkey.get_private()
public_key = pwkey.get_public()

print("Account:", account)
print("Passwd:",  passwd)
print("PrivateKey:",  private_key)
print("PublicKey:",  public_key)

结果,这是什么鬼?

貌似公钥的值是正确的,但是前缀是GPH而不是BTS

看了一下代码,原来PasswordKey的get_private()和get_public()都是调用了父类石墨烯库中的PasswordKey中的方法。而在父类中,默认的前缀是GPH而不是BTS

要解决这个问题,一种方式是修改python-bitshares以及python-graphenelib库中对应的函数,这个比较麻烦。

所以我采用了另外一种方法:
即由Private Key 从新生成公钥
public_key = PrivateKey(str(private_key)).pubkey
因为我们调用的是python-bitshares中的PrivateKey类,所以默认的前缀为BTS,无需我们在参数中设置


前缀完全正常,和区块链浏览器中对比完全一致。

完整的示例代码

from bitsharesbase.account import PasswordKey
from bitsharesbase.account import PrivateKey

account = "test2018"
passwd = "P5JiDXtCaDdCTgCrkXAG2fEzVUjrBxSJbx9MsXXXXXX"
role = "active"

pwkey = PasswordKey(account, passwd, role=role)
private_key = pwkey.get_private()
#public_key = pwkey.get_public()
public_key = PrivateKey(str(private_key)).pubkey

print("Account:", account)
print("Passwd:",  passwd)
print("PrivateKey:",  private_key)
print("PublicKey:",  public_key)

以上为完整的示例代码,仅供参考。

结论


(图源 :pixabay)

使用账户密码以及python-bitshares中的PasswordKey类,可以轻易获取对应账户的私钥,无需登陆网页钱包等繁琐的步骤。

可以使用生成的私钥使用PrivateKey类来生成公钥与区块链浏览器上显示的公钥信息对比验证是否正确。

以上代码仅供参考。

H2
H3
H4
3 columns
2 columns
1 column
8 Comments