跳转至

出现 legacy_derivation 后如何找回地址

在 4.13.1 之前,wallet-cli 按 m/44'/195'/<index>'/0/0 派生 TRON 账户。现在改用 m/44'/195'/0'/0/<index>,与 EVM 的布局一致。0 号账户在两种方式下相同,EVM 路径也从未改变。旧钱包中 1 号及之后的 TRON 账户仍保留它们原来的地址,本版本对它们的处理如下:

你的操作 结果
以该 TRON 地址签名(tx send、message sign 等) legacy_derivation(退出码 1)
在该钱包中 derive 新账户 legacy_derivation(退出码 1)
使用同一账户的 EVM 地址 正常
查询余额、--build-only、list、use 正常
用助记词执行 import mnemonic 1 号及之后的账户会以新的 TRON 地址回来

旧密钥并没有丢——助记词在旧路径上仍然能派生出它。下面的步骤会把每一把旧 TRON 密钥迁到独立账户中,然后在新路径上重建钱包。全过程只改动本地数据,链上没有任何变动。

这个错误长什么样

error [legacy_derivation]: account "main-1" was derived at m/44'/195'/1'/0/0, a TRON path this version no longer produces, so it cannot be signed here. Follow the complete recovery procedure before deleting anything:
  https://github.com/tronprotocol/wallet-cli/blob/wallet-cli-4.13.1/ts/docs/troubleshooting/legacy-derivation-recovery.md

开始之前

示例钱包中有一个受影响的账户 main-1:

wallet-cli list --network tron:728126428
HD  wlt_n5g8s27j
├─ [0] main    TRTEhBEhyiXfRxG2kRbZ3KgenwpcZ4yUJA
└─ [1] main-1  TXyPxeWda1vGTj7mS5eF7gqSmbQ6p3PDKP  (active)

先保存账户列表,以及该钱包的原生备份:

wallet-cli list -o json > ./accounts-before.json
wallet-cli backup main --out ./main-mnemonic.json

在提示处选择 Native wallet backup。备份中会列出所有需要执行第 1 步的账户,并给出对应的命令:

warning: this version's default mnemonic recovery will NOT recreate wlt_n5g8s27j.1 (m/44'/195'/1'/0/0) — that account was derived at a TRON path this version no longer produces, but the recovery phrase can still derive that key at the listed path. Export it separately before deleting anything:
  wallet-cli backup wlt_n5g8s27j.1 --keystore --network tron:728126428 --password-stdin

这两个文件都要妥善保管,不要纳入版本控制。

1. 保住旧的 TRON 地址

把列出的每个账户的 TRON 密钥导出为 keystore:

wallet-cli backup main-1 --keystore --network tron:728126428 --out ./main-1-tron.keystore.json

把它作为独立账户导入。先输入 master password,再输入 keystore 密码——后者就是导出该 keystore 时所用的 master password:

wallet-cli import keystore ./main-1-tron.keystore.json --label main-1-legacy-tron
✅ Imported wallet "main-1-legacy-tron"
  Account ID    wlt_pafmpa51
  Type          private key
  TRON address  TXyPxeWda1vGTj7mS5eF7gqSmbQ6p3PDKP
  EVM address   0xF15BeA353364D1022BCAa2f3F0A318ca2676A440
  Active        yes

这里的 TRON 地址与原来一致,且可以正常签名。EVM 地址是由同一把私钥推出来的,它不是钱包中 main-1 的那个 EVM 地址——除非你确实要用它,否则请忽略。

确认每个旧 TRON 地址现在也出现在 private key 之下:

wallet-cli list --network tron:728126428
HD  wlt_n5g8s27j
├─ [0] main            TRTEhBEhyiXfRxG2kRbZ3KgenwpcZ4yUJA
└─ [1] main-1          TXyPxeWda1vGTj7mS5eF7gqSmbQ6p3PDKP

private key
└─ main-1-legacy-tron  TXyPxeWda1vGTj7mS5eF7gqSmbQ6p3PDKP  (active)

在确认之前不要继续往下做。如果你确定某个旧 TRON 地址不再需要,可以跳过它。

2. 重建钱包

删除该 HD 钱包。这会移除它的全部账户,但不会影响第 1 步中建立的独立账户:

wallet-cli delete main --yes

用 main-mnemonic.json 中的助记词导入。这会恢复 0 号账户:

wallet-cli import mnemonic --label main

3. 重新派生其余账户

import mnemonic 只恢复索引 0。你原先有哪些索引,就逐个重新派生(derive 只从 stdin 接收 master password;$PW 中存放着它):

printf '%s' "$PW" | wallet-cli derive --account main --index 1 --label main-1 --password-stdin

与 accounts-before.json 对照:

wallet-cli list --network eip155:1
private key
└─ main-1-legacy-tron  0xF15BeA353364D1022BCAa2f3F0A318ca2676A440

HD  wlt_6xzxsmj5
├─ [0] main            0x811Bae29A75A3e283cC9B1ae4b7D7280429BD316
└─ [1] main-1          0x6F63D9e65070319885d1B46D3df31D6f1dB042e1  (active)
  • 每个索引上的 EVM 地址都与之前一致。
  • 0 号账户的 TRON 地址与之前一致。
  • 1 号及之后的账户是新的 TRON 地址。旧地址及其上的资金,在第 1 步建立的那些 private key 账户里。

全部核对无误后,请把备份文件和 keystore 文件转移到安全的存储位置。

derivation_mismatch

这是另一种错误:wallets.json 中存放的某个地址,与其种子的任何派生路径都对不上,也就是钱包文件与加密保险库互相矛盾——通常是因为该文件被手工编辑过,或是从别的钱包拷贝过来的。以该账户签名、以及从其钱包派生,都会返回这个错误码。请用你自己的副本恢复这些文件,或用助记词重建该钱包。

另请参见

账户与 HD 钱包 · backup · derive · import keystore