diff --git a/CHANGELOG.md b/CHANGELOG.md
index b962b2452150fa40df817dd3b5f3d39bda9e23ac..c655feb909b5f8289c11e8a078cdc1891144a1c3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,5 @@
 # Changelog
+
 All notable changes to this project will be documented in this file.
 
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
@@ -8,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [Unreleased] - ReleaseDate
 
+### Fixed
+
+- ed25519: public key don't have min size. empty public key must be supported.
+
 ## [0.11.0] - 2020-02-29
 
 ### Changed
diff --git a/src/bases/b58.rs b/src/bases/b58.rs
index de34d7c95c10eadee29b5aba80b9c7ab54286e45..52ba871628ae115d42a53be212297f47a49b802e 100644
--- a/src/bases/b58.rs
+++ b/src/bases/b58.rs
@@ -25,7 +25,12 @@ pub trait ToBase58 {
 
 /// Create an array of 32 bytes from a Base58 string.
 pub fn str_base58_to_32bytes(base58_data: &str) -> Result<([u8; 32], usize), BaseConvertionError> {
-    match bs58::decode(base58_data).into_vec() {
+    let mut source = base58_data;
+    while !source.is_empty() && &source[0..1] == "1" {
+        source = &source[1..];
+    }
+
+    match bs58::decode(source).into_vec() {
         Ok(result) => {
             let len = result.len();
             if len <= 32 {
diff --git a/src/keys/ed25519.rs b/src/keys/ed25519.rs
index e6690a0fb09a94fcee1796a9d55f55ce198e056b..3074ea9ea333266a88411c2a958db57f7264dabf 100644
--- a/src/keys/ed25519.rs
+++ b/src/keys/ed25519.rs
@@ -45,8 +45,6 @@ use zeroize::Zeroize;
 
 /// Maximal size of a public key in bytes
 pub const PUBKEY_SIZE_IN_BYTES: usize = 32;
-/// constl size of a public key in bytes
-pub const PUBKEY_MIN_SIZE_IN_BYTES: usize = 31;
 /// constf a signature in bytes
 pub const SIG_SIZE_IN_BYTES: usize = 64;
 
@@ -168,7 +166,7 @@ impl Default for PublicKey {
     fn default() -> Self {
         PublicKey {
             datas: [0u8; 32],
-            len: 32,
+            len: 0,
         }
     }
 }
@@ -183,7 +181,7 @@ impl TryFrom<&[u8]> for PublicKey {
     type Error = PubkeyFromBytesError;
 
     fn try_from(bytes: &[u8]) -> Result<Self, Self::Error> {
-        if bytes.len() > PUBKEY_SIZE_IN_BYTES || bytes.len() < PUBKEY_MIN_SIZE_IN_BYTES {
+        if bytes.len() > PUBKEY_SIZE_IN_BYTES {
             Err(PubkeyFromBytesError::InvalidBytesLen {
                 expected: PUBKEY_SIZE_IN_BYTES,
                 found: bytes.len(),
@@ -224,14 +222,7 @@ impl super::PublicKey for PublicKey {
     #[inline]
     fn from_base58(base58_data: &str) -> Result<Self, BaseConvertionError> {
         let (datas, len) = b58::str_base58_to_32bytes(base58_data)?;
-        if len < PUBKEY_MIN_SIZE_IN_BYTES {
-            Err(BaseConvertionError::InvalidLength {
-                expected: PUBKEY_SIZE_IN_BYTES,
-                found: len,
-            })
-        } else {
-            Ok(PublicKey { datas, len })
-        }
+        Ok(PublicKey { datas, len })
     }
 
     fn to_bytes_vector(&self) -> Vec<u8> {
@@ -495,6 +486,12 @@ mod tests {
         );
     }
 
+    #[test]
+    fn test_pubkey_111_from_base58() {
+        let public58 = "11111111111111111111111111111111111111111111";
+        let _ = unwrap!(super::PublicKey::from_base58(public58));
+    }
+
     #[test]
     fn base58_public_key() {
         let public58 = "DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV";
diff --git a/src/keys/mod.rs b/src/keys/mod.rs
index ad9463c44574625c96942a218725a9e9ddbd004e..6acfdcdb30e981af242f06b84569dde34725c55e 100644
--- a/src/keys/mod.rs
+++ b/src/keys/mod.rs
@@ -508,10 +508,7 @@ mod tests {
     #[test]
     fn pubkey() {
         let pubkey_default = PubKey::default();
-        let pubkey_bytes = [
-            0u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-            0, 0, 0, 0,
-        ];
+        let pubkey_bytes = [];
         let pubkey = PubKey::Ed25519(unwrap!(ed25519::PublicKey::try_from(&pubkey_bytes[..])));
         assert_eq!(pubkey_default, pubkey);
 
@@ -522,14 +519,14 @@ mod tests {
         );
 
         assert_eq!(pubkey.size_in_bytes(), ed25519::PUBKEY_SIZE_IN_BYTES + 3);
-        assert_eq!(pubkey_str_b58, format!("{}", pubkey));
+        assert_eq!("", &format!("{}", pubkey));
 
         assert_eq!(KeysAlgo::Ed25519, pubkey.algo());
         assert_eq!(KeysAlgo::Schnorr, PubKey::Schnorr().algo());
 
         assert_eq!(pubkey_bytes.to_vec(), pubkey.to_bytes_vector());
 
-        assert_eq!(pubkey_str_b58, pubkey.to_base58());
+        assert_eq!("", &pubkey.to_base58());
 
         assert_eq!(
             Err(SigError::InvalidSig),
@@ -718,13 +715,6 @@ mod tests {
 
     #[test]
     fn pubkey_from_bytes() {
-        assert_eq!(
-            Err(PubkeyFromBytesError::InvalidBytesLen {
-                expected: ed25519::PUBKEY_SIZE_IN_BYTES,
-                found: 2,
-            }),
-            PubKey::from_bytes(&[0u8, 1]),
-        );
         assert_eq!(
             Err(PubkeyFromBytesError::InvalidBytesLen {
                 expected: ed25519::PUBKEY_SIZE_IN_BYTES,
@@ -737,7 +727,7 @@ mod tests {
         );
         assert_eq!(
             Ok(PubKey::Ed25519(ed25519::PublicKey::default())),
-            PubKey::from_bytes(&[0u8; 32]),
+            PubKey::from_bytes(&[]),
         );
     }
 }