生成以太坊系地址

2023-11-07

代码解析

要首先生成一个新的钱包地址,我们需要导入go-ethereum crypto包,该包提供用于生成随机私钥的GenerateKey方法。

privateKey, err := crypto.GenerateKey()
if err != nil {
  log.Fatal(err)
}

然后我们可以通过导入golangcrypto/ecdsa包并使用FromECDSA方法将其转换为字节。

privateKeyBytes := crypto.FromECDSA(privateKey)

我们现在可以使用 go-ethereum hexutil 包将它转换为十六进制字符串,该包提供了一个带有字节切片的Encode方法。 然后我们在十六进制编码之后删除“0x”。

fmt.Println(hexutil.Encode(privateKeyBytes)[2:]) // 4e6aaa173f18b6160aa6a36a4e54e4e79a5fff8a93d5efe5126c589f4464c052

这就是用于签署交易的私钥,将被视为密码,永远不应该被共享给别人,因为谁拥有它可以访问你的所有资产。

由于公钥是从私钥派生的,因此go-ethereum的加密私钥具有一个返回公钥的Public方法。

publicKey := privateKey.Public()

将其转换为十六进制的过程与我们使用转化私钥的过程类似。 我们剥离了0x和前2个字符04,它始终是EC前缀,不是必需的。

publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
if !ok {
	log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey")
}

publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA)
fmt.Println(hexutil.Encode(publicKeyBytes)[4:]) // 405701f955192319aa5c0b9d7564cd0ff184a498dc12c5bda941c91354382dbf44ff6f1678ba3ea0bf9a545895c00ab7cfb2fbcf0c5cca97569a4bf0aed996c8

现在我们拥有公钥,就可以轻松生成你经常看到的公共地址。 为了做到这一点,go-ethereum加密包有一个PubkeyToAddress方法,它接受一个ECDSA公钥,并返回公共地址。

address := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()
fmt.Println(address) // 0xe83FF792C385d6935d3b1f58c40de2BDEe3621e9

公共地址其实就是公钥的Keccak-256哈希,然后我们取最后40个字符(20个字节)并用“0x”作为前缀。 以下是使用 golang.org/x/crypto/sha3 的 Keccak256函数手动完成的方法。

hash := sha3.NewLegacyKeccak256()
hash.Write(publicKeyBytes[1:])
fmt.Println(hexutil.Encode(hash.Sum(nil)[12:])) // 0xe83ff792c385d6935d3b1f58c40de2bdee3621e9

完整代码

package main

import (
	"crypto/ecdsa"
	"fmt"
	"log"

	"github.com/ethereum/go-ethereum/common/hexutil"
	"github.com/ethereum/go-ethereum/crypto"
	"golang.org/x/crypto/sha3"
)

func main() {
	//生成私钥
	privateKey, err := crypto.GenerateKey()
	if err != nil {
		log.Fatal(err)
	}

	//打印不含0x的私钥
	privateKeyBytes := crypto.FromECDSA(privateKey)
	fmt.Println(hexutil.Encode(privateKeyBytes)[2:]) // 4e6aaa173f18b6160aa6a36a4e54e4e79a5fff8a93d5efe5126c589f4464c052

	//根据私钥打印16进制公钥
	publicKey := privateKey.Public()
	publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey)
	if !ok {
		log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey")
	}

	publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA)
	fmt.Println(hexutil.Encode(publicKeyBytes)[4:]) // 405701f955192319aa5c0b9d7564cd0ff184a498dc12c5bda941c91354382dbf44ff6f1678ba3ea0bf9a545895c00ab7cfb2fbcf0c5cca97569a4bf0aed996c8

	//根据公钥返回地址
	address := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()
	fmt.Println(address) // 0xe83FF792C385d6935d3b1f58c40de2BDEe3621e9

	//使用Keccak256函数手动完成地址解析
	hash := sha3.NewLegacyKeccak256()
	hash.Write(publicKeyBytes[1:])
	fmt.Println(hexutil.Encode(hash.Sum(nil)[12:])) // 0xe83ff792c385d6935d3b1f58c40de2bdee3621e9
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成以太坊系地址 的相关文章

随机推荐

  • 记录android遇到的SecurityException

    记录android遇到的SecurityException 一 java lang SecurityException getUniqueDeviceId The user 10283 does not meet the requireme
  • List和ArrayList

    List和ArrayList区别 List是一个接口 而ArrayList是List接口的一个实现类 ArrayList类继承并实现了List接口 因此 List接口不能创建实例对象 但是可以为List接口创建一个指向自己的对象引用 而Ar
  • 微信公众号小程序开通方法_微信小程序发布审核大概要多久

    1 如果自己有通过微信公众平台注册认证好微信公众号 那么只需要登录微信公众号账号后在页面左侧找到小程序管理 注册认证小程序账号 注意 公众号账号和小程序账号是独立的两个账号 2 如果自己没有注册认证微信公众号 就可以先到微信公众平台注册个微
  • ubuntu 18.04下virtualbox安装windows虚拟机+增强功能+secureCRT

    先强调一下 我是在Ubuntu里安装windows虚拟机 如果要看如何安装linux虚拟机的话 那么你走错地方了 我一直使用Linux系统做开发的 选择Ubuntu是因为多数常用软件对Ubuntu支持的不错 能少折腾就少折腾 程序员的时间不
  • Qt5.12.3移植rk3399pro笔记

    Qt5 12 3移植到rk3399pro笔记 环境 主机 Ubuntu16 04 目标机 rk3399pro板 x11平台 交叉编译toolchain linux aarch64 gnu 问题描述 我的目标机是debian系统 带lxde桌
  • 【大数据】HiveQL的数据操作

    HiveQL的数据操作 因为 Hive 没有行级别的数据插入 数据更新和删除操作 那么往表中装载数据的唯一途径就是使用一种 大量 的数据装载操作 或者通过其他方式仅仅将文件写入到正确的目录下 1 向管理表中装载数据 LOAD DATA LO
  • SpringFactoriesLoader ServiceLoader区别

    内容简介 IoC 并不仅限于解决模块内类与类之间的依赖耦合问题 其同样适用于模块与模块之间 OSGi 一直致力于这方面的工作 但其实 Java 和 Spring 都提供了对 IoC 的支持 Java 本身提供了一种很简便的方式来支持 IoC
  • 报告

    来源 Prophet 2019年 战略数字化转型的重要性已经不止于IT领域 而影响着全公司的竞争力 企业的相关预算直线攀升 利益相关方所关注的颠覆性技术数量急剧增加 数字化项目开始由首席高管主导 并由相互协作的跨职能团队管理 数字化是整个企
  • 爬虫项目五:最详细的京东商品、评价爬虫、词云展示

    文章目录 前言 一 京东商品信息爬虫 1 分析URL 2 实例化chrome 3 加载完整数据 4 实现翻页 5 解析数据 二 京东商品评价爬虫 1 找到接口 2 分析url 3 解析数据 4 词云 前言 本文内容包含京东商品列表爬虫的详细
  • pycharm启动报错

    1 点击pycharm 报错 2 打开cmd 输入gpedit msc 点击 确定 3 在本地组策略编辑器 选择 Windows设置 安全设置 本地策略 安全选项 用户帐户控制 用于内置管理员帐户的管理员批准模式 4 设置 用户帐户控制 用
  • cuda历史版本和cudnn的下载地址

    cuda历史版本下载地址 https developer nvidia com cuda toolkit archive cudnn下载地址 https developer nvidia com rdp cudnn archive 欢迎大家
  • pthread_mutex_init线程互斥锁的使用

    pthread mutex init 头文件 include
  • Springboot项目中@JsonProperty不生效-如何处理呢?

    转自 Springboot项目中 JsonProperty不生效 如何处理呢 下文笔者讲述SpringBoot中 JsonProperty不生效的相关简介说明 首先笔者将讲述JsonProperty注解的功能简介说明 JsonPropert
  • googlecloud谷歌云的初学体会(1)

    googlecloud谷歌云入门 1 一 纯小白自述 二 云是个什么云 三 装一个软件 资源 服务 四 服务器 爷爷提供服务的电脑 五 PGSQL的安装 六 总结 一 纯小白自述 自己是个小白 仅仅懂得几句sql查询和编程的基础语法 云是啥
  • 第八十七题 UVa12166 Equilibrium Mobile

    A mobile is a type of kinetic sculpture constructed to take advantage of the principle of equilibrium It consists of a n
  • 傻瓜攻略(七)——MATLAB神经网络的保存和调用

    作为科研领域十分重要的计算工具 MATLAB在深度学习方面也一直与时俱进 每一个版本的更新都会引进许多新的机器学习和深度学习案例 下面介绍将训练好的网络进行保存的方法 当再次调用网络时 可以在前一次训练的基础上进一步训练或者直接处理新数据
  • NIPS 2017

    Attention is all you need Author Unit Google Brain Google Research University of Toronto Authors Ashish Vaswani Noam Sha
  • 什么副业可以月赚1万元?做什么副业可以月入上万?

    在当前经济形势下 对于一个普通上班族而言 指望工资生活 日子肯定是过得紧巴巴的 许多人想谋求一份副业收入很正常 那么 在当前社会上 有哪些副业项目 能一个月收入一万多呢 我这里给大家推荐几个 仅供用于调研参考 1 自媒体 也许很多人会说这个
  • 决策树详解(一)

    1 决策树的概念 决策树算法以树状结构表示数据分类的结果 每个决策点实现一个具有离散输出的测试函数 记为分支 决策树的元素有 根节点 非叶子节点 分支 叶节点四种元素 其代表的含义如下图所示 决策树的工作分为两个阶段 1 训练阶段 给定训练
  • 生成以太坊系地址

    代码解析 要首先生成一个新的钱包地址 我们需要导入go ethereum crypto包 该包提供用于生成随机私钥的GenerateKey方法 privateKey err crypto GenerateKey if err nil log