improve ledger initialization for fullnode

* use a line iterator on stdin instead of a line iterator on a buffer
 * move some unwrap() to expect(), documenting failures
 * bind entry type earlier (for kicks)
This commit is contained in:
Rob Walker 2018-06-19 09:10:51 -07:00 committed by Grimes
parent 75997e6c08
commit 6aced927ad
1 changed files with 12 additions and 16 deletions

View File

@ -15,7 +15,7 @@ use solana::server::Server;
use solana::transaction::Instruction; use solana::transaction::Instruction;
use std::env; use std::env;
use std::fs::File; use std::fs::File;
use std::io::{stdin, stdout, Read, Write}; use std::io::{stdin, stdout, BufRead, Write};
use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket}; use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket};
use std::process::exit; use std::process::exit;
use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicBool;
@ -62,41 +62,37 @@ fn main() {
exit(1); exit(1);
} }
let mut buffer = String::new();
let num_bytes = stdin().read_to_string(&mut buffer).unwrap();
if num_bytes == 0 {
eprintln!("empty file on stdin, expected a log file");
exit(1);
}
eprintln!("Initializing..."); eprintln!("Initializing...");
let mut entries = buffer.lines().map(|line| { let stdin = stdin();
serde_json::from_str(&line).unwrap_or_else(|e| { let mut entries = stdin.lock().lines().map(|line| {
let entry: Entry = serde_json::from_str(&line.unwrap()).unwrap_or_else(|e| {
eprintln!("failed to parse json: {}", e); eprintln!("failed to parse json: {}", e);
exit(1); exit(1);
})
}); });
entry
});
eprintln!("done parsing..."); eprintln!("done parsing...");
// The first item in the ledger is required to be an entry with zero num_hashes, // The first item in the ledger is required to be an entry with zero num_hashes,
// which implies its id can be used as the ledger's seed. // which implies its id can be used as the ledger's seed.
let entry0 = entries.next().unwrap(); let entry0 = entries.next().expect("invalid ledger: empty");
// The second item in the ledger is a special transaction where the to and from // The second item in the ledger is a special transaction where the to and from
// fields are the same. That entry should be treated as a deposit, not a // fields are the same. That entry should be treated as a deposit, not a
// transfer to oneself. // transfer to oneself.
let entry1: Entry = entries.next().unwrap(); let entry1 = entries
.next()
.expect("invalid ledger: need at least 2 entries");
let tx = &entry1.transactions[0]; let tx = &entry1.transactions[0];
let deposit = if let Instruction::NewContract(contract) = &tx.instruction { let deposit = if let Instruction::NewContract(contract) = &tx.instruction {
contract.plan.final_payment() contract.plan.final_payment()
} else { } else {
None None
}; }.expect("invalid ledger, needs to start with a contract");
eprintln!("creating bank..."); eprintln!("creating bank...");
let bank = Bank::new_from_deposit(&deposit.unwrap()); let bank = Bank::new_from_deposit(&deposit);
bank.register_entry_id(&entry0.id); bank.register_entry_id(&entry0.id);
bank.register_entry_id(&entry1.id); bank.register_entry_id(&entry1.id);