1. Биткоин адрес
Биткоин-адрес -- это то, чем вы делитесь с миром, чтобы получать какие-либо платежи. Вы, наверное, знаете, что ваш "кошелек", использует приватный ключ, чтобы потратить деньги, которые вы получили на свой биткоин-адрес. Он (биткоин-адрес) состоит из закодированного Base58check'ом хэша вашего публичного ключа и некоторой информации о сетевом адресе. Кодирование в Base58Check имеет некоторые интересные особенности, такие как "контрольные суммы" (checksums), чтобы предотвратить опечатки и неоднозначности символов, таких как "О" и "0".ФАКТ: TestNet - биткоин-сеть для целей развития технологий, биткоины в этой сети ничего не стоят. MainNet - биткоин-сеть, которая известна всем.Вы можете не знать насколько Blockchain is concerned (обеспокоен), в нём нет понятия "биткоин-адрес". Внутри, протокол Биткоин идентифицирует получателя биткоинов по ScriptPubKey. В ScriptPubKey есть небольшой сценарий, который объясняет, какие условия должны быть соблюдены, чтобы подтвердить владение биткоинами. Постепенно мы будем погружать в типы инструкций, которые могут быть представлены в ScriptPubKey, всё это будет при прохождении уроков из этой книги. В ScriptPubKey может содержаться хэш публичного ключа(-ей) разрешения тратить биткоины.
ФАКТ: Практическое программирование Bitcoin в MainNet делают ошибки более запоминающимися.
Эта схема иллюстрирует взаимоотношения между публичным ключем, приватным ключом, биткоин-адресом и ScriptPubKey
Теперь мы можем показать взаимоотношения в коде.
Откройте Chapter1.CS, добавьте using NBitcoin; затем создайте следующий метод:
<pre class="brush: csharp">public void Lesson1()
{
Key key = new Key(); //генерация нового приватного ключа.
PubKey pubKey = key.PubKey; //получаем соответствующий публичный ключ.
Console.WriteLine("Public Key: {0}", pubKey);
KeyId hash = pubKey.Hash; // получаем хэш публичного ключа.
Console.WriteLine("Hashed public key: {0}", hash);
BitcoinPubKeyAddress address = pubKey.GetAddress(Network.Main); // извлекаем биткоин-адрес.
Console.WriteLine("Address: {0}", address);
Script scriptPubKeyFromAddress = address.ScriptPubKey;
Console.WriteLine("ScriptPubKey from address: {0}", scriptPubKeyFromAddress);
Script scriptPubKeyFromHash = hash.ScriptPubKey;
Console.WriteLine("ScriptPubKey from hash: {0}", scriptPubKeyFromHash);
}</pre>
Публичный ключ: 02fc2e5ab52c89f3bfbbbd702254ab9fc7134173e5682b69bf740c3d0bf6bfc4ce
Хэшированный публичный ключ: 1b2da6ee52ac5cd5e96d2964f12a0241851f8d2a
Адрес: 13Uhw9BmdaXbnjDXiEd4HU4yesj7kKjxCo
ScriptPubKey для адреса: OP_DUP OP_HASH160 1b2da6ee52ac5cd5e96d2964f12a0241851f8d2a
OP_EQUALVERIFY OP_CHECKSIG
ScriptPubKey для хэша: OP_DUP OP_HASH160 1b2da6ee52ac5cd5e96d2964f12a0241851f8d2a
OP_EQUALVERIFY OP_CHECKSIG
Нажмите F5 и проверьте результат. Вы только что узнали, как создать приватный ключ соответствующий публичному ключу, хэш публичного ключа, адрес и scriptPubKey. Мы пока не будем вдаваться в подробности, но учтите, что scriptPubKey не имеет ничего общего с биткоин-адресом, но он показывает хэш открытого ключа. Обратите внимание, как мы могли генерировать ScriptPubKey от биткоин-адреса? Этот шаг проходят все биткоин-клиенты, чтобы перевести "дружественный человеку" биткоин-адрес в читаемый блокчейн адрес.
Биткоин-адрес состоит из идентификатора сети и хэша публичного ключа.
Зная это можно сгенерировать биткоин-адрес для scriptPubKey и сетевой идентификатор, как показано в слудющем коде
public void Lesson2()
{
Script scriptPubKey = new Script("OP_DUP OP_HASH160
1b2da6ee52ac5cd5e96d2964f12a0241851f8d2a OP_EQUALVERIFY OP_CHECKSIG");
BitcoinAddress address = scriptPubKey.GetDestinationAddress(Network.Main);
Console.WriteLine("Bitcoin Address: {0}", address);
}
Bitcoin-адрес: 13Uhw9BmdaXbnjDXiEd4HU4yesj7kKjxCo
Также можно получить хэш от scriptPubKey и сгенерировать биткоин-адрес от него, как мы показали это Lesson1().
public void Lesson3()
{
Script scriptPubKey = new Script("OP_DUP OP_HASH160
1b2da6ee52ac5cd5e96d2964f12a0241851f8d2a OP_EQUALVERIFY OP_CHECKSIG");
KeyId hash = (KeyId)scriptPubKey.GetDestination();
Console.WriteLine("Public Key Hash: {0}", hash);
BitcoinAddress address = new BitcoinPubKeyAddress (hash, Network.Main);
Console.WriteLine("Bitcoin Address: {0}", address);
}
Хэш публичного ключа: 1b2da6ee52ac5cd5e96d2964f12a0241851f8d2a
Bitcoin-адрес: 13Uhw9BmdaXbnjDXiEd4HU4yesj7kKjxCo
ФАКТ: хэш публичного ключа генерируется путем выполнения хэширование SHA256 на публичном ключе, а затем выполняется хэширование RIPEMD160 над результатом, с обратным порядком байтов. Функция может выглядеть так: RIPEMD160(SHA256(pubkey))
Итак, теперь вы понимаете взаимоотношения между приватным ключом, публичным ключом, хэшем публичного ключа, биткоин-адресом и scriptPubKey.
Приватные ключи часто представляются в Base58Check и называются Bitcoin Secret (также известный как Формат импорта кошелька или WIF), как биткоин адреса.
Для оставшейся части книги вы будете использовать адрес, который вы сгенерировали для себя.
Заметьте, что можно легко перейти от Bitcoin Secret к приватному ключу. Важно помнить, что невозможно перейти от биткоин-адреса к публичному ключу, потому что биткоин-адрес содержит хэш открытого ключа, а не сам публичный ключ.
public void Lesson4()
{
Key key = new Key();
BitcoinSecret secret = key.GetBitcoinSecret(Network.Main);
Console.WriteLine("Bitcoin Secret: {0}", secret);
}
Bitcoin Secret: KyVVPaNYFWgSCwkvhMG3TruG1rUQ5o7J3fX7k8w7EepQuUQACfwE
Скопируете Bitcoin Secret и добавьте нижеследующий код в ваш главный метод в Program.cs, подставляя Bitcoin Secret, вы получили тот, который мы ввели.
BitcoinSecret paymentSecret = new
BitcoinSecret("KyVVPaNYFWgSCwkvhMG3TruG1rUQ5o7J3fX7k8w7EepQuUQACfwE");
Упражнение: обратите внимание на свой собственный сгенерированный приватный ключ, который будет использоваться в других частях этой книги, вместе с его адресом.
Я буду хранить приватный ключ в переменой BitcoinSecret paymentSecret для остальных частей этой книги.
Упражнение: получите биткоин-адрес paymentSecret, сохраните его в paymentAddress и пошлите определенную сумму на этот адрес из Bitcoin Core. Отправьте что-то типа 0,01 BTC, вы можете увеличить, если чувствуете себя более уверено ;)
2. Транзакции
До того, как мы начнем, не забудьте создать новый chapter класс.
Транзакции это перевод биткоинов. Транзакции могут не иметь получателей или же иметь их несколько. То же самое может быть сказано для отправителей! В Blockchain, отправитель и получатель всегда абстрагированы с scriptPubKey, как это будет показано в главе 10. Мы будем двигаться вперед предполагая, что вы выполнили урок 4 и ассоциированные с ним упражнения. Если Вы не выполнили упражнения, пожалуйста, отправьте деньги по адресу, который вы создали, прежде чем продолжить.
Если вы используете Bitcoin Core ваша вкладка "Транзакции" будут отображать транзакцию, как например здесь:
Сейчас мы заинтересованы в идентификаторе транзакции. В этом примере это f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d87a4a2d94
Вы можете просматривать транзакции на сайте типа Blockchain.info, но как Разработчик, вы, вероятно, хотите сервис, который легче для запросов и анализа. На момент написания этой статьи, мы находим Blockr.io лучшим сервисом для этой задачи.
Если вы перейдете на: http://btc.blockr.io/api/v1/tx/raw/f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d 87a4a2d94 вы увидите необработанные байты вашей сделки
.
Транзакции это перевод биткоинов. Транзакции могут не иметь получателей или же иметь их несколько. То же самое может быть сказано для отправителей! В Blockchain, отправитель и получатель всегда абстрагированы с scriptPubKey, как это будет показано в главе 10. Мы будем двигаться вперед предполагая, что вы выполнили урок 4 и ассоциированные с ним упражнения. Если Вы не выполнили упражнения, пожалуйста, отправьте деньги по адресу, который вы создали, прежде чем продолжить.
Если вы используете Bitcoin Core ваша вкладка "Транзакции" будут отображать транзакцию, как например здесь:
Сейчас мы заинтересованы в идентификаторе транзакции. В этом примере это f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d87a4a2d94
TransactionId определяется через SHA256(SHA256(txbytes))
Не используйте TransactionId для обработки неподтвержденных транзакций. TransactionId можно манипулировать, прежде чем она подтверждается. Это называется “гибкость транзакций.” ("Transaction Malleability").
Вы можете просматривать транзакции на сайте типа Blockchain.info, но как Разработчик, вы, вероятно, хотите сервис, который легче для запросов и анализа. На момент написания этой статьи, мы находим Blockr.io лучшим сервисом для этой задачи.
Если вы перейдете на: http://btc.blockr.io/api/v1/tx/raw/f13dc48fb035bbf0a6e989a26b3ecb57b84f85e0836e777d6edf60d 87a4a2d94 вы увидите необработанные байты вашей сделки
.
NBitcoin запрашивает blockr и анализирует информацию для вас, поэтому вам не придется делать это вручную.
public void Lesson1()
{
var blockr = new BlockrTransactionRepository()
Transaction transaction = blockr.Get("4ebf7f7ca0a5dafd10b9bd74d8cb93a6eb0831bcb637fec8e8aabf842f1c2688");
Console.WriteLine(transaction.ToString())
}
"hash": "4ebf7f7ca0a5dafd10b9bd74d8cb93a6eb0831bcb637fec8e8aabf842f1c2688",
"ver": 1,
"vin_sz": 1,
"vout_sz": 2,
"lock_time": 0,
"size": 225,
"in": [
{
"prev_out": {
"hash": "bf7d91ac70917f98b497927e1b07267507652b206df14ecdba2e9390b9bffc65",
"n": 0
},
"scriptSig":
"3044022069b6b0f1a8d453bdb89e3ad475232b8e01d2851e7b53acab3f830f40e80b3b5102203c049
867975360020293c735d48b4a2dda003aa781c1d8ccd2c7af290dcd11de01
02e3538427350039e67ea99e935cefb740badf3d09ebc301b0bc9d1bb0301a3417"
}
],
"out": [
{
"value": "0.08990000",
"scriptPubKey": "OP_DUP OP_HASH160 5b1d720daf0e95e37d0eaedd282b6ed9a40bab71
OP_EQUALVERIFY OP_CHECKSIG"
},
{
"value": "0.01000000",
"scriptPubKey": "OP_DUP OP_HASH160 71049fd47ba2107db70d53b127cae4ff0a37b4ab
OP_EQUALVERIFY OP_CHECKSIG"
}
]
Соответствующие разделы находятся в "in" и "out". Вы можете увидеть, что в "out" 0.0899 BTC были отправлен на один scriptPubKey, а 0.01 BTC были отправлены на другой. (Упражнение: проверьте хэш открытого ключа в этом ScriptPubKey он будет таким же, как и тот, который будет связан с вашим paymentAddress)
Если вы посмотрите на "in" Вы заметите ссылку на prev_out (предыдущего). Каждый "in" показывает вам источники "out" из которых были взяты BTC, которые были потрачены для того, чтобы финансировать эту сделку. Условия TxOut и Output являются синонимами "out".
Резюмируя, TxOut представляет собой сумму биткоинов и ScriptPubKey. (Получателя).
Каждый "out" имеет адрес определяемый идентификатором транзакции и индексом называемым "Outpoint". Для примера, Outpoint для out с 0.01 BTC в моей транзакции: (71049fd47ba2107db70d53b127cae4ff0a37b4ab, 1).
Теперь давайте взглянем на "in" (ака TxIn, Inputs) транзакции:
TxIn состоит из "Outpoint" в "prev_out" и "ScriptSig" называется также “документ, подтверждающий право собственности (Proof of Ownership).” В моем случае prev_out Outpoint'a - это: (7def8a69a7a2c14948f3c4b9033b7b30f230308b, 0)
Путем замены id транзакции в код, который мы писали для Lesson1 мы можем просмотреть информацию, связанные с этой сделкой. Мы могли бы продолжать отслеживать идентификаторы транзакций обратно в таком же порядке, пока мы не достигнем базы биткоинов, где они были добыты.
В нашем примере "prev_out" был для суммарным для 0.1 BTC. В этой транзакции .0899 BTC и .01 BTC которые послали. Это значит, что 0.0001 BTC не рассчитывается! Разница между входами и выходами называются трансакционными сборами или сборами майнеров. Это те деньги, что майнер собирает в том числе и для включения данной транзакции в блок.
3. Сущность и смысл Блокчейн
Вы, наверное, заметили, что, хотя мы доказали право расходование TxOut, но мы не знаем существует ли на самом деле этот TxOut. Вот где основная функция Блокчейна:
Блокчейн -- это база данных всех сделок, которые произошли с момента первой биткойн-транзакций, известных также как "Поколения" блоков.
Блокчейн дублируется по всему миру. Если вы используете Bitcoin Core, у вас есть весь Блокчейн на вашем компьютере. Если сделка появилась в blockchain, то уже нельзя отрицать, что этого непроисходило.
Майнеры -- это такие сущности, чья единственная цель - вставлять транзакции в blockchain. Когда новый набор транзакций добавляется, оно транслируется по сети в виде блока. Другие узлы в сети подтверждают новый блок подчиненный правилам, изложенным в протоколе bitcoin. Создание блока -- это очень дорогой процесс. Если майнер попытается включить недействительную транзакцию, несовместимую с другими узлами, то он не распознается как блок, и майнер теряет инвестиции, затраченные на создание блока.
Как только Майнер подтверждает блок все транзакции внутри считаются подтвержденными. Когда это происходит, все майнеры должны отказаться от своей нынешней работы и начать с новой транзакции. Когда блок подтвержден, то он записывается в блокчейн, и вероятность его отмены резко снижается с каждым последующим блоком.
Впервые в истории у нас есть база данных которая не может быть легко переписана, исключает необходимость доверять, противостоит цензуре и широко распространена. Сравнение блокчейна с реестром имеет значение только если рассматривать Биткоин как валюту.
Блокчейн -- это база данных, и вы придать смысл его данные. Как вы скоро обнаружите, биткойн-транзакции могут нести больше информации, чем просто переводы биткойн. Биткоин-транзакции -- это строка в базе данных, которые никогда не могут быть стерты.
Как пользователь, Вы можете проверить, что конкретная сделка существует в blockchain двумя различными способами:
Блокчейн -- это база данных всех сделок, которые произошли с момента первой биткойн-транзакций, известных также как "Поколения" блоков.
Блокчейн дублируется по всему миру. Если вы используете Bitcoin Core, у вас есть весь Блокчейн на вашем компьютере. Если сделка появилась в blockchain, то уже нельзя отрицать, что этого непроисходило.
Майнеры -- это такие сущности, чья единственная цель - вставлять транзакции в blockchain. Когда новый набор транзакций добавляется, оно транслируется по сети в виде блока. Другие узлы в сети подтверждают новый блок подчиненный правилам, изложенным в протоколе bitcoin. Создание блока -- это очень дорогой процесс. Если майнер попытается включить недействительную транзакцию, несовместимую с другими узлами, то он не распознается как блок, и майнер теряет инвестиции, затраченные на создание блока.
Как только Майнер подтверждает блок все транзакции внутри считаются подтвержденными. Когда это происходит, все майнеры должны отказаться от своей нынешней работы и начать с новой транзакции. Когда блок подтвержден, то он записывается в блокчейн, и вероятность его отмены резко снижается с каждым последующим блоком.
Впервые в истории у нас есть база данных которая не может быть легко переписана, исключает необходимость доверять, противостоит цензуре и широко распространена. Сравнение блокчейна с реестром имеет значение только если рассматривать Биткоин как валюту.
Блокчейн -- это база данных, и вы придать смысл его данные. Как вы скоро обнаружите, биткойн-транзакции могут нести больше информации, чем просто переводы биткойн. Биткоин-транзакции -- это строка в базе данных, которые никогда не могут быть стерты.
Как пользователь, Вы можете проверить, что конкретная сделка существует в blockchain двумя различными способами:
- Проверить всю цепочку блоков, которая на момент написания статьи составляет несколько гигабайт размером.
- Попросить частичный Меркель дерево, которое несколько килобайт. Мы будем говорить о Меркель деревьев больше, как он относится к простым подтверждения оплаты
4. Блокчейн это нечто большее, чем биткоины
Самое интересное, что эта же фраза используется двумя разными группами людей. Это используется как "Биткоин-Валюта" для верующих, как основной аргумент для их бычий прогноз значение bitcoin. Он также используется теми, кто не верит в успех валюты, как попытка объяснить, почему Биткоин имеет так много интереса.
Но есть одна вещь, с которой мы все согласны: неизменненность базы данных, которая не может быть подвергнута цензуре, подделана, или стерта, которая дублируется по всему миру и она будут иметь огромное влияние на другие отрасли промышленности.
Нотариусы, которые регистрируют факты, которые могут быть использованы в суде может хранить свои документы постоянно в blockchain. Аудиты могут стать автоматические и доказуемы, когда активы и владения сохраняются и переносятся на blockchain. Все денежные движения могут доказать свою платежеспособность публично. Автоматические торговые скрипты могут торговать между собой без человеческого вмешательства или разрешения центрального органа.
В остальной части этой книги мы будем изучать основы, необходимые, чтобы включить все эти технологии и многое другое. Но начнем мы с расхода биткоинов.
Но есть одна вещь, с которой мы все согласны: неизменненность базы данных, которая не может быть подвергнута цензуре, подделана, или стерта, которая дублируется по всему миру и она будут иметь огромное влияние на другие отрасли промышленности.
Нотариусы, которые регистрируют факты, которые могут быть использованы в суде может хранить свои документы постоянно в blockchain. Аудиты могут стать автоматические и доказуемы, когда активы и владения сохраняются и переносятся на blockchain. Все денежные движения могут доказать свою платежеспособность публично. Автоматические торговые скрипты могут торговать между собой без человеческого вмешательства или разрешения центрального органа.
В остальной части этой книги мы будем изучать основы, необходимые, чтобы включить все эти технологии и многое другое. Но начнем мы с расхода биткоинов.
5. Тратим ваши коины
Так что теперь, когда вы знаете, что такое биткоин-адрес, ScriptPubKey, приватный ключ, и майнеры, теперь вы сделаете свои первые транзакции вручную. Создайте новый класс с именем Chapter14 и метод с названием Lesson1. Далее в этой главе вы добавите код построчно, как это представлено построить метод, оставьте отзыв для книги в стиле сообщения Твиттера.
Давайте начнем смотреть на транзакции, которые, содержат TxOut, что вы хотите потратить, как мы это делали в главе 11.
var blockr = new BlockrTransactionRepository();
Transaction fundingTransaction = blockr.Get("0b948b0674a3dbd229b2a0b436e0fce8aa84e6de28b088c610d110c2bf54acb4");
В нашем примере мы хотим отправить второй output:
"out": [
{
"value": "0.08990000",
"scriptPubKey": "OP_DUP OP_HASH160 5b1d720daf0e95e37d0eaedd282b6ed9a40bab71 OP_EQUALVERIFY OP_CHECKSIG"
},
{
"value": "0.01000000",
"scriptPubKey": "OP_DUP OP_HASH160 71049fd47ba2107db70d53b127cae4ff0a37b4ab OP_EQUALVERIFY OP_CHECKSIG"
}
]
Для оплаты вам нужно будет ссылаться на этот "output" в транзакции. Вы создаете транзакцию след.образом:
Transaction payment = new Transaction();
payment.Inputs.Add (new TxIn()
{
PrevOut = new OutPoint(fundingTransaction.GetHash(), 1)
});
Теперь давайте позаботимся о "Outputs". Мы посылаем 0.004 BTC, и так мы потратили 0.01 BTC, мы хотим вернуть обратно 0.006 BTC. Вы также даёте определенную плату майнерам, чтобы стимулировать их добавить данную транзакцию в следующий блок. И так вы возвращаете обратно 0.0059 BTC.
Давайте начнем смотреть на транзакции, которые, содержат TxOut, что вы хотите потратить, как мы это делали в главе 11.
var blockr = new BlockrTransactionRepository();
Transaction fundingTransaction = blockr.Get("0b948b0674a3dbd229b2a0b436e0fce8aa84e6de28b088c610d110c2bf54acb4");
В нашем примере мы хотим отправить второй output:
"out": [
{
"value": "0.08990000",
"scriptPubKey": "OP_DUP OP_HASH160 5b1d720daf0e95e37d0eaedd282b6ed9a40bab71 OP_EQUALVERIFY OP_CHECKSIG"
},
{
"value": "0.01000000",
"scriptPubKey": "OP_DUP OP_HASH160 71049fd47ba2107db70d53b127cae4ff0a37b4ab OP_EQUALVERIFY OP_CHECKSIG"
}
]
Для оплаты вам нужно будет ссылаться на этот "output" в транзакции. Вы создаете транзакцию след.образом:
Transaction payment = new Transaction();
payment.Inputs.Add (new TxIn()
{
PrevOut = new OutPoint(fundingTransaction.GetHash(), 1)
});
Теперь давайте позаботимся о "Outputs". Мы посылаем 0.004 BTC, и так мы потратили 0.01 BTC, мы хотим вернуть обратно 0.006 BTC. Вы также даёте определенную плату майнерам, чтобы стимулировать их добавить данную транзакцию в следующий блок. И так вы возвращаете обратно 0.0059 BTC.
Адрес для доната этой книги: 1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB
var programmingBlockchain =
BitcoinAddress.Create("1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB");
payment.Outputs.Add(new TxOut()
{
Value = Money.Coins(0.004m),
ScriptPubKey = programmingBlockchain.ScriptPubKey
});
payment.Outputs.Add(new TxOut()
{
Value = Money.Coins(0.0059m),
ScriptPubKey = paymentAddress.ScriptPubKey
});
Now add your feedback! This must be less than 40 bytes, or it will crash the application.
//Feedback !
var message = "Thanks ! :)";
var bytes = Encoding.UTF8.GetBytes(message);
payment.Outputs.Add(new TxOut()
{
Value = Money.Zero,
ScriptPubKey = TxNullDataTemplate.Instance.GenerateScriptPubKey(bytes)
});
Console.WriteLine(payment);
{
"hash": "258ed68ac5a813fe95a6366d94701314f59af1446dda2360cf6f8e505e3fd1b6",
"ver": 1,
"vin_sz": 1,
"vout_sz": 3,
"lock_time": 0,
"size": 166,
"in": [
{
"prev_out": {
"hash": "4ebf7f7ca0a5dafd10b9bd74d8cb93a6eb0831bcb637fec8e8aabf842f1c2688",
"n": 1
},
"scriptSig": ""
}
],
"out": [
{
"value": "0.00400000",
"scriptPubKey": "OP_DUP OP_HASH160 c81e8e7b7ffca043b088a992795b15887c961592
OP_EQUALVERIFY OP_CHECKSIG"
},
{
"value": "0.00590000",
"scriptPubKey": "OP_DUP OP_HASH160 71049fd47ba2107db70d53b127cae4ff0a37b4ab
OP_EQUALVERIFY OP_CHECKSIG"
},
{
"value": "0.00000000",
"scriptPubKey": "OP_RETURN
42696c6c20537472616974206973207570646174696e672073637265656e73686f74732e"
}
]
}
Now that we have created the transaction, we must sign it. In other words, you will have to prove
that you own the TxOut that you referenced in the input.
Signing can be complicated. Refer to
https://en.bitcoin.it/w/images/en/7/70/Bitcoin_OpCheckSig_InDetail.png for details. But we’ll make
it simple.
First insert the scriptPubKey in the scriptSig.
Since the scriptPubKey is nothing but paymentAddress.ScriptPubKey this is simple.
Then you need to give your private key for signing.
payment.Inputs[0].ScriptSig = paymentAddress.ScriptPubKey;
//also OK :
//payment.Inputs[0].ScriptSig = fundingTransaction.Outputs[1].ScriptPubKey;
payment.Sign(paymentSecret, false);
"in": [
{
"prev_out":
{
"hash": "4ebf7f7ca0a5dafd10b9bd74d8cb93a6eb0831bcb637fec8e8aabf842f1c2688",
"n": 1
},
"scriptSig":
"3045022100d4d8d4e1e3205399e0ab899e95bd6c7b65a094c9b86c4b020872428864a5c63502206f9
d0b3084e4a7895de520069a939347909471ca118a43723fd8734cd8e8bcac01
03e0b917b43bb877ccb68c73c82165db6d01174f00972626c5bea62e64d57dea1a"
}
]
Congratulations, you have signed your first transaction! Your transaction is ready to roll! All that is
left is to propagate it to the network so the miners can see it. Be sure to have Bitcoin Core running
and then:
using (var node = Node.ConnectToLocal(Network.Main)) //Connect to the node
{
node.VersionHandshake(); //Say hello
//Advertize your transaction (send just the hash)
node.SendMessage(new InvPayload(InventoryType.MSG_TX, payment.GetHash()));
//Send it
node.SendMessage(new TxPayload(payment));
Thread.Sleep(500); //Wait a bit
}
Используя блок кода будет заботиться о закрытия подключения к узлу. Что это!
Вы также можете напрямую подключаться к сети bitcoin, однако я советую вам подключить к вашей собственной доверенных узлов (быстрее и проще)
6. Доказательство собственности в качестве метода проверки подлинности
Когда я выпущу последующие главы, я буду аутентификацировать вас с помощью ключа, который Вы использовали, чтобы заплатить мне.
Ты помнишь, когда я сказал:
Address: 1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB
Signature: H1jiXPzun3rXi0N9v9R5fAWrfEae9WPmlL5DJBj1eTStSvpKdRR8Io6/uT9tGH/3OnzG6ym5yytuWoA9ahk
C3dQ=
Message: Nicolas Dorier Book Funding Address
Это является доказательством, что я владелец закрытого ключа книги.
Вы можете убедиться, что это верно со следующим кодом.
var address = new BitcoinPubKeyAddress("1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB");
var msg = "Nicolas Dorier Book Funding Address";
var sig =
"H1jiXPzun3rXi0N9v9R5fAWrfEae9WPmlL5DJBj1eTStSvpKdRR8Io6/uT9tGH/3OnzG6ym5yytuWoA9a
hkC3dQ=";
Console.WriteLine(address.VerifyMessage(msg, sig));
True
И это то, что я буду использовать для аутентификации.
Так что если я вызову вас:
Message: “Prove me you are 1LUtd66PcpPx64GERqufPygYEWBQR2PUN6”
Вы можете доказать это с вашего закрытого ключа следующим образом
msg = "Prove me you are 1LUtd66PcpPx64GERqufPygYEWBQR2PUN6";
sig = paymentSecret.PrivateKey.SignMessage(msg);
Console.WriteLine(paymentSecret.GetAddress().VerifyMessage(msg, sig));
True
Это как вам будет предложено подтвердить свою личность на http://blockchainprogramming.azurewebsites.net/
Ты помнишь, когда я сказал:
Address: 1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB
Signature: H1jiXPzun3rXi0N9v9R5fAWrfEae9WPmlL5DJBj1eTStSvpKdRR8Io6/uT9tGH/3OnzG6ym5yytuWoA9ahk
C3dQ=
Message: Nicolas Dorier Book Funding Address
Это является доказательством, что я владелец закрытого ключа книги.
Вы можете убедиться, что это верно со следующим кодом.
var address = new BitcoinPubKeyAddress("1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PB");
var msg = "Nicolas Dorier Book Funding Address";
var sig =
"H1jiXPzun3rXi0N9v9R5fAWrfEae9WPmlL5DJBj1eTStSvpKdRR8Io6/uT9tGH/3OnzG6ym5yytuWoA9a
hkC3dQ=";
Console.WriteLine(address.VerifyMessage(msg, sig));
True
И это то, что я буду использовать для аутентификации.
Так что если я вызову вас:
Message: “Prove me you are 1LUtd66PcpPx64GERqufPygYEWBQR2PUN6”
Вы можете доказать это с вашего закрытого ключа следующим образом
msg = "Prove me you are 1LUtd66PcpPx64GERqufPygYEWBQR2PUN6";
sig = paymentSecret.PrivateKey.SignMessage(msg);
Console.WriteLine(paymentSecret.GetAddress().VerifyMessage(msg, sig));
True
Это как вам будет предложено подтвердить свою личность на http://blockchainprogramming.azurewebsites.net/









Комментариев нет:
Отправить комментарий