将幽灵钱包的私钥导入Solana CLI

24

我需要通过Solana CLI使用Phantom钱包,但是我无法对其进行配置。

例如,要使用

solana balance --keypair fileexportedfromphantom

但是无法阅读该信息。

我如何将私钥转换为Solana CLI可用的有效形式?


我的私钥是一系列字节数字,例如53、63、65,但问题在于我必须将它们放入幻像扩展中,包括方括号[],然后它才能正常工作。 - luky
3个回答

51

尝试:

solana-keygen recover 'prompt://?key=0/0' -o <file.json>

并在“显示秘密恢复短语”下输入来自Phantom的24个单词的恢复短语。

这是因为Phantom对于钱包使用0/0派生路径,需要提供额外的路径才能到达正确的账户。

您可以使用相同的命令与1/02/0 ... N/0一起使用以获取不同的Phantom派生账户。

有关使用Solana工具进行分层派生的更多信息,请参见此处: https://docs.solana.com/wallet-guide/paper-wallet#hierarchical-derivation

或使用Solflare钱包在此处检查特定24个单词短语的导出路径:https://solflare.com/access


根据@FutForFut的最新评论,这假定您拥有或希望使用来自Phantom的秘密恢复短语。 在某些情况下,您可能仅拥有来自菜单中的Phantom的私钥(“显示私钥”)。 这是一个base58编码的密钥,您需要将其转换为JSON文件中的字节数组。

这里是使用bs58包的JavaScript片段(https://www.npmjs.com/package/bs58):

const bs58 = require('bs58');
const fs = require('fs');
b = bs58.decode('privatekeyexportedfromphantom');
j = new Uint8Array(b.buffer, b.byteOffset, b.byteLength / Uint8Array.BYTES_PER_ELEMENT);
fs.writeFileSync('key.json', `[${j}]`);

根据需要更新字段 privatekeyexportedfromphantomkey.json


有关Phantom的一个不明显的事情是:如果您使用本答案中建议的秘密恢复短语,那么拥有该恢复短语的任何人都将能够构造该钱包中所有帐户的私钥。我怀疑更常见的用例是只导入一个特殊的帐户/钱包到Solana CLI中。在这种情况下,Jon C的答案更合适,更安全,因为它只会公开一个密钥对,而不是整个派生(或可派生)密钥对序列。 - AllBlooming
谢谢,我也已经将另一种方法添加到了这个答案中。 - yamen
创建了一个 replit https://replit.com/@therealsuji/Phantom-Private-Key-to-Keypair?v=1 - SujithaW

14

这有点麻烦,但你需要将Phantom返回的Base-58私钥解码为一个字节数组。以下是一个简单的Python代码片段,使用base58包(https://pypi.org/project/base58/)实现:

import base58
byte_array = base58.b58decode(MY_PRIVATE_KEY_IN_BASE58)
json_string = "[" + ",".join(map(lambda b: str(b), byte_array)) + "]"
print(json_string)
你可以将输出导出到文件中,然后在CLI工具中使用该文件作为你的--keypair

你可以将输出导出到文件中,然后在CLI工具中使用该文件作为你的--keypair


错误:无法读取密钥对文件。如果我使用solana-keygen new生成密钥,它会显示为数字组合。使用您的脚本生成的输出是二进制的。 - user1843376
我得到了类似这样的东西 [�,[,:,�,�,>,�,L,=,�,J,�,而期望的外观是:[157,179,177,192,112。 - user1843376
奇怪,我刚刚自己再次测试了一下,它可以工作。对于 MY_PRIVATE_KEY_IN_BASE58,您应该输入一个字符串,例如 "4AfmonCVDRutyt3vMfsooagRsoNXTCVURGZ7nzSZPP9CWykXUmgA72Sfgrne7EcqtVJE6Gq6aA8xw21bHtbZMQzL" 这将给出 [158,99,132,43,140,119,254,9,6,225,141,208,225,184,48,219,246,115,45,3,0,67,160,190,25,199,130,208,179,210,219,1,41,32,144,228,51,198,235,65,64,71,155,119,235,189,157,49,2,65,230,165,161,159,153,77,213,153,226,174,35,2,212,89]你能测试一下吗?这是在Ubuntu 20.04上使用Python 3.8运行的。 - Jon C
对我来说可以运行在终端或REPL中的简单Python脚本。 - kafinsalim
非常感谢!我曾经为理解幽灵钱包私钥和32字节私钥之间的区别而束手无策。 - SpaceMonkey
显示剩余3条评论

0
这是一个小的Python 3脚本,用于接收您的私钥,并将其输出到Solana配置目录。
from pathlib import Path

import base58

SAVE_DIR = Path.home() / '.config' / 'solana'


def convert_key():
    byte_array = base58.b58decode(input('Enter Public Key: '))
    return "[" + ",".join(map(lambda b: str(b), byte_array)) + "]"


def create_file(save_dir: Path, key_name: str) -> Path:
    keypair_path = save_dir / f'{key_name}.json'
    if not SAVE_DIR.exists():
        raise FileNotFoundError('Solana config directory not found')
    if not SAVE_DIR.is_dir():
        raise NotADirectoryError('Solana config directory not found')
    if keypair_path.exists():
        raise FileExistsError('Keypair already exists')
    return keypair_path


def main():
    keypair = input('Enter keypair name: ')
    keypair_path = create_file(SAVE_DIR, keypair)
    keypair_path.write_text(convert_key())
    print(f'Keypair {keypair} created at {keypair_path}')


if __name__ == '__main__':
    main()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接