前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用 Python 实现区块链公私钥关系

用 Python 实现区块链公私钥关系

作者头像
龙哥
发布2020-04-22 11:24:49
1.6K0
发布2020-04-22 11:24:49
举报
文章被收录于专栏:Python绿色通道Python绿色通道

作者:Boblee,人工智能硕士毕业,擅长及爱好python,基于python研究人工智能、群体智能、区块链等技术,并使用python开发前后端、爬虫等。

1、私钥、公钥、地址之间的关系

私钥、公钥:椭圆曲线加密算法生成,但是无法通过公钥倒推得到私钥。公钥的作用是在和对方交易时,使用自己的私钥加密信息,然后对方使用自己的公钥解密获得原始信息,这个过程俗称签名。

地址:由于公钥太长,在交易中不方便使用,就对公钥哈希进行SHA256、RIPEMD160、Base58算法加密生成地址。

2、公私钥加密流程

私钥签名过程:签名即是使用私钥将message加密,然后将原信息和加密后的信息发送出去的过程。

公钥验签过程:收到对方发送的信息和私钥签名后的信息,使用对方的公钥机密签名后的信息,并和原信息进行比对,一致则未篡改,反之。

3、Python实现(以太坊)

生成公私钥

以太坊可以基于密码生成公私钥。

代码语言:javascript
复制
from eth_account import Account
from eth_utils.hexadecimal import encode_hex
from eth_account.messages import encode_defunct
import json
def get_key(key):
    """
    获取公钥私钥
    :return: 返回公钥、私钥
    """
    ac1 = Account.create(key)
    return encode_hex(ac1.key),ac1.address

生成的结果:

密钥是:123

私钥是:0xbd26862c106b7985319b72a08b34ffe2827affb1a7c8f17962456a6f7c5a8246

公钥是:0x1761Ae9C3F60124338aEF74C5C322fB23C1AF8b2

私钥签名

当有一笔交易时,可以使用私钥针对交易签名,所以私钥要保存好。

代码语言:javascript
复制
def message_sign(text, prv_key):
    """
    基于私钥获取签名
    :param text: 待签名的文本
    :param prv_key: 私钥
    :return: 签名
    """
    try:
        message = encode_defunct(text=text)
        result = Account.sign_message(message, prv_key)
        result = str(result)
        result = result[result.find("'signature':"):result.find(')})')]
        return result[result.find("('") + 2:].replace("'", '')
    except:
        return '私钥格式不对'

结果是:

原文是:qwe

私钥是:0xbd26862c106b7985319b72a08b34ffe2827affb1a7c8f17962456a6f7c5a8246

签名是:0x86b90940723e1667df873cfdcfc9ca52f045c29bb5ca700ad85f889a99c5bca43c3a5adc1d25f1b10b3314647424918426439178c0f17034cd8302d8305070131b

公钥验签

当矿工打包时,可以使用公钥进行验证签名。

代码语言:javascript
复制
def verifity(text, signature, address):
    """
    验证签名
    :param text: 原文本
    :param signature: 签名
    :param address: 公钥
    :return: 验证结果
    """
    try:
        message = encode_defunct(text=text)
        address_new = Account.recover_message(message, signature=signature)
        if address == address_new:
            return '验证一致'
        else:
            return '验证失败'
    except:
        return '格式错误'

原文是:qwe

公钥是:0x1761Ae9C3F60124338aEF74C5C322fB23C1AF8b2

签名是:0x86b90940723e1667df873cfdcfc9ca52f045c29bb5ca700ad85f889a99c5bca43c3a5adc1d25f1b10b3314647424918426439178c0f17034cd8302d8305070131b

结果是:验证一致

私钥推导公钥

根据1中的关系私钥是可以推出公钥。

代码语言:javascript
复制
def recover_address(prv_key):
    """
    基于私钥推出地址
    :param prv_key: 私钥
    :return: 地址
    """
    try:
        acct = Account.from_key(prv_key)
        return acct.address
    except:
        return '格式错误'

结果是:

私钥是:0xbd26862c106b7985319b72a08b34ffe2827affb1a7c8f17962456a6f7c5a8246

结果是:0x1761Ae9C3F60124338aEF74C5C322fB23C1AF8b2

4、结语

本文使用的是基于python的以太坊包eth_account,安装只需pip install eth_account,该库还有其它功能比如基于交易hash推导地址,公钥加密等。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python绿色通道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档