Fullnode no longer fails to process a ledger with ProgramErrors in it
This commit is contained in:
18
src/bank.rs
18
src/bank.rs
@ -536,7 +536,12 @@ impl Bank {
|
|||||||
pub fn process_entry(&self, entry: &Entry) -> Result<()> {
|
pub fn process_entry(&self, entry: &Entry) -> Result<()> {
|
||||||
if !entry.is_tick() {
|
if !entry.is_tick() {
|
||||||
for result in self.process_transactions(&entry.transactions) {
|
for result in self.process_transactions(&entry.transactions) {
|
||||||
result?;
|
match result {
|
||||||
|
// Entries that result in a ProgramError are still valid and are written in the
|
||||||
|
// ledger so map them to an ok return value
|
||||||
|
Err(BankError::ProgramError(_, _)) => Ok(()),
|
||||||
|
_ => result,
|
||||||
|
}?;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.register_tick(&entry.id);
|
self.register_tick(&entry.id);
|
||||||
@ -1277,6 +1282,15 @@ mod tests {
|
|||||||
let entry = Entry::new(&hash, 0, num_hashes, vec![tx]);
|
let entry = Entry::new(&hash, 0, num_hashes, vec![tx]);
|
||||||
hash = entry.id;
|
hash = entry.id;
|
||||||
entries.push(entry);
|
entries.push(entry);
|
||||||
|
|
||||||
|
// Add a second Transaction that will produce a
|
||||||
|
// ProgramError<0, ResultWithNegativeTokens> error when processed
|
||||||
|
let keypair2 = Keypair::new();
|
||||||
|
let tx = Transaction::system_new(&keypair, keypair2.pubkey(), 42, last_id);
|
||||||
|
let entry = Entry::new(&hash, 0, num_hashes, vec![tx]);
|
||||||
|
hash = entry.id;
|
||||||
|
entries.push(entry);
|
||||||
|
|
||||||
if (i + 1) % ticks == 0 {
|
if (i + 1) % ticks == 0 {
|
||||||
let tick = Entry::new(&hash, 0, num_hashes, vec![]);
|
let tick = Entry::new(&hash, 0, num_hashes, vec![]);
|
||||||
hash = tick.id;
|
hash = tick.id;
|
||||||
@ -1316,7 +1330,7 @@ mod tests {
|
|||||||
bank.add_system_program();
|
bank.add_system_program();
|
||||||
let (ledger_height, last_id) = bank.process_ledger(ledger).unwrap();
|
let (ledger_height, last_id) = bank.process_ledger(ledger).unwrap();
|
||||||
assert_eq!(bank.get_balance(&pubkey), 1);
|
assert_eq!(bank.get_balance(&pubkey), 1);
|
||||||
assert_eq!(ledger_height, 5);
|
assert_eq!(ledger_height, 6);
|
||||||
assert_eq!(bank.tick_height(), 2);
|
assert_eq!(bank.tick_height(), 2);
|
||||||
assert_eq!(bank.last_id(), last_id);
|
assert_eq!(bank.last_id(), last_id);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user