Bitcoin Forum
December 11, 2017, 07:41:57 AM *
News: Latest stable version of Bitcoin Core: 0.15.1  [Torrent].
 
   Home   Help Search Donate Login Register  
Pages: [1]
  Print  
Author Topic: Miner на Visual Basic.NET для образовательных целей!  (Read 2117 times)
RuLitecoin
Newbie
*
Offline Offline

Activity: 10


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


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

1512978117
Hero Member
*
Offline Offline

Posts: 1512978117

View Profile Personal Message (Offline)

Ignore
1512978117
Reply with quote  #2

1512978117
Report to moderator
1512978117
Hero Member
*
Offline Offline

Posts: 1512978117

View Profile Personal Message (Offline)

Ignore
1512978117
Reply with quote  #2

1512978117
Report to moderator
1512978117
Hero Member
*
Offline Offline

Posts: 1512978117

View Profile Personal Message (Offline)

Ignore
1512978117
Reply with quote  #2

1512978117
Report to moderator
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction. Advertise here.
1512978117
Hero Member
*
Offline Offline

Posts: 1512978117

View Profile Personal Message (Offline)

Ignore
1512978117
Reply with quote  #2

1512978117
Report to moderator
1512978117
Hero Member
*
Offline Offline

Posts: 1512978117

View Profile Personal Message (Offline)

Ignore
1512978117
Reply with quote  #2

1512978117
Report to moderator
1512978117
Hero Member
*
Offline Offline

Posts: 1512978117

View Profile Personal Message (Offline)

Ignore
1512978117
Reply with quote  #2

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

Activity: 175


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
Hero Member
*****
Offline Offline

Activity: 861


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

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

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

Activity: 10


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
Newbie
*
Offline Offline

Activity: 10


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: 175


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: 175


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
Newbie
*
Offline Offline

Activity: 10


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
Newbie
*
Offline Offline

Activity: 10


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: 175


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:  

Sponsored by , a Bitcoin-accepting VPN.
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!