Как сгенерировать закрытые ключи для ThunderCore из начальной фразы mnemoni c из 12 слов, экспортированной из TrustWallet или Metamask? - PullRequest
1 голос
/ 22 апреля 2020

Я получил начальную фразу mnemoni c, состоящую из 12 слов, экспортированную из TrustWallet, однако она нужна мне как закрытый ключ thunderCore. Как из него сгенерировать закрытый ключ thunderCore? Что, если начальная фраза экспортируется из Метамаски?

1 Ответ

0 голосов
/ 30 апреля 2020

Чтобы сгенерировать закрытые ключи из фраз из 12 слов мнемони c, вам нужен путь деривации (строка), как указано в BIP-0049 .

Пути деривации, используемые в поле:

  • m/44'/1001'/0'/0: использует правильный тип монеты для ThunderCore (1001), зарегистрированный в SLIP-0044 , используемом TrustWallet
  • "m/44'/60'/0'/0: это путь деривации, используемый для Ethereum mai nnet, используемый MetaMask

Вот автономный пример для генерации закрытых ключей из 12-мнемонического мнемони c с использованием ethereum-hdwallet библиотека:

hdwallet.js

const EthereumHDWallet = require('ethereum-hdwallet')

// https://github.com/bitcoin/bips/blob/master/bip-0049.mediawiki
// https://github.com/satoshilabs/slips/blob/master/slip-0044.md
const TrustWalletHdPath = "m/44'/1001'/0'/0" // coin_type 1001 is ThunderCore, this is the recommended path
const MetaMaskHdPath = "m/44'/60'/0'/0"      // coin_type 60 is really Ethereum, but MetaMask use it for all EVM compatible chains

class HdWallet {
  constructor(mnemonic) {
    this.mnemonic = this.mnemonic
    this.w = EthereumHDWallet.fromMnemonic(mnemonic)
  }
  deriveUsingTrustWalletPath() {
    return this.w.derive(TrustWalletHdPath)
  }
  deriveUsingMetaMaskPath() {
    return this.w.derive(MetaMaskHdPath)
  }
  metaMaskAddress(index /*: number */) /*: string */ {
    return '0x' + this.deriveUsingMetaMaskPath().derive(index).getAddress().toString('hex')
  }
  trustWalletAddress(index /*: number */) /*: string */ {
    return '0x' + this.deriveUsingTrustWalletPath().derive(index).getAddress().toString('hex')
  }
  metaMaskPrivateKey(index /*: number */) /*: string */ {
    return this.deriveUsingMetaMaskPath().derive(index).getPrivateKey().toString('hex')
  }
  trustWalletPrivateKey(index /*: number */) /*: string */ {
    return this.deriveUsingTrustWalletPath().derive(index).getPrivateKey().toString('hex')
  }
}

const fromMnemonic = (s /*: string or buffer */) => {
  return new HdWallet(s)
}

module.exports = {
  fromMnemonic: fromMnemonic,
}

testHdWallet.js

const assert = require('assert');
const HdWallet = require('../src/hdwallet');

const mnemonic = 'feel pulp crunch segment buzz turn organ broccoli elder ask phone limit';

describe('fromMnemonic', () => {
  it('trustWalletAddress', async() => {
    const w = HdWallet.fromMnemonic(mnemonic);
    console.log('TrustWallet:', w.trustWalletAddress(0));
    assert('0x2323Beb990514446bA4c073C2e1A4BDC0ECf06Af'.toLowerCase() ===
            w.trustWalletAddress(0).toLowerCase());
  });
  it('metaMaskAddress', async() => {
    const w = HdWallet.fromMnemonic(mnemonic);
    console.log('MetaMask:', w.metaMaskAddress(0));
    assert('0x9A7be7ae9a2779167bc5b64d1cC672cc5b2593e4'.toLowerCase() ===
            w.metaMaskAddress(0).toLowerCase());
  });
  it('trustWalletPrivateKey', async() => {
    const w = HdWallet.fromMnemonic(mnemonic);
    console.log('TrustWallet sk:', w.trustWalletPrivateKey(0));
    assert('6d7bf444545ce47d7fda9df58275f5f4dd5eb911494ab66d81f76f1aca2b763e'.toLowerCase() ===
            w.trustWalletPrivateKey(0).toLowerCase());
  });
  it('metaMaskPrivateKey', async() => {
    const w = HdWallet.fromMnemonic(mnemonic);
    console.log('MetaMask sk:', w.metaMaskPrivateKey(0));
    assert('6aad31c479c44230721b470570c12bd3f41e71b79d8f27ca08b913cbaeac25af'.toLowerCase() ===
            w.metaMaskPrivateKey(0).toLowerCase());
  });
})

См. Полный проект в hdwallet филиал field-support репо.

...