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#.
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.
////////////////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
Nicolás Dorier
Nick ODell
Nicolás Dorier
haddar macdasi
Nicolás Dorier
código o si no