예제 #1
0
파일: fresh.c 프로젝트: aznboy84/freshgpu
void fresh_regenhash(struct work *work)
{
  uint32_t data[20];
  uint32_t *nonce = (uint32_t *)(work->data + 76);
  uint32_t *ohash = (uint32_t *)(work->hash);

  be32enc_vect(data, (const uint32_t *)work->data, 19);
  data[19] = htobe32(*nonce);
  freshhash(ohash, data);
}
예제 #2
0
파일: fresh.c 프로젝트: aznboy84/freshgpu
bool scanhash_fresh(struct thr_info *thr, const unsigned char __maybe_unused *pmidstate,
         unsigned char *pdata, unsigned char __maybe_unused *phash1,
         unsigned char __maybe_unused *phash, const unsigned char *ptarget,
         uint32_t max_nonce, uint32_t *last_nonce, uint32_t n)
{
  uint32_t *nonce = (uint32_t *)(pdata + 76);
  uint32_t data[20];
  uint32_t tmp_hash7;
  uint32_t Htarg = le32toh(((const uint32_t *)ptarget)[7]);
  bool ret = false;

  be32enc_vect(data, (const uint32_t *)pdata, 19);

  while(1)
  {
    uint32_t ostate[8];
    *nonce = ++n;
    data[19] = (n);
    freshhash(ostate, data);
    tmp_hash7 = (ostate[7]);

    applog(LOG_INFO, "data7 %08lx", (long unsigned int)data[7]);

    if(unlikely(tmp_hash7 <= Htarg))
    {
      ((uint32_t *)pdata)[19] = htobe32(n);
      *last_nonce = n;
      ret = true;
      break;
    }

    if (unlikely((n >= max_nonce) || thr->work_restart))
    {
      *last_nonce = n;
      break;
    }
  }

  return ret;
}
예제 #3
0
파일: fresh.c 프로젝트: aznboy84/freshgpu
/* Used externally as confirmation of correct OCL code */
int fresh_test(unsigned char *pdata, const unsigned char *ptarget, uint32_t nonce)
{
  uint32_t tmp_hash7, Htarg = le32toh(((const uint32_t *)ptarget)[7]);
  uint32_t data[20], ohash[8];

  be32enc_vect(data, (const uint32_t *)pdata, 19);
  data[19] = htobe32(nonce);
  freshhash(ohash, data);
  tmp_hash7 = be32toh(ohash[7]);

  applog(LOG_DEBUG, "htarget %08lx diff1 %08lx hash %08lx",
        (long unsigned int)Htarg,
        (long unsigned int)diff1targ,
        (long unsigned int)tmp_hash7);

  if (tmp_hash7 > diff1targ)
    return -1;

  if (tmp_hash7 > Htarg)
    return 0;

  return 1;
}
예제 #4
0
int scanhash_fresh(int thr_id, uint32_t *pdata, const uint32_t *ptarget,
                   uint32_t max_nonce, uint64_t *hashes_done)
{
    uint32_t len = 80;

    uint32_t n = pdata[19] - 1;
    const uint32_t first_nonce = pdata[19];
    const uint32_t Htarg = ptarget[7];

    uint32_t hash64[8] __attribute__((aligned(32)));
    uint32_t endiandata[32];

    uint64_t htmax[] = {
        0,
        0xF,
        0xFF,
        0xFFF,
        0xFFFF,
        0x10000000
    };
    uint32_t masks[] = {
        0xFFFFFFFF,
        0xFFFFFFF0,
        0xFFFFFF00,
        0xFFFFF000,
        0xFFFF0000,
        0
    };

    // we need bigendian data...
    for (int kk=0; kk < 32; kk++) {
        be32enc(&endiandata[kk], ((uint32_t*)pdata)[kk]);
    };
#ifdef DEBUG_ALGO
    if (Htarg != 0)
        printf("[%d] Htarg=%X\n", thr_id, Htarg);
#endif
    for (int m=0; m < sizeof(masks); m++) {
        if (Htarg <= htmax[m]) {
            uint32_t mask = masks[m];
            do {
                pdata[19] = ++n;
                be32enc(&endiandata[19], n);
                freshhash(hash64, &endiandata, len);
#ifndef DEBUG_ALGO
                if ((!(hash64[7] & mask)) && fulltest(hash64, ptarget)) {
                    *hashes_done = n - first_nonce + 1;
                    return true;
                }
#else
                if (!(n % 0x1000) && !thr_id) printf(".");
                if (!(hash64[7] & mask)) {
                    printf("[%d]",thr_id);
                    if (fulltest(hash64, ptarget)) {
                        *hashes_done = n - first_nonce + 1;
                        return true;
                    }
                }
#endif
            } while (n < max_nonce && !work_restart[thr_id].restart);
            // see blake.c if else to understand the loop on htmax => mask
            break;
        }
    }

    *hashes_done = n - first_nonce + 1;
    pdata[19] = n;
    return 0;
}