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" Причем с комментами. Причем отдельно либо для CPU, либо для OpenCL. Есть куча сорцов готовых майнеров, но там похоже только для гуру C++, потому как даже просто разобрать все это хозяйство по полкам, чтобы понятно было где все начинается и чем продолжается - уже задача нетривиальная (есть подозрение, что даже для гуру C-прогеров). У авторов очевидно нет привычки комменты писать с назначением той или иной процедуры/функции/переменной, поэтому пытаюсь найти хотя бы попроще. Заранее спасибо за любые наводки. Title: Re: Самый простой исходный код майнера на C++ Post by: Balthazar on August 09, 2012, 06:48:21 PM Code: while(true) 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, спасибо)) Берем строку, которую вернул запрос getwork, конвертируем преобразуем ее функцией hex2bin (реализаций много в интернете можно найти). Берем из результата первые 80 байт, переворачиваем порядок байтов и это будет blockheader. Для sha256 тоже любая доступная реализация подойдет. А hash_greater_target определяется как-то так:Но как Вы сами понимаете, в дебагер это не засунешь)) Где взять blockheader? sha256 не является предопределенным методом языка C++, значит должен быть класс... Code: int hash_greater_target(const unsigned char *hash, const unsigned char *target) Первый параметр - хэш, второй - обработанное 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 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"; } |