以太坊地址生成过程

2024-08-29 16:08
文章标签 生成 地址 过程 以太

本文主要是介绍以太坊地址生成过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1 以太坊地址生成过程
    • 2 以太坊地址生成实例
      • 2.1 生成随机数作为私钥
      • 2.2 私钥生成公钥
        • 2.2.1 使用 bx 工具生成公钥
        • 2.2.2 使用 secp256k1-py 包生成公钥
      • 2.3 计算公钥哈希值
      • 2.4 得到地址
    • 3 以太坊地址生成 Python3 实现
    • 4 参考资料

1 以太坊地址生成过程

以太坊地址生成过程如下:

  1. 生成 256 位随机数作为私钥。
  2. 将私钥转化为 secp256k1 非压缩格式的公钥,即 512 位的公钥。
  3. 使用散列算法 Keccak256 计算公钥的哈希值,转化为十六进制字符串。
  4. 取十六进制字符串的后 40 个字母,开头加上 0x 作为地址。

2 以太坊地址生成实例

生成以太坊地址过程实例数据:

  • 私钥:1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20
  • 公钥:04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d
  • 地址:0xabcd68033A72978C1084E2d44D1Fa06DdC4A2d57

2.1 生成随机数作为私钥

生成 256 位随机数:

>>> import random
>>> r = random.randint(0, 2**256)
>>> r
14098500174935566811277058424286341448580475958153633347646702637404947635488
>>> r.to_bytes(32, byteorder='big').hex()
'1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20'

2.2 私钥生成公钥

以太坊使用的椭圆曲线算法为 secp256k1,从私钥生成对应的公钥有两种方法:比特币工具 bx 和 secp256k1-py 包。

2.2.1 使用 bx 工具生成公钥

Mac 用户可以使用 brew 安装 bx 工具:

$ brew install bx

以 1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20 作为私钥,然后使用 bx 工具将私钥转化为 secp256k1 的非压缩格式公钥:

$ bx ec-to-public 1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20 -u
04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d
2.2.2 使用 secp256k1-py 包生成公钥

使用 pip 安装:

$ pip install secp256k1

之后将私钥转化为公钥:

>>> import secp256k1
>>> private_key = '1f2b77e3a4b50120692912c94b204540ad44404386b10c615786a7efaa065d20'
>>> private_key = bytes.fromhex(private_key)
>>> privkey = secp256k1.PrivateKey(private_key)
>>> privkey.pubkey.serialize(compressed=False).hex()
'04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d'

2.3 计算公钥哈希值

要使用 keccak256 哈希算法,可以使用 PyCryptodome 工具,使用 pip 进行安装:

$ pip install pycryptodome

公钥开头去除 04,将剩余部分转化为字节串并使用 keccak256 算法进行哈希:

>>> from Crypto.Hash import keccak
>>> keccak_hash = keccak.new(digest_bits=256)
>>> public_key = '04dfa13518ff965498743f3a01439dd86bc34ff9969c7a3f0430bbf8865734252953c9884af787b2cadd45f92dff2b81e21cfdf98873e492e5fdc07e9eb67ca74d'[2:]
>>> public_key = bytes.fromhex(public_key)
>>> keccak_hash.update(public_key)
<Crypto.Hash.keccak.Keccak_Hash object at 0x102960588>
>>> keccak_hash.hexdigest()
'39c0eb3b26d4838930b1f34babcd68033a72978c1084e2d44d1fa06ddc4a2d57'

2.4 得到地址

取哈希值十六进制字符串后 40 个字母,开头加上 0x 生成最终的以太坊地址:

>>> '0x' + '39c0eb3b26d4838930b1f34babcd68033a72978c1084e2d44d1fa06ddc4a2d57'[-40:]
'0xabcd68033a72978c1084e2d44d1fa06ddc4a2d57'

3 以太坊地址生成 Python3 实现

使用 Python3 实现以太坊地址生成:

import secp256k1
from Crypto.Hash import keccakdef get_eth_addr(private_key_str=None):if private_key_str is None:private_key = secp256k1.PrivateKey()private_key_str = private_key.serialize()else:private_key_bytes = bytes.fromhex(private_key_str)private_key = secp256k1.PrivateKey(private_key_bytes)public_key_bytes = private_key.pubkey.serialize(compressed=False)public_key_str = public_key_bytes.hex()keccak_hash = keccak.new(digest_bits=256)keccak_hash.update(public_key_bytes[1:])h = keccak_hash.hexdigest()address = '0x' + h[-40:]return {"private_key": private_key_str,"public_key": public_key_str,"address": address}

4 参考资料

  • 以太坊在线地址生成工具:可以作为以太坊靓号地址生成工具,代码开源:https://github.com/bokub/vanity-eth。
  • https://pycryptodome.readthedocs.io/en/latest/src/hash/keccak.html:Keccak python 工具。
  • https://github.com/ctz/keccak:Python2 环境下使用的 Keccak,此为源代码,需要自己 clone 在本地使用。
  • https://github.com/ludbb/secp256k1-py:secp256k1 的 Python 库。

这篇关于以太坊地址生成过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118324

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

PyInstaller打包selenium-wire过程中常见问题和解决指南

《PyInstaller打包selenium-wire过程中常见问题和解决指南》常用的打包工具PyInstaller能将Python项目打包成单个可执行文件,但也会因为兼容性问题和路径管理而出现各种运... 目录前言1. 背景2. 可能遇到的问题概述3. PyInstaller 打包步骤及参数配置4. 依赖

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.