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.
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.
////////////////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//////////////////
Nick Odell
Nicolas Dorier
Nick Odell
Nicolas Dorier
Haddar Macdasi
Nicolas Dorier
CodeOderElse