amaclin
Legendary
Offline
Activity: 1260
Merit: 1019
|
|
January 18, 2017, 01:11:53 PM |
|
Надо глянуть исходники - как там реализовано, но в оригинале алгоритм задумывался так: 1. Если появились несколько цепочек, то принимаем обе и майним тоже соответственно обе. 2. Как только одна цепочка обогнала другую - начинаем майнить ту которая длиннее.
Неправильно. Никто не гоняется за двумя зайцами майнит две цепочки. Мэйнчейн в каждый момент времени один. И если клиент майнит - он майнит от последнего блока в мэйнчейне. С другой стороны клиент принимает и записывает себе в базу все валидные блоки которые ему присылают пиры. Валидный - это значит к нему есть родитель. Если вдруг в результате такого разрастания дерева блоков клиент обнаруживает что он находится не в мэйнчейне то есть организовалась цепочка по сложности превосходящая мэйнчейн - клиент начинает считать её мэйнчейном. Как точно считается сложность цепочки - я тут не особо копенгаген. Там какая-то вроде сложная формула суммирования, включающая даже количество транзакций в блоке. Но, повторю, в деталях не особо силен. Суммарная сложность из двух цепочек не обязательно будет больше у той, которая длиннее, но в принципе для удобства можно считать и так в уме представляя себе "что под капотом" Теперь возникает вопрос, что делать с хитрожопыми майнерами, которые продолжают майнить более короткую цепочку и посылать ее блоки в сеть? Имеют право. Может у них нет более длинной цепочки? Не знаю точно, как сейчас это решается, но вроде кошель с более длинной цепочкой банит такие хосты на некоторое время. За что банить? Ну нет у человека блока 1000 - он и майнил себе от имеющегося у него 999-ого Будучи забаненым большинством пиров, горе-майнер еще более безнадежно отстанет от главной цепочки. угу Вопрос в том - по какой причине длинная цепочка может перестать расти? Думаю только по сговору майнеров, контролирующих большую часть мощности сети... Это ты считаешь цепочку более длинной. И думаешь - а чего она сука не растет? а весь остальной мир уже давно её обогнал и майнит свою длинную цепочку, которую ты считаешь короткой. Поэтому я и предлагаю внести элемент лотереи. Можно еще таким элементом сделать перерасчет сложности не раз в 2 недели, а раз в час например )) и ромбики нарисовать в эбауте.
|
|
|
|
kzv
Legendary
Offline
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
|
|
January 18, 2017, 01:47:08 PM |
|
Надо глянуть исходники - как там реализовано, но в оригинале алгоритм задумывался так: 1. Если появились несколько цепочек, то принимаем обе и майним тоже соответственно обе. 2. Как только одна цепочка обогнала другую - начинаем майнить ту которая длиннее.
Неправильно. Никто не гоняется за двумя зайцами майнит две цепочки. Мэйнчейн в каждый момент времени один. И если клиент майнит - он майнит от последнего блока в мэйнчейне. С другой стороны клиент принимает и записывает себе в базу все валидные блоки которые ему присылают пиры. Валидный - это значит к нему есть родитель. Если вдруг в результате такого разрастания дерева блоков клиент обнаруживает что он находится не в мэйнчейне то есть организовалась цепочка по сложности превосходящая мэйнчейн - клиент начинает считать её мэйнчейном. Как точно считается сложность цепочки - я тут не особо копенгаген. Там какая-то вроде сложная формула суммирования, включающая даже количество транзакций в блоке. Но, повторю, в деталях не особо силен. Суммарная сложность из двух цепочек не обязательно будет больше у той, которая длиннее, но в принципе для удобства можно считать и так в уме представляя себе "что под капотом" Хорошо, эту часть алгоритма не меняем: пусть каждый клиент записывает в базу все блоки, для которых есть родитель. Если каждая ветка может расти ровно раз в 10 минут по времени клиента, то умрет только та цепочка, которую перестало майнить большинство. В противном случае более короткая никогда более длинную не догонит. Теперь возникает вопрос, что делать с хитрожопыми майнерами, которые продолжают майнить более короткую цепочку и посылать ее блоки в сеть? Имеют право. Может у них нет более длинной цепочки? Теоретически пусть майнят. Но для профилактики, те у кого есть более длинная цепочка, должны периодически банить таких майнеров. Блок принять - майнера на час забанить. Не знаю точно, как сейчас это решается, но вроде кошель с более длинной цепочкой банит такие хосты на некоторое время. За что банить? Ну нет у человека блока 1000 - он и майнил себе от имеющегося у него 999-ого Ну не на всегда банить. Просто временно ограничить прием пакетов от него... На всякий случай.
|
|
|
|
amaclin
Legendary
Offline
Activity: 1260
Merit: 1019
|
|
January 18, 2017, 01:56:40 PM |
|
Ну не на всегда банить. Просто временно ограничить прием пакетов от него... На всякий случай.
У тебя были блоки 998-999-1000 И ты майнил блок 1001 А тебе подсовывают блок 999' Ты блок берешь и банишь пира на час. Молодец, чо. Он тебе хотел прислать реорганизованную цепочку блоков 999'-1000'-1001' чтобы ты понял что ты майнишь орфан-цепь. А ты его забанил. На самом деле ты забанил сам себя таким образом. Молодец. Загнал себя в клетку.
|
|
|
|
kzv
Legendary
Offline
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
|
|
January 18, 2017, 07:18:47 PM |
|
Ну не на всегда банить. Просто временно ограничить прием пакетов от него... На всякий случай.
У тебя были блоки 998-999-1000 И ты майнил блок 1001 А тебе подсовывают блок 999' Ты блок берешь и банишь пира на час. Молодец, чо. Он тебе хотел прислать реорганизованную цепочку блоков 999'-1000'-1001' чтобы ты понял что ты майнишь орфан-цепь. А ты его забанил. На самом деле ты забанил сам себя таким образом. Молодец. Загнал себя в клетку. Я не разбирался в алгоритме, по которому биток банит хосты, но то что он их периодически банит это достоверный факт. Давайте не будем просто трогать этот алгоритм, а оставим его как есть. Итого, главные идеи (причем легко реализуемые) нового форка: 1. Включать новый блок в цепочку не чаще чем раз в 10 минут 2. Сделать неизменяемую сложность. Достаточно низкую, чтобы можно было майнить на процессоре. Как вам эти пункты?
|
|
|
|
amaclin
Legendary
Offline
Activity: 1260
Merit: 1019
|
|
January 18, 2017, 07:28:52 PM |
|
Я могу показаться критиканом, который только и делает, что хейтит чужие рацухи. Но я считаю себя достаточно знающим вопрос человеком, чтобы сказать: то что ты предлагаешь - это полная херотень. 2. Сделать неизменяемую сложность. Достаточно низкую, чтобы можно было майнить на процессоре. Неизменяемая сложность - это просто дыра-дырища которая позволит провести атаку-51 первому кульному хацкеру, который твой хэш-алгоритм запустит не на своем процессоре, а сделает порт на GPU или просто арендует мейнфрейм в своем студенческом кампусе.
|
|
|
|
kzv
Legendary
Offline
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
|
|
January 18, 2017, 07:35:48 PM |
|
Я могу показаться критиканом, который только и делает, что хейтит чужие рацухи. Но я считаю себя достаточно знающим вопрос человеком, чтобы сказать: то что ты предлагаешь - это полная херотень. 2. Сделать неизменяемую сложность. Достаточно низкую, чтобы можно было майнить на процессоре. Неизменяемая сложность - это просто дыра-дырища которая позволит провести атаку-51 первому кульному хацкеру, который твой хэш-алгоритм запустит не на своем процессоре, а сделает порт на GPU или просто арендует мейнфрейм в своем студенческом кампусе. Можешь описать алгоритм атаки 51 в предложенном мной форке? Я вот не вижу никакой возможности провести такую атаку, если блоки в цепочку будут приниматься от всех хостов с одинаковой вероятностью. Идея оригинального клиента о перерасчете сложности, чтобы блоки искались раз в 10 минут - красивая идея, но она привела к тому, о чем в 2009 году никто не мог знать: к асикам. Теперь стало очевидно, что не нужен этот огород со сложностью, достаточно библиотечной сишной функции time и все асики бреются.
|
|
|
|
amaclin
Legendary
Offline
Activity: 1260
Merit: 1019
|
|
January 18, 2017, 07:47:23 PM |
|
Я вот не вижу никакой возможности провести такую атаку, если блоки в цепочку будут приниматься от всех хостов с одинаковой вероятностью. при таком алгоритме сеть будет сплититься не переставая, в конце концов каждая нода будет самостоятельно генерировать раз в 10 минут свой собственный блок, который не будет принят ни одним из её пиров консенсус - это когда все соглашаются на какое-то решение и никто не против. например "водить в жмурки будет самый толстый" - это консенсус. в биткойне консенсус - транзакции действительны только в мэйнчейне, а мэйнчейн - это цепочка с наибольшей суммарной сложностью от генезиса. если ты убираешь правило по наибольшей сложности, то как определить какая цепь верная, а какая нет?
|
|
|
|
kzv
Legendary
Offline
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
|
|
January 18, 2017, 07:53:13 PM |
|
Я вот не вижу никакой возможности провести такую атаку, если блоки в цепочку будут приниматься от всех хостов с одинаковой вероятностью. при таком алгоритме сеть будет сплититься не переставая, в конце концов каждая нода будет самостоятельно генерировать раз в 10 минут свой собственный блок, который не будет принят ни одним из её пиров А вот это как рах и хотелось бы проверить экспериментально. Потому что ни у кого такого нет и сказать точно - как оно будет на самом деле, можно только на живом примере ))
|
|
|
|
kzv
Legendary
Offline
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
|
|
January 18, 2017, 07:56:14 PM |
|
если ты убираешь правило по наибольшей сложности, то как определить какая цепь верная, а какая нет?
Правильная цепь та, которая самая длинная. Она же и самая сложная, потому что сложность блока = константа.
|
|
|
|
amaclin
Legendary
Offline
Activity: 1260
Merit: 1019
|
|
January 18, 2017, 07:58:33 PM |
|
Правильная цепь та, которая самая длинная. Она же и самая сложная, потому что сложность блока = константа.
вот у меня длина цепи 1000 и у тебя 1000 ты говоришь что отправил мне транзакцию, а я утверждаю что я её не получил прошло 10 минут у тебя длина цепи 1001 и у меня 1001 ты говоришь что отправил мне транзакцию, а я утверждаю что я её не получил прошло 10 минут у тебя длина цепи 1002 и у меня 1002 ты говоришь что отправил мне транзакцию, а я утверждаю что я её не получил дебилы, бля. не, этот разговор мне надоел. извини, но спорить с заведомой глупостью - терять время. хочешь - делай. я готов поспорить на любую сумму что у тебя ни хуя не выйдет. но тратить время на объяснения больше не буду.
|
|
|
|
kzv
Legendary
Offline
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
|
|
January 18, 2017, 08:12:11 PM |
|
Правильная цепь та, которая самая длинная. Она же и самая сложная, потому что сложность блока = константа.
вот у меня длина цепи 1000 и у тебя 1000 ты говоришь что отправил мне транзакцию, а я утверждаю что я её не получил прошло 10 минут у тебя длина цепи 1001 и у меня 1001 ты говоришь что отправил мне транзакцию, а я утверждаю что я её не получил прошло 10 минут у тебя длина цепи 1002 и у меня 1002 ты говоришь что отправил мне транзакцию, а я утверждаю что я её не получил дебилы, бля. Вот исходные данные: у тебя 1000 блоков и у меня 1000 блоков. Ты майнишь и я майню... Если ты находишь блок раньше чем через 10 минут, то блок инвалидный - начинаешь искать новый блок. Тоже самое со мной. Вероятность того, что 1001 блок мы найдем и включим в свою цепь одновременно - крайне мала... Если мы не майним по блоку в секунду конечно... Но если кто-то начнет слать по инвалидному блоку в секунду, думаю его все таки оригинальный алгоритм забанит надолго.
|
|
|
|
amaclin
Legendary
Offline
Activity: 1260
Merit: 1019
|
|
January 18, 2017, 08:29:24 PM |
|
Вот исходные данные: у тебя 1000 блоков и у меня 1000 блоков. Ты майнишь и я майню... Если ты находишь блок раньше чем через 10 минут, то блок инвалидный - начинаешь искать новый блок. Тоже самое со мной. Вероятность того, что 1001 блок мы найдем и включим в свою цепь одновременно - крайне мала... Если мы не майним по блоку в секунду конечно... Но если кто-то начнет слать по инвалидному блоку в секунду, думаю его все таки оригинальный алгоритм забанит надолго.
я нахожу блок через 600 секунд. а твой блок приходит ко мне через 601 секунду потому что я в японии, а ты в англии мне нет никакого резона твой блок считать лучше моего. поэтому я продолжаю майнить от своего блока, а ты от своего. потому что тебе мой блок тоже пришел через 601 секунду как нам прийти к консенсусу чья цепочка верная? а если нас таких долбоёбов не двое, а двести тысяч? каждый со своей цепочкой? далее по индукции. какой мне смысл орфанить свою цепь и брать твою? в случае чего я могу часики подкрутить на пару секунд и мои блоки для меня всегда будут верные, а твои - всегда невалидные Если ты находишь блок раньше чем через 10 минут, то блок инвалидный - начинаешь искать новый блок. Тоже самое со мной.
Я не долбоящер. Если блок № 1000 датирован временем 21:15:37 (допустим) то я в блок № 1001 который собираюсь майнить ставлю время 21:25:37 и если нахожу такой блок за 3 минуты, то не считаю его невалидным, а просто курю 7 минут бамбук и выпускаю в сеть ровно через 600 секунд после блока 1000
|
|
|
|
kzv
Legendary
Offline
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
|
|
January 18, 2017, 08:58:55 PM |
|
Я не долбоящер. Если блок № 1000 датирован временем 21:15:37 (допустим) то я в блок № 1001 который собираюсь майнить ставлю время 21:25:37 и если нахожу такой блок за 3 минуты, то не считаю его невалидным, а просто курю 7 минут бамбук и выпускаю в сеть ровно через 600 секунд после блока 1000
Ну вот, ты такой умный и умеешь подкручивать часики. Велком! Твои блоки будет принимать большинство, которое так крутить не умеет... Правда со временем таких умных может оказаться большинство и к клиенту будет одновременно приходить 100500 разных блоков с одним и тем же временем )) Ну дак клиент возьмет самый первый, а остальных отбреет. И какой смысл майнить соло свою цепочку, когда большинство работает по другому алгоритму? Конечно, если исходить из того, что каждый начнет майнить по своему - тогда да, ничего из такой монеты не выйдет. Но исходить-то нужно из другого: сильно умных меньшинство, а большинство пользуется официальным клиентом с одинаковым алгоритмом.
|
|
|
|
amaclin
Legendary
Offline
Activity: 1260
Merit: 1019
|
|
January 18, 2017, 09:17:56 PM |
|
Конечно, если исходить из того, что каждый начнет майнить по своему - тогда да, ничего из такой монеты не выйдет. Но исходить-то нужно из другого: сильно умных меньшинство, а большинство пользуется официальным клиентом с одинаковым алгоритмом. Совершаешь ту же ошибку, что и Накамото. Он тоже думал, что все будут майнить на процессорах примерно одним клиентом (но возможность читинга он продумал гораздо лучше тебя) Но оказалось, что дураки готовы объединиться в пул, если владелец пула покажется им умным и пообещает им бабла больше, чем они смогут заработать сами. Так что как только пройдет слух, что существует "читерский" клиент или способ подкрутить часики и получить на три копейки больше - дураков в твоей сети не останется. Все станут "умными".
|
|
|
|
kzv
Legendary
Offline
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
|
|
January 18, 2017, 09:44:59 PM |
|
Так что как только пройдет слух, что существует "читерский" клиент или способ подкрутить часики и получить на три копейки больше - дураков в твоей сети не останется. Все станут "умными".
Ну можно сразу в алгоритме тогда искать блок с подкрученными часиками. Тогда все на равных все равно будут. Все смайненные блоки будут приходить одновременно. Сейчас когда приходит несколько блоков, то главным считается тот у кого больше сложность. Я считаю это надо как-то поменять. Если вместо выбора по сложности сделать рэндом? Ну да, надо продумать что-то получше ))
|
|
|
|
kzv
Legendary
Offline
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
|
|
January 18, 2017, 10:03:03 PM |
|
Что если поменять понятие сложности? Пусть из нескольких блоков, главным будет тот, сумма всех чисел в хэше которого - минимальна? Никто ведь из майнеров не знает заранее - какая сумма получилась у других. Поэтому получаем случайный результат при валидации когда несколько блоков приходят одновременно. С другой стороны, этот результат валидации будет одинаковым у всех клиентов.
|
|
|
|
kzv
Legendary
Offline
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
|
|
January 19, 2017, 12:47:22 PM |
|
Вобщем посмотрел исходники... Судя по этому: https://github.com/bitcoin/bitcoin/blob/0.12/src/main.cpp#L3428Алгоритм принятия блоков такой: 1. Если приходит блок, который мы сами спрашивали, то принимаем его в свою цепочку 2. Если приходит блок, который мы не спрашивали, то принимаем его в случае если сложность этого блока больше сложности последнего блока в нашей активной цепочке
|
|
|
|
amaclin
Legendary
Offline
Activity: 1260
Merit: 1019
|
|
January 19, 2017, 01:39:20 PM |
|
мухаха. теперь ответь на вопросы - что значит "мы спрашивали блок"? - в каком случае клиент может получить блок если его не спрашивал?
|
|
|
|
kzv
Legendary
Offline
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
|
|
January 19, 2017, 02:16:27 PM |
|
- что значит "мы спрашивали блок"?
Значит отправляли в сеть запрос: "дайте блок с таким-то хэшем у кого он есть" - в каком случае клиент может получить блок если его не спрашивал?
Если в сети появился новый блок.
|
|
|
|
amaclin
Legendary
Offline
Activity: 1260
Merit: 1019
|
|
January 19, 2017, 02:41:46 PM |
|
Значит отправляли в сеть запрос: "дайте блок с таким-то хэшем у кого он есть" Два (риторических) вопроса - как мы узнаем хэш нового блока? - зачем нам отправлять такой запрос всем своим пирам? Давай я не буду тебя мучить. Сам отвечу. Есть пакет "inv" Если я получаю блок и он вызывает у меня реорганизацию цепочки (или наращивание) я посылаю всем своим пирам этот пакет. В пакете только хэш блока, но не его высота. Дальше пиры уже решают что делать с этой информацией. Могут запросить у меня содержимое блока. Могут проигнорировать, если такой блок у них уже есть. Запрашивать блок "у всех" смысла нет. Есть смысл запрашивать только у того кто прислал "inv" Ситуация когда одна нода шлет другой ноде блок без запроса вообще говоря в биткойне не встречается. Хотя и не запрещается напрямую. К чему я это объясняю? К тому, что не бывает блоков, которые мы не запрашивали.
|
|
|
|
|