Усиленная генерация адресов с кошельком только для просмотра BIP44 с xpub

Меня озадачивает получение защищенного ключа от кошелька BIP44, предназначенного только для просмотра.

Позвольте мне сначала объяснить, что я пытаюсь сделать.

  • Я реализую схему мультиподписи 2 из 3
  • Я использую узел и кошелек Bcoin
  • Все 3 ключа генерируются извне
  • Я хочу использовать кошелек Bcoin только для просмотра

ts для создания адресов и скриптов

Вот что я сделал до сих пор:

  1. Создал 3 ключа xprv и ключи xpubs с помощью этого инструмента здесь
  2. Я использовал пользовательский путь m/44'/0'/0'для защищенных ключей, потому что для кошелька Bcoin требуются защищенные ключи BIP44.
  3. С помощью ключей я создал 3 кошелька только для просмотраxpub .
  4. Затем я добавил каждый из ключей как общие ключи друг к другу (на самом деле мне нужно сделать это только для одного кошелька).

Код выглядит следующим образом:

const HSM_accountKey = "xpub_HSM...."
const IC_accountKey = "xpub_IC..."
const Paper_accountKey = "xpub_Paper..."

const result_wallet_HSM = await walletClient.createWallet('wallet_HSM', options_wallet);
const result_wallet_IC = await walletClient.createWallet('wallet_IC', options_wallet);
const result_wallet_Paper = await walletClient.createWallet('wallet_Paper', options_wallet);


const wallet_IC_account = await wallet_IC.getAccount('default');
const wallet_Paper_account = await wallet_Paper.getAccount('default');
const result_addkey1 = await wallet_HSM.addSharedKey('default', wallet_IC_account.accountKey);
const result_addkey2 = await wallet_HSM.addSharedKey('default', wallet_Paper_account.accountKey);

Теперь я создал кошелек с мультиподписью 2 из 3 только для просмотра. Что я хочу сделать сейчас, так это создать адреса. Я не хочу получать больше дочерних расширенных ключей. Мне нужен только один уровень деривации. Теперь я хочу создать мультиподписные адреса для своих пользователей.

// Create addresses from each wallet
const wallet_HSM_address = await wallet_HSM.createAddress('default');
const wallet_IC_address = await wallet_IC.createAddress('default');
const wallet_Paper_address = await wallet_Paper.createAddress('default');

// Keyrings for script generation
const keyring_HSM = KeyRing.fromJSON(wallet_HSM_address);
const keyring_IC = KeyRing.fromJSON(wallet_IC_address);
const keyring_Paper = KeyRing.fromJSON(wallet_Paper_address);

//Get the pubkeys from each wallet
const pubKeys = [keyring_HSM.publicKey, keyring_HSM.publicKey, keyring_Paper.publicKey];

const multiSigScript = Script.fromMultisig(m, n, pubKeys);
const receivingAddress = multiSigScript.getAddress().toBase58(network); 

У меня такое чувство, что я делаю этот шаг окольным путем, но вы понимаете, что я пытаюсь сделать.

Повторюсь, сейчас я хочу создать индивидуальные адреса получения для моих пользователей и соответствующие сценарии P2SH.

Теперь мне нужна помощь в понимании .

  • Согласно BIP32, вы не можете получить защищенные открытые ключи с помощью CDKpub. Вам нужен xprv для получения дочерних ключей.
  • Однако из того, что я сделал, я могу получить дочерние открытые ключи. Я отправил монеты tesetnet на эти адреса ( receivingAddressв коде выше), и они работают. Кошелек получает монеты.
  • Как же тогда кошелек, предназначенный только для просмотра, смог создать защищенные дочерние открытые ключи? Я не вводил xprvв кошелек.
  • Или я НЕ создаю защищенные дочерние открытые ключи, когда использовал путь m/44'/0'/0'? Является ли код receivingAddress, который я создаю в приведенном выше коде, не закаленным? Это означает, что если кто-то сможет найти дочерние закрытые ключи одного пользователя и xpub, он сможет получить все закрытые ключи Чили?

Мои извинения за длинный вопрос. Я немного смущен тем, как кошельки могут создавать дочерние открытые ключи, не имея приватного ключа в кошельке.

Спасибо.

Я не вижу нигде в вашем коде, где вы получаете дочерние ключи. Все, что я вижу, это то, что вы сгенерировали 3 пары закрытых/открытых ключей и сделали из них мультиподпись. Ничего особенного.
Спасибо, Эндрю. В чем разница между получением дочерних ключей и созданием дочерних ключей? Я пытаюсь создать дочерние ключи для пользователей системы, чтобы у них был адрес получателя. В чем мое непонимание? А затем позже мне нужно сгенерировать соответствующие дочерние закрытые ключи, чтобы потратить монеты, полученные на этот адрес. Поэтому я хочу иметь возможность генерировать эти закрытые ключи из файла index.
получение дочерних ключей и генерация дочерних ключей означают одно и то же. Но, AFAICT, вы вообще не делаете этого в своем коде.
@AndrewChow Большое спасибо. Не могли бы вы сказать мне, что это происходит createAddress()? Разве он не генерирует дочерний ключ? Каждый раз, когда я звоню, createAddress()он генерирует новый дочерний адрес с определенным индексом. Что я тут недопонимаю.
Я не знал, что createAddress()создается новый адрес. Если это так, он не получает защищенные адреса, особенно если вы дали ему только xpub.

Ответы (1)

Вы не получаете защищенные дочерние ключи. Вы не можете получить защищенные ключи от xpub. То, что сам xpub усилен, не означает, что его потомки защищены.

Спасибо, Андрей. Это, вероятно, причина. Если у вас есть идеи, как явно генерировать защищенные дочерние ключи, поделитесь ими.