diff --git a/Cargo.toml b/Cargo.toml
index 8589f30eab9e98..f5c7dab74366bf 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -100,6 +100,7 @@ rand = "0.5.1"
rayon = "1.0.0"
reqwest = "0.9.0"
ring = "0.13.2"
+rocksdb = "0.10.1"
sha2 = "0.8.0"
serde = "1.0.27"
serde_cbor = "0.9.0"
diff --git a/src/db_ledger.rs b/src/db_ledger.rs
new file mode 100644
index 00000000000000..ddbb099b52dcf9
--- /dev/null
+++ b/src/db_ledger.rs
@@ -0,0 +1,572 @@
+//! The `ledger` module provides functions for parallel verification of the
+//! Proof of History ledger as well as iterative read, append write, and random
+//! access read to a persistent file-based ledger.
+
+use bincode::{deserialize, serialize};
+use byteorder::{ByteOrder, LittleEndian, ReadBytesExt};
+use entry::Entry;
+use ledger::Block;
+use packet::{Blob, BLOB_HEADER_SIZE};
+use result::{Error, Result};
+use rocksdb::{ColumnFamily, Options, WriteBatch, DB};
+use serde::de::DeserializeOwned;
+use serde::Serialize;
+use std::io;
+
+pub const DB_LEDGER_DIRECTORY: &str = "db_ledger";
+
+#[derive(Debug, PartialEq, Eq)]
+pub enum DbLedgerError {
+ BlobForIndexExists,
+ InvalidBlobData,
+}
+
+pub trait LedgerColumnFamily {
+ type ValueType: DeserializeOwned + Serialize;
+
+ fn get(&self, db: &DB, key: &[u8]) -> Result