So verwenden Sie NBitcoin für BIP32-Geldbörsen

Ich verwende c# NBitcoin, um den Hauptschlüssel auf einem Offline-Server zu generieren

ExtKey privateKey = new ExtKey("[My seed]");
ExtPubKey pubKey = privateKey.Neuter();

Ich muss dem Online-Server den öffentlichen Hauptschlüssel geben, und er kann so viele Adressen generieren, wie er benötigt. Meine Fragen sind:

Wie übergebe ich den öffentlichen Hauptschlüssel ( pubKey ) an diesen Code im Online-Server?

BitcoinAddress address1 = **pubKey**.Derive([some client data]).PubKey.GetAddress(Network.Main);

Was ist die beste Vorgehensweise, um auf eine Zahlung zu hören, die an dieser neuen Adresse eingegangen ist? Ich arbeite mit Webanfragen an http://btc.blockr.io/api/v1/address/unconfirmed/[address1]
Meine Sprache ist c# serverseitig.

Antworten (2)

wenn du tust

BitcoinAddress address1 = **pubKey**.Derive([some client data]).PubKey.GetAddress(Network.Main);

Sie erhalten die Bitcoin-Adresse, aber nicht den öffentlichen Hauptschlüssel. (ExtPubKey) Ein HD Pub Key enthält mehr Informationen als nur den Pubkey.

Der richtige Code ist

string wifStr = **pubkey**.Derive([some client data]).ToString(Network.Main)

Dann kannst du es neu laden

ExtPubKey key = ExtPubKey.Parse(wifStr)

Tatsächlich hat das String-Format eines ExtPubKey das Netzwerk, zu dem es gehört, deshalb haben Sie auch den Typ „BitcoinExtKey“, der in objektorientierter Form beides darstellt: den ExtPubKey UND das Netzwerk. Wenn du es brauchst :

BitcoinExtPubKey wif = **pubkey**.GetWif(Network.Main)

Werfen Sie einen Blick in mein Buch , es gibt andere Codebeispiele rund um HD-Schlüssel.

Bezüglich der Best Practices gibt es derzeit keine Patentlösung. Ich habe eine API namens RapidBase erstellt, mit der Sie eine Brieftasche erstellen und Adressen hinzufügen können, die in dieser Brieftasche überwacht werden sollen. (Sie finden es auf github)

Sie können es versuchen, wenn Sie möchten, aber es ist im Moment sehr instabil (API-weise), also erwarten Sie, dass sich die Dinge in Zukunft ändern werden. Wenn Sie blockr verwenden, ist es meiner Meinung nach am besten, jede Adresse so anzufordern, wie Sie es tun.

Wenn Sie bitcoinq RPC verwenden, können Sie eine Adresse hinzufügen, aber es dauert einige Zeit, da der Bitcoin-Kern die Blockchain jedes Mal neu scannt, um die relevanten Transaktionen abzurufen.

Ich könnte mich irren, aber im Moment gibt es keine einfach zu verwendende Lösung, mit Ausnahme von Rapidbase, die ich entwickelt habe, die im Moment nicht sehr stabil ist.

Aber er interessiert sich nicht für den Chaincode - er braucht den erweiterten untergeordneten Schlüssel nicht. Was er braucht, ist eine Möglichkeit, eine Adresse zu überwachen.
Nun, dies ist eine zweiteilige Frage: "Wie übergebe ich den öffentlichen Hauptschlüssel (pubKey) an diesen Code im Online-Server?" Dies ist eine Antwort auf diese. Ich bearbeite die Antwort auf seine zweite Frage.
Ah ich sehe. Ich habe die erste Frage nicht gesehen.
hab den zweiten nicht gesehen :D
Siehe meine Antwort, ich wollte das Neutrum speichern, damit ich es als öffentlichen Hauptschlüssel verwenden kann, aus dem alle untergeordneten Elemente erstellt wurden. Wenn ich die wifStr speichere und auf dem Online-Server veröffentliche, wenn ein Hacker die wifStr findet, kann er daraus den privaten Hauptschlüssel erstellen?
Sie haben eine wif-Version von beiden: ExtKey und ExtPubKey, wenn Sie den ExtKey haben und den ExtPubKey wollen, tun Sie einfach extKey.Neuter().ToString(Network.Main)
@NicolasDorier Ihr Buch scheint interessant, aber der Link "neue Version" funktioniert nicht, nur der "alte Version"?
////////////////1st offline SERVER//////////////////
//Create Master Private Key with a seed
ExtKey privateKey = new ExtKey("16236c2028fd2018eb7049825e6b4f0191de4dbff003579918de7b7348ff06ac");
//create master public key from this privateKey
ExtPubKey pubKey = privateKey.Neuter();
//save it's wifStr as key to the next server to use and generate all child keys 
string wifStr = pubKey.ToString(Network.Main);
////////////////END//////////////////



////////////////2nd online SERVER//////////////////
ExtPubKey key = ExtPubKey.Parse(wifStr);
//The payment server receive an order, note the server does not need the private key to generate the address
uint orderID = 1001;
BitcoinAddress address = key.Derive(orderID).PubKey.GetAddress(Network.Main);
Console.WriteLine(address);
////////////////END//////////////////


////////////////3rd admin SERVER//////////////////
//Now on the server that have access to the private key, you get the private key from the orderID
ExtKey mPrivateKey = new ExtKey("16236c2028fd2018eb7049825e6b4f0191de4dbff003579918de7b7348ff06ac");
Key key1 = mPrivateKey.Derive(orderID).Key;
BitcoinSecret secret = key1.GetBitcoinSecret(Network.Main);
Console.WriteLine(secret); //Print a nice secret key string
////////////////END//////////////////
der Code ist richtig, außer dass new ExtKey(string) nicht existiert. Wenn Sie den privaten ExtKey haben, verwenden Sie ExtKey.ToString(Network) / ExtKey.Parse(wif)