Bitcoin Forum
May 01, 2024, 09:47:03 PM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Miner на Visual Basic.NET для образовательных целей!  (Read 2209 times)
RuLitecoin (OP)
Newbie
*
Offline Offline

Activity: 10
Merit: 0


View Profile
November 01, 2015, 10:49:45 AM
 #1

Здравствуйте друзья, прошу помочь разобраться с написанием программы по майнингу биткоина под 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


Извините если что не так написал, буду весьма благодарен !

Unlike traditional banking where clients have only a few account numbers, with Bitcoin people can create an unlimited number of accounts (addresses). This can be used to easily track payments, and it improves anonymity.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1714600023
Hero Member
*
Offline Offline

Posts: 1714600023

View Profile Personal Message (Offline)

Ignore
1714600023
Reply with quote  #2

1714600023
Report to moderator
kcaterpillar
Full Member
***
Offline Offline

Activity: 173
Merit: 100


View Profile
November 03, 2015, 09:02:23 AM
 #2

Разобрать в смысле распарсить? Или изучить, разобраться в коде?

Если распарсить, то можно также, как и на других языках - строковыми операциями.
Вот таблица структуры заголовка блока, которая в коде примера: 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 Offline

Activity: 2311
Merit: 2297


View Profile
November 03, 2015, 11:17:09 AM
 #3

выбираю VB как наиболее простой язык высокого уровня
Offtopic, но тем не менее. 
VB.NET ничем не проще C#.
Зато, освоив синтаксис C#, вам будет легче читать код, написанный на синтаксически родственных языках Java, JavaScript, PHP, С++, С и многих других.
Пока вы находитесь в процессе изучения, вам терять нечего. Подумайте над этим.

Кроме того, чисто субъективно синтаксис VB некрасивый.
RuLitecoin (OP)
Newbie
*
Offline Offline

Activity: 10
Merit: 0


View Profile
November 03, 2015, 11:49:52 AM
 #4

Разобрать в смысле распарсить? Или изучить, разобраться в коде?

Если распарсить, то можно также, как и на других языках - строковыми операциями.
Вот таблица структуры заголовка блока, которая в коде примера: 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 Offline

Activity: 10
Merit: 0


View Profile
November 03, 2015, 11:59:49 AM
 #5

Разобрать в смысле распарсить? Или изучить, разобраться в коде?

Если распарсить, то можно также, как и на других языках - строковыми операциями.
Вот таблица структуры заголовка блока, которая в коде примера: 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
Full Member
***
Offline Offline

Activity: 173
Merit: 100


View Profile
November 03, 2015, 12:20:38 PM
 #6

С этим моментом в принципе понятно, а что насчет 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
Full Member
***
Offline Offline

Activity: 173
Merit: 100


View Profile
November 03, 2015, 12:30:44 PM
 #7

И далее... т.е. нужно сначала майнеру сформировать этот блок из extranonce1, coinb1, coinb2 (coinbase transaction for the block), extranonce2_size (вопрос как это  делать) И затем уже сам блок хешировать дважды и перебирать ?! Правильно я понимаю ?!

Нет, как уже выше говорил, если вы в пуле, то у вас уже есть hashMerkleRoot, в нём уже экстранонс и coinbase есть в закодированном виде. Т.е. вы получаете от пула все поля заголовка блока за исключением nonce - и перебираете его - один раз изменили значение - далее берёте от всего заголовка блока двойной хэш - Если он подходит по target - то вы нашли решение для блока. Если нет - то опять изменяете дальше nonce и опять берёте двойной хэш от заголовка блока, сравниваете и т.д. пока весь nonce не переберёте. Как только nonce весь исчерпан - получаете новое задание и опять в нём перебираете весь nonce. Но это я описал общую схему. С пулом нужно работать по его протоколу, т.е. по его правилам, вот их для начала нужно выяснить и всё уточнить. Тогда у вас будет клиент, который может работать с пулами по такому-то протоколу (протоколам). Иначе пул вас не поймёт
RuLitecoin (OP)
Newbie
*
Offline Offline

Activity: 10
Merit: 0


View Profile
November 03, 2015, 12:34:50 PM
 #8

С этим моментом в принципе понятно, а что насчет 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 Offline

Activity: 10
Merit: 0


View Profile
November 03, 2015, 01:02:28 PM
 #9

Разобрать в смысле распарсить? Или изучить, разобраться в коде?

Если распарсить, то можно также, как и на других языках - строковыми операциями.
Вот таблица структуры заголовка блока, которая в коде примера: 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
Full Member
***
Offline Offline

Activity: 173
Merit: 100


View Profile
November 03, 2015, 01:24:59 PM
 #10

Можно еще раз уточнить - prev block hash и меркель рут - применяется алгоритм little endian  - big endian. и уже потом двойная хеш функция ?

Параметры hashPrevBlock и hashMerkleRoot  у вас уже есть. Вы сами собираете заголовок блока из них - нужно склеить шесть строковых параметров, при этом один из них - nonce, его вы генерите самостоятельно, остальное всё уже есть. Нужно ли менять порядок байтов в отдельных полях, когда склеиваете из них блок  - сейчас точно не помню, лучше возьмите рабочий блок и посмотрите, например, у hashPrevBlock в начале должны быть нули. Там приходится менять байты часто, перед каждым хэшированием и после него, но когда именно, лучше уточните самостоятельно, чтобы не запутаться и не ошибиться, потому что это один раз прописывается и забывается. Когда я писал программу, работающую с заголовком, информации в сети ещё было мало об этом, я просто брал из blockexplorer  готовый блок, и смотрел переворачивают они там или нет, сейчас может где-то есть в сети уже информация точная. Такие вещи лучше уточнять по спецификации. Когда заголовок соберёте - тогда точно перед каждым хэшированием нужно менять байты.
Pages: [1]
  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!