Web3钱包中助记词和生成私钥、公钥、地址的基本原理
于是乎,我决定自己写一个系列文章。记录我的学习研究成果。
我认为,用代码一步步生成一个私钥、公钥、地址,是更好的学习方式,接下来就使用 Go 语言来做到这一点。
写代码之前,先补充一些必备知识。
1. 椭圆曲线是什么?
以太坊和比特币使用完全相同的椭圆曲线:secp256k1,公钥就是这个椭圆曲线上的(x, y)坐标,x,y 数值通过私钥唯一确定。
x、y 各 32 字节,故公钥为 64 字节。你可能会看到 65 字节表示的公钥,这是由 SECG 发布的行业标准的一种序列化编码方式,在最前面加一个字节的前缀,04 表示公钥为非压缩格式,即完整存储了 x 和 y 的坐标各 32 字节。
为什么要分为 压缩公钥 和 非压缩公钥 呢?
因为在secp256k1的椭圆曲线方程里,只要知道其中一个坐标值,另一个坐标值可以通过解方程得出,因此可以只存储其中一个坐标,这样就可以节约 32 个字节,从而引入了压缩格式的公钥,前缀为 02 或 03。
故非压缩格式的公钥 65 字节(前缀 04 + 64 字节的实际公钥),压缩格式的公钥 33 字节(前缀 02 或 03 + 32 字节的一个坐标值)。
推荐阅读:吴军《数学之美》第 31 章 椭圆曲线加密原理
2. 私钥的简单介绍
以太坊私钥只是一个随机生成的数字。这个数字是 256 位的,且必须是完全随机的,你可以投掷硬币 256 次,得到一个二进制数字作为私钥。只要不可预测且不可重复,具体怎么得到这个 256 位的随机数字并不重要。
大多数情况下,我们都是写代码生成私钥,这时候最重要的就是找到密码学安全的随机源,千万不要自己生成随机数或使用编程语言自带的简单随机数,你使用的随机数一定要是密码学安全的,这一点至关重要。
私钥的重要性不言而喻。需要强调的是,私钥绝对不可以丢失,和银行卡密码不一样,私钥如果丢失无法像找回密码那样还能恢复,这是去中心化的特点。
在中心化世界里,我们用银行卡不担心密码丢失,因为可以找回,但是消费记录、数据隐私无法保证,好比在互联网上裸奔。
在去中心化世界,数据倒是可以做到隐私(虽然目前来看,大家并不关心隐私),但是很不方便,比如保存私钥就是个很麻烦的问题。
我不是想谈数据隐私、保存私钥的话题,因为目前没什么好的解决方案。而是想引出我一直以来的想法,就是任何事物都具有两面性。正所谓 "祸兮福所倚,福兮祸所伏",当你学习有负面情绪,坚持不下去的时候,想一想负面情绪的好处。我认为正是因为有了负面情绪的存在,才挡住了很多比我们更聪明的人的脚步,让我们得以有机会超越他们。如果学习没有负面情绪,那所有人都坚持学习了,那大家只能看谁最聪明了,这样哪还有普通人的机会。从这个角度,我们需要感谢负面情绪。
3. 助记词
助记词涉及到钱包的行业标准了,我会在本系列第三篇进一步讲解。现在,简单了解一下,前面说了,私钥是随机生成的一个数字,那如果需要 10 个账户?100 个账户?甚至 1000000 个账户呢?就要随机生成 1000000 个私钥吗?这么多私钥怎么管理?怎么保存?基于此,助记词诞生了。
助记词可以管理成千上万个私钥,这就需要了解以太坊的 2 种钱包了,从下一篇文章开始,我将连续介绍钱包及开发一个钱包。
使用 Go 语言生成私钥、公钥、地址
下图是生成私钥、公钥、地址的基本原理,现在根据这个原理图,写出相应的代码。

需要引入的包
import (
"crypto/elliptic"
"crypto/rand"
"encoding/hex"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/crypto/secp256k1"
)生成一个椭圆曲线。
curve := secp256k1.S256()
生成私钥(32byte)
b := make([]byte, curve.Params().N.BitLen()/8)
io.ReadFull(rand.Reader, b)
key := new(big.Int).SetBytes(b) // key就是私钥
// 打印私钥
fmt.Println("key:", len(key.Bytes()))
fmt.Println("key:", hex.EncodeToString(key.Bytes()))生成公钥:对私钥进行椭圆曲线加密,生成公钥(64byte)
X, Y := curve.ScalarBaseMult(key.Bytes())
pubKey := elliptic.Marshal(curve, X, Y)
fmt.Println("pubKey:", pubKey)生成地址:去掉公钥第一个字节 04,再使用 keccak256 算法压缩公钥,最后的 20byte 就是地址
compressPubKey := crypto.Keccak256(pubKey[1:])
addr := common.BytesToAddress(compressPubKey[12:])
fmt.Println("addr:", addr.String())验证私钥和地址匹配
将第 3 步产生的私钥导入 metamask
查看 metamask 生成的地址,和第 5 步计算出的地址是否匹配
总结
记住上面的基本原理流程图,就算是学会了本文最重要的内容。
你可能感兴趣的文章
-
Tronscan(波场浏览器)是什么以及功能与使用指南
TronScan 是波场(TRON)区块链的官方权威区块浏览器与综合交互平台,提供链上数据查询、资产钱包管理、智能合约验证、治理投票及代币发行等一站式服务,这篇文章介绍Trons…
2026-07-31 -
美股休市时间怎么查?2026年纽交所、纳斯达克休市日历解析
本文基于纽交所与纳斯达克官方公告,系统解答了美股休市时间怎么查这一核心问题,文章提供三类查询路径完整列出2026年10个休市日和2个提前收盘日的具体日期与规则,并特别提…
2026-07-31 -
加密收入持续下滑,Robinhood 如何突围?HOOD 值得关注吗?
2026 年 Q2 Robinhood 总营收同比增长 23.6%,但加密收入同比大跌 47.8%,连续两季度近乎腰斩,公司靠股票、期权、预测市场完成业务多元化转型,估值显著高于 Coinbase,同…
2026-07-30 -
目前哪些预测市场交易量最大?一文详解
加密市场行情持续承压,预测市场交易逆势升温,受世界杯催化,行业 6 月总交易额环比大涨 75%,Kalshi 交易量遥遥领先,与 Polymarket 合计占据超九成流动性,体育交易为核心…
2026-07-29 -
预测市场系统分析:什么是预测市场?全球最大的预测市场是谁?
本文系统解析预测市场的定义、运作逻辑与爆发式增长,2026年月交易量已突破257亿美元,通过对比Polymarket与Kalshi的交易数据、用户规模与商业模式,揭示全球最大预测市场的…
2026-07-29 -
Ondo上线Ondo Network:Ondo Network是什么、工作原理及未来发展方向
7月27日,Ondo推出 Ondo Network,新一代金融市场的执行层,本文解释了Ondo Network是什么,以及它为什么是现在这个样子,需要的朋友可以参考下…
2026-07-28 -
2026年最佳加密货币投资组合追踪器:十大加密货币投资组合追踪器对比
谁是最好的加密货币投资组合追 踪器?拥有一个好的加密货币投资组合追 踪器是一件非常重要的事情,老手新人该如何选择加密货币投资组合追 踪器呢?下面咱们对比各大主流工…
2026-07-28 -
2026 DeFi新手必读指南:10大热门平台评比与安全操作指南
在2026年,选择一个可靠的DeFi平台是最大化收益并确保资产安全的关键第一步,这篇文章是专为投资者设计的全方位指南,将为你完整解析DeFi 平台是什么、有哪些核心类型,并提…
2026-07-28 -
Lighter vs Hyperliquid 2026完整比较:Perps、费用、代币及安全性
想知道哪个去中心化交易所更适合您的交易策略?Lighter提供零费用、zk证明的永续合约交易,而Hyperliquid则以自有Layer1处理海量交易量并代币化资产,本文将带大家了解两者…
2026-07-28 -
预测市场如何定价美联储加息动作?利率预期形成机制深度解析
美联储议息前夕出现罕见预期分化:经济学家一致看维稳,预测市场定价加息概率走高,本文对比联邦基金期货与加密预测市场定价机制,厘清预期分歧成因,分析驱动加息预期上行…
2026-07-27

繁體中文