Serialize genesis block using bincode (#4687)
* use mmap to read the genesis block, and deserialize
This commit is contained in:
@ -18,6 +18,7 @@ generic-array = { version = "0.13.0", default-features = false, features = ["ser
|
||||
hex = "0.3.2"
|
||||
itertools = "0.8.0"
|
||||
log = "0.4.2"
|
||||
memmap = "0.6.2"
|
||||
num-derive = "0.2"
|
||||
num-traits = "0.2"
|
||||
rand = "0.6.5"
|
||||
|
@ -9,7 +9,9 @@ use crate::pubkey::Pubkey;
|
||||
use crate::signature::{Keypair, KeypairUtil};
|
||||
use crate::system_program;
|
||||
use crate::timing::{DEFAULT_SLOTS_PER_EPOCH, DEFAULT_TICKS_PER_SLOT};
|
||||
use std::fs::File;
|
||||
use bincode::{deserialize, serialize};
|
||||
use memmap::Mmap;
|
||||
use std::fs::{File, OpenOptions};
|
||||
use std::io::Write;
|
||||
use std::path::Path;
|
||||
|
||||
@ -75,19 +77,27 @@ impl GenesisBlock {
|
||||
}
|
||||
|
||||
pub fn load(ledger_path: &str) -> Result<Self, std::io::Error> {
|
||||
let file = File::open(&Path::new(ledger_path).join("genesis.json"))?;
|
||||
let genesis_block = serde_json::from_reader(file)?;
|
||||
let file = OpenOptions::new()
|
||||
.read(true)
|
||||
.open(&Path::new(ledger_path).join("genesis.bin"))
|
||||
.expect("Unable to open genesis file");
|
||||
|
||||
//UNSAFE: Required to create a Mmap
|
||||
let mem = unsafe { Mmap::map(&file).expect("failed to map the genesis file") };
|
||||
let genesis_block = deserialize(&mem)
|
||||
.map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, format!("{:?}", err)))?;
|
||||
Ok(genesis_block)
|
||||
}
|
||||
|
||||
pub fn write(&self, ledger_path: &str) -> Result<(), std::io::Error> {
|
||||
let serialized = serde_json::to_string(self)?;
|
||||
let serialized = serialize(&self)
|
||||
.map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, format!("{:?}", err)))?;
|
||||
|
||||
let dir = Path::new(ledger_path);
|
||||
std::fs::create_dir_all(&dir)?;
|
||||
|
||||
let mut file = File::create(&dir.join("genesis.json"))?;
|
||||
file.write_all(&serialized.into_bytes())
|
||||
let mut file = File::create(&dir.join("genesis.bin"))?;
|
||||
file.write_all(&serialized)
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user