Bitcoin Forum
November 03, 2024, 07:29:42 PM *
News: Latest Bitcoin Core release: 28.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Самый простой исходный код майнера на C++  (Read 19712 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-прогеров). У авторов очевидно нет привычки комменты писать с назначением той или иной процедуры/функции/переменной, поэтому пытаюсь найти хотя бы попроще.

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

Activity: 3108
Merit: 1359



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: 2334
Merit: 2374


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



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



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!