C++從零開始區塊鏈:區塊鏈業務模組之主鏈同步
阿新 • • 發佈:2018-11-03
同樣是採用一個簡單,但效率低下的方案,遍歷自己的鏈和其他節點的鏈,誰的長誰的就是主鏈。
然後將自己的鏈和主鏈進行比較,將自己的鏈上的區塊掛在主鏈上,掛的同時驗證一下自己的區塊是否已經存在於主鏈上,如果存在就跳過。
void BlockChain::MergeBlockChain(const std::string &json)
{
std::list<Block> lst_block = GetBlockListFromJson(json);
lst_block.pop_front();
if (lst_block.size() > m_lst_block.size())
{
std ::list<Block>::iterator it;
pthread_mutex_lock(&m_mutexBlock);
for (it = m_lst_block.begin(); it != m_lst_block.end(); ++it)
{
Block block = lst_block.back();
if(it->proof <= block.proof)
continue;
std::string strJson = GetJsonFromBlock(block);
std::string strHash = Cryptography::GetHash(strJson.c_str(), strJson.length());
it->index = block.index + 1;
it->previous_hash = strHash;
lst_block.push_back(*it);
}
m_lst_block = lst_block;
pthread_mutex_unlock(&m_mutexBlock);
}
else
{
std::list<Block>::iterator it;
for (it = lst_block.begin(); it != lst_block.end(); ++it)
{
pthread_mutex_lock(&m_mutexBlock);
Block block = m_lst_block.back();
if (it->proof <= block.proof)
{
pthread_mutex_unlock(&m_mutexBlock);
continue;
}
std::string strJson = GetJsonFromBlock(block);
std::string strHash = Cryptography::GetHash(strJson.c_str(), strJson.length());
it->index = block.index + 1;
it->previous_hash = strHash;
m_lst_block.push_back(*it);
pthread_mutex_unlock(&m_mutexBlock);
}
}
}