virtual void startBlock( const Block *b, uint64_t chainSize ) { curBlock = b; const uint8_t *p = b->data; const uint8_t *sz = -4 + p; LOAD(uint32_t, size, sz); offset += size; double now = usecs(); static double startTime = 0; static double lastStatTime = 0; double elapsed = now - lastStatTime; bool longEnough = (5*1000*1000<elapsed); bool closeEnough = ((chainSize - offset)<80); if(unlikely(longEnough || closeEnough)) { if(0==startTime) { startTime = now; } double progress = offset/(double)chainSize; double elasedSinceStart = 1e-6*(now - startTime); double speed = progress / elasedSinceStart; info( "%8" PRIu64 " blocks, " "%8.3f MegaAddrs , " "%6.2f%% , " "elapsed = %5.2fs , " "eta = %5.2fs , " , curBlock->height, addrMap.size()*1e-6, 100.0*progress, elasedSinceStart, (1.0/speed) - elasedSinceStart ); lastStatTime = now; } SKIP(uint32_t, version, p); SKIP(uint256_t, prevBlkHash, p); SKIP(uint256_t, blkMerkleRoot, p); LOAD(uint32_t, bTime, p); blockTime = bTime; if(0<=cutoffBlock && cutoffBlock<=curBlock->height) { wrapup(); } }
void move( const uint8_t *script, uint64_t scriptSize, const uint8_t *txHash, int64_t value, const uint8_t *downTXHash = 0 ) { uint8_t addrType[3]; uint160_t pubKeyHash; int type = solveOutputScript(pubKeyHash.v, script, scriptSize, addrType); if(unlikely(type<0)) return; Addr *addr; auto i = addrMap.find(pubKeyHash.v); if(unlikely(addrMap.end()!=i)) addr = i->second; else { addr = allocAddr(); memcpy(addr->hash.v, pubKeyHash.v, kRIPEMD160ByteSize); addr->sum = 0; addrMap[addr->hash.v] = addr; allAddrs.push_back(addr); } addr->lastTouched = blockTime; addr->sum += value; static uint64_t cnt = 0; if(unlikely(0==((cnt++)&0xFFFFF))) { if( curBlock && lastBlock && firstBlock ) { double progress = curBlock->height/(double)lastBlock->height; info( "%8" PRIu64 " blocks, " "%8.3f MegaMoves , " "%8.3f MegaAddrs , " "%5.2f%%", curBlock->height, cnt*1e-6, addrMap.size()*1e-6, 100.0*progress ); } } }
virtual void start( const Block *, const Block * ) { if(csv) { printf( "\"Time\"," " \"Address\"," " \"TXId\"," " \"TXAmount\"," " \"NewBalance\"" "\n" ); } else { info("Dumping all transactions for %d address(es)\n", (int)addrMap.size()); printf(" Time (GMT) Address Transaction OldBalance Amount NewBalance\n"); printf(" =======================================================================================================================================================================================================================\n"); } }