void static HonghuoMiner(CWallet *pwallet,int targetConter) { LogPrint("INFO","Miner started\n"); SetThreadPriority(THREAD_PRIORITY_LOWEST); RenameThread("Honghuo-miner"); auto CheckIsHaveMinerKey = [&]() { LOCK2(cs_main, pwalletMain->cs_wallet); set<CKeyID> setMineKey; setMineKey.clear(); pwalletMain->GetKeys(setMineKey, true); return !setMineKey.empty(); }; if (!CheckIsHaveMinerKey()) { LogPrint("INFO", "HonghuoMiner terminated\n"); ERRORMSG("ERROR:%s ", "no key for minering\n"); return ; } auto getcurhigh = [&]() { LOCK(cs_main); return chainActive.Height(); }; targetConter = targetConter+getcurhigh(); try { SetMinerStatus(true); while (true) { if (SysCfg().NetworkID() != CBaseParams::REGTEST) { // Busy-wait for the network to come online so we don't waste time mining // on an obsolete chain. In regtest mode we expect to fly solo. while (vNodes.empty() || (chainActive.Tip() && chainActive.Tip()->nHeight>1 && GetAdjustedTime()-chainActive.Tip()->nTime > 60*60)) MilliSleep(1000); } // // Create new block // unsigned int LastTrsa = mempool.GetTransactionsUpdated(); CBlockIndex* pindexPrev = chainActive.Tip(); CAccountViewCache accview(*pAccountViewTip, true); CTransactionDBCache txCache(*pTxCacheTip, true); CScriptDBViewCache ScriptDbTemp(*pScriptDBTip, true); int64_t lasttime1 = GetTimeMillis(); shared_ptr<CBlockTemplate> pblocktemplate(CreateNewBlock(accview, txCache, ScriptDbTemp)); if (!pblocktemplate.get()){ throw runtime_error("Create new block fail."); } LogPrint("MINER", "CreateNewBlock tx count:%d used time :%d ms\n", pblocktemplate.get()->block.vptx.size(), GetTimeMillis() - lasttime1); CBlock *pblock = &pblocktemplate.get()->block; MiningBlock(pblock, pwallet, pindexPrev, LastTrsa, accview, txCache, ScriptDbTemp); if (SysCfg().NetworkID() != CBaseParams::MAIN) if(targetConter <= getcurhigh()) { throw boost::thread_interrupted(); } } } catch (...) { LogPrint("INFO","HonghuoMiner terminated\n"); SetMinerStatus(false); throw; } }
int PrimeWorker::HandleInput(zmq_pollitem_t *item) { zmsg_t* msg = zmsg_recv(item->socket); zframe_t* frame = zmsg_next(msg); size_t fsize = zframe_size(frame); const byte* fbytes = zframe_data(frame); proto::Signal& sig = mSignal; sig.ParseFromArray(fbytes+1, fsize-1); if(sig.type() == proto::Signal::NEWBLOCK){ mCurrBlock = sig.block(); mCurrHeight = mCurrBlock.height(); //printf("HandleInput(): proto::Signal::NEWBLOCK %d\n", mCurrHeight); zmsg_send(&msg, mSignals); while(true){ while(vNodes.empty()) MilliSleep(1000); mIndexPrev = pindexBest; if(!mIndexPrev) MilliSleep(1000); else break; } mWorkerCount = mNonceMap.size(); mNonceMap.clear(); mReqNonces.clear(); mShares.clear(); if(mBlockTemplate) delete mBlockTemplate; mBlockTemplate = CreateNewBlock(mReserveKey); if(!mBlockTemplate){ printf("ERROR: CreateNewBlock() failed.\n"); return -1; } }else if(sig.type() == proto::Signal::SHUTDOWN){ printf("HandleInput(): proto::Signal::SHUTDOWN\n"); zmsg_send(&msg, mSignals); FlushStats(); return -1; } zmsg_destroy(&msg); return 0; }
/* BOOL XBaseProp::LoadBlock( CToken& token, void *pBlockObj, LPCTSTR szBlockName, ID _idBlock ) { TCHAR szLastToken[64]; XCLEAR_ARRAY( szLastToken ); ID idBlock = 0; while(1) { if( token.GetToken() == NULL ) break; if( token == _T("{") ) { #pragma message( "이름 없어도 블럭생성되게 해서 하위계층으로 계속 복사되도록. 스킬처럼" ) // if( szBlockName ) // 블럭네임이 있을때만 블럭을 생성한다. 스크립트에서 최상위 블럭은 보통 이게 널이다 void *pSendBlock = NULL; void *pNewBlock = pSendBlock = CreateNewBlock( szLastToken, idBlock ); if( pNewBlock == NULL ) // 새로 할당 못받은경우는 상위에서 넘겨준 포인터로 넘겨준다. pSendBlock = pBlockObj; if( LoadBlock( token, pSendBlock, szLastToken, idBlock ) == FALSE ) { //XPROP_BREAKF( 1, "%s블럭 읽기실패", szLastToken ); XBREAKF( 1, "%s->%s{ }:\n알수없는 기호 나옴", token.m_strFileName, (szBlockName)? szBlockName : _T("") ); SAFE_DELETE( pNewBlock ); return FALSE; } else { if( pNewBlock ) // 어쨋든 여기서 블럭 할당 못받은경우는 리스트에 추가할수 없다 AddNewBlock( pNewBlock ); } } else if( token == _T("}") ) break; else { // 바로 다음 토큰이 블럭{ 이라면 블럭이름으로 인식 TCHAR szNextToken1[ MAX_TOKEN ]; TCHAR szNextToken2[ MAX_TOKEN ]; token.PushPos(); // 현재 위치 백업 _tcscpy_s( szNextToken1, token.GetToken() ); _tcscpy_s( szNextToken2, token.GetToken() ); // 다음, 다다음 토큰까지 읽어본다 token.PopPos(); // 토큰위치 복구 if( szNextToken1[0] == '{' ) { if( token.IsNumeric( token.m_Token ) ) // { 앞에 있는 토큰이 숫자형태라면 idBlock = token.ToNumber( token.m_Token ); // 일단 idblock으로 가정 else { _tcscpy_s( szLastToken, token.m_Token ); idBlock = 0; } } else if( token.IsNumeric( szNextToken1 ) && szNextToken2[0] == '{' ) // 다음 토큰이 숫자+{ 면 블럭 아이디로 인식 { _tcscpy_s( szLastToken, token.m_Token ); // 일단 블럭이름 받아놓고 idBlock = token.GetNumber(); // block id } else { // 토큰 파싱은 버추얼 파서에게 맞긴다 if( OnParse( token, pBlockObj, szBlockName ) == FALSE ) { XERROR( "%s->%s{ }:\n알수없는 기호 나옴", token.m_strFileName, (szBlockName)? szBlockName : _T("") ); // XPROP_BREAKF( 1, "알수없는 기호나옴: %s", token.m_Token ); // return FALSE; // 알수없는 기호나와도 일단 계속 읽게 하자 } } } } return TRUE; } */ BOOL XBaseProp::LoadBlock( CToken& token, void *pBlockObj, LPCTSTR szBlockName, ID _idBlock ) { TCHAR szLastToken[64]; XCLEAR_ARRAY( szLastToken ); ID idBlock = 0; while(1) { if( token.GetToken() == NULL ) break; if( token == _T("{") ) { #pragma message( "이름 없어도 블럭생성되게 해서 하위계층으로 계속 복사되도록. 스킬처럼" ) // if( szBlockName ) // 블럭네임이 있을때만 블럭을 생성한다. 스크립트에서 최상위 블럭은 보통 이게 널이다 void *pSendBlock = NULL; void *pNewBlock = pSendBlock = CreateNewBlock( szLastToken, idBlock ); if( pNewBlock == NULL ) // 새로 할당 못받은경우는 상위에서 넘겨준 포인터로 넘겨준다. pSendBlock = pBlockObj; if( LoadBlock( token, pSendBlock, szLastToken, idBlock ) == FALSE ) { //XPROP_BREAKF( 1, "%s블럭 읽기실패", szLastToken ); XBREAKF( 1, "%s->%s{ }:\n알수없는 기호 나옴", token.m_strFileName, (szBlockName)? szBlockName : _T("") ); SAFE_DELETE( pNewBlock ); return FALSE; } else { if( pNewBlock ) // 어쨋든 여기서 블럭 할당 못받은경우는 리스트에 추가할수 없다 AddNewBlock( pNewBlock ); } } else if( token == _T("}") ) break; else { // 토큰 파싱은 버추얼 파서에게 맞긴다 if( OnParse( token, pBlockObj, szBlockName ) == FALSE ) { // 토큰해석을 못했다면 블럭 이름일 수 있다. // 바로 다음 토큰이 블럭{ 이라면 블럭이름으로 인식 TCHAR szNextToken1[ MAX_TOKEN ]; TCHAR szNextToken2[ MAX_TOKEN ]; token.PushPos(); // 현재 위치 백업 _tcscpy_s( szNextToken1, token.GetToken() ); if( token.GetToken() == NULL ) break; _tcscpy_s( szNextToken2, token.m_Token ); // 다음, 다다음 토큰까지 읽어본다 token.PopPos(); // 토큰위치 복구 if( szNextToken1[0] == '{' ) { if( token.IsNumeric( token.m_Token ) ) // { 앞에 있는 토큰이 숫자형태라면 idBlock = token.ToNumber( token.m_Token ); // 일단 idblock으로 가정 else { _tcscpy_s( szLastToken, token.m_Token ); idBlock = 0; } } else if( token.IsNumeric( szNextToken1 ) && szNextToken2[0] == '{' ) // 다음 토큰이 숫자+{ 면 블럭 아이디로 인식 { _tcscpy_s( szLastToken, token.m_Token ); // 일단 블럭이름 받아놓고 idBlock = token.GetNumber(); // block id } else { // 토큰 파싱은 버추얼 파서에게 맞긴다 // if( OnParse( token, pBlockObj, szBlockName ) == FALSE ) { // XERROR( "%s->%s{ }:\n알수없는 기호 나옴", token.m_strFileName, (szBlockName)? szBlockName : _T("") ); // } } } } } return TRUE; }