Cómo usar NBitcoin para billeteras BIP32

Estoy usando c# NBitcoin para generar una clave maestra en un servidor fuera de línea

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

Tendré que darle al servidor en línea la clave pública maestra, y puede generar tantas direcciones como necesite, mis preguntas son:

¿Cómo paso la clave pública maestra ( pubKey ) a este código en el servidor en línea?

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

¿Cuál es la mejor práctica para escuchar un pago recibido en esta nueva dirección? Estoy trabajando con solicitudes web a http://btc.blockr.io/api/v1/address/unconfirmed/[address1]
Mi idioma es el lado del servidor c#.

Respuestas (2)

cuando estas haciendo

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

Obtiene la dirección de bitcoin, pero no la clave pública maestra. (ExtPubKey) Una clave de publicación HD tiene más información que solo la clave de publicación.

El código correcto es

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

Entonces puedes recargarlo

ExtPubKey key = ExtPubKey.Parse(wifStr)

De hecho, el formato de cadena de una ExtPubKey tiene la Red a la que pertenece, es por eso que también tiene el tipo "BitcoinExtKey" que representa en forma orientada a objetos: la ExtPubKey Y la Red. Si lo necesitas :

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

Eche un vistazo a mi libro , hay otros ejemplos de código alrededor de las teclas HD.

En cuanto a las mejores prácticas, no hay una bala de plata en este momento. Creé una API llamada RapidBase que le permite crear una billetera y agregar direcciones para monitorear en esta billetera. (Puedes encontrarlo en github)

Puede probarlo si lo desea, pero es muy inestable por ahora (en cuanto a la API), así que espere que las cosas cambien en el futuro. Si está utilizando Blockr, creo que su mejor opción es solicitar cada dirección como lo está haciendo.

Si está utilizando bitcoinq RPC, puede agregar la dirección, pero lleva tiempo ya que el núcleo de bitcoin volverá a escanear la cadena de bloques para obtener las transacciones relevantes cada vez.

Puede que me equivoque, pero por ahora no hay una solución fácil de usar, excepto rapidbase que desarrollé, que no es muy estable por ahora.

Pero no está interesado en el código de cadena, no necesita la clave secundaria extendida. Lo que necesita es una forma de monitorear una dirección.
Bueno, esta es una pregunta de dos partes "¿Cómo paso la clave pública maestra (pubKey) a este código en el servidor en línea?" Esta es una respuesta a esta. Estoy editando la respuesta para su segunda pregunta.
Ah, ya veo. No vi esa primera pregunta.
no vi la segunda :D
Vea mi respuesta, quería guardar el Neutro para poder usarlo como la clave pública maestra a partir de la cual se crearon todos los niños. Si guardo el wifStr y lo publico en el servidor en línea si algún pirata informático encuentra el wifStr, ¿puede crear a partir de él la clave privada maestra?
tiene una versión wif de ambos: ExtKey y ExtPubKey, si tiene ExtKey y quiere ExtPubKey, simplemente haga extKey.Neuter().ToString(Network.Main)
@NicolasDorier Su libro parece interesante, pero el enlace de "nueva versión" no funciona, ¿solo el de "versión anterior"?
////////////////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//////////////////
el código es correcto, excepto que la nueva ExtKey (cadena) no existe. Si tiene la ExtKey privada, use ExtKey.ToString(Network) / ExtKey.Parse(wif)