1. 程式人生 > >C++從零開始區塊鏈:區塊鏈業務模組之重複交易檢測

C++從零開始區塊鏈:區塊鏈業務模組之重複交易檢測

想象這樣一個場景:
節點a廣播了一條訊息,節點b和節點c都收到並記錄在自己的交易列表中了。
然後節點b和節點c挖礦。
當節點b挖礦成功,將a的交易打包到區塊中,並在網路上廣播。
這時節點c接收到節點b的挖礦成功的廣播,區塊驗證通過後掛到自己的區塊上,然後繼續挖礦。
當節點c也挖礦成功後,將自己的交易列表打包程區塊在節點上廣播。
而節點d是個小透明,先接收到b的區塊,後接收到c的區塊,然後將自己的區塊同步到主鏈上。
於是問題來了,b和c都將a的交易記錄了一次,並都打包成區塊,又都被掛到了主鏈上。其造成的結果就是a明明只廣播了一條交易,但主鏈上卻記錄了a的兩次交易,很明顯是錯誤的。
那麼怎麼解決呢?就是在每個節點的接收到一個挖礦廣播後,用自己的交易列表和區塊的交易列表進行比對,如果發現自己的列表中的某個交易已經記錄在區塊上了,就將自己的該交易記錄刪除。
單從交易的付款方,收款方,交易金額來區分是否是同一支交易是不合適的,因為很有可能兩個人進行了多次金額相同的交易。為解決這個問題,需要在交易中加入一個隨機值或者是時間戳。但本例只為演示,就不加了。

void BlockChain::DeleteDuplicateTransactions(const Block &block)
{
    std::list<Transactions>::iterator selfIt;
    std::list<Transactions>::const_iterator otherIt;

    pthread_mutex_lock(&m_mutexTs);
    for (selfIt = m_lst_ts.begin(); selfIt != m_lst_ts.end();)
    {
        if
(block.lst_ts.end() != std::find(block.lst_ts.begin(), block.lst_ts.end(), *selfIt)) { selfIt = m_lst_ts.erase(selfIt); } else { ++selfIt; } } pthread_mutex_unlock(&m_mutexTs); }