助记词 → 私钥 → 公钥 → 钱包地址,自托管钱包里的这四样东西就是这样一环推出下一环的。

这条推导只往一个方向走。有了助记词,钱包能算出私钥;有了私钥,能算出公钥,再算出地址。反过来的每一步都算不回去:从地址推不出公钥,从公钥推不出私钥,从私钥也换算不回那组单词。地址可以放心发给别人,私钥和助记词不能交出去,原因就是这条推导倒不回去。

助记词、私钥、公钥、地址各自的用处

助记词是创建钱包时给出的一组单词,用处是恢复:进不去钱包了,靠它重新进入。原理不复杂:钱包软件里有一份词表,每个单词对应一个数字,整组助记词能换算成一个数,钱包拿这个数当种子,生成用到的全部密钥对。

私钥是一串数字,以太坊的私钥写出来是 64 个十六进制字符(0–9 和 a–f)。它的用处是签名:从某个地址转出的每一笔交易,都要用这个地址对应的私钥签过,链上才承认。钱包真正握在手里的就是私钥,币本身一直记在链上。

公钥由私钥算出,两者成对出现,合称一对密钥。地址又由公钥算出,是别人给你转账时要填的那串字符;以太坊地址以 0x 开头。一组助记词能派生出不止一个私钥,所以同一个钱包里可以有好几个地址,它们背后是同一组单词。

别人拿到地址,倒推不出私钥

推导链上的每一步换算都是单向的,顺着算很容易,倒着算没有可行的办法。私钥能推出公钥,公钥推不回私钥。地址则是对公钥做一次哈希、截取结果的一段得到的,而哈希这类运算的特点就是从结果推不回原来的输入。

所以公开地址不会把私钥一起带出去。私钥也没法靠猜:64 个十六进制字符,每一位有 16 种取值,合起来是 16 的 64 次方种组合,挨个去试,撞中的机会小到可以不考虑。号称能「碰撞」出别人助记词的碰撞器软件,面对的是同一类概率。

钱包地址可以发给别人吗?哪些能公开

四样东西按能不能交给别人,可以这样对照:

由什么算出 能不能给别人 别人拿到后能做什么
助记词 创建钱包时生成 不能 在自己的设备上恢复出整个钱包,转走其中各个地址上的资产
私钥 助记词 不能 以这个地址的名义签名,转走地址上的资产
公钥 私钥 可以 核对一笔签名是不是这把私钥签的,推不出私钥
地址 公钥 可以 往这个地址转账,在链上查它的余额和每一笔进出

地址本来就是拿来公开的。收款时把它发给对方,对方往这串字符转账即可。公开也有代价:地址上的余额和每一笔转账记录,谁拿着地址都能在链上查到,不想把几类用途的收支放在一处,可以分开用不同的地址。

私钥和助记词正好相反。ethereum.org 的安全与防骗指南把助记词称作钱包的主密钥,提醒不论出于什么理由都不要分享助记词或私钥:拿到助记词的人可以访问你的所有账户,把资产卷走;私钥对单个账户也是一样。

代币授权和转账差在哪、签过的授权怎么查和撤销,见钱包授权和转账有什么区别。

合约账户没有私钥:它和外部账户(EOA)的三处不同

以太坊上的账户分两种。外部账户(EOA,全称外部拥有账户)由握有私钥的人控制;合约账户是部署到网络上的智能合约,由代码的逻辑控制,没有私钥。从助记词一路推出来的那些地址背后都有私钥,属于外部账户。

两种账户都能接收、持有和发送 ETH 与代币,都能和已部署的智能合约交互,地址也都是 0x 开头的 42 个字符。差别主要有三处:

  • 创建的成本。创建外部账户不花钱。创建合约账户要付费,因为它占用了网络的存储空间。
  • 能不能主动发起交易。外部账户可以发起交易。合约账户只能在收到一笔交易之后作出响应、发送消息。外部账户之间的交易只能是 ETH 或代币的转移;从外部账户发给合约账户的交易却能触发代码,代码可以做许多事,比如转移代币,甚至再创建一个新合约。
  • 地址怎么来。外部账户的地址由公钥算出。合约地址通常在部署时给出,由创建者的地址和这个地址已发出的交易数量(nonce)算出来。另一种部署方式 CREATE2 改用创建者地址、创建者选的一个值(盐)和合约创建代码的哈希来算,合约还没部署,地址就能先算出来。

没有私钥,合约账户也就没有助记词可以备份,里面的资产能不能动、由谁来动,都由代码决定。往一个合约地址转币之前,先弄清这份合约有没有把币转出来的功能;币转到合约地址后找不找得回,取决于这一点。

钱包只是操作账户的界面,外部账户和合约账户它都可以打交道。

只有私钥没有助记词:私钥转不成助记词

按 BIP-39(比特币改进提案第 39 号,一种助记词规范)的写法,种子是对助记词做哈希得到的,这一步只能从单词换成种子,不能反过来;私钥又是从种子往下派生的。单独留着的一把私钥,仍然能为它对应的那个地址签名转账,但变不出原来的助记词,也变不出同一组单词派生出的其他地址。

一把私钥只管它对应的那一个地址。助记词在推导的最上游,本身不直接签名;换了设备、删了钱包,重新输入这组单词,派生出的地址会一起回来。

反过来的问题是,同一组助记词放进另一个钱包软件,能不能恢复出同样的地址。这取决于两边把单词换成种子、再派生密钥的规则是否一致。Bitcoin Wiki 写到,一般情况下助记词只在生成它的那款钱包软件里能用。打算换钱包时,先在新钱包的帮助文档里查它支持哪种助记词格式,以那边的说明为准。

一组助记词为什么能管很多个地址

助记词对应的不是某一把私钥,而是一个种子;钱包从种子出发,生成它用到的全部密钥对。地址要几个,就往下多生成几对。

整个过程分两段(BIP-39 规范的写法):

  1. 单词换成种子。钱包把整句助记词交给 PBKDF2 函数,用 HMAC-SHA512 迭代 2048 次,得到一个 512 位(64 字节)的种子。
  2. 种子生成密钥。种子再交给确定性钱包的算法,规范里点名的是 BIP-0032 或类似的方法,由它生成一对又一对密钥,每对密钥对应一个地址。

「确定性」指同样的输入只会算出同样的结果。同一组单词按同样的顺序输入,得到的总是那一个种子,往下生成的也总是那一批密钥对。所以硬盘坏了,凭纸上那组单词就能把整个钱包恢复回来,用不着每个地址单独抄一份备份。

有两样东西会让同一组单词算出不同的种子。

一是口令(passphrase)。BIP-39 允许在助记词之外再加一个口令,不设就按空字符串算。口令参与单词换种子那一步的运算,所以每个口令都对应一个有效的种子,也就是另一个完整的钱包,只有输对的那个才会打开你原先的那批地址。有的钱包把它叫作「扩展词」或「第 13 个词 / 第 25 个词」。设了口令,恢复时单词和口令缺一不可。Bitcoin Wiki 的提醒是:忘了口令,钱包连同里面的钱就没了,别高估自己记口令的能力,不常用的时候尤其如此。它和给钱包文件加密用的密码也是分开的两样东西。

二是词表。种子是直接拿单词本身算出来的,把一组助记词译成另一种语言的词表,算出的是完全不同的种子。绝大多数支持 BIP-39 的钱包只认英文词表,规范本身也强烈不建议用非英文词表生成助记词。抄助记词时照钱包给出的原样抄,别自己译成中文来记。

助记词备份的只是链上的资金。闪电网络这类链下交易里的钱,要连同别的数据一起备份才能恢复,通常钱包的备份功能会自动带上。

助记词丢了怎么办,还能找回吗

钱包开发者帮不了这个忙。自托管钱包的开发者手里没有用户的助记词:钱包提供商不托管你的资金,钱包给出的助记词是恢复钱包的唯一方法(ethereum.org 钱包页的说法)。

能不能补救,要看设备。

钱包还能在原设备上打开,资产就还在你的控制之下。建议趁现在新建一个钱包,把新给出的助记词抄好、核对无误,再把资产从旧地址转过去。旧钱包的私钥只存在这台设备上,它一出问题就没有第二份可用。

设备丢了或坏了,助记词又没有另外抄下来,这个钱包里的私钥就找不回来了。链上那几个地址的余额不会消失,记录照样能查到,只是再也没有人能为它们签名,把币转出去。

助记词怎么保存才安全

保存助记词,要让自己日后找得到,也要防着它被人看见。具体这样做:

  1. 拿纸笔把单词按顺序抄下来,每个词前面写上序号。在纸上写,用铅笔比用墨水笔好。
  2. 抄完逐个核对拼写和顺序。错一个字母、调换两个词,恢复时都可能对不上。
  3. 不截图。截图可能被同步到云端,给黑客留下机会。
  4. 不存进电脑文件、网盘或备忘录,也不通过聊天软件发给自己或家人。
  5. 抄好的纸放在不容易被人翻到、也不怕受潮的地方;想多一层保险,抄两份分开放。

用铅笔是 Bitcoin Wiki「Seed phrase」词条的建议;不截图、不存进电脑,是 ethereum.org 的安全与防骗指南和钱包页提醒过的。

恢复钱包时,只在钱包软件自己的恢复界面里输入助记词。助记词不往任何网页里填;一个网页要你填整组单词,本身就是危险信号。

纸笔只管备份。签名时也不想让私钥碰联网设备,要用冷钱包。

客服、空投要我提供助记词,是不是骗局

可以直接当骗局处理。ethereum.org 的安全与防骗指南写到,合法的服务、支持人员和网站都不会向你索要助记词或私钥。冒充客服的人常在公开的 Discord 频道里搜别人发的求助,再私信找上门;空投骗局则会让你连上钱包,「授权」一笔交易。

自称客服、开口要助记词或私钥的,别给;领空投之前要你连上钱包「授权」一笔交易的,也别签。

常见疑问

钱包地址发给别人收款,对方能动我的币吗?

不能。地址由公钥算出,公钥由私钥算出,这几步都推不回去。对方拿着地址只能往里转账,或者在链上查这个地址的余额和转账记录;要把币从这个地址转出去,得用对应的私钥签名。

助记词截图存在手机相册里,算不算备份?

不建议这样存。ethereum.org 的安全与防骗指南提醒,对助记词或私钥截图,可能会让它们被同步到云端,给黑客留下机会。用纸笔抄下来、放在不联网的地方,比留在相册里稳妥。

同一组助记词换一个钱包软件,还能恢复出原来的地址吗?

要看两个钱包把助记词换算成密钥的规则是否一致。Bitcoin Wiki 的「Seed phrase」词条写到,一般情况下助记词只在生成它的那款钱包软件里能用。换软件之前,先查清新钱包支持哪种助记词格式,再动手恢复。

公钥和钱包地址是同一个东西吗?

不是。地址由公钥再算一步得到:以太坊的做法是对公钥做一次哈希,取结果的最后 20 个字节,前面加上 0x。两样都可以公开,收款时发给对方的是地址。