以太坊地址生成过程

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

相关文章

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

linux部署NFS和autofs自动挂载实现过程

《linux部署NFS和autofs自动挂载实现过程》文章介绍了NFS(网络文件系统)和Autofs的原理与配置,NFS通过RPC实现跨系统文件共享,需配置/etc/exports和nfs.conf,... 目录(一)NFS1. 什么是NFS2.NFS守护进程3.RPC服务4. 原理5. 部署5.1安装NF

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

Vue3 如何通过json配置生成查询表单

《Vue3如何通过json配置生成查询表单》本文给大家介绍Vue3如何通过json配置生成查询表单,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录功能实现背景项目代码案例功能实现背景通过vue3实现后台管理项目一定含有表格功能,通常离不开表单

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了