Example #1
0
static void findBlockParent(
    Block *b
)
{
    auto where = lseek64(
        b->chunk->getMap()->fd,
        b->chunk->getOffset(),
        SEEK_SET
    );
    if(where!=(signed)b->chunk->getOffset()) {
        sysErrFatal(
            "failed to seek into block chain file %s",
            b->chunk->getMap()->name.c_str()
        );
    }

    uint8_t buf[gHeaderSize];
    auto nbRead = read(
        b->chunk->getMap()->fd,
        buf,
        gHeaderSize
    );
    if(nbRead<(signed)gHeaderSize) {
        sysErrFatal(
            "failed to read from block chain file %s",
            b->chunk->getMap()->name.c_str()
        );
    }

    auto i = gBlockMap.find(4 + buf);
    if(unlikely(gBlockMap.end()==i)) {

        uint8_t bHash[2*kSHA256ByteSize + 1];
        toHex(bHash, b->hash);

        uint8_t pHash[2*kSHA256ByteSize + 1];
        toHex(pHash, 4 + buf);

        warning(
            "in block %s failed to locate parent block %s",
            bHash,
            pHash
        );
        return;
    }
    b->prev = i->second;
}
Example #2
0
static void getBlockHeader(
    size_t        &size,
    Block        *&prev,
    uint8_t      *&hash,
    size_t        &earlyMissCnt,
    const uint8_t *p
) {

    LOAD(uint32_t, magic, p);
    if(unlikely(gExpectedMagic!=magic)) {
        hash = 0;
        return;
    }

    LOAD(uint32_t, sz, p);
    size = sz;
    prev = 0;

    hash = allocHash256();

    #if defined(DARKCOIN)
        h9(hash, p, gHeaderSize);
    #elif defined(PAYCON) 
        h13(hash, p, gHeaderSize);
    #elif defined(MARTEXCOIN)
        h13(hash, p, gHeaderSize);
    #elif defined(CLAM)
        auto pBis = p;
        LOAD(uint32_t, nVersion, pBis);
        if(6<nVersion) {
            sha256Twice(hash, p, gHeaderSize);
        } else {
            scrypt(hash, p, gHeaderSize);
        }
    #elif defined(JUMBUCKS)
        scrypt(hash, p, gHeaderSize);
    #else
        sha256Twice(hash, p, gHeaderSize);
    #endif

    auto i = gBlockMap.find(p + 4);
    if(likely(gBlockMap.end()!=i)) {
        prev = i->second;
    } else {
        ++earlyMissCnt;
    }
}
Example #3
0
static void linkBlock(
    Block *block
)
{
    if(unlikely(0==block->data)) {
        block->height = 0;
        block->prev = 0;
        block->next = 0;
        return;
    }

    int depth = 0;
    Block *b = block;
    while(b->height<0) {

        auto i = gBlockMap.find(4 + b->data);
        if(unlikely(gBlockMap.end()==i)) {
            uint8_t buf[2*kSHA256ByteSize + 1];
            toHex(buf, 4 + b->data);
            warning("at depth %d in chain, failed to locate parent block %s", depth, buf);
            return;
        }

        Block *prev = i->second;
        prev->next = b;
        b->prev = prev;
        b = prev;
        ++depth;
    }

    uint64_t h = b->height;
    while(block!=b) {

        Block *next = b->next;
        b->height = h;
        b->next = 0;

        if(likely(gMaxHeight<h)) {
            gMaxHeight = h;
            gMaxBlock = b;
        }

        b = next;
        ++h;
    }
}
Example #4
0
 IloInt getBlock(IloNumVar x) const {
    BlockMap::const_iterator const it = blockMap.find(x);
    return (it == blockMap.end()) ? -1 : it->second;
 }