当前位置:主页 > 区块链 > 区块链技术 > Web3助记词和生成私钥、公钥、地址

Web3钱包中助记词和生成私钥、公钥、地址的基本原理

2026-02-28 12:44:22 | 来源: | 作者:佚名
为了学习钱包、助记词、私钥、公钥、地址的知识,我浏览了大量的网页、博客、社区,没发现一篇令我满意的文章,能够用最简洁的方式 + 实例代码把知识讲解清楚

于是乎,我决定自己写一个系列文章。记录我的学习研究成果。

我认为,用代码一步步生成一个私钥、公钥、地址,是更好的学习方式,接下来就使用 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 步计算出的地址是否匹配

总结

记住上面的基本原理流程图,就算是学会了本文最重要的内容。

免责声明:本文只为提供市场讯息,所有内容及观点仅供参考,不构成投资建议,不代表本站观点和立场。投资者应自行决策与交易,对投资者交易形成的直接或间接损失,作者及本站将不承担任何责任。!
Tag:助记词   生成私钥   公钥   地址  

你可能感兴趣的文章

更多

热门币种

  • 币种
    最新价格
    24H涨跌幅
  • bitcoin BTC 比特币

    BTC

    比特币

    $ 63535.13¥ 436041.59
    -6.45%
  • ethereum ETH 以太坊

    ETH

    以太坊

    $ 1854.01¥ 12724.07
    -8.8%
  • tether USDT 泰达币

    USDT

    泰达币

    $ 1.0004¥ 6.8657
    +0.05%
  • binance-coin BNB 币安币

    BNB

    币安币

    $ 591.5¥ 4059.46
    -5.84%
  • ripple XRP 瑞波币

    XRP

    瑞波币

    $ 1.2875¥ 8.8361
    -9.39%
  • usdc USDC USD Coin

    USDC

    USD Coin

    $ 1.0018¥ 6.8753
    +0.18%
  • solana SOL Solana

    SOL

    Solana

    $ 78.0905¥ 535.93
    -10.75%
  • tron TRX 波场

    TRX

    波场

    $ 0.2791¥ 1.9154
    -2.17%
  • dogecoin DOGE 狗狗币

    DOGE

    狗狗币

    $ 0.088703¥ 0.6087
    -9.68%
  • cardano ADA 艾达币

    ADA

    艾达币

    $ 0.2617¥ 1.796
    -10.25%

币圈快讯

  • 伊朗:敌方无视所有国际法已成立国家危机管理总部

    2026-02-28 16:58
    据当地时间28日午间,伊朗内政部就美以空袭伊朗发表声明,称“敌人无视所有国际法,并在谈判期间肆意妄为”,表示内政部将动用一切力量维护社会秩序,内政部长也已向全国各省省长发出命令,要求各省调动一切资源满足民众的需求。 声明还表示,内政部已成立国家危机管理总部,并已向所有省级危机管理部门和相关机构下达了必要的指示。声明呼吁民众保持冷静,根据实际情况安排市内及城际出行,同时呼吁民众关注官方渠道发布的新闻,不要轻信谣言和虚假新闻。
  • Ju.com8折打新ETH收官第9期SOL3月1日16:00开抢

    2026-02-28 16:53
    据Ju.com春节「十连发」主流币8折打新第8期ETH已于2月28日16:00收官。本期参与人数达11,000人,参与活动资金约42,000,000美元,整体超募540%,其中USDT池超募近700%。认购资产结算后无锁仓,到账即现货,可直接卖出或提现。 第9期SOL专场将回归,于3月1日16:00正式上线,用户可通过USDT/BTC/ETH/SOL/BNB/JU以8折价格参与认购,参与无门槛,后续Ju.com待上线项目将根据市场情况及用户需求综合评估后另行公告,请以官方后续公告为准。 除8折福利外,参与打新用户可获得赠金与合约体验金奖励,并可获得抽奖机会,有机会赢取88g金条、iPhone17等实物大奖;邀请好友成功参与,最高可获得5%打新代币奖励。更多详情敬请关注Ju.com官方公告及活动页面。
  • 鲸鱼“0x172”在市场下跌期间从Aave借700万美元购入以太坊

    2026-02-28 16:49
    据市场消息,地址为“0x172”的鲸鱼从Aave借入700万美元USDC,并以1,865美元的价格购买了3,753个ETH。该鲸鱼目前持有15,964个ETH,价值约2,968万美元。
  • 特朗普表示等行动结束接管伊朗政府

    2026-02-28 16:42
    特朗普在truthsocial平台发布的一段8分钟视频中证实,美国已对伊朗发动“重大作战行动”,并对伊朗喊话称,“等行动结束,接管你们的政府”。特朗普表示,德黑兰方面的“威胁行径直接危及美国、美军、海外军事基地以及全球盟友”。他宣称伊朗“试图重建核计划、研发远程导弹”。 特朗普还宣称:“我们将摧毁他们的导弹”“彻底消灭他们的海军”。特朗普在讲话中要求伊朗伊斯兰革命卫队“放下武器”,否则“将面临必死结局”。他说,“等我们行动结束,接管你们的政府。”
  • ETH全网合约持仓量24h减少8.32%

    2026-02-28 16:41
    据Coinglass数据显示,ETH全网合约持仓量在过去24小时减少8.32%,当前总持仓量为236.57亿美元。其中Binance持仓量为48.66亿美元,OKX持仓量为15.53亿美元,Bybit持仓量为18.04亿美元,Gate持仓量为24.76亿美元。
  • 查看更多