Comments 48
Если база есть у всех одновременно, то как транзакция вписывается сразу всем?
Как несколько одновременных транзакций вписываются в базу?
Важно понимать, что в блоке всегда есть ссылка на предыдущую транзакцию. Давайте представим, что три участника А, Б, В имеют общий банк денег, которыми договорились совместно распоряжаться.
Транзакция 1. А перевел Б 100 рублей. Все три участника проверили и приняли транзакцию, первый блок записан.
Затем, Б хочет забрать 100 рублей и В хочет забрать 100 рублей. Начинается процесс обмена транзакциями для окончательного утверждения. Номер будущей транзакции — 2.
Согласно общему правилу, участник, совершивший транзакцию, рассылает блок ближайшим соседям и ожидает от них проверки и подтверждения принятия.
Вариант 1. Б передает А свою транзакцию. В ней указана ссылку на транзакцию 1, А соглашается с тем, что это верно. Проведя дополнительные проверки (содержащие некую бизнес логику, например), А принимает транзакцию и записывает ее к себе. Блок 2 создан. Теперь, когда, В попытается сделать тоже самое, ни А, ни Б не примут транзакцию, потому что ее место уже «занято».
Вариант 2. Б передает свою транзакцию В. В уже тоже «создал» блок номер 2, поэтому не примет ее, как верную. В данном случае возникнет коллизия, которую необходимо разрешить по согласованию сторон. Либо Б, либо В должны принять (уступить), либо настаивать.
Пример очень поверхностный, не учитывающий множество дополнительных факторов. Прошу не принимать за абсолютно правильный и верный.
Блокчейн это просто обычный односвязный список блоков с транзакциями, изменияющими состояние базы данных, если какую-то его часть подменить, то хеши следующих блоков изменятся и подмененный кусок не встанет на место старого.
Для этого существует процедура анкоринга на что-то, что подменить крайне сложно.
К примеру, Ассанж, чтобы доказать, что он живой, сфотографировался с распечаткой хэша одного из последних блоков в биткоине.
Можно сохранять хэши некоторых блоков и если всю базу подменить, то они никогда не сойдутся. А поломать биткоин — очень дорогая задача.
Вот как раз имитировать транзакции будет невозможно: они все защищены криптографической подписью и нужно получить закрытые ключи всех остальных участников блокчейна
Но вообще, на сколько я знаю, в транзакциях хранятся даты изменений, так что при подмене базы на устаревшую можно заметить, что «что-то никто во всем мире не обменивается биткоинами, наверное биткоин сдох».
Уж проще предположить, что злоумышленник взломает ваш комп и подменит ваш блокчейн клиент на фальшивый. Но для такого можно просто с дополнительного устройства, например телефона, проверить актуальность базы если уж операция настолько важная. А вообще как вы представляете себе определить с каких компьютеров будет проверяться ваша транзакция, если база храниться у огромного числа пользователей?
P.S. про ключи я что-то не понял, что вы имели ввиду
На этом и держится система. Пока она маленькая и не очень надежная, она никому особо и не нужна, чтобы совершать такие махинации. Чем она становится востребованные, тем она становится надежнее. Таким образом сложность взлома стремиться к тому, чтобы быть всегда дороже выигрыша от ее взлома.
P.S. Про ключи все равно не понял. Для подтверждения владения в биткойне используются ключи для подтверждения владения кошельком. Но он меняется только при переводе с одного кошелька на другой. Если у вас старая база, то и ключ от кошелька с деньгами старый.
Клиент сверяет базу с каждым из пиров.
Для описанного вами злоумышленник должен имитировать все подключения к пирам, которые выбираются случайным образом из списка пиров, накопленного клиентом. Это реально, но несколько сложно.
Для надёжности можно посмотреть транзакцию и текущее состояние блокчейна на публичных сервисах (сайтах с HTTPS). Подделать сертификат SSL ещё сложнее, чем имитировать произвольных пиров.
Гораздо проще понять блокчейн, представив его как технологию подтверждения неких связанных действий. При этом не особо важно каких. Эта технология позволяет при получении базы этих связанных действий от какого-либо источника проверить, было ли потрачено на «некое действие» над каждым шагом очень большое количество времени, а точнее вычислительных ресурсов. При этом информация, над которым проводится «некое действие», очередной шаг или транзакция — это просто текст, НО, и это очень важно, с дополнительной частью в которой находится хеш предыдущего шага. Таким образом «некое действие» зависит не только от самого шага, но и от всех предыдущих шагов, т.к. оно зависит от хеша от хеша… от хеша самого первого шага. Вот вам и цепочка — chain в слове blockchain.
Помимо этого в полученной базе, разумеется, можно проверить, не нарушают ли все шаги какие-либо правила. Например, в случае криптовалют, что имеющимися деньгами нельзя расплатиться дважды, и что расплатиться можно только подтвердив право владения ими (подтверждение владения — это еще одна криптомагия основанная на цифровой подписи). Но это уже не относится к самому блокчейну.
Вот собственно и все. Пока никакой распределенной базы. Но осталось самое сложное — понять, что это вообще дает? А дает это следующее. Представьте себе, что все данные о шагах с подтверждениями «неких действий» над ними есть в открытом доступе. Каждый может их легко проверить, например, есть ли среди них шаг о перечислении денег на свой кошелек (оплатили ли мне товар). И только в результате использования огромных вычислительных ресурсов можно подтвердить (осуществить над ним «некое действие») новый такой шаг. Кто будет тратить эти выч. ресурсы? Тот, кому это выгодно. А выгодно это может быть, например, если по правилам этих шагов подтверждающий может получить комиссию за это. Если желающих на этом заработать много, то возникает следующая ситуация, когда множество желающих пытается наперебой подтвердить новые шаги. Кому повезло первым это сделать, получает гонорар в рамках этого шага, и сразу же старается передать этот шаг всем другим. Большинству остальных пользователей системы выгодно его принять, т.к. новый шаг подтверждает и все предыдущие шаги, т.е. в том числе и шаги отвечающие за благостостояние этих пользователей. Конечно при этом они проверят шаг не только на наличие подтверждения, но и на соответствие его правилам, а то вдруг подтверждающий зачислит из воздуха деньги себе, или приведет их со случайных счетов, не подтвердив право их использования, а какой смысл принимать такой шаг, если остальные его не примут, т.к. он нарушит работоспособность системы.
Вот вам и распределенность. Большинству выгодно хранить у себя эту базу (чтобы иметь возможность подтвердить перевод себе любимому денег), и расширять (совершать перевод одним и подтверждать эти переводы за вознаграждение другим).
Теперь сам корень этой магии. Подтверждением «некоего действия» служит угаданное число хеш от сочетания шага (транзакции) с которым, дает число начинающееся с нескольких нулей. Такое число можно только угадать. Таким образом «некое действие» — это угадывание такого числа. Сделать это сложно (зависит от количества нулей), отсюда и потраченные ресурсы на его угадывание.
Если операция добавления нового звена такая затратная по вычислительным ресурсам, то почему проверка не требует этих ресурсов?
Обычно это решается через алгоритмы консенсуса, которые позволяют сети прийти к какому-то единому решению относительно того, какой из предложеных блоков принять как следующий.
В Биткоине это Proof of Work, нужно подобрать такой nonce, в результате которого хэш блока будет удовлетворять какому-то условию, которое однозначно вытекает из состояния на момент последнего принятого блока. Процесс подбора называется майнингов и вероятность того, что два узла подберут одновременно подходящий блок крайне мала, но такое иногда случается, в результате чего цепочка блоков форкается, но вычислительные ресурсы между форками неравномерно распределяются и один из форков просто пропадает, а узлы, которые принимали эти блоки просто откатываются до последнего нормального блока и выкачивают самую длинную известную цепочку.
Из этого следует, что тем, кто принимает денежные переводы, стоит подождать не только подтверждения шага с нужным ему переводом (вдруг параллельно ему подтвердят другой шаг без нужного вам перевода) а еще нескольких подтверждений других шагов осуществленных поверх вашего. Вот тогда это уж наверняка сигнал, что переведенные вам деньги оказались в живой ветке.
Второй вопрос интереснее. Почему проверка выполнения «некой операции» не требует тех же ресурсов, что само выполнение «некой операции»? Если очень абстрактно, то представьте эту операцию как поиск иголки в стоге сена. Искать ее долго (хотя вам может и повезти), а проверить, что вы ее нашли легко, если вы поставили на найденном месте флажок. Флажок и будет подтверждением вашей находки.
Математически же эту логику можно реализовать так. Представьте, что у вас есть алгоритм сложного перемешивания и преобразования исходного текста любой длинны, например «Большой большой стог сена», в небольшую строку. Получаться будет какая-то каша вроде «Ав02Й», но при этом, поскольку алгоритм осуществляет точный компьютер, то сколько не перемешивай копии одного и тот же текста, результат всегда будет одинаковым, а вот если изменить или добавить хоть одну букву к тексту, то результат перемешивания будет скорее всего совсем другим:
«Большой большой стог сена» ----> «Ав02Й»
«Большой большой стог сена A» -> «В59ф9»
И вот представьте, что вы пытаетесь добавить к тексту такую строку, чтобы в результате перемешивания, ну скажем получилось слово «иголка». И вот, несколько миллиардов попыток спустя вы нашли такую добавочную строку:
«Большой большой стог сена 0юФВа2дафВ3ущшч34» -> «иголка»
Эта строка и есть ваш флажок, указывающий на иголку, и подтверждение проделанной работы. Чтобы проверить, действительно ли получается в итоге «иголка», вам нужно перемешать исходную строку с добавленной строкой-флажком один раз. А вот чтобы найти строку-флажок вам нужно мноооого попыток.
Кто будет тратить эти выч. ресурсы? Тот, кому это выгодно. А выгодно это может быть, например, если по правилам этих шагов подтверждающий может получить комиссию за это. Если желающих на этом заработать много, то возникает следующая ситуация, когда множество желающих пытается наперебой подтвердить новые шаги. Кому повезло первым это сделать, получает гонорар в рамках этого шага, и сразу же старается передать этот шаг всем другим.
В криптовалютах своя система заработка, которая не применима напрямую для других объектов, к которым пытаются приспособить блокчейн. Поэтому вопрос автору статьи: кто подтверждает транзакции и как обеспечивается его заработок (с одновременным обеспечением вычислительной мощности, чтобы соблюдался общий принцип блокчейна: код на подмену не может быть сформирован быстрее, чем генерируется новый)?
В принципе любая система, основанная на блокчейне нуждается в больших вычислительных ресурсах на поддержание ее безопасности. При этом, эти ресурсы должны быть обязательно распределены между независимыми участниками, иначе возможен сговор и дискредитация системы. Если система предоставляет какую-то услугу, то за нее, как и за любую услугу, нужно платить. Как за пользование банковской карточкой вы платите деньги банку, который тратит эти деньги на мероприятия по поддержанию безопасности банковской системы. В случае с блокчейном вы можете сами осуществлять мероприятия по поддержанию безопасности сервиса — то есть осуществлять подтверждения своей и чужих транзакций. На начальном этапе развития системы это даже вполне реально. С ростом системы, будет все сложнее это сделать, т.к. требуемая сложность подтверждений увеличится. Но что если и в этом сервисе ввести свою виртуальную валюту, которой можно будет расплачиваться за подтверждение своей транзакции. Таким образом вы можете а) купить вычислительные мощности (компьютер помощнее) и самим подтверждать свои транзакции б) арендовать вычислительные мощности у других пользователей системы, купив у них виртуальную валюту. Это рождает рынок виртуальной валюты, и в результате вы покупаете безопасность не у выбранного банка, а у всего сообщества пользователей системы.
На сколько я знаю, таким образом, например работает блокчейн система Эфириум. Она позволяет осуществлять произвольные операции (контракты), расплачиваясь за вычисление операции «газом» (хз что это) а за подтверждение транзакций, то есть за безопасность, общей для всей системы валютой «эфиром». На базе этой технологии можно создать свои сервисы, например синхронизацию работы распределенной по разным странам конторы, с системой голосования при принятии решений. За эту услугу конторе придется платить, либо вычислительными ресурсами, либо «эфиром», который придется купить у сообщества. Таким образом «эфир» всегда кому-то нужен и его всегда выгодно добывать, так как всегда можно продать. Это есть ликвидность — основное свойство реальных валют.
Возможно есть способ создать и закрытую систему на основе блокчейна, каким-то хитрым образом обязав всех участников осуществлять поддержку безопасности системы. Но я пока не очень представляю как это сделать не вводя какой-то аналог валюты.
Само забавно смотреть, что биткоин по сути придумывался как средство прямого обмена без участия третьих лиц, денежной единицы без инфляции… А в итоге: фермы по майнингу, пирамиды МММ, посредники снимающие комиссию с транзакций, привязка к курсам других валют.
Ладно ПК на нормальном интернете и большим диском все это загрузит и сможет работать. А что делать на мобильном устройстве, да еще и как вариант с 3G?
Как отправить деньги или проверить получил ли я их? Доверить расчет всех хэшей сторонней организации? И наверное хорошо если банку.
А если это банк и он «контролирует» мой кошелек (ну или я ему делегировал это право), то как по мне особой разницы нет, что блокчейн, что нет.
Ну может как одно из преимуществ самой технологии — скорость перевода средств между разными банками. Но мы все равно приходим к тому, что есть большие организации которые контролируют поток электронных денег, берут комиссии за транзакцию и т.д. Рано или поздно, при таком раскладе, обычные пользователи выйдут из игры только за счет того, что вычислительная мощность их оборудования или ширина канала просто не справится с нагрузкой. Я правильно понимаю?
Если рассматривать идею блокчейнов как технологию которая позволяет всегда получить однозначную информацию о состоянии каких-либо объектов, да еще и с историей, и к тому же с контролем целостности этой истории, то безусловно идея — супер.
Вот мне интересно: насколько технология позволяет масштабировать систему которая на ней работает?
Ну и да. Буду ждать новых статей. Тема интересная.
Важно понимать, что такие «толстые клиенты» не будут иметь доступ к вашим кошелькам, а только смогут проверять, пришла ли на кошелек N нужная сумма.
Чтобы отправить платеж, нужно и того меньше — достаточно ключей от своих кошельков.
А что делать на мобильном устройстве
Использовать тонкий клиент, как это изначально предусмотрено в архитектуре биткоина.
Как отправить деньги или проверить получил ли я их? Доверить расчет всех хэшей сторонней организации?
Чтобы отправить транзакцию просто создайте транзакцию, подпишите её, и доверте кому-нибудь чтоб он закинул её в сеть. Например можно использовать https://blockchain.info/pushtx
Доверять ему не надо. Подписываете транзакцию вы сами, подписывать свою транзакцию вы можете хоть на оффлайновом девайсе. Максимум что может сделать злоумышленик с вашей транзакцией, это просто не отправить её в сеть. Всё, никак по-другому вам навредить он не может.
Чтобы проверить, получили ли вы деньги, можно воспользоваться сервисом кого-угодно с полным клиентом. Сейчас таких несколько десятков только для биткоина. Навредить вам он так же никак не может. Максимум может не отобразить транзакцию. Ну так можно посмотреть на другом сервисе.
Мне лично кажется, что лучше аналогию с гитом проводить, по крайней мере, для разработчиков она наиболее понятная, да и очень близкая, если подумать.
Клиенты могут генерировать хоть миллион транзакций в секунду, сеть узлов их примет только с момента подписания очередного блока. И ещё несколько блоков транзакция считается неподтверждённой, это защита от форка.
Размер базы транзакций уменьшается за счёт «контрольных точек». Консенсус майнеров периодически подтверждает «опорный» блок, ранее которого можно не хранить цепочку. Такие контрольные блоки периодически создаются (маркируются).
Ведь по сути каждое звено блокчейн-цепи – это своеобразный полный бекап данных всех транзакций всех остальных участников на это звено.
Для биткоинов это точно не так, при сохранении офлайн сохраняется только кусок цепочки (и немудрено, поскольку объем такой базы колоссален)
При создании биткоина изначально было предусмотрено что в конце-концов полные клиенты (со всей цепочкой блоков) будут в нескольких дата-центрах и у майнеров, а остальные пользователи будут использовать легкие клиенты, не выкачивая всю цепочку.
И нет, это практически не влияет ни на децентрализацию, ни на безопасность.
Надеюсь, кому-то поможет разобраться (там мало технических подробностей, но много разъяснений основных принципов, «на пальцах»)
Сайт как-то не демонстрирует прозрачности ценообразования.
Что такое блокчейн и зачем он нужен