RuLitecoin (OP)
Newbie
Offline
Activity: 10
Merit: 0
|
|
November 01, 2015, 10:49:45 AM |
|
Здравствуйте друзья, прошу помочь разобраться с написанием программы по майнингу биткоина под VB.net для пула. Цель строго образовательная, пусть хоть перебирает 1 хэш в сек, главное разобраться в самой сути, думаю многим будет интересно, выбираю VB как наиболее простой язык высокого уровня и соответственно целей нет сделать программу быстрой, главное понятной, так как разобраться в дебрях С++ и ассемблера не представляется возможным. Есть частично код, но мучают несколько базовых вопросов:
1. Нужно ли использовать json с VB, или можно обойтись внутренними функциями 2. Помогите разобрать посылаемый от пула хэш предыдущего блока, какую часть строки и как использовать 3. При переборе хэша, мы увеличиваем на +1 число nonce, и как потом понять что шара действительно подходит для пула и sha256(sha256(Block_Header)) < target будет выполнено, например:
sha256(sha256(Block_Header)) < 0x00000000000002816E0000000000000000000000000000000000000000000000, так еще и записанное в обратном порядке, это как понимать?!
Вот такой код есть на питоне, Block 125552 :
>>> import hashlib >>> header_hex = ("01000000" + "81cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000" + "e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122b" + "c7f5d74d" + "f2b9441a" + "42a14695") >>> header_bin = header_hex.decode('hex') >>> hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest() >>> hash.encode('hex_codec') '1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e0000000000000000' >>> hash[::-1].encode('hex_codec') '00000000000000001e8d6829a8a21adc5d38d0a473b144b6765798e61f98bd1d'
Как его разобрать на VB
Извините если что не так написал, буду весьма благодарен !
|
|
|
|
kcaterpillar
|
|
November 03, 2015, 09:02:23 AM |
|
Разобрать в смысле распарсить? Или изучить, разобраться в коде? Если распарсить, то можно также, как и на других языках - строковыми операциями. Вот таблица структуры заголовка блока, которая в коде примера: https://en.bitcoin.it/wiki/Block_hashing_algorithmТам есть все поля с размерами в байтах. Version - 4 байта hashPrevBlock - 32 байта hashMerkleRoot - 32 байта Time - 4 байта Bits - 4 байта Nonce - 4 байта Соответственно по размеру поля можно парсить весь заголовок и вытащить оттуда то, что нужно. sha256(sha256(Block_Header)) - это два раза хеш sha256 от строки с заголовком блока. Т.е. берется первый хэш, затем от результата первого еще один хэш. В обратном порядке означает что байты определённым образом по алгоритму меняются местами. См. little endian - big endian.
|
|
|
|
A-Bolt
Legendary
Offline
Activity: 2326
Merit: 2365
|
|
November 03, 2015, 11:17:09 AM |
|
выбираю VB как наиболее простой язык высокого уровня
Offtopic, но тем не менее. VB.NET ничем не проще C#. Зато, освоив синтаксис C#, вам будет легче читать код, написанный на синтаксически родственных языках Java, JavaScript, PHP, С++, С и многих других. Пока вы находитесь в процессе изучения, вам терять нечего. Подумайте над этим. Кроме того, чисто субъективно синтаксис VB некрасивый.
|
|
|
|
RuLitecoin (OP)
Newbie
Offline
Activity: 10
Merit: 0
|
|
November 03, 2015, 11:49:52 AM |
|
Разобрать в смысле распарсить? Или изучить, разобраться в коде? Если распарсить, то можно также, как и на других языках - строковыми операциями. Вот таблица структуры заголовка блока, которая в коде примера: https://en.bitcoin.it/wiki/Block_hashing_algorithmТам есть все поля с размерами в байтах. Version - 4 байта hashPrevBlock - 32 байта hashMerkleRoot - 32 байта Time - 4 байта Bits - 4 байта Nonce - 4 байта Соответственно по размеру поля можно парсить весь заголовок и вытащить оттуда то, что нужно. sha256(sha256(Block_Header)) - это два раза хеш sha256 от строки с заголовком блока. Т.е. берется первый хэш, затем от результата первого еще один хэш. В обратном порядке означает что байты определённым образом по алгоритму меняются местами. См. little endian - big endian. С этим моментом в принципе понятно, а что насчет extranonce1, coinb1, coinb2 (coinbase transaction for the block), extranonce2_size для формирования блока майнером. С этим данными как поступать, и как использовать ?! Или эти данные нужны для соло майнинга ?!
|
|
|
|
RuLitecoin (OP)
Newbie
Offline
Activity: 10
Merit: 0
|
|
November 03, 2015, 11:59:49 AM |
|
Разобрать в смысле распарсить? Или изучить, разобраться в коде? Если распарсить, то можно также, как и на других языках - строковыми операциями. Вот таблица структуры заголовка блока, которая в коде примера: https://en.bitcoin.it/wiki/Block_hashing_algorithmТам есть все поля с размерами в байтах. Version - 4 байта hashPrevBlock - 32 байта hashMerkleRoot - 32 байта Time - 4 байта Bits - 4 байта Nonce - 4 байта Соответственно по размеру поля можно парсить весь заголовок и вытащить оттуда то, что нужно. sha256(sha256(Block_Header)) - это два раза хеш sha256 от строки с заголовком блока. Т.е. берется первый хэш, затем от результата первого еще один хэш. В обратном порядке означает что байты определённым образом по алгоритму меняются местами. См. little endian - big endian. И далее... т.е. нужно сначала майнеру сформировать этот блок из extranonce1, coinb1, coinb2 (coinbase transaction for the block), extranonce2_size (вопрос как это делать) И затем уже сам блок хешировать дважды и перебирать ?! Правильно я понимаю ?!
|
|
|
|
kcaterpillar
|
|
November 03, 2015, 12:20:38 PM |
|
С этим моментом в принципе понятно, а что насчет extranonce1, coinb1, coinb2 (coinbase transaction for the block), extranonce2_size для формирования блока майнером. С этим данными как поступать, и как использовать ?! Или эти данные нужны для соло майнинга ?!
Вы уточните, что вы пишите. Если это клиент для майнинга в пуле, то нужно определиться с протоколом, например, stratum, но это всё определяет пул, и протокол у него может быть другой. Т.е. ваш клиент должен ориентироваться на него. Все данные, которые вы передаёте на сервер пула или получаете от него - определены протоколом, с этого и нужно начинать. Тогда возникнет ясность, и уже по каждому параметру можно отдельно разбираться. Что касается extranonce и поля coinbase - обычно пул с ними работает самостоятельно, и клиентам этого не требуется, но опять же все зависит от протокола. Для соло майнинга нужно всё. Обычно пул сам перебирает coinbase и клиентам-майнерам передаёт задание на перебор только nonce. Вот пример фрагмента транзакции с полем coinbase: ... "in":[ { "prev_out":{ "hash":"0000000000000000000000000000000000000000000000000000000000000000", "n":4294967295 }, "coinbase":"030eea0304f9832a52088801386a6031020000", "sequence":0 } ], ... В поле coinbase пул или соло-майнер может вставлять любые данные, затем они все окажутся в hashMerkleRoot заголовка блока. Если у вас это поле уже есть, то параметры относящиеся к extranonce и coinbase не нужны, они уже есть у пула. Если вы хотите написать полный майнинг-клиент, который будет и работать и в соло режиме, тогда вам нужно всё это делать самому, т.е. заполняете coinbase (по сути он же extranonce), затем получаете хэш дерева Меркля (hashMerkleRoot) и дальше уже перебираете nonce. Одним словом, определитесь с протоколом, с которым будет работать ваш клиент, и реализуйте работу именно с этим протоколом.
|
|
|
|
kcaterpillar
|
|
November 03, 2015, 12:30:44 PM |
|
И далее... т.е. нужно сначала майнеру сформировать этот блок из extranonce1, coinb1, coinb2 (coinbase transaction for the block), extranonce2_size (вопрос как это делать) И затем уже сам блок хешировать дважды и перебирать ?! Правильно я понимаю ?!
Нет, как уже выше говорил, если вы в пуле, то у вас уже есть hashMerkleRoot, в нём уже экстранонс и coinbase есть в закодированном виде. Т.е. вы получаете от пула все поля заголовка блока за исключением nonce - и перебираете его - один раз изменили значение - далее берёте от всего заголовка блока двойной хэш - Если он подходит по target - то вы нашли решение для блока. Если нет - то опять изменяете дальше nonce и опять берёте двойной хэш от заголовка блока, сравниваете и т.д. пока весь nonce не переберёте. Как только nonce весь исчерпан - получаете новое задание и опять в нём перебираете весь nonce. Но это я описал общую схему. С пулом нужно работать по его протоколу, т.е. по его правилам, вот их для начала нужно выяснить и всё уточнить. Тогда у вас будет клиент, который может работать с пулами по такому-то протоколу (протоколам). Иначе пул вас не поймёт
|
|
|
|
RuLitecoin (OP)
Newbie
Offline
Activity: 10
Merit: 0
|
|
November 03, 2015, 12:34:50 PM |
|
С этим моментом в принципе понятно, а что насчет extranonce1, coinb1, coinb2 (coinbase transaction for the block), extranonce2_size для формирования блока майнером. С этим данными как поступать, и как использовать ?! Или эти данные нужны для соло майнинга ?!
Вы уточните, что вы пишите. Если это клиент для майнинга в пуле, то нужно определиться с протоколом, например, stratum, но это всё определяет пул, и протокол у него может быть другой. Т.е. ваш клиент должен ориентироваться на него. Все данные, которые вы передаёте на сервер пула или получаете от него - определены протоколом, с этого и нужно начинать. Тогда возникнет ясность, и уже по каждому параметру можно отдельно разбираться. Что касается extranonce и поля coinbase - обычно пул с ними работает самостоятельно, и клиентам этого не требуется, но опять же все зависит от протокола. Для соло майнинга нужно всё. Обычно пул сам перебирает coinbase и клиентам-майнерам передаёт задание на перебор только nonce. Вот пример фрагмента транзакции с полем coinbase: ... "in":[ { "prev_out":{ "hash":"0000000000000000000000000000000000000000000000000000000000000000", "n":4294967295 }, "coinbase":"030eea0304f9832a52088801386a6031020000", "sequence":0 } ], ... В поле coinbase пул или соло-майнер может вставлять любые данные, затем они все окажутся в hashMerkleRoot заголовка блока. Если у вас это поле уже есть, то параметры относящиеся к extranonce и coinbase не нужны, они уже есть у пула. Если вы хотите написать полный майнинг-клиент, который будет и работать и в соло режиме, тогда вам нужно всё это делать самому, т.е. заполняете coinbase (по сути он же extranonce), затем получаете хэш дерева Меркля (hashMerkleRoot) и дальше уже перебираете nonce. Одним словом, определитесь с протоколом, с которым будет работать ваш клиент, и реализуйте работу именно с этим протоколом. Вот это спасибо за пояснения, я в туториле видел именно с coinbase и поэтому немного запутался. У меня будет stratum protocol.
|
|
|
|
RuLitecoin (OP)
Newbie
Offline
Activity: 10
Merit: 0
|
|
November 03, 2015, 01:02:28 PM |
|
Разобрать в смысле распарсить? Или изучить, разобраться в коде? Если распарсить, то можно также, как и на других языках - строковыми операциями. Вот таблица структуры заголовка блока, которая в коде примера: https://en.bitcoin.it/wiki/Block_hashing_algorithmТам есть все поля с размерами в байтах. Version - 4 байта hashPrevBlock - 32 байта hashMerkleRoot - 32 байта Time - 4 байта Bits - 4 байта Nonce - 4 байта Соответственно по размеру поля можно парсить весь заголовок и вытащить оттуда то, что нужно. sha256(sha256(Block_Header)) - это два раза хеш sha256 от строки с заголовком блока. Т.е. берется первый хэш, затем от результата первого еще один хэш. В обратном порядке означает что байты определённым образом по алгоритму меняются местами. См. little endian - big endian. Можно еще раз уточнить - prev block hash и меркель рут - применяется алгоритм little endian - big endian. и уже потом двойная хеш функция ?
|
|
|
|
kcaterpillar
|
|
November 03, 2015, 01:24:59 PM |
|
Можно еще раз уточнить - prev block hash и меркель рут - применяется алгоритм little endian - big endian. и уже потом двойная хеш функция ?
Параметры hashPrevBlock и hashMerkleRoot у вас уже есть. Вы сами собираете заголовок блока из них - нужно склеить шесть строковых параметров, при этом один из них - nonce, его вы генерите самостоятельно, остальное всё уже есть. Нужно ли менять порядок байтов в отдельных полях, когда склеиваете из них блок - сейчас точно не помню, лучше возьмите рабочий блок и посмотрите, например, у hashPrevBlock в начале должны быть нули. Там приходится менять байты часто, перед каждым хэшированием и после него, но когда именно, лучше уточните самостоятельно, чтобы не запутаться и не ошибиться, потому что это один раз прописывается и забывается. Когда я писал программу, работающую с заголовком, информации в сети ещё было мало об этом, я просто брал из blockexplorer готовый блок, и смотрел переворачивают они там или нет, сейчас может где-то есть в сети уже информация точная. Такие вещи лучше уточнять по спецификации. Когда заголовок соберёте - тогда точно перед каждым хэшированием нужно менять байты.
|
|
|
|
|