Как использовать NBitcoin для кошельков BIP32

Я использую С# 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]
. Мой язык — серверная часть С#.

Ответы (2)

когда ты делаешь

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, которое я разработал, пока не очень стабильно.

Но его не интересует чейнкод — ему не нужен расширенный дочерний ключ. Что ему нужно, так это способ контролировать адрес.
Что ж, это вопрос из двух частей: «Как мне передать главный открытый ключ (pubKey) в этот код на онлайн-сервере?» Это ответ на этот. Я редактирую ответ на его второй вопрос.
Ах я вижу. Я не видел первого вопроса.
второй не видел :D
Смотрите мой ответ, я хотел сохранить Neuter, чтобы использовать его в качестве основного открытого ключа, из которого созданы все дочерние элементы. Если я сохраню wifStr и опубликую его на онлайн-сервере, если какой-нибудь хакер найдет wifStr, сможет ли он создать из него главный закрытый ключ?
у вас есть wif-версия обоих: ExtKey и ExtPubKey, если у вас есть ExtKey и вы хотите ExtPubKey, просто выполните extKey.Neuter().ToString(Network.Main)
@NicolasDorier Ваша книга кажется интересной, но ссылка «новая версия» не работает, только ссылка «старая версия»?
////////////////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//////////////////
код правильный, за исключением того, что новый ExtKey (строка) не существует. Если у вас есть закрытый ExtKey, используйте ExtKey.ToString(Network)/ExtKey.Parse(wif)