diff --git a/src/traft/node.rs b/src/traft/node.rs
index b16b5af6a6a3defa8c693a68a379cbadd78c1be3..c05e7cd9aa01067f456c3996256e54d3b8d97568 100644
--- a/src/traft/node.rs
+++ b/src/traft/node.rs
@@ -790,12 +790,13 @@ impl NodeImpl {
                     Dml::Delete { key, .. } => s.get(key),
                     Dml::Replace { tuple, .. } => {
                         let tuple = Tuple::from(tuple);
-                        let index = s.primary_key();
-                        // Safety: safe as long as `tuple` has the correct format
-                        // for the `index`, which should be checked via cas before
-                        // this log entry is committed.
-                        // TODO: rewrite using the safe `KeyDef::extract_key` alternative
-                        let key = unsafe { index.extract_key(tuple) };
+                        let key_def = self
+                            .storage
+                            .key_def(s.id(), 0)
+                            .expect("index for space must be found");
+                        let key = key_def
+                            .extract_key(&tuple)
+                            .expect("cas should validate operation before committing a log entry");
                         s.get(&key)
                     }
                 }