Я использую С# NBitcoin для генерации главного ключа на автономном сервере.
ExtKey privateKey = new ExtKey("[My seed]");
ExtPubKey pubKey = privateKey.Neuter();
Мне нужно будет дать онлайн-серверу главный открытый ключ, и он может генерировать столько адресов, сколько ему нужно, мои вопросы:
Как передать главный открытый ключ ( pubKey ) этому коду на онлайн-сервере?
BitcoinAddress address1 = **pubKey**.Derive([some client data]).PubKey.GetAddress(Network.Main);
Как лучше всего прослушивать платеж, полученный на этот новый адрес? Я работаю с веб-запросами на http://btc.blockr.io/api/v1/address/unconfirmed/[address1]
. Мой язык — серверная часть С#.
когда ты делаешь
BitcoinAddress address1 = **pubKey**.Derive([some client data]).PubKey.GetAddress(Network.Main);
Вы получаете биткойн-адрес, но не главный открытый ключ. (ExtPubKey) Публичный ключ HD содержит больше информации, чем просто публичный ключ.
Правильный код
string wifStr = **pubkey**.Derive([some client data]).ToString(Network.Main)
Затем вы можете перезагрузить его
ExtPubKey key = ExtPubKey.Parse(wifStr)
Фактически, строковый формат ExtPubKey имеет сеть, к которой он принадлежит, поэтому у вас также есть тип «BitcoinExtKey», который представляет в объектно-ориентированной форме как ExtPubKey, так и сеть. Если вам это нужно:
BitcoinExtPubKey wif = **pubkey**.GetWif(Network.Main)
Взгляните на мою книгу , там есть другие примеры кода для HD-ключей.
Что касается лучших практик, то сейчас нет серебряной пули. Я создал API под названием RapidBase, который позволяет вам создавать кошелек и добавлять адреса для мониторинга в этом кошельке. (Вы можете найти его на github)
Вы можете попробовать его, если хотите, но пока он очень нестабилен (с точки зрения API), поэтому ожидайте, что в будущем все изменится. Если вы используете блокировщик, я думаю, что вам лучше всего запрашивать каждый адрес, как вы это делаете.
Если вы используете RPC bitcoinq, вы можете добавить адрес, но это требует времени, так как ядро биткойна будет каждый раз повторно сканировать блокчейн для получения соответствующих транзакций.
Я могу ошибаться, но на данный момент нет простого в использовании решения, исключение Rapidbase, которое я разработал, пока не очень стабильно.
////////////////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//////////////////
Ник Оделл
Николя Дорье
Ник Оделл
Николя Дорье
Хаддар Макдаси
Николя Дорье
КодОрЭлс