我想在Solana上开发,但。。。我喜欢了解我在做什么。我已经看了文档,但我无法了解solana-keygen
是如何工作的。我一直在努力从同一个助记符中复制同一个公共地址,但似乎什么都不起作用。有人知道地址是如何生成的吗?如果你有你的私钥,你如何在不使用@solana/web3库的情况下获得公钥。
import * as Bip39 from 'bip39'
import { Keypair } from "@solana/web3.js";
const seed: Buffer Bip39.mnemonicToSeedSync("title spell imitate observe kidney ready interest border inject quiz misery motor")
const derivedSeed = ed25519.derivePath("m/44'/501'/0'/0'", seed.toString('hex')).key;
const keyPair = Keypair.fromSeed(derivedSeed)
console.log(keyPair.publicKey.toString())
这个代码工作得很好,所以如果我转到https://solflare.com/access
并尝试插入mnemonic
,我可以看到地址。
但是,事实上,solana-keygen
给我返回了这个带有助记符的地址:nsaayLiawKPiui9fWYCpRdYkdKeqj2fNn9u8LjauEkn
这是一个样品钱包。请随意试用此参数。
请不要为这个钱包提供资金
怎么可能得到solana-keygen
给我的相同地址?
我试图在ed25519, pbkd2,
上传递所有可能的参数,但似乎在这个过程中遗漏了一些内容。
var bip39 = require('bip39');
var ed25519 = require('ed25519-hd-key');
var solanaWeb3 = require("@solana/web3.js");
从助记符中获取主种子:
masterSeed = bip39.mnemonicToSeedSync(seedPhrase, passPhrase);
获取派生的索拉纳地址种子:
var index = 0;
var derivedPath = "m/44'/501'/" + index +"'/0'";
const derivedSeed = ed25519HdKey.derivePath(derivedPath, masterSeed.toString('hex')).key;
获取密钥对:
keypair = solanaWeb3.Keypair.fromSeed(derivedSeed);
获取钱包地址和密钥:
walletAddr = keypair.publicKey.toBase58();
secretKey = keypair.secretKey;
注意:要在浏览器中运行此功能,请按如下方式使用browserfy:
例如:
创建一个文件,bip39-input.js
:
var bip39 = require('bip39');
创建浏览捆绑包:
browserify bip39-input.js -r bip39 -s bip39
--exclude=./wordlists/english.json
--exclude=./wordlists/japanese.json
--exclude=./wordlists/spanish.json
--exclude=./wordlists/italian.json
--exclude=./wordlists/french.json
--exclude=./wordlists/korean.json
--exclude=./wordlists/czech.json
--exclude=./wordlists/portuguese.json
--exclude=./wordlists/chinese_traditional.json
-o bip39-bundle.js
将bip39-bundle.js
文件放置在script
标记中。
实际上我以前也遇到过同样的问题。到现在我还是不明白。但我使用了另一种方法来解决问题。基本上,我使用solana-keygen recover 'prompt://?key=0/0' -o file.json
将密钥对恢复为json。然后打开文件,将私钥复制回代码,并使用let secretKey = Uint8Array.from(private key)
进行提取。你可以从我的博客中找到详细信息https://medium.com/@lianxiongdi/solana-web3-tutorial--connect-your-web3-程序-挑战-39b335f4b4b。
您的问题是因为solana-keygen new
没有使用ed25519HdKey派生路径,但它只是从种子中截取了前32个字节,然后从中生成密钥对。别担心,在弄清楚这一点之前,我也遇到过和您一样的问题。
import bip39 from 'bip39'
import solanaWeb3, { Keypair } from '@solana/web3.js'
async function getKeyCreatedBySolanaKeygenFromMnemonic(mnemonic, password) {
const pass = ''
const seed = await bip39.mnemonicToSeed(mnemonic, pass)
let derivedSeed = seed.subarray(0, 32);
const kp = Keypair.fromSeed(derivedSeed);
return kp;
}
async function main() {
const mnemonic = "title spell imitate observe kidney ready interest border inject quiz misery motor"
const kp = await getKeyCreatedBySolanaKeygenFromMnemonic(mnemonic);
console.log('Public key derived from solana-keygen new mnemonic:', kp.publicKey.toBase58())
}
main();
输出:solana-keygen公钥新助记符nsaayLiawKPiui9fWYCpRdYkdKeqj2fNn9u8LjauEkn