Многие кошельки биткоина при выборе монет для отправки предпочитают использовать крупную монету, баланс которой больше отправляемой суммы. После каждой такой транзакции образуется монета-сдача. Через какое-то время весь кошелёк зарастает такими монетами порядка 0.001 (~10 долларов на текущий момент), которые уже и не на что потратить. Когда в очередной раз мне понадобилось сделать транзакцию, мне пришла в голову мысль, а нельзя ли собрать транзакцию так, чтобы сдачи не было. Кошелёк упрямо предлагал «распилить» ещё одну более крупную монету, так что я решил руками выбрать монеты, чтобы насобирать необходимую сумму. Однако это оказалось не так просто: сумма или получалась меньше нужного значения или слишком сильно его превосходила. В итоге я решил, что должен быть алгоритм, с помощью которого из монет можно собрать нужную сумму или чуть больше. Оказалось, что это не только возможно, но работает настолько хорошо, что сподвигло меня написать эту статью. Но обо всём по порядку.
Задача о рюкзаке
Широко известна задача о рюкзаке: уложить как можно большее число ценных вещей в рюкзак при условии, что вместимость рюкзака ограничена. В данном случае мы имеем случай задачи о рюкзаке 0-1, так как каждый предмет (монета) доступен для укладки в рюкзак всего один раз. Кроме того, вес каждого «предмета» совпадает с его стоимостью, поэтому мы имеем дело с ещё более частным случаем, задачей о сумме подмножеств. В википедии предлагается использовать генетический алгоритм, однако я решил искать точное решение с помощью динамического программирования, так как это вполне достижимо по ресурсам и выглядит просто.
Чтобы свести задачу о выборе монет к задаче о рюкзаке, надо совершить небольшое преобразование входных данных. Дело в том, что решение задачи о ранце (точнее, о сумме подмножеств) даст нам подмножество исходного множества, обладающее максимальной суммой, не превосходящей параметр (грузоподъёмность рюкзака). А нас не устраивают комбинации монет, дающие сумму меньше того количества, которое мы хотим отправить. Однако нас устраивают комбинации, слегка превосходящие. К примеру, если нам нужно отправить 0.005 биткоина, а мы нашли комбинацию, дающую 0.00499, то нам она бесполезна, так как меньше суммы, которую хочет продавец. А вот если мы найдём 0.005001, это подходит. Лишние сатошики можно использовать в качестве комиссии (о ней подробно поговорим ниже) или подарить продавцу, если он допускает отправку большей суммы. Поэтому нам надо с помощью задачи о рюкзаке выбирать не те монеты, которые надо отправить, а те, которые надо оставить. Тогда «недобор» до максимума превратится в «перебор» в терминах исходной задачи.
Пример. Допустим, у нас есть такие монеты: 0.1 BTC, 0.002 BTC, 0.00832423 BTC. А отправить нам надо 0.01 BTC. Найдём такие монеты, сумма которых будет будет максимальна, но меньше или равна общей сумме наших монет минус отправляемая сумма, то есть вот такого числа: 0.1 + 0.002 + 0.00832423 — 0.01 = 0.10032423. В данном случае простым перебором находим, что это монета 0.1. Её мы оставляем, а значит отправляем остальные: 0.002 BTC и 0.00832423 BTC, которые в сумме дают 0.01032423 BTC, что больше 0.01 BTC и нас устраивает. (Правда, комиссия вышла примерно 3 доллара, но, допустим, что сеть загружена и мы хотим сделать отправку как можно быстрее.)
Комиссии
Чтобы учесть комиссии за транзакцию, я модифицировал каждую входную монету, уменьшив её баланс на сумму, которую придётся выложить за её включение в транзакцию в качестве входа. Это можно сделать, зная размер входа и комиссию (например 2 сатоши за байт). Кроме того, я модифировал отправляемую сумму, приплюсовав к ней цену части транзакции, не зависящей от выбранных монет: заголовка и выхода(ов). Все эти параметры пользователь может указывать с помощью флагов. Также можно отключить поправку на комиссии вообще, указав комиссию 0 сатоши за байт.
Информацию о размерах входов и выходов в разных версиях адресов (классические, обёрнутый segwit и нативный segwit) я взял отсюда: https://bitcoin.stackexchange.com/a/84006
Алгоритмы и реализация
Генетический алгоритм я сразу отбросил, может и зря. Сосредоточился на точных алгоритмах. Первой моей попыткой была реализация через полный перебор всех комбинаций, но даже на 40 монетах он работал часами и пришлось отказаться от него. Затем я попробовал динамическое программирование, предложенное в википедии. В нём можно не держать в памяти всю матрицу, а только текущий и предыдущий ряды. Кроме того, нам не нужно хранить ценность, так как она совпадает с весом и является номером столбца. Зато нам нужно помнить комбинацию — её я решил хранить в виде битсета. Кроме того, можно хранить всего один ряд, строя из него следующий ряд in-place. Каждая ненулевая запись ряда остаётся на своём месте и копируется (с добавлением соответствующего бита) в другую ячейку на определённое число ячеек правее (если там до этого было пусто). Если идти в обратном порядке, перебирая ячейку, в которую идёт «прыжок», то можно всё правильно заполнить:
Каждая ненулевая ячейка в текущем ряду порождает в следующем ряду себя же и ещё одну ячейку на определённое число ячеек (равное достоинству добавляемой монеты) правее. Если в той ячейке уже есть значение, то «побеждает» вариант с наибольшим количеством выбранных (то есть не включённых в транзакцию) монет, так как мы хотим при прочих равных отправить как можно меньше монет.
На одну ячейку я трачу 8 байт под битсет, а число ячеек равно возможному количеству балансов от 0 до суммы монет минус отправляемая сумма. К примеру если в кошельке всего 1 биткоин, а отправляется 0.1, то будет 100'000'000-10'000'000 = 90'000'000 ячеек, каждая по 8 байт, то есть 720 мегабайт — немного для современного компьютера. Если число монет меньше 32, то можно было бы использовать по 4 байта на монету, но я не стал это оптимизировать. Кроме того, если монет больше, чем 64, то программа не работает — это тоже надо бы исправить, сделав битсет произвольной длины. Наконец можно отбросить последний знак в балансах, потеряв немного в точности, но выиграв в 10 раз в памяти. Но пока и так сойдёт.
Программу я назвал changeless и разместил на гитлабе: gitlab.com/starius/changeless. Написана она на Go, собирается с помощью go get
, как обычно. Доступны бинарники для Linux, Windows, Mac, собранные в CI.
Когда я запустил программу с реальными монетами, я был поражён, как точно она подобрала необходимую комбинацию. Когда число монет большое, практически любую сумму, соразмерную балансам монет, можно подобрать с точностью вплоть до сатоши! Меняешь требуемую сумму на 1 сатоши и программы выдаёт совершенно другую комбинацию монет точно под эту сумму. Ниже пример работы на 50 случайных монетах с балансами от 0 до 1 биткоина.
$ cat coins50.txt
0.01331611 0.03906237 0.04847086 0.08453118 0.09748168
0.10395389 0.10619825 0.12156721 0.12923149 0.13587973
0.14798976 0.16053788 0.19011834 0.21570038 0.21946913
0.31861430 0.33435508 0.33718842 0.33789473 0.35976748
0.37360122 0.44944553 0.47572926 0.49927495 0.50992142
0.53062326 0.53079433 0.53542072 0.54715225 0.55019714
0.55313907 0.56656642 0.56673333 0.65879650 0.66228482
0.68424322 0.70436496 0.75638055 0.79095597 0.82438005
0.83684407 0.85151564 0.86862948 0.90054250 0.90239402
0.91636213 0.93087757 0.93579251 0.97207439 0.98248384
$ changeless -amount 10.00000000 -coins coins50.txt
Processing item 50/50.
0.09748168 + 0.33435508 + 0.47572926 + 0.53542072 + 0.66228482 +
0.70436496 + 0.75638055 + 0.82438005 + 0.9005425 + 0.90239402 +
0.91636213 + 0.93579251 + 0.97207439 + 0.98248384 = 10.00004651
Tx size: 2118 vBytes. Total fees: 0.00004651 BTC (2.2 sats/vByte).
$ changeless -amount 10.00000001 -coins coins50.txt
Processing item 50/50.
0.01331611 + 0.09748168 + 0.53079433 + 0.56656642 + 0.70436496 +
0.75638055 + 0.82438005 + 0.86862948 + 0.9005425 + 0.91636213 +
0.93087757 + 0.93579251 + 0.97207439 + 0.98248384 = 10.00004652
Tx size: 2118 vBytes. Total fees: 0.00004651 BTC (2.2 sats/vByte).
Программа сумела подобрать комбинации монет для отправки ровно 10 биткоинов и ровно 10.00000001 биткоинов (10 биткоинов и 1 сатоши). Чтобы это увидеть, надо вычесть из суммы монет комиссии: 10.00004651 — 0.00004651 = 10, 10.00004652 — 0.00004651 = 10.00000001.
Как получить список балансов монет
Для программы Electrum я нашёл такой способ (команда консоли):
' '.join((x["value"]) for x in listunspent())
Если хочется исключить определённые монеты, например на определённом адресе, то это можно сделать так:
' '.join((x["value"]) for x in listunspent() if x["address"] != "bad address")
Для других кошельков я такого простого способа не нашёл и пришлось перепечатывать руками.
Комментарии (25)
nikizan
27.08.2019 10:45listunspent
[minconf=1] [maxconf=999999]
Returns array of unspent transaction inputs in the wallet.
en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list
Jetmanman
27.08.2019 13:54И всё это из-за высокой комиссии, иначе бы и не нужно было заморачиваться. Биткоин хорош, но не масштабируем, поэтому подход к будущему масштабированию Эфириума (шардинг) мне больше нравится. Да и сейчас в Эфириуме реализованы адреса на основе баланса и размер одной средней транзакции (при переводе просто эфира) раза в 2 меньше, чем в биткоине (т.к. нет использования множественных выходов), т.е. более эффективное использование простанства блокчейна. А после ближайшего хардфорка так пропускная способность должна вырасти еще в 4 раза как за счёт более экономного использования газа так и за счёт увеличения блока, но это лучше, чем система для богатых людей. Скоро (через 1-2 года) в биткоине транзакции будут стоить по 100 долларов и выше, а миллионерам будет все равно на это, ведь перевод миллионов долларов с комиссией даже в 1000 долларов это копейки. Учитывая ближайший халвинг биткоина, когда эмиссия биткоина сократиться в 2 раза, то либо хэшрейт должен снизится в 2 раза, либо транзакции станут стоить гораздо дороже (вплоть до 35 баксов за транзакцию), т.к. уже сейчас реальная стоимость одной транзакции биткоина 67 долларов исходя из затрат на электроэнергию, т.е. сейчас происходит дотирование транзакций за счёт эмиссии, а платят те, кто верит в повышение цены, а не те кто отправляет транзакции. Либо произойдет смешанный вариант когда будет частично снижен хэшрейт, повышены комиссии и снижены прибыли майнеров. В Эфириуме реальная цена транзакции сейчас 5 долларов исходя из затрат на электроэнергию, а фактические несколько центов (до 20 центов), если брать обычные транзакции, не смартконтракты и все это при в 2 большем количестве обрабатываемых транзакций в секунду, чем у биткоина.
Эфириум пытается стать в том числе деньгами для людей и вариантов использования будет иметь гораздо больше, как пример это накопления, деньги, кредиты обеспеченные эфиром, стабильные монеты, автономные приложения, идентификация, голосования и выборы, сбор средств, программы лояльности, тот же распределенный днс можно сделать, неизменная база данных, хранение важных данных, отслеживание товаров через токенизацию и т.д.
На счёт безопасности Эфириума, то чтобы осуществить атаку на эфириум внешнему атакующему, у которого нет обрудования, то для атаки на эфирум придется потратить 800 млн долларов, против 3,3 млрд на биткоин, а если брать крупнейшего майнера, то ему придётся раскошелится на 200 млн. в эфириуме, против 950 млн в биткоине. Количество узлов эфириума 6500-8000 узлов по разным данным, у биткоина 9800. Т.е. безопасность эфириума ниже, но более чем достаточна, т.к. затраты на атаку огромны по сравнению с капитализацией.
Т.е. биткоин рискует стать платежной системой и цифровым золотом только для очень богатых людей, банков, бирж и центробанков, а им все равно будет там комиссия 100$ или 1000$ при переводе миллионов и миллиардов долларов это будет менее 0,1% комиссии, и никакой LN не поможет ибо нужно потратить на товары и переводы больше, чем в 100 раз цены за комиссию на 2 транзакции (открывающую и закрывающую), а это 20000 долларов при комиссии 100$ за одну транзакцию, чтобы получить 1% комиссии, не более, не говоря уже об нереальной очереди транзакций (на открывающие транзакции для LN) при попытке обработать транзакции сотен миллионов людей. Либо биткоин будет сильно терять рост сетевого эффекта, в то время как эфириум, если ему конечно удастся перейти на POS и шардинг безопасно, обеспечит потребности сотен миллионов пользователей, т.к. шардинг даст в 1024 раза большую пропускную способность, чем сейчас, в совокупности с прочими методами масштабирования это должно сработать. По крайней мере транзакции будут платить сами за себя и модель эфириума будет устойчивой, а кто кроме очень богатых людей будет платить бешеные комиссии в биткоине мне не понятно.mayorovp
27.08.2019 15:08Что-то про дотирование транзакций за счёт эмиссии вы какую-то чушь написали.
Цена транзакции определяется соотношением спроса (т.е. желающих провести транзакцию) и предложения (которое фиксировано из-за особенностей биткоина).
Цена транзакции не зависит от от количества майнеров, ни от цены за электричество, ни от эмиссии.
Jetmanman
27.08.2019 16:38Никакой чуши, сейчас транзакции дотируются за счёт выдачи 12,5 биткоинов на блок, а в реальности за это платят те люди, кто покупает эти биткоины у майнеров. Себестоимость одной транзакции биткоина 67 долларов, если делить затраты майнеров на электроэнергию и затраты на оборудование на транзакции в блоке, по вашему кто за это должен платить? Т.е. вы считаете, что себестоимость транзакции может быть выше той, что платят пользователи и это будет устойчивой моделью? Я думаю, что нет и в будущем комиссии очень сильно вырастут. Через год халвинг. Это не говорит о том, что биткоин пропадет, но говорит о том, что он станет доступен только богатым людям или организациям и банкам.
А ваш минус на мой комментарий это ваше не аргументированное личное мнение.mayorovp
27.08.2019 17:33Себестоимость биткоина зависит от количества майнеров. Если половина майнеров разбежится из-за невыгодности добычи — то для оставшихся себестоимость упадёт вдвое.
Собственно, после халвинга примерно это и произойдёт.
Jetmanman
27.08.2019 19:30И что в итоге? Большая централизация майнинга? Если слухи правдивы, что 2 крупнейших пула принадлежат битмейну, то уже конечно не радужная ситуация. А ведь все ждут, что хэшрейт будет только расти, поэтому пути только такие, либо произойдет снижение децентрализации и безопасности за счёт уменьшения числа майнеров и снижения хэшрейта или произойдёт увеличение комиссии, ну или то и другое частично. Но учитывая то, что блок уже заполнен почти до упора, то комиссия вырастет так или иначе вне зависимости от затрат на майнинг, т.к. возникнет бешеная конкуренция за пространство в блоке и её выиграют богачи и крупные организации, т.к. уже сейчас происходят миллиардные ежедневные переводы, а значит спрос со стороны богатых людей есть и с чего бы ему уменьшаться, учитывая что богачей в мире меньше числа целых биткоинов, так что борьба за пространство блока просто вытеснит простых людей из биткоина. К тому же врядли в магазинах будут принимать биткоины, на что их тратить? А эфир можно тратить внутри платформы эфириума, на оплату дейтельности на нём. Корпорации на сеть эфириума еще не зашли только потому что они знают, что мгновенно перегрузят эфириум, но если он масштабируется (а скорее когда), то рост сетевого эффекта будет очень быстрым, может даже лавинообразным, т.к. интерес со стороны корпораций есть. А четырёхкратный рост числа транзакций в эфире произойдёт уже где-то в ноябре, если не затянут как обычно.
starius Автор
27.08.2019 23:05Высокие комиссии решают сразу две проблемы: не дают заполонить блокчейн мусором и создают награду за майнинг. Когда пройдёт несколько халвингов и инфляция биткоина станет околонулевой, то новые битки почти перестанут подливаться и комиссии будут основным источником компенсации для майнеров.
Советую почитать книгу The Bitcoin Standard — она кого хочешь сделает биткоин-максималистом. Главная функция биткоина — это быть средством сбережения и крупных переводов (расчёты между бизнесменами, покупка недвижимости и так далее), а не платёжной системой для оплаты 10 долларов за розничные покупки. Хотя конкретно сегодня она и для последнего тоже подходит большую часть времени, так как комиссии околонулевые (0.01-0.05 доллара), загруженность низкая.
Помимо лайтнинга есть и другие способы делать мелкие платежи биткоином:
- создание частных бумажных денег, подкреплённых биткоином, (представьте бинанс выпустит "мавродики" в сатошевом номинале, которыми можно будет пополнять свой баланс на бинансе — это вполне может работать, если государство не помешает
- USB-кошельки, пополненные на определённую сумму (например 0.001) и с которых можно подписать транзакцию только 1 раз, после чего чип показывает, что приватным ключом уже кто-то пользовался. Будет аналогом сегодняшней вездесущей стодолларовой купюры (или купюры в 5000 рублей). Преимущество в приватности переводов (которой в схеме с переиспользованием адреса, как в Waves или XRP а теперь ещё и в Эфире не будет, кстати), так как на блокчейн вообще ничего не попадает. Я дал вам физическую монету с USB-портом, вы вставили в смартфон, убедились, что она подлинная (по информации из блокчейна, проверке, что она может сделать подписи заявленным адресом биткоина и по цифровой подписи производителя таких монет). Вы положили монету в карман и разгуливаете с ней, как сегодня вы разгуливаете с бумажкой 100 долларов. По сути ничем не хуже золотой монеты, даже лучше, так как можно "высосать" из неё ценность и перенести её обратно в обычный биткоин-кошелёк, а золотую монету только физически можно передавать.
Jetmanman
28.08.2019 12:46Вы сами подтверждаете, что использовать биткоин смогут только богатые люди, т.е. в будущем если вы или я захотим использовать криптовалюту, то скорее всего это будет эфириум. Насчёт мусора в блоке, мусор это все что стоит очень дешево и должно обходиться дешево в хранении, но если эфириум перейдет на шардинг, то цена хранения упадет в 1024 раза, значит и мусором будет считаться что-то более дешевое, чем сейчас когда блок биткоина это примерно 2 мб с учетом сегвита.
На счёт анонимности скажу, что она практически недостижима из-за того, что все записывается в блокчейн и даже транзакции монеро удалось деанонимизировать. Но эфириум насколько я понимаю за то, чтобы использовать zk-snark/stark, а это при условии использования таких транзакций всеми даст хорошую анонимность. Но с анонимностью проблемы в том, что государства могут просто запретить использование таких криптовалют, как пытаются делать в некоторых странах ограничивая использваниме монеро, зэкэш, даш. К тому же можно использовать миксеры, а для этого даже не нужно ничего менять в коде криптовалюты, но опять же такие монеты могут быть помечены государствами и организациями как сомнительные и противозаконные и ими потом просто не расплатишься.
На счёт наличных денег на основе криптовалюты скажу, что почему нельзя просто сделать карту такую же как банковская с неизвлекаемым ключом на чипе внутри, тогда насколько я понимаю никто не сможет достать и узнать ключ и вроде даже производитель чипа и туда можно записать любую крипту и платить ею, при оплате все на терминале все будет записываться в блокчейн или можно просто передать такую карту физически вместе с ключом, который исходный владелец не будет знать.
И последнее на счёт биткоина. Сатоши Накамото в своем документе о биткоине написал в заголовке «Биткойн: система цифровой пиринговой наличности», но уже сейчас это не так, это не деньги так как использовать биткоин как деньги для обычных покупок очень дорого, т.к. медианная комиссия 1,53 доллара судя по осредненным за 90 дней данным с coinmetrics.io, т.е никакие не 5 центов как вы говорите, а 5 центов будет если вы хотите очень долго ждать. При дальнейшем снижении награды за блок и переходе на комиссии с транзакций комиссия на мой взгляд достигнет минимум 100 долларов или больше, т.к. себестоимость уже сейчас 67 баксов. И в чем смысл биткоина, если Сатоши в первом блоке биткоина записал критику монетарной политики банков, а при этом не желая того создал систему для богатых людей, у богатых все итак хорошо, зачем для них создавать биткоин? В чем смысл биткоина, если он будет обеспечивать богатых людей? В чем смысл, если биткоин не будет использоваться по назначению? И не важно какой хэшрейт в числах, важно сколько денег потрачено на защиту сети, и если появятся более эффективные майнеры это ничего не дает сети, т.к. злоумышленнику просто нужно купить соответствующее эффективное оборудование, а оно доступно всем у кого есть деньги. Мне непонятны эти разговоры про эффективность майнинга в POW, если суть POW именно в затратах на защиту сети, все равно все сэкономленные деньги пойдут на покупку нового оборудования для извлечения большей прибыли.
И все забывают про волатильность биткоина, а также что комиссию нужно считать не только ту, что внутри сети биткона, но и при конвретации фиатной валюты в криптовалюту и наоборот, т.к. я очень сильно сомневаюсь, что в государствах будут разрешены оплата какой-либо валютой кроме местной, такой как доллар, рубль, они для этого и созданы, чтобы государства могли осуществлять монетарную политику, а значит и комиссия на конвертацию и соотвественно дополнительное время тоже нужно учитывать, а волатильность просто заставит продавцов поднимать цены при оплате криптой, или сразу конвертировать в фиатные валюты.
Биткоину остается только крупные переводы и функция накопления, а с такой себестоимостью транзакций это только для богатых людей. Когда биткоин достигнет 100000 долларов, я думаю многие перестанут верить в дальнейший рост и скупка биткоинов снизится, а значит комиссии будут определяющими в прибыли майнера и вот тогда транзакции будут стоить минимум 100-1000 баксов.starius Автор
29.08.2019 01:25Вы сами подтверждаете, что использовать биткоин смогут только богатые люди, т.е. в будущем если вы или я захотим использовать криптовалюту, то скорее всего это будет эфириум.
Сомневаюсь. Эфириум лишён какой-либо ценности, так как полностью контролируется одним человеком (или в крайнем случае одной компанией), который может по своей воли отменять транзакции, нарушая заявленное правило "код есть закон".
Кроме того, кто мне и вам помешает в будущем пользоваться биткоином. Допустим, цена вырастет в 10 раз. Транзакция будет стоить не 1-5 центов, а 10-50 центов в нормальные дни. Надо быть сверх-богачом, чтобы платить столько? Напомню, биткоин не подразумевает постоянного использования для мелких трат. Думаю, минимальное, что обычный человек будет им оплачивать — это аренда квартиры. Кроме того, это один из рынков, где есть активный запрос на уход в тень — идеальное для биткоина применение.
если эфириум перейдет на шардинг, то цена хранения упадет в 1024 раза
Но тогда и безопасность сети будет крайне низкой. Впрочем, если они сделают дешёвые и быстрые транзакции, можно будет сделать токены на эфире, подкреплённе биткоином (уже такое есть). Я бы держал там эквивалент 100 долларов и тратил бы на покупки в магазинах. Но как основная форма для хранения накоплений это не подходит — недостаточно безопасно. Я бы сравнил биткоин со срочным вкладом в банке — вы не пользуетесь им каждый день, а открываете его, ждёте год и закрываете или снимаете проценты. А те применения, о которых вы говорите — это аналог пластиковой карточки, привязанной к счёту для востребования, на которой люди держат небольшие суммы.
На счёт анонимности скажу, что она практически недостижима из-за того, что все записывается в блокчейн и даже транзакции монеро удалось деанонимизировать.
Ну это смотря от кого мы защищаемся. Чтобы побороть анализаторы блокчейна, достаточно CoinJoin, который можно уже сегодня делать в биткоине. Когда 100 человек объединяет свои монеты в одну транзакцию и растаскивает их на сто новых адресов, то вероятность каждого человека быть владельцем адреса 1%. А если такую операцию повторить 2-3 раза, то эта цифта становится 0.01% и 0.0001%. Запретить такое будет крайне сложно, разве что если полностью биткоин запрещать. Биткоином обменивается слишком много людей, чтобы их можно было заставить не принимать такие монеты. Тем более, никто обычно и не смотрит, откуда ему пришла монета. Да и зачем это делать, если направляешь их после этого сразу в coin join и откуда бы они ни пришли, уже будет не различить, когда будешь их тратить. Этот подход возвращает в биткоин одно из главных свойств денег — взаимозаменяемость.
На счёт наличных денег на основе криптовалюты скажу, что почему нельзя просто сделать карту такую же как банковская с неизвлекаемым ключом на чипе внутри, тогда насколько я понимаю никто не сможет достать и узнать ключ и вроде даже производитель чипа и туда можно записать любую крипту и платить ею, при оплате все на терминале все будет записываться в блокчейн или можно просто передать такую карту физически вместе с ключом, который исходный владелец не будет знать.
Чем это лучше варианта, который я предложил, с одноразовыми USB-монетами? Они будут достаточно мелкие, чтобы использоваться в качестве разменной монеты, но в то же время они не будут требовать никаких блокчейн операций (что позволит использовать в них напрямую биткоин) и их можно будет проверять на подлинность простым способом (в отличие от обычных бумажных денег или золотых монет, которые проверить на 100% не так-то просто).
медианная комиссия 1,53 доллара судя по осредненным за 90 дней данным с coinmetrics.io, т.е никакие не 5 центов как вы говорите, а 5 центов будет если вы хотите очень долго ждать.
Это комиссия, которую по факту платили, а не минимальная, с которой транзакции быстро проходят. Есть такой сайт bitmex называется, они каждый день в 16:00 по московскому времени вываливают кучу транзакций (все накопившиеся запросы на вывод), в которых минимальная транзакция 0.0002 (2 доллара), а значение по умолчанию и вовсе стоит на 0.001 (10 долларов). Транзакций там немало, они не пытаются их объединять и каждому шлют своей транзакцией и платят такую комиссию. Очень щедро, но избыточно! Когда я сам отправляю, я смотрю на сайты https://bitcoinfees.info/ и https://bitcoinfees.earn.com/. К примеру на первом сайте сейчас сказано, что если хочешь, чтобы за час дошло, нужно 24 цента. Но это сейчас некий всплекс, так как биток упал, наверное. И опять же я просто поставлю 10 центов и всё равно дойдёт обень быстро. Мне не принципиально, чтобы дошло максимально быстро, так как я не плачу в магазине и не стою у кассы. Все сайты и люди, которым я плачу, спокойно прождут несколько часов, а некоторые и несколько дней. Когда люди шлют деньги из страны в страну, перевод занимает обычно 3 суток и люди мирится с этим, потому что куда спешить?
Сатоши Накамото в своем документе о биткоине написал в заголовке «Биткойн: система цифровой пиринговой наличности»
Слово "наличность" в данной фразе не подразумевает мелкий размер платежа. Это мы привыкли оплачивать мелкие траты наличкой, а крупные картой, поэтому у нас слово "наличность" ассоциируется с мелкими суммами. Однако надо смотреть, что слово cash на самом деле означает и что называли им в прошлом, когда мы ещё были на золотом стандарте. Cash — это то, что в монетарной системе обладает собственной ценностью, а не является обязательством, которое чем-то подкреплено. К примеру, в 19 веке золото было cash, а доллары, которые банки обязались обменивать на золото по фиксированному курсу, не были cash, они были notes. То есть у них тогда cash в основном хранился в банках, обеспечивая ценность всего остального, начиная с банкнот. В сегодняшнем мире у нас нет cash в истинном значении, наши бумажные деньги — это пустышка, так как они являются вроде бы основой монетарной системы (поддерживают все остальные деньги и инструменты вроде облигаций и под ними нет ещё одного "слоя" поддержки), но сами при этом не являются ценностью, а навязаны государством. То есть в фразе digital cash слово cash означает не бумажные деньги, а золотые монеты, к примеру. Они до сих пор сохранили ценность, хотя владеют ими в основном очень богатые люди. Ну так и что с того? Остальные люди потому и бедны, что принимают резаную бумагу за cash. Эх, было бы проще, если бы Сатоши написал "Биткойн: цифровая система твёрдых денег". Не пришлось бы объяснять, что мятые бумажки к cash не имеют никакого отношения :-)
И в чем смысл биткоина, если Сатоши в первом блоке биткоина записал критику монетарной политики банков, а при этом не желая того создал систему для богатых людей, у богатых все итак хорошо, зачем для них создавать биткоин?
В первом блоке биткоина Сатоши сослался на статью о том, как правительство печатает деньги из воздуха, чтобы заткнуть дыры в банках. Вы зря всё сводите к бедным и богатым. Проблема с печатью денег в том, что она всех делает беднее, так как деньги обесцениваются. Бедность — это состояние по умолчанию, в котором находится человек. Он пытается из него выбраться, работает, получает деньги. А потом оказывается, что деньги эти можно просто так печатать, то есть ему дали за его реальный труд подделку. Вот так люди и остаются бедными. А богатые люди знают, как избежать инфляции. Биткоин — это способ избежать инфляции, доступный каждому. Он сам по себе не сделает бедного богатым, но он даст ему инструмент, позволяющий защитить свои деньги от обесценивания, которое затевают банкиры, когда включают печатный станок. Мне хочется, чтобы каждый бедный мог сам выкарапкаться из этого состояния и его не сталкивали обратно в ту же яму с помощью инфляции.
И не важно какой хэшрейт в числах, важно сколько денег потрачено на защиту сети, и если появятся более эффективные майнеры это ничего не дает сети, т.к. злоумышленнику просто нужно купить соответствующее эффективное оборудование, а оно доступно всем у кого есть деньги.
Переводое оборудование, с помощью которого майнить прибыльно, стоит очень дорого. Те, кто задумал атаку на сеть, вынуждены будут купить это оборудование, а в случае успешной атаки они обрушат цену биткоина, а значит окажутся в огромных убытках, ведь их дорогое оборудование можно будет только выбросить на помойку.
И все забывают про волатильность биткоина, а также что комиссию нужно считать не только ту, что внутри сети биткона, но и при конвретации фиатной валюты в криптовалюту и наоборот, т.к. я очень сильно сомневаюсь, что в государствах будут разрешены оплата какой-либо валютой кроме местной, такой как доллар, рубль, они для этого и созданы, чтобы государства могли осуществлять монетарную политику, а значит и комиссия на конвертацию и соотвественно дополнительное время тоже нужно учитывать, а волатильность просто заставит продавцов поднимать цены при оплате криптой, или сразу конвертировать в фиатные валюты.
Волатильность тем выше, чем меньше капитализация. К примеру, волательность золота заметно ниже (хотя оно тоже упало с 1900 до 1050 долларов — нехилое падение), так как оно обладает капитализацией в 40 раз больше. Так что проблема волатильности уйдёт сама собой по мере роста биткоина как денежной системы. Сейчас он ещё подросток, а не взрослый. Но уже и не ребёнок.
Что касается конвертации туда-сюда, то я не понял, зачем конвертировать, если можно просто перевести человеку биткоин. Если ему хочется его продать — это уже его дело. Что касается государства, то ему будет довольно сложно запретить подобное. Просто сегодня мало людей знает про биткоин, поэтому мала вероятность того, что два таких человека встретятся при сделке. Но представьте, что я продаю вам подержанный ноутбук и у вас есть биткоин. Почему бы вам мне просто его не перевести, как вы передали бы кеш? Государство такие сделки не отслеживает, да и не должно: в системе из меня и вас ничего не поменялось, как был ноутбук и биткоин, так и остался, просто поменялись местами. Можно назвать взаимным одариванием, которое, согласно известному прецеденту, налогом не облагается :-)
А что касается монетарной политики государства, то как раз она и делает всех нас бедными. Единственное, что государство может делать с деньгами — это их печатать и собирать налоги. Оба действия делают человека беднее. Кроме того может брать деньги в долг под проценты, которые будут в будущем либо напечатаны, либо собраны в виде налогов. Тут и ежу понятно, что такая монетарная система выгодна государству и не выгодна простому человеку. Так что биткоин как раз хорош тем, что позволяет поставить государство на место, чтобы не вмешивалось туда, куда не просят.
И ещё один чисто практический аспект. Чтобы застраховаться от колебаний курса, можно просто хеджировать свои транзакции, например с помощью деривативов. К примеру, розничные продавцы золота стоят в шорте по золоту на ту сумму, которая лежит у них в магазинах. Когда кто-то приходит и покупает у них монету или слиток, они сразу же выходят из шорта. То же делают и обменники валют и т.п. Такая тактика позволяет им не зависеть от колебаний курса и стабильно зарабатывать на разнице между спотовой ценой и ценой, по которой они продают. Думаю, ничего сложного нет в том, чтобы сделать то же самое для биткоина, если хочется обезопасить сумму сделки в долларах или наоборот в биткоине. Уверен, что онлайн-магазины, где можно оплатить что-то биткоином, делают точно так же: когда для покупателя создаётся адрес оплаты и фиксируется сумма в битках, они тут же встают в шорт по битку относительно доллара, чтобы не зависеть от колебаний цены, пока покупатель оплачивает.
Биткоину остается только крупные переводы и функция накопления, а с такой себестоимостью транзакций это только для богатых людей.
А обычные люди не делают накопления? Я знаю человека, который вообще все свои деньги держит в биткоине и не жалеет об этом. При этом богатым его назвать нельзя, обычный парень. Если бы я был посмелее, делал бы как он.
Когда биткоин достигнет 100000 долларов, я думаю многие перестанут верить в дальнейший рост и скупка биткоинов снизится, а значит комиссии будут определяющими в прибыли майнера и вот тогда транзакции будут стоить минимум 100-1000 баксов.
Думаю, тут ошибка в рассуждениях. Если число переводов в биткоине сократится, то майнеры всё ещё будут получать фиксированную награду за блок (12.5 биткоина). Если же вы говорите об отдалённом будущем, когда фиксированная часть награды сильно уменьшится из-за халвингов и комиссии станут основным источником заработка майнеров, то тут всё равно ошибка в рассуждениях. Если блок не будет полностью заполняться, то майнеры будут вынуждены брать даже самые дешевые транзакции, так как иначе место в блоке просто пропадёт и они меньше заработают. Сговориться и не брать такие транзакции, несмотря на пустое место в блоке, у них тоже вряд ли удастся, так как каждый из них будет заинтересован в единоличном выходе из сговора (то есть это пример трагедии общин). То есть комиссии в биткоиновом выражении будут примерно как сейчас, когда в сети нет ажиотажа: 1-2 сатоши за байт. Если цена биткоина при этом вырастет в 10 раз, значит это будет 10-50 центов.
Кстати во всех подобных рассуждениях надо ещё учитывать такой момент, что если биткоин будет 100к или миллион, то это будет означать с огромной вероятностью, что доллар уже не тот, что сегодня. То есть будущие 10-50 центов это не такая большая ценность, как сегодняшние (а, к примеру как сегодня 5-25 центов, в 2 раза меньше).
Jetmanman
29.08.2019 11:14-1Вы проигнорировали себестоимость транзакции биткоина, которая на данный момент исходя из затрат на оборудование, которое служит год и затрат на электричество 67 баксов, дальнейшие рассуждения, что отдельные люди могут сейчас позволить себе платить за транзакцию 5 центов не серьезны, т.к. эти комиссии даже близко не покрывают текущие расходы, все расходы покрываются за счёт покупки биткоинов у майнеров на бирже и когда нибудь это закончится, т.е. эта доля резко снизится и основная доля будет составлять комиссии, а при росте затрат на майнинг, что и происходило до сих пор, а также уже почти полностью забитом блоке комиссии станут огромными, что и определяет пользователей переводов, которые будут смотреть на относительные комисии и чтобы позволить себе перевод в комиссией в 1% от перевода, то величина такого перевода должна быть в 100 раз больше, т.е. при 100 долларах это 10000 долларов.
Вы говорите про то, что блок используется неэффективно, но те у кого есть деньги плевать на это, и большая эффективность не приведет к какому-то серьезному масштабированию.
Еще раз ни о каких центах за транзакцию для всех не идет речь, т.к. текущая медианная комиссия как раз и дает вам возможность ставить такие низкие комиссии, т.к. вы внизу распределения и те кому нужно быстро перевести на биржу и обратно, а это наверно основное использование на данный момент не станут ставить низкие комиссии и рисковать застрявшей транзакцией и потерянным временем. Сейчас комиссия медианная 1,53$ при осреднении за 90 дней, конечно есть периоды как сейчас когда комиссии ниже, но часто они гораздо выше, а в среднем пока 1,53$. Сейчас кстати доля комиссии от всей награды майнеру это 1-4%, т.е. рост комисии неизбежен. Да и как вы будете конкурировать с теми кто будет отправлять огромные суммы повышая комиссии? Просто весь блок будет заполнен дорогими транзакциями с огромными суммами, а ваша станет как вы говорите мусором, т.к. все определяет величина комиссии, и если есть деньги то зачем им парить об эффективности использования блока, просто повысят комиссию.
Обычная экономика работает только с фиатными валютами, а все кто принимает криптовалюты просто работают таким образом, что просто конвертируют мгновенно в фиат или наоборот и пользуются криптовалютами просто как быстрой платежной системой, т.к. государства просто запрещают использовать какие-либо валюты кроме национальной. Если вы будете принимать криптовалюты вместо национальной, то скорее всего вы нарушите закон, да и происходить это будет разве что между людьми как вы говорите для продажи б.у. товаров, но основная экономика это не купля продажа товаров между людьми, а в магазинах никто не станет напрямую использовать криптовалюты.
Одна из причин почему не выгодно использовать криптовалюты в оплате товаров даже в том случае, что вы описали при покупке б.у. техники это то, что никто не получает и не будет получать зарплату в криптовалюте, а значит неизбежна конвертация и соответственно дополнительные комиссии и время.
Волатильность биткоина и других криптовалют никогда не исчезнет, т.к. это свободный курс, а не регулируемый центробанками, и волатильность несколько процентов всегда будет. И эта волатильность заставляет закладывать ее в цену, т.к. продавец должен быть уверен что всегда получает прибыль, а не убыток от продажи.
Кстати на счёт времени подтверждения, по формуле приведенной в документе сатоши накамото можно определить, что время подтверждения определяется исключительно долей крупнейшего майнера, которого можно рассматривать как потенциального атакующего, который втихаря строит форк блокчейна, чтобы осуществить двойную трату и откатить текущую цепь, так вот для биткоина при вероятности атакующим примерно 5% догнать честную цепочку это 4 подтвреждения, а для эфиримума это 5 подтверждений, но по времени это 40 и 1 минута соответственно, т.е. эфириум в 40 раз быстрее при том, чтобы атаковать гарантировано крупнейшему майнеру придется докупить оборудования на 200 млн долларов, т.е. защита железобетонная. Другими словами биткоин гораздо медленнее, а защита его избыточна.
И на счёт того, что один человек может менять правила эфириума, то это не соответствует действительности.
Сейчас идет очень много пиара биткоину, и почти никакого эфириуму, как только сетевой эффект эфириума увеличится все перебегут хвалить эфириум, а пока многим майнерам и прочим инвесторам выгодно хвалить биткоин, т.к. они много на этом зарабатывают, очень много пустой хвалы биткоину, раньше я тоже был биткоин максималистом, пока не понял, что его хвалят не заслуженно.
Пока биткоин не представил плана масштабирования, а эфириум представил (кстати это план команды разработчиков, а не план организации владебщей криптовалютой, могут быть и другие команды со своими планами), также у эфириума сейчас 2 клиента это geth и парити, а у биткоина это почти полностью биткоин кор, а в будущем эфириум планирует и уже создает до 6 клиентов, т.е. эфир более децентрализован. Самая плохая децентрализация на данный момент в криптовалютах заключена в майнинге и есть много опасностей такие как воровство хэшрейта хакерами, так и то, что просто мелкие майнеры исчезнут и число майнеров сократится до небольшого количества крупных майнеров. И что собственно мешает крупным государствам использовать налоги населения и дотировать производство оборудования для увеличения своей доли вплоть до 51%? Смена алгоритма не поможет, т.к. все алгоритмы используют либо асики, либо видеокарты, либо процессоры и все это государство может иметь, так что никакая смена алгоритма не поможет снизить передать власть людям, т.к. все что есть у обычных людей есть и у государства. Разве что конкуренция между государствами будет, но и то не гарантирует от сговора блокирования неугодных транзакций по сговору крупных игроков как это произошло в EOS. А эфириум планирует перейти на POS, а в это случае если это сработает будет невозможно скупить все монеты государствами, а валидаторов будет 300000 по 32 эфира(не больше, не меньше) на ставку, что гарантирует децентрализацию, а шардинг обеспечит масштабируемость. По крайней мере это будет рабочая платформа для всех, что не означает, что это будет настолько дешево, что каждый сможет записывать туда котиков или сообщения из чатов забесплатно тоннами.
starius Автор
27.08.2019 23:13Пока цена биткоина выше себестоимости, в майнерах недостатка не будет. В момент халвинга себестоимость подскачет примерно в 2 раза (не ровно в 2, так как есть же ещё комиссии), часть майнеров выйдет из бизнеса (те, что майнят на старом оборудовании и уже имеют низкую доходность). На их место придут владельцы последних моделей асиков. Тем самым возрастёт доля более эффективных майнеров, что полезно для биткоина и мира в целом: лучше соотношение цена-качество (потребление электричества — хешрейт). А то всё громче слышно недовольство зелёных, что биткоин потребляет больше электричества, чем вся Швейцария, к примеру. Вот это будет частично пофикшено без существенного убытка для безопасности сети.
wondersoft
28.08.2019 11:09Какую именно задачу мы решаем? Если минимизация комиссии, то она зависит при прочих равных от:
- наличия сдачи
- количества входов
Обойтись без сдачи в большинстве реальных случаев нельзя, как монеты ни подбирай. В статье пример где очень много монет примерно одинакового номинала на адресах, но это довольно редкий случай, разве что у какого нибудь обменника или биржи.
Уменьшить количество входов действительно, можно. Опять если исходить из практических примеров когда нет такого равномерного размазывания баланса, тут не так много выбора остается. Кошельки используют гораздо более простые алгоритмы, которые эту проблемы сливания монет решают.
starius Автор
28.08.2019 11:20Две задачи: минимизации комиссий и уменьшения числа монет. Второе нужно, чтобы можно было руками выбирать, какую монету отправить, что в свою очередь нужно для увеличения приватности. Когда их в кошельке несколько десятков, ручная работа с ним затрудняется.
Обойтись без сдачи в большинстве реальных случаев нельзя, как монеты ни подбирай. В статье пример где очень много монет примерно одинакового номинала на адресах, но это довольно редкий случай, разве что у какого нибудь обменника или биржи.
В том и дело, что комбинаторика работает в нашу пользу. Я на своём реальном кошельке успешно смог подобрать сумму, которую надо было отправить, а у меня там всего 40 монет было. В примере, который я приложил к статье, балансы сгенерированы случайно в диапозоне от 0 до 1, они вовсе не примерно одинаковы. В моём кошельке тоже был бардак и монеты были самые разные, никакого специального баланса на них не было.
Кошельки используют гораздо более простые алгоритмы, которые эту проблемы сливания монет решают.
Мой кошелёк предпочитает взять одну монету вместо сливания многих маленьких, даже когда это можно сделать (а это можно сделать, как нашла моя программа).
wondersoft
28.08.2019 11:59Так он и берет одну монету, чтобы комиссию уменьшить. Чем тогда этот алгоритм лучше?
starius Автор
28.08.2019 23:25Он берёт одну монету и создаёт одну монету (сдачу), то есть число монет (а значит и суммарная комиссия, которую в будущем придётся заплатить, чтобы все их потратить) осталась той же. А мой алгоритм сокращает число монет.
Squoworode
Стоп, што? Я думал, биткойн — это деньги, сколько нужно, столько и заплатил, а тут получается, что это — ведро нестандартизированных кусков случайной ценности?
mayorovp
Деньги в кошельке — это набор незакрытых входящих транзакций, каждая со своей суммой.
HappyLynx
На самом деле тут почти прямая аналогия с наличкой, только вместо банкнот стандартизированных номиналов у вас банкноты произвольного номинала.
Случай налички:
Вы хотите купить что-то за 650 рублей, при этом в кошельке у вас есть купюра на 1000 рублей, 8 купюр на 100 и, скажем, одна на 500. И вы тоже не можете просто взять и заплатить 650 рублей, вы можете дать одну купюру на 1000 и получить 350 сдачей, можете дать 500 и две по 100 и получить 50 сдачей ну и т.д.
Вот в биткоине история та же, только сдачу можно взять всегда одной купюрой номиналом равным размеру сдачи, т.е., скажем, у вас в кошельке было три «купюры» по 500 рублей, вы две из них отдаете продавцу, в процессе перевода они «склеиваются» в одну купюру на 1000 рублей, затем она «расклеивается» на купюру 650 рублей, которая оказывается в кошельке продавца, и купюру 350 рублей, которая возвращается вам в виде сдачи. При этом в вашем кошельке окажется две купюры: одна на 500, вторая на 350, и да, в самом кошельке они никаким магическим образом не «склеиваются». А происходит это потому, что блокчейн биткоина не хранит информацию о балансах кошельков в прямом виде, он хранит историю транзакций, т.е. информацию о том, какие «купюры» из каких кошельков уходили и в какие приходили, при этом текущий баланс кошелька не хранится, а вычисляется как сумма всех пришедших на него купюр минус сумма всех ушедших.
Polaris99
И что делать потом с фрагментацией?
mayorovp
Ну, собственно, в этом посте и написано что.
Ещё её можно просто игнорировать.
Nilpferd
То есть, если завести два кошелька и периодически перекидывать из одного кошелька в другой кучу таких мелких «купюр», то туда(в другой кошелек)они будут падать одной крупной «купюрой»?
Update: А, всё, увидел комментарий про комиссию на каждую «купюру».
mayorovp
Два кошелька не обязательно — можно же и самому себе деньги отправить.
Комиссию, кстати, платить не обязательно — она влияет "всего лишь" на приоритет транзакции. Но если устраивает блокировка средств на неделю — то нулевая комиссия вполне себе вариант.
vlad9486
Самому блокчейну нет разницы где у тебя лежат не потраченные выходы, он ничего не знает о кошельках. Все купюры можно сбить в одну купюру за одну транзакцию. Вся статья, ИМХО, о перфекционизме.
starius Автор
Да, сколько надо, столько и платишь, каждый биткоин взаимозаменим с другим биткоином по ценности. Однако на более низком уровне кошелёк состоит из адресов, на которых лежат монеты, которые образуются либо когда вам присылают деньги, либо когда вы кому-то шлёте и остаток кладётся на монету-сдачу. Иногда приходится спускаться на уровень монет, например чтобы улучшить приватность (так как на блокчейне видны операции именно с монетами, а не с кошельками) или чтобы сократить число этих самых монет в кошельке (или по крайней мере не дать ему расти), а значит и будущие комиссии: когда-то в будущем каждую монету придётся тратить, а комиссия за транзакцию зависит от числа включённых в неё монет.