Bitcoin Forum
November 16, 2024, 08:10:22 PM *
News: Check out the artwork 1Dq created to commemorate this forum's 15th anniversary
 
   Home   Help Search Login Register More  
Pages: « 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 »  All
  Print  
Author Topic: Делаем криптовалюту  (Read 36805 times)
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
January 18, 2017, 01:11:53 PM
 #81

Надо глянуть исходники - как там реализовано, но в оригинале алгоритм задумывался так:
1. Если появились несколько цепочек, то принимаем обе и майним тоже соответственно обе.
2. Как только одна цепочка обогнала другую - начинаем майнить ту которая длиннее.
Неправильно. Никто не гоняется за двумя зайцами майнит две цепочки.

Мэйнчейн в каждый момент времени один. И если клиент майнит - он майнит от последнего блока
в мэйнчейне. С другой стороны клиент принимает и записывает себе в базу все валидные блоки
которые ему присылают пиры. Валидный - это значит к нему есть родитель.
Если вдруг в результате такого разрастания дерева блоков клиент обнаруживает
что он находится не в мэйнчейне то есть организовалась цепочка по сложности превосходящая
мэйнчейн - клиент начинает считать её мэйнчейном.

Как точно считается сложность цепочки - я тут не особо копенгаген. Там какая-то вроде сложная
формула суммирования, включающая даже количество транзакций в блоке. Но, повторю, в деталях
не особо силен. Суммарная сложность из двух цепочек не обязательно будет больше у той, которая
длиннее, но в принципе для удобства можно считать и так в уме представляя себе "что под капотом"

Quote
Теперь возникает вопрос, что делать с хитрожопыми майнерами, которые продолжают
майнить более короткую цепочку и посылать ее блоки в сеть?
Имеют право. Может у них нет более длинной цепочки?

Quote
Не знаю точно, как сейчас это решается, но вроде кошель с
более длинной цепочкой банит такие хосты на некоторое время.
За что банить? Ну нет у человека блока 1000 - он и майнил себе от имеющегося у него 999-ого

Quote
Будучи забаненым большинством пиров, горе-майнер еще более безнадежно отстанет от главной цепочки.
угу

Quote
Вопрос в том - по какой причине длинная цепочка может перестать расти?
Думаю только по сговору майнеров, контролирующих большую часть мощности сети...
Это ты считаешь цепочку более длинной. И думаешь - а чего она сука не растет?
а весь остальной мир уже давно её обогнал и майнит свою длинную цепочку, которую
ты считаешь короткой.

Quote
Поэтому я и предлагаю внести элемент лотереи. Можно еще таким элементом
сделать перерасчет сложности не раз в 2 недели, а раз в час например ))
и ромбики нарисовать в эбауте.
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
January 18, 2017, 01:47:08 PM
 #82

Надо глянуть исходники - как там реализовано, но в оригинале алгоритм задумывался так:
1. Если появились несколько цепочек, то принимаем обе и майним тоже соответственно обе.
2. Как только одна цепочка обогнала другую - начинаем майнить ту которая длиннее.
Неправильно. Никто не гоняется за двумя зайцами майнит две цепочки.

Мэйнчейн в каждый момент времени один. И если клиент майнит - он майнит от последнего блока
в мэйнчейне. С другой стороны клиент принимает и записывает себе в базу все валидные блоки
которые ему присылают пиры. Валидный - это значит к нему есть родитель.
Если вдруг в результате такого разрастания дерева блоков клиент обнаруживает
что он находится не в мэйнчейне то есть организовалась цепочка по сложности превосходящая
мэйнчейн - клиент начинает считать её мэйнчейном.

Как точно считается сложность цепочки - я тут не особо копенгаген. Там какая-то вроде сложная
формула суммирования, включающая даже количество транзакций в блоке. Но, повторю, в деталях
не особо силен. Суммарная сложность из двух цепочек не обязательно будет больше у той, которая
длиннее, но в принципе для удобства можно считать и так в уме представляя себе "что под капотом"

Хорошо, эту часть алгоритма не меняем: пусть каждый клиент записывает в базу все блоки, для которых есть родитель.
Если каждая ветка может расти ровно раз в 10 минут по времени клиента, то умрет только та цепочка, которую перестало майнить большинство. В противном случае более короткая никогда более длинную не догонит.

Quote
Теперь возникает вопрос, что делать с хитрожопыми майнерами, которые продолжают
майнить более короткую цепочку и посылать ее блоки в сеть?
Имеют право. Может у них нет более длинной цепочки?

Теоретически пусть майнят. Но для профилактики, те у кого есть более длинная цепочка, должны периодически банить таких майнеров.
Блок принять - майнера на час забанить.

Quote
Не знаю точно, как сейчас это решается, но вроде кошель с
более длинной цепочкой банит такие хосты на некоторое время.
За что банить? Ну нет у человека блока 1000 - он и майнил себе от имеющегося у него 999-ого

Ну не на всегда банить. Просто временно ограничить прием пакетов от него... На всякий случай.

OpenTrade - Open Source Cryptocurrency Exchange
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
January 18, 2017, 01:56:40 PM
 #83

Ну не на всегда банить. Просто временно ограничить прием пакетов от него... На всякий случай.

У тебя были блоки 998-999-1000
И ты майнил блок 1001
А тебе подсовывают блок 999'
Ты блок берешь и банишь пира на час.
Молодец, чо. Он тебе хотел прислать реорганизованную цепочку блоков 999'-1000'-1001'
чтобы ты понял что ты майнишь орфан-цепь. А ты его забанил.
На самом деле ты забанил сам себя таким образом.  Grin Молодец. Загнал себя в клетку.
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
January 18, 2017, 07:18:47 PM
 #84

Ну не на всегда банить. Просто временно ограничить прием пакетов от него... На всякий случай.

У тебя были блоки 998-999-1000
И ты майнил блок 1001
А тебе подсовывают блок 999'
Ты блок берешь и банишь пира на час.
Молодец, чо. Он тебе хотел прислать реорганизованную цепочку блоков 999'-1000'-1001'
чтобы ты понял что ты майнишь орфан-цепь. А ты его забанил.
На самом деле ты забанил сам себя таким образом.  Grin Молодец. Загнал себя в клетку.

Я не разбирался в алгоритме, по которому биток банит хосты, но то что он их периодически банит это достоверный факт.
Давайте не будем просто трогать этот алгоритм, а оставим его как есть.
Итого, главные идеи (причем легко реализуемые) нового форка:
1. Включать новый блок в цепочку не чаще чем раз в 10 минут
2. Сделать неизменяемую сложность. Достаточно низкую, чтобы можно было майнить на процессоре.

Как вам эти пункты?

OpenTrade - Open Source Cryptocurrency Exchange
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
January 18, 2017, 07:28:52 PM
 #85

Я могу показаться критиканом, который только и делает, что
хейтит чужие рацухи. Но я считаю себя достаточно знающим вопрос человеком,
чтобы сказать: то что ты предлагаешь - это полная херотень.

Quote
2. Сделать неизменяемую сложность. Достаточно низкую, чтобы можно было майнить на процессоре.
Неизменяемая сложность - это просто дыра-дырища которая позволит провести атаку-51
первому кульному хацкеру, который твой хэш-алгоритм запустит не на своем процессоре, а
сделает порт на GPU или просто арендует мейнфрейм в своем студенческом кампусе.
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
January 18, 2017, 07:35:48 PM
 #86

Я могу показаться критиканом, который только и делает, что
хейтит чужие рацухи. Но я считаю себя достаточно знающим вопрос человеком,
чтобы сказать: то что ты предлагаешь - это полная херотень.

Quote
2. Сделать неизменяемую сложность. Достаточно низкую, чтобы можно было майнить на процессоре.
Неизменяемая сложность - это просто дыра-дырища которая позволит провести атаку-51
первому кульному хацкеру, который твой хэш-алгоритм запустит не на своем процессоре, а
сделает порт на GPU или просто арендует мейнфрейм в своем студенческом кампусе.

Можешь описать алгоритм атаки 51 в предложенном мной форке?
Я вот не вижу никакой возможности провести такую атаку, если блоки в цепочку будут приниматься от всех хостов с одинаковой вероятностью.
Идея оригинального клиента о перерасчете сложности, чтобы блоки искались раз в 10 минут - красивая идея, но она привела к тому, о чем в 2009 году никто не мог знать: к асикам. Теперь стало очевидно, что не нужен этот огород со сложностью, достаточно библиотечной сишной функции time и все асики бреются.

OpenTrade - Open Source Cryptocurrency Exchange
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
January 18, 2017, 07:47:23 PM
 #87

Я вот не вижу никакой возможности провести такую атаку, если
блоки в цепочку будут приниматься от всех хостов с одинаковой вероятностью.
при таком алгоритме сеть будет сплититься не переставая, в конце концов
каждая нода будет самостоятельно генерировать раз в 10 минут свой собственный блок,
который не будет принят ни одним из её пиров  Grin

консенсус - это когда все соглашаются на какое-то решение и никто не против.
например "водить в жмурки будет самый толстый" - это консенсус.

в биткойне консенсус - транзакции действительны только в мэйнчейне, а мэйнчейн -
это цепочка с наибольшей суммарной сложностью от генезиса.
если ты убираешь правило по наибольшей сложности, то как определить какая цепь
верная, а какая нет?
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
January 18, 2017, 07:53:13 PM
 #88

Я вот не вижу никакой возможности провести такую атаку, если
блоки в цепочку будут приниматься от всех хостов с одинаковой вероятностью.
при таком алгоритме сеть будет сплититься не переставая, в конце концов
каждая нода будет самостоятельно генерировать раз в 10 минут свой собственный блок,
который не будет принят ни одним из её пиров  Grin


А вот это как рах и хотелось бы проверить экспериментально.
Потому что ни у кого такого нет и сказать точно - как оно будет на самом деле, можно только на живом примере ))

OpenTrade - Open Source Cryptocurrency Exchange
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
January 18, 2017, 07:56:14 PM
 #89


если ты убираешь правило по наибольшей сложности, то как определить какая цепь
верная, а какая нет?


Правильная цепь та, которая самая длинная. Она же и самая сложная, потому что сложность блока = константа.

OpenTrade - Open Source Cryptocurrency Exchange
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
January 18, 2017, 07:58:33 PM
 #90

Правильная цепь та, которая самая длинная. Она же и самая сложная, потому что сложность блока = константа.
вот у меня длина цепи 1000 и у тебя 1000
ты говоришь что отправил мне транзакцию, а я утверждаю что я её не получил
прошло 10 минут
у тебя длина цепи 1001 и у меня 1001
ты говоришь что отправил мне транзакцию, а я утверждаю что я её не получил
прошло 10 минут
у тебя длина цепи 1002 и у меня 1002
ты говоришь что отправил мне транзакцию, а я утверждаю что я её не получил

дебилы, бля.

не, этот разговор мне надоел. извини, но спорить с заведомой глупостью - терять время.
хочешь - делай. я готов поспорить на любую сумму что у тебя ни хуя не выйдет.
но тратить время на объяснения больше не буду.
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
January 18, 2017, 08:12:11 PM
 #91

Правильная цепь та, которая самая длинная. Она же и самая сложная, потому что сложность блока = константа.
вот у меня длина цепи 1000 и у тебя 1000
ты говоришь что отправил мне транзакцию, а я утверждаю что я её не получил
прошло 10 минут
у тебя длина цепи 1001 и у меня 1001
ты говоришь что отправил мне транзакцию, а я утверждаю что я её не получил
прошло 10 минут
у тебя длина цепи 1002 и у меня 1002
ты говоришь что отправил мне транзакцию, а я утверждаю что я её не получил

дебилы, бля.


Вот исходные данные: у тебя 1000 блоков и у меня 1000 блоков. Ты майнишь и я майню...
Если ты находишь блок раньше чем через 10 минут, то блок инвалидный - начинаешь искать новый блок. Тоже самое со мной.
Вероятность того, что 1001 блок мы найдем и включим в свою цепь одновременно - крайне мала... Если мы не майним по блоку в секунду конечно...
Но если кто-то начнет слать по инвалидному блоку в секунду, думаю его все таки оригинальный алгоритм забанит надолго.

OpenTrade - Open Source Cryptocurrency Exchange
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
January 18, 2017, 08:29:24 PM
 #92

Вот исходные данные: у тебя 1000 блоков и у меня 1000 блоков. Ты майнишь и я майню...
Если ты находишь блок раньше чем через 10 минут, то блок инвалидный - начинаешь искать новый блок. Тоже самое со мной.
Вероятность того, что 1001 блок мы найдем и включим в свою цепь одновременно - крайне мала... Если мы не майним по блоку в секунду конечно...
Но если кто-то начнет слать по инвалидному блоку в секунду, думаю его все таки оригинальный алгоритм забанит надолго.

я нахожу блок через 600 секунд.
а твой блок приходит ко мне через 601 секунду потому что я в японии, а ты в англии
мне нет никакого резона твой блок считать лучше моего. поэтому я продолжаю майнить от своего
блока, а ты от своего. потому что тебе мой блок тоже пришел через 601 секунду

как нам прийти к консенсусу чья цепочка верная?
а если нас таких долбоёбов не двое, а двести тысяч? каждый со своей цепочкой?

далее по индукции. какой мне смысл орфанить свою цепь и брать твою? в случае чего я могу часики подкрутить
на пару секунд и мои блоки для меня всегда будут верные, а твои - всегда невалидные

Если ты находишь блок раньше чем через 10 минут, то блок инвалидный - начинаешь искать новый блок. Тоже самое со мной.
Я не долбоящер. Если блок № 1000 датирован временем 21:15:37 (допустим) то я в блок № 1001 который собираюсь майнить ставлю время 21:25:37 и если нахожу такой блок за 3 минуты, то не считаю его невалидным, а просто курю 7 минут бамбук и выпускаю в сеть ровно через 600 секунд после блока 1000
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
January 18, 2017, 08:58:55 PM
 #93


Я не долбоящер. Если блок № 1000 датирован временем 21:15:37 (допустим) то я в блок № 1001 который собираюсь майнить ставлю время 21:25:37 и если нахожу такой блок за 3 минуты, то не считаю его невалидным, а просто курю 7 минут бамбук и выпускаю в сеть ровно через 600 секунд после блока 1000


Ну вот, ты такой умный и умеешь подкручивать часики. Велком! Твои блоки будет принимать большинство, которое так крутить не умеет... Правда со временем таких умных может оказаться большинство и к клиенту будет одновременно приходить 100500 разных блоков с одним и тем же временем )) Ну дак клиент возьмет самый первый, а остальных отбреет.
И какой смысл майнить соло свою цепочку, когда большинство работает по другому алгоритму?

Конечно, если исходить из того, что каждый начнет майнить по своему - тогда да, ничего из такой монеты не выйдет. Но исходить-то нужно из другого: сильно умных меньшинство, а большинство пользуется официальным клиентом с одинаковым алгоритмом.

OpenTrade - Open Source Cryptocurrency Exchange
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
January 18, 2017, 09:17:56 PM
 #94

Конечно, если исходить из того, что каждый начнет майнить по своему - тогда да,
ничего из такой монеты не выйдет. Но исходить-то нужно из другого: сильно умных
меньшинство, а большинство пользуется официальным клиентом с одинаковым алгоритмом.
Совершаешь ту же ошибку, что и Накамото.
Он тоже думал, что все будут майнить на процессорах примерно одним клиентом
(но возможность читинга он продумал гораздо лучше тебя)
Но оказалось, что дураки готовы объединиться в пул, если владелец пула покажется
им умным и пообещает им бабла больше, чем они смогут заработать сами.
Так что как только пройдет слух, что существует "читерский" клиент или способ подкрутить
часики и получить на три копейки больше - дураков в твоей сети не останется. Все станут "умными".
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
January 18, 2017, 09:44:59 PM
 #95

Так что как только пройдет слух, что существует "читерский" клиент или способ подкрутить
часики и получить на три копейки больше - дураков в твоей сети не останется. Все станут "умными".

Ну можно сразу в алгоритме тогда искать блок с подкрученными часиками. Тогда все на равных все равно будут. Все смайненные блоки будут приходить одновременно.
Сейчас когда приходит несколько блоков, то главным считается тот у кого больше сложность. Я считаю это надо как-то поменять.
Если вместо выбора по сложности сделать рэндом? Ну да, надо продумать что-то получше ))

OpenTrade - Open Source Cryptocurrency Exchange
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
January 18, 2017, 10:03:03 PM
 #96

Что если поменять понятие сложности?
Пусть из нескольких блоков, главным будет тот, сумма всех чисел в хэше которого - минимальна?
Никто ведь из майнеров не знает заранее - какая сумма получилась у других. Поэтому получаем случайный результат при валидации когда несколько блоков приходят одновременно. С другой стороны, этот результат валидации будет одинаковым у всех клиентов.

OpenTrade - Open Source Cryptocurrency Exchange
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
January 19, 2017, 12:47:22 PM
 #97

Вобщем посмотрел исходники...
Судя по этому: https://github.com/bitcoin/bitcoin/blob/0.12/src/main.cpp#L3428
Алгоритм принятия блоков такой:

1. Если приходит блок, который мы сами спрашивали, то принимаем его в свою цепочку
2. Если приходит блок, который мы не спрашивали, то принимаем его в случае если сложность этого блока больше сложности последнего блока в нашей активной цепочке


OpenTrade - Open Source Cryptocurrency Exchange
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
January 19, 2017, 01:39:20 PM
 #98

мухаха.
теперь ответь на вопросы
 - что значит "мы спрашивали блок"?
 - в каком случае клиент может получить блок если его не спрашивал?
kzv
Legendary
*
Offline Offline

Activity: 1722
Merit: 1285

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
January 19, 2017, 02:16:27 PM
 #99


 - что значит "мы спрашивали блок"?

Значит отправляли в сеть запрос: "дайте блок с таким-то хэшем у кого он есть"

 
- в каком случае клиент может получить блок если его не спрашивал?


Если в сети появился новый блок.

OpenTrade - Open Source Cryptocurrency Exchange
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
January 19, 2017, 02:41:46 PM
 #100

Значит отправляли в сеть запрос: "дайте блок с таким-то хэшем у кого он есть"
Два (риторических) вопроса
- как мы узнаем хэш нового блока?
- зачем нам отправлять такой запрос всем своим пирам?

Давай я не буду тебя мучить. Сам отвечу.
Есть пакет "inv" Если я получаю блок и он вызывает у меня реорганизацию цепочки (или наращивание)
я посылаю всем своим пирам этот пакет. В пакете только хэш блока, но не его высота.
Дальше пиры уже решают что делать с этой информацией.
Могут запросить у меня содержимое блока. Могут проигнорировать, если такой блок у них уже есть.
Запрашивать блок "у всех" смысла нет. Есть смысл запрашивать только у того кто прислал "inv"

Ситуация когда одна нода шлет другой ноде блок без запроса вообще говоря в биткойне
не встречается. Хотя и не запрещается напрямую.

К чему я это объясняю? К тому, что не бывает блоков, которые мы не запрашивали.
Pages: « 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 »  All
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!