type
status
date
slug
summary
tags
category
icon
password
✨在 Web3 世界中,钱包、地址、私钥、公钥 的概念至关重要,是迈入区块链世界的第一课。
针对不同读者的需求,本文将分为两个大块。
- 以通俗易懂的方式介绍概念,主要针对没有区块链基础和没有计算机基础的读者。
- 会对其中的每一项都进行更加深入的详细介绍,主要针对有一定Web3经验或者有计算机基础的读者。
概念简介
在介绍上述概念之前,要先向你简单介绍 区块链的账户是什么。
首先,我们要明确,区块链的账户不是在某条链内置的东西,它本质上是 一串随机数字(私钥)+特定加密算法。前者根据不同的链,或许有不同的私钥规范,后者根据不同的链,或许使用不同的加密算法。
一个粗略的类比是:使用手机号就能直接使用各个平台,但有的平台可能要求使用电信手机号,有的平台要求移动手机号。当然,各个平台上的数据是各自独立的,就像各个链一样。
钱包💰
在现实生活中,钱包的作用是什么?当然是存放你的资产,包括你的多张银行卡,或者像是你微信支付或者支付宝,可以绑定多个银行的银行卡。
类似地,在区块链中,钱包也是方便管理你资产的工具。钱包集成了非常多功能,帮你保管各个账户,也能够让你方便地与链上交互。
常见的插件钱包有Metamask,Phantom等。在发起交易时,会请求签名进行交易许可,就像银行交易时需要输入你的密码一样。
私钥🔑
一个私钥就是一个账户,谁拥有了这个私钥就拥有了这个账户的掌控权,可以访问该私钥关联的所有链上资产。
私钥的作用就是对交易签名,发送签名给接收方。
以太坊(ETH)、比特币(BTC)和Solana的私钥本质上都是 256位随机数。
你可能会问:这个随机数,要是别人拍脑袋一想,写出一个数字,正好是我的私钥,那不相当于我的资产直接就被获取了☹️?
这里的256位随机数指的是256个二进制位的数字,能表达的范围为 。换算成十进制是 ,这是一个大到超乎想象的数字,基本不可能会有生成重复的情况。地球上100亿人类,每个人平均有10个私钥,假设一共 个私钥,那么生成一个已经在使用的私钥的概率也只有 。这个概率小到不可能,因此不需要担心。
为什么我们看到的私钥通常不是一串数字,而是一串字符呢?
这是因为他们对这个数字使用不同的编码方式进行。比如btc常用十六进制编码,或者Base58Check编码;Eth常用十六进制编码;Solana常用Base58编码。
公钥🔒
对发送方的签名进行解签,可以恢复出发送方的公钥,验证身份。
公钥长度是64字节,表达为16进制字符是128个字符。
公钥是会直接或间接在交易中携带的,只是形式可能会有所不同,可能是以地址的形式(ETH),也可能是公钥哈希的形式(BTC),也有可能公钥本身(Solana)。
公钥是由私钥通过密码学算法推导来的。私钥推导公钥,但公钥不能反向推导私钥。 不同链选择的密码学算法或许不同。
比如BTC和ETH使用secp256k1算法生成公钥,使用对应的ECDSA作为签名算法。
Solana使用ed25519算法生成公钥,使用对应的EdDSA作为签名算法。
还记得我们提到的 账户 = 私钥+特定加密算法 这个概念吗。由于BTC和ETH,或者各EVM兼容的链,都是使用相同的加密算法,所以他们可以共用一个账户(当然各个不同的链的资产是不一样的)。而ETH和Solana的账户就不可以共用。
从这里也能看出,私钥是绝对核心,配合不同的加密算法,可以派生出各个链的账户。如果泄露私钥,相当于泄露由这个私钥派生出的所有链上账户。
地址🏠
地址是你向公众暴露出的你的标识。你向对方转账时,输入的就是对方的地址,这笔交易的转账方显示就是你的地址。
地址是由公钥计算来的。不同链的计算和表达方式也是有所不同,通常会比公钥更短。
你可能会问,既然公钥又不是保密的,为什么要弯弯绕绕又经过好几道计算,又得到一个新的地址呢?
- 避免直接暴露公钥。但此理由比较牵强,因为只要发起交易,就会直接或间接暴露公钥。
- 缩短地址,节省存储。这看上去是合理的理由,一个地址节省30个字节,出现一亿次地址就能节省 2.8G。
- 兼容性与灵活性。这看上去是个好的理由,因为公私钥是不变的,但是可以根据不同的计算方式,提供不同的地址生成方式,为后续提供了扩展性的可能。
深入详解
钱包💰
钱包 = 私钥与签名的管理器 + 交易/交互的代理。它负责生成/保存私钥、从私钥派生出公钥/地址、签名消息/交易等。
分类
按照私钥所属,可以分为 托管钱包 和 非托管钱包。
- 托管钱包: 第三方(交易所,托管服务)帮你保管私钥,用户使用账号密码登录(如OKX,Binance上的钱包)。私钥实际上是被第三方机构拥有。方便,但需要托管方值得信任。
- 非托管钱包:自己持有私钥 / 助记词,通常分为软件钱包(Metamask,Phantom)和硬件钱包。
功能
- 私钥生成。产生私钥 / 助记词(或导入)
- 地址派生。从私钥派生出一系列地址。
- 发起交易。将用户的交易(转账,合约交互)构建出原始交易结构,签名交易(消息),广播交易。
- 状态和余额管理。查询各链的余额,交易历史,账户信息等数据。
- 交互信息显示。链上交互时显示核对信息,签名提示,授权Dapp网站授权等。
原理
在生成钱包时,通常会有一组单词,叫助记词(Mnemonic)。钱包的助记词的作用是根据某种方式派生出这个钱包的多个私钥,这样,你就只需要记住这 12 / 24 个英文单词,即可掌管你钱包的诸多私钥,而不是记忆毫无规律的一个个随机私钥。
那么助记词是如何产生,又是如何生成私钥的呢?
助记词🧠
Web3 钱包中的助记词通常是按照 BIP-39(Bitcoin Improvement Proposal 39) 标准生成的,这个标准被广泛应用于BTC,ETH,Solana 等公链钱包中。生成流程大致如下:
1. 生成随机熵(Entropy)
钱包首先生成一段高强度随机数(熵),常见长度:
- 128 位 → 12 个单词
- 256 位 → 24 个单词
2. 添加校验和(Checksum)
对随机熵进行 SHA-256 哈希,从哈希结果中取前若干位(熵长度 ➗ 32)作为校验和。例如 128 位熵 → 取 4 位校验和。将校验和附加到熵的末尾,得到一串新二进制数据。
3. 切分并映射到单词表
- 把这串二进制数据按 11 位一组切分(因为 = 2048)。
- 每一组 11 位的数字作为索引,对应 BIP-39 提供的 2048 个标准单词列表(有多语言版本)。
- 依次映射,得到若干个助记词。
得到了助记词之后,又是如何根据该助记词,生成若干个确定的私钥呢?
分层派生🪜
1. 生成种子(Seed)
- 用户输入助记词和一个可选的密码短语。(这个密码短语的作用是什么呢?就是方便你用同一组助记词,加上不同的自定义短语,这不就有多个钱包啦)。
- 使用 PBKDF2-HMAC-SHA512(2048 次迭代)将助记词和密码短语扩展成一个 512 位的种子。
2. 生成主密钥
利用生成的种子,使用 BIP-32/BIP-44 等标准,派生出分层确定性(HD)钱包的主私钥 和 主链码
3. 分层派生
HD 钱包通过分层路径管理无限多的密钥:
- purpose':用途标识,BIP-44 固定为 44’。
- coin_type':区分链,如 60’(Ethereum)、0’(Bitcoin)。
- account':账户编号。
- change:0 表示外部地址,1 表示找零地址。
- address_index:具体地址索引。
比如
- 以太坊常用路径:m/44'/60'/0'/0/0、m/44'/60'/0'/0/1 等等。
- 第二个地址只需将 address_index 改为 1:
m/44'/60'/0'/0/1
通过 HMAC-SHA512 和椭圆曲线运算,每个路径都会生成一个 完全不同的私钥,但都能从同一助记词恢复。同一个助记词和路径,永远生成相同的私钥,并且理论上同一个助记词可以生成无限个私钥,并且只能单向推导,不能从任一私钥反向推导主私钥或者助记词或其他私钥。
✅ 总结
助记词 → 种子 → 主私钥/链码 → 分层派生路径 → 多个私钥
正是 HD 钱包的分层确定性结构(BIP-32/BIP-44)让一组助记词可以安全、标准化地生成无限数量的私钥和地址。但这种便携性也带来了安全隐患,如何保护助记词不泄露是在 Web3 世界中防止资产丢失的必修课。
链交互✍️
发起交易,进行签名,进行交易信息的友好查看,是钱包的另一大重要功能。
构造交易
根据不同的链,对应的交易请求可能是不同。比如:
- BTC 的 UTXO 模型:选择未花费输出(UTXO)、构建输入/输出、计算找零、设置手续费。
- ETH 的 账户模型:使用 nonce、to / value / data、gasLimit、gasPrice 等参数构造交易。
然后将交易按照不同的链的规范,进行序列化 和 签名,然后将该交易信息发送到节点或者中继网络上。
签名授权
在 Dapp 应用中,通常需要授权才能发起交易,这就是钱包的签名功能(交易必然包含签名,需要签名的不一定包含交易)。比如网站需要证明一个操作是拥有钱包的本人发起的,就需要进行签名,确认授权,App 验证签名通过后,进行后续操作。在签名界面中,你可以看到交易的一些摘要信息。有关签名的详情,我们会在 私钥 的部分进行介绍。
常见误解与要点总结
- 钱包 ≠ 账户余额数据库:钱包只是私钥管理器 / 签名器,链上余额由区块链节点维护。(就像支付宝和银行的关系,钱是在银行,钱包只是一个中介角色)
- 助记词 ≈ 私钥的根:助记词能恢复出整个钱包的一系列私钥;妥善备份等同于你对资金的最终控制。
- 硬件钱包是最有效的现实保护手段,但仍需留意供应链、固件安全和物理环境。
私钥🔑
私钥的本质是一个长度固定的大随机数(256 位二进制)。
私钥的主要作用:
- 控制资产: 拥有私钥的人,可以生成合法签名,在区块链上交互。
- 身份认证:在 Dapp,智能合约交互中,私钥签名就是身份凭证。此外还可以单独用于对消息签名,证明自己的身份。
你也可以说,私钥的主要作用就是签名。那么签名到底是个什么过程呢?
用私钥对一段消息进行加密,这个过程就叫签名。
实现身份认证的核心就是私钥和公钥的 非对称加密。
假设 A 的私钥 ,公钥 ,一段消息 ,加密函数 ,解密函数 。
私钥拥有者对消息进行加密
任何人都可以从 和 中恢复出公钥 / 地址(公开的)。
再将其与交易签署者的公钥 / 地址 做对比,即可验证交易发起者的身份。
不同的链,使用的非对称加密算法可能不同。
- BTC:secp256k1 + ECDSA
- ETH:secp256k1 + ECDSA
- Solana:ed25519
- Polkadot:sr25519
✅ 总结
- 私钥是区块链身份和资产的根本。
- 私钥 签名,公钥 验证。
公钥🔒
公钥与私钥是一对的,是从私钥计算出来的,根据提供的签名和消息,解密出公钥,并与签名者提供的公钥进行对比,从而达到验证的作用。
区块链 | 椭圆曲线 & 算法 | 公钥格式 |
Bitcoin | secp256k1 + ECDSA | 33 字节压缩或 65 字节非压缩公钥 |
Ethereum | secp256k1 + ECDSA | 64 字节未压缩(不含前缀 0x04) |
Solana | ed25519 | 32 字节公钥 |
如果签名者提供的公钥是别人的公钥,尝试花别人的钱?
有 A,B,C 三个角色,A 向 B 发起交易。如果 A 用私钥对消息签名,但向 B 发送的公钥其实是 C的公钥,那么 B 在解签后,解出来的会是 A 的公钥,与声明的 C 的公钥不符,因此验证失败。
- 单向性:公钥无法推回私钥。
- 唯一性:相同私钥在同一曲线下总会生成相同公钥。
- 链独立性:相同私钥在不同链(不同曲线或派生路径)会生成完全不同的公钥/地址,即便算法相同,如果使用不同路径,结果也不同。
地址🏠
地址(Address)就是每个账户对外公开的身份,就像银行卡号、账号、总得暴露出来,别人才能够转账给你,和你交互。
不同链的地址生成方式
区块链 | 算法和流程 | 地址示例 |
Bitcoin | 公钥 → SHA-256 → RIPEMD-160 → 加上版本前缀 → Base58Check 编码 | 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa |
Ethereum | 公钥 → Keccak-256 哈希 → 取最后 20 字节 → 加上 0x 前缀 | 0x742d35Cc6634C0532925a3b844Bc454e4438f44e |
Solana | 直接使用 ed25519 公钥 → Base58 编码 | 7m7kGRtA4HLmZXssSmye6q5T1VD5hff8vWEnZcdJ1R5N |
- Author:Ago
- URL:http://www.sunago.top/article/web3-account
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!