Давайте обсудим, что такое криптовалюта биткоин и как работают транзакции биткоинов.
Транзакции биткоинов выполняется между электронными кошельками. Для полной безопасности они снабжены цифровыми подписями. Транзакции являются публичными, всякий участник может изучить информацию об отправителе и получателе в доступной сети блоков, также ознакомиться со всей историей предшествовавших транзакций, вплоть до начального этапа появления первых криптомонет. Для получения информации, зайдите на https://blockchain.info/ и в поле Поиск введите информацию перевода.
Некоторые люди просто сохраняют биткоины, рассчитывают в будущем на повышение их стоимости. Поговорим подробнее, как следует осуществлять транзакции во время растраты биткоинов.
В реальной жизни биткоинов нет, имеются только отчеты о транзакциях.
Как это не звучит забавно, но это действительно так. Они отсутствуют в том числе и на жестком диске. Мы думаем, что у кого-то имеются биткоины, но, если рассмотреть биткоин адрес, там не окажется цифровых денег. Невозможно какое-либо физическое тело или электронный файл назвать биткоином.
Действительно присутствуют записи о транзакциях между адресами, балланс на них постоянно изменяется. Вам захотелось уточнить баланс биткоин адреса? Изучив его, вы не обнаружите там ничего. Придется вычислять баланс после ознакомления со всеми транзакциями, относящимися к интересующему адресу. Они сохранены в цепочке блоков.
К примеру, Мария отправляет Василию биткоины. Эту манипуляцию называют транзакцией, она включает в себя три вида информации:
• Input (вход) – информация о том, откуда поступили биткоины на Машин адрес, скажем, их прислала подруга Ольга.
• Amount (сумма) – объем биткоинов, отправляемых Василию Марией.
• Output (выход) – биткоин адрес Василия.
Чтобы выполнить пересылку понадобится биткоин адрес и зашифрованный ключ. Бессмысленно сопоставлять биткоин адрес и лицевой счет в банке. Они практически не имеют ничего общего. Чтобы открыть биткоин адрес не требуется заполнения огромного количества бумаг и предоставления документов, подтверждающих личность. Они формируются в произвольном порядке и являются случайной буквенно-цифровой последовательностью. Скрытый ключ тоже является буквенно-цифровой последовательностью, но его хранение засекречено.
Личный биткоин адрес возможно представлять в качестве прозрачной депозитной ячейки. Кто угодно может заглянуть в нее, изучить, что имеется внутри, но взять содержимое способен только обладатель закрытого ключа.
Вернемся к Марии и Василию. Когда у Марии возникает желание поделиться с Васей цифровыми деньгами, она подписывает замаскированным ключом заявление на перевод. Заявление содержит в себе три вида информации: биткоин адрес (откуда биткоины были перечислены Марии), сумма транзакции, биткоин адрес получателя. После чего Мария скидывает заявку в сеть с личного биткоин кошелька. Майнеры обнаруживают и утверждают транзакцию, она добавляется в блок транзакций. После этого увеличивается баланс Васиного биткоин адреса.
Подтверждение транзакций осуществляют майнерами, одновременно они добывают новые монеты. Поэтому в отдельных случаях приходится подождать завершения майнинга. Алгоритм функционирования Биткоина предусматривает, что майнинг любого блока занимает десять минут. Если же оплата проводится с помощью процессинговых компаний, например, Coinbase, BitPay или другие, то ждать совсем не придется. Они обладают схемой моментального утверждения транзакции после того, как совершен перевод биткоинов.
Не всегда. Различные факторы влияют на расчет комиссионных сборов. У некоторых кошельков имеется опция ручного выставления размера вознаграждения. Остаток транзакции, который не востребован получателем или был возвращен в качестве сдачи, относится к вознаграждению. Его забирает майнер, он решает блок транзакций как дополнительное вознаграждение.
В настоящее время многие майнеры занимаются обработкой транзакций без комиссионного вознаграждения. Если учесть тот факт, что за каждый последующий блок вознаграждение уменьшается, такая ситуация не сможет остаться неизменной.
Ситуацией с вознаграждением за транзакцию раньше была запутанной, комиссию рассчитывали по непростому алгоритму. Благодаря обновлениям ядра ПО, в том числе управляющего транзакциями, усовершенствовался метод обработки комиссионного вознаграждения, минимальный размер будет выбираться автоматически.
Система не предусматривает выдачу каких-либо документов. Но за счет будущих обновлений изменятся методы работы с платежами, они станут более удобными для клиентов. Процессинговая фирма BitPay предоставит дополнительные возможности, не предусмотренные при типичных биткоин транзакциях, это могут быть выписки, листы подтверждения заказов.
Конечно. Биткоины – это дробные единицы до стомиллионных долей.
В первой части мы разобрали, что такое ключи, как подписываются и подтверждаются транзакции. В этой мы разберём, как происходят переводы, создаются блоки и в каком виде существует сам биткоин.
Как происходят переводы биткоинов?
Теперь вы понимаете, что для платежей и хранения виртуального золота достаточно помнить 12 слов. Чтобы получать биткоины, вы отправляете свой адрес в сети биткоина другому человеку. Когда человек отправляет вам биткоины, то это похоже на обычное сообщение. Он указывает в транзакции ваш адрес, указывает количество передаваемых монет, сумму комиссии и подписывает своим секретным ключом. Подпись генерируется от частного ключа отправителя и клиент транслирует транзакцию в сеть биткоина.
Читайте также: На каком обменнике можно выгодно обменять Биткоины
В блокчейн биткоина заложен собственный учёт монет: откуда пришло и куда ушло. Биткоины существуют только в виде записей в транзакциях. У каждого биткоин-адреса есть входы и выходы, куда приходят и откуда уходят. Баланса у отдельного адреса нет. Сумма баланса считается по всем входным значениям, связанным с адресом:
Входы и выходы транзакций
Баланс третьего адреса состоит из транзакций с первого и второго. Выходы первого и второго адреса становятся входами для третьего. Значения выходов предыдущих транзакций суммируются и общая сумма биткоинов в дальнейшем используется в выходе Адреса 3.
При создании транзакции происходит её хэширование — хэш-функция преобразует информацию о количестве передаваемых монет, хэше предыдущей транзакции и другую в строку символов установленной длины. Хэш нужен, чтобы отслеживать целостность информации. Транзакции, как и блоки в сети, связаны друг с другом. Если попытаться изменить одну транзакцию, то хэши всех транзакций изменятся и клиенты отвергнут её.
У биткоина есть условие — каждый выход используется только один раз. Поэтому при отправке на другой адрес все биткоины должны быть потрачены на выходе. Иначе сумма будет потеряна. Эту работу делает клиент. Если у адреса 100 биткоинов, а отправляется с него 50, то клиент создаст 2 выхода: 50 биткоинов на Адрес 4 и 50 биткоинов на Адрес 3, т.е. обратно:
“Сдача” по биткоину
Перед тем как транзакция будет транслироваться в сеть биткоина, её подписывают личным ключом, который связан с адресом. При подписании формируется публичный ключ, клиент объединяет всю информацию и преобразует их в строку шестнадцатеричного формата:
Транзакция в шестнадцатеричном формате
Этот набор знаков можно раскодировать. После трансляции узлы вокруг проверяют перевод и транслируют дальше, пока майнеры его не обработают. Транзакции обрабатывают и проверяют майнеры с «полными» клиентами. За свою работу они получают сгенерированные биткоины в каждом блоке, а также комиссии с транзакций. Чем выше комиссию вы предложите, тем быстрее майнеры её проверят и добавят в блокчейн. Им выгоднее более высокие комиссии. Их сумма считается за килобайт информации и не зависит от отправленной суммы монет. Так как блоки формируются каждые 10 минут, то транзакция будет добавлена не раньше этого времени.
Каждый узел хранит список необработанных транзакций — пул памяти. Когда пул памяти заполняется, увеличивается тариф комиссии за килобайт.
Как создаются новые блоки биткоина?
Самая главная работа лежит на майнерах — они проверяют, добавляют новые транзакции в блок и поддерживают работу сети биткоина. Чем больше майнеров, тем безопаснее сеть. Каждый майнер соревнуется с другими за награду в биткоинах. Тот, кто находит новый блок, получает 12,5 биткоинов и комиссии за транзакции. Соревнуются майнеры своими вычислительными мощностями. Чем выше вычислительные мощности, тем вероятнее получить награду.
Вычисления нужны для поддержания времени создания блока каждые 10 минут, что создаёт равномерную эмиссию монет. Если мощности майнеров растут, то сложность пропорционально возрастает, а если мощности уменьшаются, то падает.
Используя свои мощности, каждый майнер ищет хэш нового блока, который становится идентификатором блока. В этот хэш входит номер блока, хэши транзакций, хэш предыдущего блока и др. Сам хэш вычисляется за доли секунды, но с добавлением сложности новый блок находят примерно за 10 минут. Для блока нужен определённый хэш — он должен начинаться с нулей. Чтобы вычислить такой хэш, в набор данных добавляется случайное число “nonce”:
Хэш чувствителен к любым изменениям информации и он изменится, если добавится даже один пробел. Для нахождения этого блока в демоверсии блокчейн хэш-функция выполнилась 69242 раза. Начиная с 0, счётчик “nonce” увеличивался на один, добавлялся к набору данных и вычислялся хэш. Так происходило до тех пор, пока у хэша в начале не появилось 4 нуля. Когда сложность добычи растёт, то растёт и количество нулей. У настоящего хэша блока биткоина уже стоит 19 нулей в начале хэша. Поэтому, чем выше сложность, тем менее вероятна атака 51% — завладеть большими мощностями в сети и подписывать транзакции с двойными расходами.
Читайте также: Как выводить с bonus Биткоин
Майнеры давно уже объединяются в пулы, чтобы гарантированно зарабатывать на своих вычислениях. Общая мощность пула соревнуется с другими пулами и майнинг-фермами, и каждый с вероятностью получает награду. В пулах награда делится на всех майнеров, участвующих в добыче, в зависимости от их вычислительных ресурсов.
- Для получения, хранения и передачи биткоинов создают адрес. Для доступа используют секретный ключ из 12 слов. Личный ключ — доступ к вашим биткоинам и возможность расплачиваться с адреса.
- Никто не знает личный ключ. Программа-клиент пользователя генерирует из личного ключа публичный и так определяет владельца биткоин-адреса.
- Биткоины существуют только как записи в транзакциях.
- У транзакции есть входы и выходы. Вход — ссылка на выход другой транзакции, которая означает, сколько пришло биткоинов. Выход — ссылка для транзакции, на которую отправлены монеты.
- Каждый выход используется только один раз. При следующей транзакции с адреса все средства должны быть потрачены. Остаток при этом возвращается в обратной транзакции.
- После подписания транзакции личным ключом клиент отправляет её ближайшим узлам, а те передают дальше.
- Чем выше комиссия транзакции, тем быстрее майнеры её проверят и добавят в сеть.
- Майнеры добавляют транзакции в блок, связывают его с хэшем предыдущего блока и ищут хэш с определённым количеством нулей в начале. Называют это доказательством работы (Proof-of-Work).
- Тот, кто находит хэш нового блока, получает награду в виде новых биткоинов и комиссий за транзакции.
Всем привет! В этой статье мы разберемся что такое Replace-By-Fee транзакции и как их использовать. Бонус! Пара поучительных историй в конце.
Итак, представим ситуацию когда A посылает монеты B. Он создает и подписывает транзакцию, и выпускает ее в сеть для подтверждения. К сожалению, транзакция долго не подтверждается, у транзакции слишком маленькая комиссия (или комиссия нормальная в обычных обстоятельствах, но в данный момент очередь неподтвержденных транзакций слишком большая и майнеры предпочитают майнить транзакции с бОльшими комиссиями). Что делать пользователю A? Варианты: a) ждать подтверждения (ждать можно долго) б) ждать отмены транзакции (когда большинство нод решат наконец выкинуть из mempool транзакцию) и освобожденными монетами можно будет снова распоряжаться (то есть создавать транзакции и пулы не будут считать их даблспендами и отвергать) в) Заменить транзакцию с повышением комиссии (RBF)
Итак, RBF — замена существующей транзакции новой транзакцией с повышением комиссии. Замена означает что в новой транзакции будут использованы те же входы что и в старой транзакции, и это не будет считаться даблспендом (читай, мошенничеством). В итоге только одна транзакция будет добавлена в блокчейн (с большой вероятностью это будет транзакция с повышенной комиссией).
Какая транзакция может быть заменена? Это хороший вопрос. Замена транзакций была предусмотрена еще создателем системы Сатоши Накамото, но выключена в определенный момент. Затем она была доработана до RBF и включена в код Bitcoin Core 0.12 и старше. Для замены в данных транзакции предусмотрено специальное int поле nSequence, которое сигнализирует о том, какая транзакция старше какой. Чтоб транзакция была потенциально заменяемой, значение nSequence должно быть меньше (0xffffffff — 1).
По умолчанию, большинство современных кошельков nSequence сразу ставят максимальным, и возможность заменять транзакции надо включать в настройках. Вот так это выглядит в кошельке Electrum:
Пример декодированой транзакции:
Sequence указывается для каждого входа транзакции.
В том же кошельке Electrum после включения опции RBF станет возможным увеличивать комиссию за транзакцию прямо в GUI, но сейчас мы с вами будем собирать RBF транзакцию руками. Зачем? Во-первых — разобраться, во-вторых — для большей гибкости, например, в этом случае в RBF транзакции мы сможем указать совершенно другие целевые адреса для перевода, чем периодически пытаются воспользоваться злоумышленники.
Выглядит это так: A хочет заплатить B. A создает, подписывает и транслирует транзакцию на перевод монет B, но умышленно ставит пониженную или нулевую комиссию. Если B недостаточно осторожен он засчитывает неподтвержденную транзакцию (и отдает товар А, например). После этого A заменяет транзакцию и перенаправляет выход транзакции на С, где С подконтролен А.
Как B может этого избежать? Если все же B предпочитает засчитывать неподтвержденные транзакции (для скорости), не стоит засчитывать пластичные транзакции (где nSequence позволяет транзакции заменять). И вообще, с подозрением относиться к таким транзакциям. Если вы когда-то засчитывали пластичные транзакции то неплохо бы их перепроверить на факт наличия фрода и применить санкции к плательщику, если тот мошенничает. Ну и естественно, идеально было бы дожидаться не менее 2х подтверждений.
Читайте также: С какой скоростью идет транзакция Биткоин передача данных
Будем пользоваться замечательной опенсорсной тулзой github.com/OutCast3k/coinbin с помощью которой можно вручную легко создавать транзакции с нужными нам входами и выходами. Работает полностью в браузере не общаясь с сервером. Живая версия доступна по адресу coinb.in
Создаем транзакцию через New → Transaction. Берем приватный ключ в формате WIF и загружаем доступные (непотраченные) выходы для этого ключа. Во вкладке Outputs указываем целевой адрес, указываем amount. В Advanced Options не забываем поставить галку на “Make this a RBF transaction” — в этом случае nSequence транзакции будет меньше максимального значения. Жмем Submit.
Транзакция создана. Обратите внимание на Transaction Fee — это разница между доступным количеством монет суммарно со всех входов МИНУС сумма всех выходов (в нашем случае 1 выход). Разница и будет комиссией которую майнер заберет себе. В этом примере она специально нулевая.
Жмем Sign, копипастим туда полученный hex транзакции, все тот же приватный ключ, и подписываем транзакцию:
Транслируем транзакцию в сеть (можно использовать любой ендпоинт):
Так транзакция выглядит:
Теперь давайте воспользуемся RBF. Создаем новую транзакцию, входы берем с того же WIF. Но выходы укажем совершенно иные! Один из выходов укажем 1CWHWkTWaq1K5hevimJia3cyinQsrgXUvg — донейт адрес создателя coinb.in
Amount укажем такие чтоб комиссия за транзакцию была достаточной для быстрого подтверждения.
Обратите внимание на вкладку Inputs — если исходный адрес многоразовый и на нем много транзакций, то нам придется во входах вручную прописать только те инпуты, которые входят в транзакцию которую мы хотим заменить (удалить лишние, оставить только нужные). Входов этих могут быть сотни, и в некоторых случаях это может быть достаточно кропотливая работа.
Вот так это теперь выглядит на blockchain.info. У новой транзакции есть все шансы быть включенной в блок раньше своей предыдущей версии.
Ждем. Есть подтверждение:
Мы только что заменили транзакцию с помощью RBF, причем монеты отправили совсем не на тот адрес который хотели изначально.
Опять о безопасности
Не всегда nSequence=MAX гарантирует что транзакция финальная и заменить ее нельзя. На самом деле галку “Make this a RBF transaction” можно было не ставить, но:
- При замене транзакции не все ноды согласятся ретранслировать новую версию, ссылаясь на mempool-conflict
- Некоторые ноды примут транзакцию, и таки ретранслируют ее в сеть
- Информационные ресурсы типа blockchain.info будут прямым текстом писать DOUBLE SPEND
- Не все пулы будут майнить эту транзакцию, справедливо считая её даблспендом. Некоторые пулы будут ее майнить, но это может занять больше времени (по сравнению со временем если вся сеть будет её майнить)
- Если новая транзакция будет таки включена в блок — это абсолютно валидно и не противоречит правилам сети. Любые претензии потенциально обманутых нигде не принимаются
Т.о. мы приходим к мысли что любые транзакции без подтверждения хотя бы в 2х блоках являются ненадежными. Почему в 2х а не 1м? Короткий ответ — orphaned blocks.
Ссылки и материалы:
Как-то один из проектов использующих мой биткоин платежный шлюз взломали, и поставили на вывод 2 BTC. В той версии шлюза была захардкоджена комиссия 0.0001 BTC, что было достаточно мало на тот момент. Времени оказалось достаточно чтобы во всем разобраться и заменить транзакцию на возврат средств, повысив комиссию до 0.1 BTC. Злоумышленники наверное расстроились. Мораль — используйте RBF во благо!
Я на bitmedia.io пополнял счет биткоином. Счет там пополняется засчитывая входящие транзакции на специальный top-up адрес пользователя, и прибавляя сумму транзакции к общему балансу пользователя. Засчитываются только транзакции с 6 подтверждениями.
Баланс я хотел пополнить поскорее, поэтому когда первая транзакция зависла, я несколько раз заменял транзакцию с помощью RBF. Когда транзакция подтвердилась — баланс мне приплюсовался в столько раз больше, сколько RBF замен я сделал. Я сразу написал в поддержку, чтобы баг исправили. В благодарность лишние 0.3 BTC мне подарили как bug bounty. Мораль — проверьте свои системы как они поведут себя с RBF!
Хардкорная конфа по С++. Мы приглашаем только профи.