OnChain invalid timestamp block propagation fail
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 35/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 停滞
- 技術スタック
- rust
- 領域
- blockchain, networking
調査の方向性
core/verification/queue/mod.rs と、issue に示されている verify() 関数から始めます。status、header response、body response メッセージを使って block1/block2 のタイムスタンプシナリオを再現し、その後 ready_signal と対象ノードの status response を追跡します。無効なブロックが拒否され、有効な先行ブロックが処理され、logging 文に依存せずに期待される status メッセージが送信されれば完了です。
索引モデルが issue の本文から書いたものです。
説明
There are some issues in sending invalid timestamp onChain blocks.
Below is a test scenario.
- Make block1 and block2.
- The timestamp in Block2's header should be invalid. Simply make it smaller than block1.
- Send a
status messagewith block2's hash as the bestHash. - Send a
header response messagewhich is [genesisHeader, block1Header, block2Header]. - Send a
body response message== [[], []], which is correspond to block1's body and block2's body. - Block is accepted from the target node only for block1. So the target node should send a status message with block1's hash as bestHash.(This is normal behaviour but it didn't)
And here are problems
- The target node does not send
status messageif in the above situation. However, if I insertedinfo!("55");then thestatus messagecome properly. - In below
verify()function in/core/verification/queue/mod.rs,Ok(verified)is returned twice although the block2 is invalid.
fn verify(
verification: Arc<Verification<K>>,
engine: Arc<CodeChainEngine>,
ready_signal: Arc<QueueSignal>,
empty: Arc<SCondvar>,
more_to_verify: Arc<SCondvar>,
_id: usize,
) {
loop {
// wait for work if empty.
{
let mut more_to_verify_mutex = verification.more_to_verify_mutex.lock().unwrap();
if verification.unverified.lock().is_empty() && verification.verifying.lock().is_empty() {
empty.notify_all();
}
while verification.unverified.lock().is_empty() {
more_to_verify_mutex = more_to_verify.wait(more_to_verify_mutex).unwrap();
}
}
// do work.
let item = {
// acquire these locks before getting the item to verify.
let mut unverified = verification.unverified.lock();
let mut verifying = verification.verifying.lock();
let item = match unverified.pop_front() {
Some(item) => item,
None => continue,
};
verification.sizes.unverified.fetch_sub(item.heap_size_of_children(), AtomicOrdering::SeqCst);
verifying.push_back(Verifying {
hash: item.hash(),
output: None,
});
item
};
let hash = item.hash();
let is_ready = match K::verify(item, &*engine, verification.check_seal) {
Ok(verified) => {
let mut verifying = verification.verifying.lock();
let mut idx = None;
for (i, e) in verifying.iter_mut().enumerate() {
if e.hash == hash {
idx = Some(i);
verification
.sizes
.verifying
.fetch_add(verified.heap_size_of_children(), AtomicOrdering::SeqCst);
e.output = Some(verified);
break
}
}
if idx == Some(0) {
// we're next!
let mut verified = verification.verified.lock();
let mut bad = verification.bad.lock();
VerificationQueue::drain_verifying(
&mut verifying,
&mut verified,
&mut bad,
&verification.sizes,
);
info!("111");
true
} else {
info!("222");
false
}
}
Err(_) => {
let mut verifying = verification.verifying.lock();
let mut verified = verification.verified.lock();
let mut bad = verification.bad.lock();
bad.insert(hash.clone());
verifying.retain(|e| e.hash != hash);
if verifying.front().map_or(false, |x| x.output.is_some()) {
VerificationQueue::drain_verifying(
&mut verifying,
&mut verified,
&mut bad,
&verification.sizes,
);
info!("33");
true
} else {
info!("44");
false
}
}
};
if is_ready {
info!("55");
// Import the block immediately
ready_signal.set_sync();
}
}
}
- 主要言語
- Rust
- スター
- 256
- フォーク
- 50
- PR マージ指標
- 30日以内にマージされた PR はありません
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
CodeChain-io/codechain のほかの issue
-
難易度 4/5 3〜5日 初心者へのやさしさ 25/100
CodeChain-io/codechain#2002 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
CodeChain-io/codechain#1993 · コメント 2 件 ·
-
Terminate gracefully オープン
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
CodeChain-io/codechain#1987 · コメント 1 件 ·
-
performance rpc
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
CodeChain-io/codechain#1973 ·
-
難易度 3/5 1〜2日 初心者へのやさしさ 35/100
CodeChain-io/codechain#1971 ·
CodeChain-io/codechain の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
Eynzof/Hermes-CN-Desktop#616 ·
-
bug rules
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
-
app bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
IronCoreLabs/ironcore-alloy#346 ·
-
good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100