OnChain invalid timestamp block propagation fail
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 35/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- À l'abandon
- Stack technique
- rust
- Domaine
- blockchain, networking
Piste de recherche
Commencez par core/verification/queue/mod.rs et la fonction verify() présentée dans l’issue. Reproduisez le scénario d’horodatage block1/block2 avec les messages de status, header response et body response, puis suivez ready_signal et la réponse de status du nœud cible. C’est terminé lorsque le bloc invalide est rejeté, que le prédécesseur valide est traité et que le message de status attendu est envoyé sans dépendre d’instructions de journalisation.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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();
}
}
}
- Langage dominant
- Rust
- Étoiles
- 256
- Forks
- 50
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de CodeChain-io/codechain
-
is this project still alive? Ouverte
Difficulté 4/5 3-5 jours Accessibilité débutants 25/100
CodeChain-io/codechain#2002 ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
CodeChain-io/codechain#1993 · 2 commentaires ·
-
Terminate gracefully Ouverte
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
CodeChain-io/codechain#1987 · 1 commentaire ·
-
performance rpc
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
CodeChain-io/codechain#1973 ·
-
Difficulté 3/5 1-2 jours Accessibilité débutants 35/100
CodeChain-io/codechain#1971 ·
Toutes les issues de CodeChain-io/codechain
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
-
state:needs triage
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
zed-industries/zed#64680 · 2 commentaires ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
RustPython/RustPython#8802 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
TheLarkInn/aipm#2390 ·