Bitcoin Forum

Local => Кодеры => Topic started by: snfive on August 09, 2012, 06:18:54 PM



Title: Самый простой исходный код майнера на C++
Post by: snfive on August 09, 2012, 06:18:54 PM
Привет всем!

В данной ветке я уже нашел топик в духе "100 баксов за разбор кода" (https://bitcointalk.org/index.php?topic=17747.0 (https://bitcointalk.org/index.php?topic=17747.0)), там даже дается намек, что самый простой исходник, это бинарник от Jgarzic, но там я нашел только "конструктор" для линюха, причем на С.

Вопрос: существует ли какой-нибудь исходник без наворотов в духе скринсейверов, отображения температуры и прочих вкусностей, просто что-нибудь в духе
Code:
#include "1.h"
#include "2.h"
....
#include "N.h"


int _tmain(int argc, _TCHAR* argv[])
{
//понеслась
}


Причем с комментами.
Причем отдельно либо для CPU, либо для OpenCL.

Есть куча сорцов готовых майнеров, но там похоже только для гуру C++, потому как даже просто разобрать все это хозяйство по полкам, чтобы понятно было где все начинается и чем продолжается - уже задача нетривиальная (есть  подозрение, что даже для гуру C-прогеров). У авторов очевидно нет привычки комменты писать с назначением той или иной процедуры/функции/переменной, поэтому пытаюсь найти хотя бы попроще.

Заранее спасибо за любые наводки.


Title: Re: Самый простой исходный код майнера на C++
Post by: Balthazar on August 09, 2012, 06:48:21 PM
Code:
while(true)
{
   blockheader.nNonce++;
   if(blockheader.nNonce < 0)
   {
       blockheader.nNonce = 0;
       blockheader.nTime = GetTime();
   }

   hash = sha256(sha256(blockheader));

   if(!hash_greater_target(hash, target))
          break;
}


Title: Re: Самый простой исходный код майнера на C++
Post by: snfive on August 09, 2012, 07:24:09 PM
Это значительно проще, Balthazar, спасибо))

Но как Вы сами понимаете, в дебагер это не засунешь)) Где взять blockheader? sha256 не является предопределенным методом языка C++, значит должен быть класс... Я даже подозреваю где его взять.

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


Title: Re: Самый простой исходный код майнера на C++
Post by: A-Bolt on August 09, 2012, 08:15:56 PM
но там я нашел только "конструктор" для линюха, причем на С.
https://github.com/jgarzik/cpuminer (https://github.com/jgarzik/cpuminer)
Это и есть самый простой исходник CPU-майнера на С без наворотов, который, кстати, собирается и под Windows c помощью Mingw32, и который таки можно засунуть в дебаггер.


Title: Re: Самый простой исходный код майнера на C++
Post by: snfive on August 09, 2012, 08:48:26 PM
Судя по всему придется этот "самый простой" исходник ковырять.
А может быть есть нечто в духе того, что начал Balthazar?


Title: Re: Самый простой исходный код майнера на C++
Post by: snfive on August 09, 2012, 09:02:18 PM
Сходу началось:
Где взять cpuminer-config.h, sys/time.h еще дофига *.h, которые присандалены к cpu-miner.cpp в этом самом простом исходнике?


Title: Re: Самый простой исходный код майнера на C++
Post by: Balthazar on August 09, 2012, 09:29:27 PM
Это значительно проще, Balthazar, спасибо))

Но как Вы сами понимаете, в дебагер это не засунешь)) Где взять blockheader? sha256 не является предопределенным методом языка C++, значит должен быть класс...
Берем строку, которую вернул запрос getwork, конвертируем преобразуем ее функцией hex2bin (реализаций много в интернете можно найти). Берем из результата первые 80 байт, переворачиваем порядок байтов и это будет blockheader. Для sha256 тоже любая доступная реализация подойдет. А hash_greater_target определяется как-то так:


Code:
int hash_greater_target(const unsigned char *hash, const unsigned char *target)
{
uint32_t *hash32 = (uint32_t *) hash;
uint32_t *target32 = (uint32_t *) target;
int i;
/* this is NOT endian-clean */
for (i = 7; i >= 0; i--) {
if (hash32[i] > target32[i])
return 1;
//shortcut
if (hash32[i] < target32[i])
return 0;
}
return 0;
}

Первый параметр - хэш, второй - обработанное hex2bin и перевернутое значение target, которое вернул запрос getwork.


Title: Re: Самый простой исходный код майнера на C++
Post by: snfive on August 10, 2012, 06:56:59 AM
Да, Balthazar, hex2bin я видел, sha256 тоже)
С getwork уже проблема (по шустрому не смог найти), хотя для дебагера, я так понимаю достаточно и пару готовых примеров. Необязательно ведь подрубаться наживую к рабочему пулу (над этим, кстати, еще поработать как следует надо).

Можно гденить отковырять пару результатов запроса getwork?

Спасибо за помощь)


Title: Re: Самый простой исходный код майнера на C++
Post by: Balthazar on August 10, 2012, 07:21:45 AM
Code:
bitcoin@pool:/$ bitcoind -rpcconnect=82.146.47.200 -rpcport=8346 -rpcuser=balthazar_1 -rpcpassword=xxx getwork
{
    "data" : "000000013a70a2e6411119373547c528c629756ff52d57ce032005c1000000b70000000019c5f9e24798167e4b9e9f48957550101344168de128a9734b12b476302db4a75024b6471a083cc900000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000",
    "midstate" : "b2ebcdb350711d63aeb0cc3cc41bc024219de9fe87548467e2da1c5a4d247fa5",
    "target" : "0000000000000000000000000000000000000000000000000000ffff00000000",
    "hash1" : "00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000010000"
}
bitcoin@pool:/$



Title: Re: Самый простой исходный код майнера на C++
Post by: snfive on August 10, 2012, 07:57:26 AM
Спасибо! Попробую разобраться.

ЗЫ. На Вашем пуле, Balthazar, уже не 100, а стабильные 200-230 GH/s, пора менять подпись))


Title: Re: Самый простой исходный код майнера на C++
Post by: LZ on September 02, 2012, 03:30:58 PM
Есть pyminer (https://github.com/jgarzik/pyminer), но он на Python. ::)


Title: Re: Самый простой исходный код майнера на C++
Post by: anonymous_acc on January 11, 2013, 04:56:51 PM
Сам bitcoind на C++, и майнер в него встроен.

Самый простой на C, cpuminer  https://github.com/jgarzik/cpuminer  (https://github.com/jgarzik/cpuminer), от него форчится cgminer, первый только для cpu, второй только для gpu.

Up!
По теме исходников майнеров.


Title: cgminer & CPU
Post by: Yurock on January 13, 2013, 09:46:31 PM
Самый простой на C, cpuminer  https://github.com/jgarzik/cpuminer  (https://github.com/jgarzik/cpuminer), от него форчится cgminer, первый только для cpu, второй только для gpu.
У меня cgminer считал хеши на ЦП.


Title: Re: Самый простой исходный код майнера на C++
Post by: hazarun on July 22, 2013, 02:31:35 PM
Сам bitcoind на C++, и майнер в него встроен.
По теме исходников майнеров.

Есть ли простые исходники где нить на Си шарп ?

И описание проходящих процессов, для чайников.
А не спецификации для  тех, кто и так знает общие вопросы.


Title: на Perl'e
Post by: lordfantom on July 25, 2013, 04:58:18 AM
#!/usr/bin/env perl
use 5.010_001;
use strict;
use warnings;
use Digest::SHA;
use JSON;
use WWW::Mechanize;
use Time::HiRes qw<time gettimeofday tv_interval>;
use Getopt::Long;

sub get_work {
    my $json = encode_json( { id => 'json', method => 'getwork', params => $_[0] ? $_[0] : [] } );
    my $mech = WWW::Mechanize->new;
    $mech->credentials( 'ed21@bk.ru_work', 'pass' );
    my $rc = $mech->post( "http://pool-us.50btc.com:8332/", Content => $json );
   warn "Get_work ($json): returned: ", $rc->decoded_content, "\n";
      my $result = decode_json( $rc->decoded_content );
    return $result;
}

my $max_nonce = hex("0xfffffffa");

sub sha256 { Digest::SHA::sha256( @_ ) }

sub find_share {   
   my $data     = shift;
    my $raw      = pack 'H*', $data->{data};
    my $short    = substr( $raw, 0, 80 );                        #  80 bytes
    my $short_le = pack "N*", unpack "V*", $short;               #
   
    my @solutions;
    #for my $i_nonce (0..(2**25-1))
   for my $i_nonce (0 .. 1000000)
   {
      my $nonce_le = pack 'N*', $i_nonce;
        #print "Nonce $i_nonce ($nonce_le)\n";
        substr( $short_le, 76, 4 ) = $nonce_le;
        # sha256(sha256( $data ))
        my $hash1         = sha256($short_le);            
        my $hash          = sha256( sha256($short_le) );
        #my $hash1_be = pack "N*", unpack("V*", $hash1); # BE again
        #my $hash_be  = pack "N*", unpack("V*", $hash);
        #print "----------\n";
      #print "nonce:  ", unpack("H*", $nonce_le), "\n";
      #print "hash1:  ", unpack("H*", $hash1), "\n";
        #print "hash:   ", unpack("H*", $hash), "\n";
        my $zero_starting = unpack( 'H*', reverse $hash );
        if ( $zero_starting =~ /^00000000/ ) {
            warn "----------\nFound : $zero_starting (nonce $i_nonce)\n";
            push @solutions, $hash;
        }
      
    }
    return @solutions;
 }

while (1) {
    my $work  = get_work();
    die "Error fetching work! ", $work->{error} // 'unknown error' if (!$work or $work->{error});
    my $start = time;
    my (@found) = find_share( $work->{result} );
    if ( @found ) {
        warn "Found share -- @found -- ";
           }
    my $end = time;
    warn "Processed in ", ($end-$start), "\n";
}