Exemplo n.º 1
0
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;
	}
}
Exemplo n.º 2
0
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;
	
}
Exemplo n.º 3
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;
}