четверг, 3 июля 2014 г.

Техническая информация биткоин

Терминология

 С Bitcoin сталкиваются как IT-специалисты, так и менее квалифицированные пользователи. В связи с этим, с одной стороны, сформировалась система бытовых терминов, используемая обычными пользователями, а с другой стороны, сформировалась система терминов для специалистов, которая в основном исходит от разработчиков Bitcoin-qt и Bitcoind. Расхождения касаются наиболее часто используемых терминов. 

Перечислим их: 
BTC — сокращенное название единиц учёта. Используется вместо слова «Bitcoin» для однозначного указания, что имеется в виду сама цифровая валюта, а не сеть, набор алгоритмов или какая-либо другая сущность, относящаяся к данной тематике. 
bitcoind — программа (демон), в которой реализован протокол Bitcoin, используемая посредством командной строки или удаленного вызова процедур (JSON-RPC). 
Bitcoin-qt — первая программа с графическим интерфейсом Qt, совместимая с bitcoind. 
Bitcoin можно также использовать и через другие программы. 
Пара ключей — публичный и приватный ключ. Используется для генерации адреса и подписывания транзакции на перевод BTC
Адрес — является идентификатором, содержащим около 33 алфавитно-цифровых символов. Используется как для получения, так и для отправки BTC. Представляет собой 160-битный хэш от открытого ключа ECDSA ключевой пары. 
Кошелёк — образное название для личного хранилища BTC (account) или всё аккаунты внутри wallet.dat. 
Account — понятие в протоколе Bitcoin для упрощения создания онлайн-сервиса с помощью bitcoind. Содержит некоторое количество ключевых пар и служебную информацию. Данные об аккаунтах и адресах хранятся в файле «wallet.dat»
В Bitcoin-qt аккаунты отображаются как метки. Не следует путать кошелёк как весь wallet.dat, аккаунт и адрес. 
Транзакция — запись о переводе BTC с одной группы адресов (0 и более) на другую группу адресов (1 и более). Содержит подписанный отправителем хеш транзакции с помощью которой отправитель ранее получил BTC и адреса получателей BTC
Блок — запись в цепочке блоков(базе данных), которая содержит в себе множество ожидающих подтверждения транзакций и подтверждает их. Хранение данных[править | править исходный текст] БД публично хранит в незашифрованном виде информацию о всех транзакциях, подписываемых с помощью асимметричного шифрования. Для предотвращения многократной траты одной и той же суммы используются метки времени, реализованные путём разбиения БД на цепочку специальных блоков, каждый из которых, в числе прочего, содержит в себе хеш предыдущего блока и свой порядковый номер. Каждый новый блок осуществляет подтверждение транзакций, информацию о которых содержит и дополнительное подтверждение транзакций во всех предыдущих блоках цепочки. Для уменьшения размера БД используется древовидное хеширование Для более наглядного объяснения механизма работы платёжной системы Сатоси Накамото ввёл понятие «цифровая монета», определив его как цепочку цифровых подписей. 
Исходя из данного определения, каждая монета имеет свой собственный номинал. Каждому bitcoin-адресу может сопоставляться любое количество монет. При помощи транзакций монеты можно делить и объединять, при этом их суммарный номинал за вычетом комиссии сохраняется. 

Транзакции

Транзакции - Когда один пользователь передаёт некую сумму другому пользователю, он создаёт новую транзакцию, которая содержит хеш предыдущей транзакции, подписанный им, и публичный ключ следующего владельца. Затем эта информация широковещательным запросом отправляется в сеть. Остальные узлы сети проверяют подписи, прежде чем принять транзакцию к обработке. Транзакции поддерживают множественные входы (результаты предыдущих транзакций) и выходы (указания о получателях). В общем случае транзакция может содержать произвольное количество выходов (возможны случаи, когда необходимо передать средства нескольким получателям с помощью одной транзакции, что позволит сэкономить на комиссионных сборах). Транзакция также может содержать множество входов, которые могут являться даже совпадающими bitcoin-адресами. Такое может иметь место, когда было несколько входящих транзакций на один адрес. Каждая первая и только первая транзакция в блоке не имеет входов и зачисляет вознаграждение за создание данного блока. Такая транзакция должна получить 120 подтверждений, чтобы полученные с помощью неё bitcoin могли быть использованы. Значения со всех входов суммируются, и сумма распределяется по выходам. Разница между суммой на входе и суммой на выходе считается комиссией за осуществление транзакции. Размер вознаграждения, зачисляемого первой транзакцией, является суммой всех комиссий у транзакций, включённых в блок, и фиксированного значения, изначально равного 50 и уменьшающегося вдвое каждые 210000 блоков. Транзакции обязательно содержат указания о получателях, например, bitcoin-адреса или иные условия. Большинство транзакций, имеющих входы, имеют минимум два выхода: с указателем получателя монеты с номиналом, равным отправленной сумме, и указателя на отправителя для «сдачи» — монеты с номиналом, который остался от суммарного номинала на входе за вычетом комиссии. 
«Bitcoin-qt» отправляет каждую сдачу на новый bitcoin-адрес из резерва заранее созданных и скрытых от пользователя адресов. Информация о том, какая именно монета является сдачей, отсутствует в БД. 

Ключи 


Криптосистема с открытым ключом Каждый пользователь системы может генерировать неограниченное количество пар ключей, которые хранятся в специальном файле (кошельке). Для создания новых пар ключей используется алгоритм ECDSA с параметрами secp256k1. Размер закрытого ключа — 256 бит, а соответствующего ему открытого ключа — 512 бит. Создание новой пары ключей автономно и не требует соединения с сетью. Адресация Передача bitcoin происходит с выставлением условий для получателя. Воспользоваться суммой сможет тот, кто сможет выполнить все условия. 
Стандартным условием является использование bitcoin-адреса. Но условия могут быть и другими, например, последовательное использование нескольких bitcoin-адресов или привязка к определённому IP-адресу. 
Bitcoin-адрес генерируется на основе преобразования публичного ключа пользователя. Секретные (приватные) ключи авторизуют владельца. Bitcoin-адреса не содержат персональной информации о владельце. Человек может иметь множество адресов, создавая их по собственной инициативе, для чего даже не требуется подключение к интернету. Создание адреса лишь для одной транзакции или одного корреспондента помогает сохранить анонимность. Bitcoin-адрес в текстовой форме представляет собой строку Base 58 длиной до 34 символов, состоящую из букв латинского алфавита и цифр, например 175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W. Существуют варианты представления адресов в виде QR-кодов и других двухмерных штрихкодов, пригодных для считывания мобильными устройствами. 

Цепочка блоков


 Основная последовательность блоков (чёрные) является самой длинной от начального (зелёный) до текущего. Побочные ветви (фиолетовые) отсекаются. Любые транзакции не считаются легитимными (не считаются «подтверждёнными»), пока информация о них не будет сгруппирована в специальные структуры — блоки. Структура и информация в блоках подчиняется заданным правилам и её можно быстро проверить. Каждый блок всегда содержит информацию об одном предыдущем блоке. Это позволяет все существующие блоки выстроить в одну цепочку, которая представляет собой распределённую базу данных и содержит информацию о всех совершённых когда-либо операциях с bitcoin. Блоки одновременно создают множество майнеров. Регулярно возникают ситуации, когда один и тот же блок является предыдущим для двух новых блоков. В каждом из новых блоков могут встречаться как одинаковые транзакции, так и разные, то есть вошедшие только в один из них. Через некоторое время появляются очередные блоки, цепочка может раздвоиться. Каждая из ветвей равноправна до тех пор, пока одна из них не получит более длинное продолжение. Обычно, при равенстве длины, предпочтение отдаётся той цепочке, конечный блок которой появился раньше. Система автоматически легитимной считает более длинную цепочку, не обращая внимание на время создания последнего блока. Транзакции, вошедшие исключительно в менее длинную ветку (в том числе по выплате вознаграждения), теряют статус подтверждённых. Если это транзакция по передаче bitcoin, то она может быть включена в очередной блок. 
Транзакции получения вознаграждения за создание отсечённых блоков не дублируются в другой ветке, то есть «лишние» bitcoin за отсечённые блоки не получают дальнейших подтверждений и «утрачиваются». Таким образом, цепочка блоков содержит историю владения, с которой можно ознакомиться, например, на специализированных сайтах.

Ответ: всем счастья 189 раз

Атака «Double Spending»
Если пользователь попытается использовать ранее потраченные bitcoin-монеты снова, сеть не примет его транзакцию как действительную. Но в параллельных ветках блоков могут находиться транзакции, которые по разному расходуют одни и те же начальные средства. Вероятность существования параллельных цепочек блоков крайне мала и экспоненциально уменьшается с ростом длины цепочки и количества независимых майнеров. Таким образом, чем больше подтверждений имеет транзакция, тем менее вероятна отмена транзакции из-за отмирания содержащей её цепочки блоков. Однако при наличии у злоумышленника контроля над достаточно большой долей суммарной мощности майнинга существует ненулевая вероятность «тайного» выстраивания длинных параллельных цепочек блоков. После их публикации в сети главной будет признана более длинная цепочка. Отмена цепочки блоков может приводить к признанию недействительными транзакций даже подтвержденных несколькими блоками и последующей повторной трате средств. При наличии в одних руках свыше 50 % суммарной мощности майнинга такая ситуация возможна на любом уровне подтверждения (атака «Double Spending» или «атака 51 %»).
 Если подконтрольная мощность меньше 50 %, то вероятность успеха экспоненциально снижается с каждым подтверждением. Проведение успешной атаки не позволяет: изменить размер вознаграждения за генерацию блока получить неограниченное количество bitcoin уничтожить сеть потратить bitcoin, которые ранее не принадлежали злоумышленнику. На начало 2013 года мощность сети составляла менее 25 THash/s, но за последующие 3 месяца выросла до 55 за счет массового распространения специализированных процессоров (ASIC), разработанных специально для майнинга в сети Bitcoin.
В середине июля 2013 года мощность сети превысила 210,46 THash/s. К сентябрю мощность превысила 1000 THash/s, в октябре мощность удвоилась, а на 1 декабря 2013 года превысила 6000 THash/s. 
При этом пользователь с наибольшей производительностью имеет менее 100 THash/s. Структура блока Блок состоит из заголовка и списка транзакций. Заголовок блока включает в себя свой хеш, хеш предыдущего блока, хеши транзакций и дополнительную служебную информацию. Первой транзакцией в блоке всегда записывается генерация новых bitcoin-монет, которые в случае успешной генерации блока станут наградой пользователю за созданный блок. Далее идут все или некоторые из последних транзакций, которые ещё не были записаны в предыдущие блоки. Созданный блок будет принят остальными пользователями, если числовое значение хеша заголовка равно или ниже определённой цели, величина которой периодически корректируется. Если блок не удовлетворяет цели, то изменяется блок служебной информации в заголовке и хеш пересчитывается. Обычно требуется большое количество попыток, так как результат хеширования (функции SHA-256) практически непредсказуем. Когда вариант найден, узел рассылает полученный блок другим подключенным узлам. Другие узлы проверяют блок. Если ошибок нет, то блок считается добавленным в цепочку и следующий блок должен включить в себя его хеш. Величина целевого числа, с которым сравнивается хеш, корректируется через каждые 2016 блоков. Запланировано, что вся сеть будет тратить на генерацию одного блока примерно 10 минут, на 2016 блоков — около двух недель. Если 2016 блоков сформированы быстрее, то цель немного уменьшается и достичь её становится труднее, в противном случае цель увеличивается. 
Изменение сложности вычислений не влияет на надёжность сети Bitcoin и требуется лишь для того, чтобы система генерировала блоки почти с постоянной скоростью, не зависящей от мощности сети. Эмиссия Bitcoin предусматривает только одну возможность для дополнительной эмиссии — новые bitcoin-монеты начисляются в качестве вознаграждения тому, кто сгенерировал очередной блок, получивший 120 подтверждений. Первоначально эмиссия составляла 50 bitcoin в каждом блоке. После 2012-11-28 15:24:38 UTC значение уменьшилось до 25 bitcoin, в соответствии с алгоритмом. На май 2014 года в обращении находилось 12,7 миллионов bitcoin, что составляет более половины их максимально возможного предельного количества в 21 миллион. Желающие получить возможно большее вознаграждение стремились задействовать как можно большие вычислительные мощности. 
Особенность задачи позволяла применить максимальное распараллеливание вычислений. В силу специфики строения, для этого хорошо подошли графические процессоры (GPU) с небольшой дополнительной программой (в сотни раз производительнее CPU) и платы с FPGA (производительность сравнима с видеокартами, но превосходят их по энергоэффективности). Затем были выпущены специализированные процессоры (ASIC), выполняющие только вычисление хешей для Bitcoin, более производительные чем GPU и FPGA. 

Сложность

 За требование к хешам блоков отвечает специальный параметр, называемый «сложность». Так как вычислительные мощности сети непостоянны, этот параметр пересчитывается клиентами сети через каждые 2016 блоков таким образом, чтобы поддерживать среднюю скорость формирования распределённой БД на уровне 2016 блоков в две недели. Таким образом 1 блок должен создаваться примерно раз в десять минут. После создания 210 000 блоков (на что требуется примерно 4 года) вдвое уменьшается размер эмиссионного вознаграждения майнеров (снижается скорость эмиссии). На практике, когда вычислительная мощность сети растёт — соответствующие временные промежутки короче, а когда снижается — длиннее. Перерасчёт сложности с привязкой ко времени возможен благодаря наличию в заголовках блоков времени их создания. Оно записано в Unix-формате и взято по системным часам автора блока (если блок создан в пуле, то из системных часов сервера этого пула). 

Пулы 

Для уменьшения влияния фактора удачи и более равномерного и предсказуемого получения bitcoin майнеры используют пулы. Часто выплаты майнеру рассчитываются исходя из отправленных им пулу шар (shares) (блоков с хешем, который подошёл бы при сложности равной единице). В среднем нужно 232 операций хеширования для нахождения одной шары. Для нахождения блока в среднем требуется количество шар, равное текущей сложности. 

Существуют 3 основных типа начисления наград]: 
Proportional — После нахождения пулом блока награда делится пропорционально вкладу каждого участника. 
PPS — Вознаграждается каждая присланная шара. Оценивается как текущее вознаграждение за блок, деленные на текущую сложность. 
Score — Оценочная система вознаграждения шар, алгоритм определяется организатором пула.

У этих типов начисления есть следующие популярные варианты:
SMPPS — Аналогично PPS, но пул никогда не передаёт пользователям больше, чем реально получил сам. Разница между реальным получением награды пулом и вознаграждением шары в PPS, если таковая есть, компенсируется постепенно. 
ESMPPS — Аналогично SMPPS, но уравнивает приоритеты вознаграждения постоянным и новым участникам пула. 
RSMPPS — Аналогично SMPPS, но первыми в очереди на вознаграждение ставятся новые пользователи. 
PPLNS — Аналогично Proportional, но деление награды осуществляется пропорционально вкладу в последние сложность присланных на пул шар, умноженному на N, где N обычно равно 2. 

Подтверждение транзакций

Обычно при получении bitcoin-монет новый владелец не может сразу же передать их. Для уменьшения вероятности двойного использования, любая транзакция должна получить некоторое количество подтверждений. Одним подтверждением считается один новый блок, начиная с того, в котором упакована транзакция. Необходимое число подтверждений зависит от программы-клиента либо от указаний принимающей стороны. Bitcoin-монеты, полученные за создание блока, протокол разрешает использовать после 120 подтверждений. 
Если учесть, что скорость появления блоков поддерживается на уровне 1 блок в 10 минут, воспользоваться комиссией можно через 20 часов после успешного начисления. Полученные от других пользователей bitcoin-монеты клиент «Bitcoin-qt» позволяет использовать сразу, но у большинства получателей по умолчанию выставлено требование 6 подтверждений, то есть реально воспользоваться полученным обычно можно через час. 
Различные онлайн-сервисы часто устанавливают свой порог подтверждений.

 Комиссионные сборы

 В системе Bitcoin не предусмотрено обязательных комиссионных сборов. Пользователи могут добровольно включать в платёж произвольную сумму комиссионного сбора, подавая на вход транзакции больше средств, чем на выход, что повышает приоритет обработки такой транзакции. Различные программы-клиенты имеют свои правила относительно размера и объекта комиссионных сборов. Комиссионный сбор достаётся узлу, сгенерировавшему блок с такой транзакцией. Генерирующий новый блок пользователь может по своему усмотрению добавлять в него транзакции из очереди. Например, он может отобрать только транзакции с комиссионным сбором. 

Объём данных 

Схема получения хеша транзакций В программах-клиентах была добавлена система, организующая записи транзакции таким образом, что пользователь может локально удалять данные из своей базы, которые ему точно не понадобятся. После того, как все транзакции с какими-то средствами были упакованы в блоки и подтверждены, предыдущие транзакции с этими средствами можно отбросить для экономии места на диске. Для того, чтобы это можно было осуществить без изменения хеша блока, транзакции хешируются с помощью TTH, и в заголовок блока помещается только результат данного хеширования. Сейчас все пользователи официального клиентского ПО после запуска программы в первый раз получают полную базу данных (блоки без индексации и оптимизации). 
По состоянию на май 2014 её размер составлял более 20 ГБ. Заголовок блока имеет объём около 80 байт. Так как блоки генерируются примерно каждые 10 минут, то за год будет накапливаться около 4,2 Мб заголовков блоков.

 Программный интерфейс  

Программное обеспечение сетевого узла существует в двух видах: приложение с графическим интерфейсом и фоновое приложение. В обоих случаях оно может управляться через программный интерфейс по протоколу JSON-RPC (RFC 4627)
Это позволяет достаточно просто решить такие задачи, как: Подключить к одному узлу несколько программ-майнеров, создав собственный пул; Интегрировать узел с веб-сайтом, на котором используется Bitcoin; Майк Хёрн (Mike Hearn), сотрудник компании Google, в рамках программы «20% рабочего времени сотрудника» реализовал программное обеспечение узла Bitcoin на языке Java BitcoinJ. Эта реализация ограничена лишь пользовательскими функциями (такой узел не может проверять транзакции и блоки, создавать блоки, а может лишь создавать новые транзакции). Это является шагом в сторону мобильных приложений, использующих Bitcoin.
Вебинары, курсы, мануалы, стратегии, секреты.