Gehärtete Adressgenerierung mit BIP44 Watch-Only-Wallet mit xpub

Ich bin verwirrt über die Ableitung des gehärteten Schlüssels aus einer BIP44-Wallet, die nur auf Uhren beschränkt ist.

Lassen Sie mich zunächst erklären, was ich versuche zu tun.

  • Ich implementiere ein 2-von-3-Multisig-Schema
  • Ich verwende Bcoin Node und Wallet
  • Alle 3 Schlüssel werden extern generiert
  • Ich möchte die Bcoin-Wallet nur für die Uhr verwenden

ts zum Erstellen von Adressen und Skripten

Das habe ich bisher gemacht:

  1. Erstellte 3 xprv-Schlüssel und xpubs-Schlüssel mit diesem Tool hier
  2. Ich habe den benutzerdefinierten Pfad verwendet m/44'/0'/0', um gehärtete Schlüssel zu haben, da Bcoin Wallet gehärtete BIP44-Schlüssel benötigt
  3. Ich habe mit den Schlüsseln 3 Nur-Uhr- Geldbörsen erstellt xpub.
  4. Dann habe ich jeden der Schlüssel als gemeinsame Schlüssel zueinander hinzugefügt (ich muss dies wirklich nur für eine Brieftasche tun)

Der Code ist wie folgt:

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);

Jetzt habe ich eine 2-von-3-Multisig-Wallet nur für die Uhr erstellt. Was ich jetzt tun möchte, ist, Adressen zu erstellen. Ich möchte keine weiteren untergeordneten erweiterten Schlüssel ableiten. Ich brauche nur eine Ableitungsebene. Jetzt möchte ich Multisig-Adressen für meine Benutzer erstellen.

// 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); 

Ich habe das Gefühl, dass ich diesen Schritt auf Umwegen mache, aber Sie verstehen, was ich versuche.

Um es noch einmal zu sagen, was ich jetzt tun möchte, ist, individuelle Empfangsadressen für meine Benutzer und die entsprechenden P2SH-Skripte zu erstellen.

Nun, das ist es, was ich brauche, um es zu verstehen .

  • Laut BIP32 können Sie mit CDKpub keine gehärteten öffentlichen Schlüssel ableiten. Sie benötigen xprv, um untergeordnete Schlüssel abzuleiten.
  • Aus dem, was ich getan habe, kann ich jedoch öffentliche untergeordnete Schlüssel ableiten. receivingAddressIch habe Testetnet-Münzen an diese Adressen ( im obigen Code) gesendet und sie funktionieren. Die Brieftasche nimmt Coins auf.
  • Wie konnte die Watch-Only-Wallet dann gehärtete untergeordnete öffentliche Schlüssel erstellen? Ich habe keine Eingaben xprvin die Brieftasche gemacht.
  • Oder erstelle ich KEINE gehärteten öffentlichen untergeordneten Schlüssel, wenn ich den Pfad verwendet habe m/44'/0'/0'? Ist das, receivingAddresswas ich im obigen Code erstelle, kein gehärteter? Das heißt, wenn jemand in der Lage ist, die untergeordneten privaten Schlüssel eines Benutzers und der zu finden xpub, kann er alle chilenischen privaten Schlüssel ableiten?

Ich entschuldige mich für die lange Frage. Ich bin etwas verwirrt darüber, wie die Brieftaschen öffentliche untergeordnete Schlüssel erstellen können, ohne einen privaten Schlüssel in der Brieftasche zu haben.

Danke schön.

Ich sehe nirgendwo in Ihrem Code, wo Sie untergeordnete Schlüssel ableiten. Ich sehe nur, dass Sie 3 private/öffentliche Schlüsselpaare generiert und daraus ein Multisig gemacht haben. Das ist nichts Besonderes.
Danke Andreas. Was ist der Unterschied zwischen dem Ableiten von untergeordneten Schlüsseln und dem Generieren von untergeordneten Schlüsseln? Was ich versuche, ist, untergeordnete Schlüssel für Benutzer des Systems zu generieren, damit sie eine Empfangsadresse haben. Was ist mein Missverständnis? Und später muss ich die entsprechenden untergeordneten privaten Schlüssel generieren, um die erhaltenen Münzen an diese Adresse auszugeben. Also möchte ich in der Lage sein, diese privaten Schlüssel aus dem Index zu generieren.
Das Ableiten von untergeordneten Schlüsseln und das Generieren von untergeordneten Schlüsseln bedeuten dasselbe. Aber, AFAICT, das machen Sie in Ihrem Code überhaupt nicht.
@AndrewChow Vielen Dank. Können Sie mir freundlicherweise sagen, woran es liegt createAddress()? Generiert es keinen untergeordneten Schlüssel? Jedes Mal, wenn ich es aufrufe, createAddress()wird eine neue untergeordnete Adresse mit einem bestimmten Index generiert. Was verstehe ich hier falsch.
Ich war mir nicht bewusst, dass createAddress()eine neue Adresse erstellt wird. Wenn dies der Fall ist, werden keine gehärteten Adressen abgeleitet, insbesondere wenn Sie ihm nur einen xpub gegeben haben.

Antworten (1)

Sie leiten keine gehärteten untergeordneten Schlüssel ab. Sie können keine gehärteten Schlüssel von einem xpub ableiten. Nur weil der xpub selbst gehärtet ist, heißt das nicht, dass seine Kinder es sind.

Danke Andreas. Das ist wahrscheinlich der Grund. Wenn Sie eine Idee haben, wie Sie gehärtete untergeordnete Schlüssel explizit generieren können, teilen Sie dies bitte mit.