Bitcoin Forum
April 16, 2024, 04:14:20 AM *
News: Latest Bitcoin Core release: 26.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Самый простой исходный код майнера на C++  (Read 19683 times)
snfive (OP)
Newbie
*
Offline Offline

Activity: 24
Merit: 0


View Profile
August 09, 2012, 06:18:54 PM
 #1

Привет всем!

В данной ветке я уже нашел топик в духе "100 баксов за разбор кода" (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-прогеров). У авторов очевидно нет привычки комменты писать с назначением той или иной процедуры/функции/переменной, поэтому пытаюсь найти хотя бы попроще.

Заранее спасибо за любые наводки.
1713240860
Hero Member
*
Offline Offline

Posts: 1713240860

View Profile Personal Message (Offline)

Ignore
1713240860
Reply with quote  #2

1713240860
Report to moderator
In order to achieve higher forum ranks, you need both activity points and merit points.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
Balthazar
Legendary
*
Offline Offline

Activity: 3108
Merit: 1358



View Profile
August 09, 2012, 06:48:21 PM
 #2

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;
}
snfive (OP)
Newbie
*
Offline Offline

Activity: 24
Merit: 0


View Profile
August 09, 2012, 07:24:09 PM
 #3

Это значительно проще, Balthazar, спасибо))

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

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

Activity: 2310
Merit: 2295


View Profile
August 09, 2012, 08:15:56 PM
 #4

но там я нашел только "конструктор" для линюха, причем на С.
https://github.com/jgarzik/cpuminer
Это и есть самый простой исходник CPU-майнера на С без наворотов, который, кстати, собирается и под Windows c помощью Mingw32, и который таки можно засунуть в дебаггер.
snfive (OP)
Newbie
*
Offline Offline

Activity: 24
Merit: 0


View Profile
August 09, 2012, 08:48:26 PM
 #5

Судя по всему придется этот "самый простой" исходник ковырять.
А может быть есть нечто в духе того, что начал Balthazar?
snfive (OP)
Newbie
*
Offline Offline

Activity: 24
Merit: 0


View Profile
August 09, 2012, 09:02:18 PM
 #6

Сходу началось:
Где взять cpuminer-config.h, sys/time.h еще дофига *.h, которые присандалены к cpu-miner.cpp в этом самом простом исходнике?
Balthazar
Legendary
*
Offline Offline

Activity: 3108
Merit: 1358



View Profile
August 09, 2012, 09:29:27 PM
 #7

Это значительно проще, 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.
snfive (OP)
Newbie
*
Offline Offline

Activity: 24
Merit: 0


View Profile
August 10, 2012, 06:56:59 AM
 #8

Да, Balthazar, hex2bin я видел, sha256 тоже)
С getwork уже проблема (по шустрому не смог найти), хотя для дебагера, я так понимаю достаточно и пару готовых примеров. Необязательно ведь подрубаться наживую к рабочему пулу (над этим, кстати, еще поработать как следует надо).

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

Спасибо за помощь)
Balthazar
Legendary
*
Offline Offline

Activity: 3108
Merit: 1358



View Profile
August 10, 2012, 07:21:45 AM
 #9

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:/$

snfive (OP)
Newbie
*
Offline Offline

Activity: 24
Merit: 0


View Profile
August 10, 2012, 07:57:26 AM
 #10

Спасибо! Попробую разобраться.

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

Activity: 1722
Merit: 1072


P2P Cryptocurrency


View Profile
September 02, 2012, 03:30:58 PM
 #11

Есть pyminer, но он на Python. Roll Eyes

My OpenPGP fingerprint: 5099EB8C0F2E68C63B4ECBB9A9D0993E04143362
anonymous_acc
Sr. Member
****
Offline Offline

Activity: 322
Merit: 250



View Profile
January 11, 2013, 04:56:51 PM
 #12

Сам bitcoind на C++, и майнер в него встроен.

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

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

BTC: 1HRcwjxG2H5vSnNo5ZbGqMxRPFWJk6dwW9
Yurock
Sr. Member
****
Offline Offline

Activity: 462
Merit: 250


View Profile
January 13, 2013, 09:46:31 PM
 #13

Самый простой на C, cpuminer https://github.com/jgarzik/cpuminer , от него форчится cgminer, первый только для cpu, второй только для gpu.
У меня cgminer считал хеши на ЦП.
hazarun
Legendary
*
Offline Offline

Activity: 2128
Merit: 1019


View Profile
July 22, 2013, 02:31:35 PM
 #14

Сам bitcoind на C++, и майнер в него встроен.
По теме исходников майнеров.

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

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

Activity: 43
Merit: 0


View Profile
July 25, 2013, 04:58:18 AM
 #15

#!/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";
}
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!