EOS原始碼解析 使用多執行緒從簽名生成對應公鑰

2021-09-26 18:21:59 字數 1826 閱讀 1729

昨天早上,eos 1.5.0 release 版本發布了。這次比較大改動點是在多執行緒簽名上面。它將同步區塊時的 block 簽名驗證和 trx 簽名驗證都使用多執行緒簽名驗證,來節省同步所需要的時間, 但是生產區塊所需要的成本是不變的,但為什麼生產區塊成本不變呢。接下來介紹一下具體的改動。

區塊多執行緒簽名改動:同步區塊時進行多執行緒簽名, replay 過程中依然是單執行緒簽名。因為區塊同步時需要回滾 pending block 的 trx 操作, 這塊時間剛好可以用來並行處理簽名, 但 replay 的時候沒有這一步,即使用多執行緒簽名也無法節省時間,反而會讓主線程阻塞等待非同步結果返回。

trx 多執行緒簽名改動:同步區塊以及 replay 過程都會進行多執行緒簽名, 因為有多個 trx 要執行,所以執行 trx 的時間可以供其他 trx 的簽名並行進行。 但生產區塊的時候無法使用,因為執行 bp 接受到乙個 廣播的 trx 就立馬去執行了,執行完之後才回去接受下乙個廣播 trx, 所以無法使用多執行緒簽名。

塊簽名:

因為 replay 不適用多執行緒簽名, 所以 replay 依舊沿用之前的簽名**, 而同步則使用了新的部分。

// producer_plugin.cpp 接受到廣播塊

void on_incoming_block(const signed_block_ptr& block)

// controller.cpp

std::futurecreate_block_state_future( const signed_block_ptr& b ) ", ("id", id) );

auto prev = fork_db.get_block( b->previous );

eos_assert( prev, unlinkable_block_exception, "unlinkable block $", ("id", id)("previous", b->previous) );

// 進行多執行緒簽名

return async_thread_pool( [b, prev]() );

}void push_block( std::future& block_state_future ) );

try ;

emit( self.accepted_block_header, new_header_state );

if ( read_mode != db_read_mode::irreversible )

} fc_log_and_rethrow( )

}

交易簽名

try );

} );

}packed_transactions.emplace_back( std::move( mtrx ) );}}

// 執行 trx

// ...

commit_block(false);

return;

} catch ( const fc::exception& e )

// trx 執行時獲取簽名返回的公鑰

const flat_set& recover_keys( const chain_id_type& chain_id )

}// 當沒開啟多執行緒簽名時, 直接驗證生成對應公鑰

signing_keys = std::make_pair( chain_id, trx.get_signature_keys( chain_id ));

}return signing_keys->second;}

當大家比較關注的 cpu 使用並沒有得到改善, 因為多執行緒簽名無法應該在生產區塊上。所以在生產區塊時, trx 執行所需要的 cpu 時間並不會減少,也就是 cpu 資源的使用並沒有得到改善。

EOS 原始碼解析 什麼是 read only 模式

大家之前使用 mongodb plugin mysql plugin 或其他資料持久化外掛程式的時候,可能會發現 transaction 和 trace 的資料重複duplicate 多機環境下 在最初的時候只能在持久化的時候做去重處理,但 eos 之後已經推出了 read only 模式,可以避免...

mysql 執行緒池原始碼 執行緒池原始碼解析

1.前言 我個人覺得理論性的東西可能大家都懂,但是具體的實現細節可能並不是很清楚所以才想記錄一下,加深記憶。2.關鍵原始碼解析 1 ctl private final atomicinteger ctl new atomicinteger ctlof running,0 private static...

c 多執行緒 原始碼3

在開發中經常會遇到執行緒的例子,如果某個後台操作比較費時間,我們就可以啟動乙個執行緒去執行那個費時的操作,同時程式繼續執行。在某些情況下可能會出現多個執行緒的同步協同的問題,下面的例子就展示了在兩個執行緒之間如何協同工作。這個程式的思路是共同做一件事情 從乙個arraylist中刪除元素 如果執行完...