Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2017, 20:46   #1
ShadowInject
Пользователь
 
Регистрация: 08.11.2014
Сообщений: 37
По умолчанию Проверить валидность

Реализовал проверку крипто кошелька на валидность, но только биткойны валидирует, а все остальные нет. Нашел вариант, но он на js може кто-то может помочь, как валидировать другие криптокошельки. https://github.com/ryanralph/altcoin-address
Мой вариант. Может кто-то смжет понять как происходит валидация тут https://github.com/ryanralph/altcoin...aster/index.js
Код:
public static bool ValidateBitcoinAddress(string address)
        {
               var decoded = DecodeBase58(address);
                if (DecodeBase58(address) != null)
                {
                    byte[] d1 = Hash(decoded.SubArray(0, 21));
                    byte[] d2 = Hash(d1);
                    if (!decoded.SubArray(21, 4).SequenceEqual(d2.SubArray(0, 4))) return false;
                    return true;
                }           
            return false;
        }
 
        const string Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
        const int Size = 25;
 
        private static byte[] DecodeBase58(string input)
        {
            var output = new byte[Size];
            try
            {
                foreach (var t in input)
                {
                    var p = Alphabet.IndexOf(t);
                    if (p == -1) throw new Exception("invalid character found");
                    var j = Size;
                    while (--j > 0)
                    {
                        p += 58*output[j];
                        output[j] = (byte) (p%256);
                        p /= 256;
                    }
                    if (p != 0) throw new Exception("address too long");
                }
                return output;
            }
            catch (Exception)
            {
                return null;
            }
            
        }
 
        private static byte[] Hash(byte[] bytes)
        {
            var hasher = new SHA256Managed();
            return hasher.ComputeHash(bytes);
        }
      
    }
    public static class ArrayExtensions
    {
        public static T[] SubArray<T>(this T[] data, int index, int length)
        {
            var result = new T[length];
            Array.Copy(data, index, result, 0, length);
            return result;
        }
    }
ShadowInject вне форума Ответить с цитированием
Старый 03.12.2017, 01:55   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

По части валидации код, на который Вы ссылаетесь, не делает ничего, чего не делал бы Ваш код. Он только дополнительно поверяет тип расшифрованного адреса

Похоже, у Вас неправильная реализация DecodeBase58
Точнее сформулирую так: если тот код, на который Вы ссылаетесь, действительно работает, то проблема в реализации DecodeBase58. Потому что она не раскодирует те адреса, что даны там в тестовых примерах. Да и алгоритм не совсем понятен. Хотя на биткойнах-то работает..

Я был прав. Завтра копну глубже.

Последний раз редактировалось Black Fregat; 03.12.2017 в 04:51.
Black Fregat вне форума Ответить с цитированием
Старый 03.12.2017, 12:37   #3
ShadowInject
Пользователь
 
Регистрация: 08.11.2014
Сообщений: 37
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
По части валидации код, на который Вы ссылаетесь, не делает ничего, чего не делал бы Ваш код. Он только дополнительно поверяет тип расшифрованного адреса

Похоже, у Вас неправильная реализация DecodeBase58
Точнее сформулирую так: если тот код, на который Вы ссылаетесь, действительно работает, то проблема в реализации DecodeBase58. Потому что она не раскодирует те адреса, что даны там в тестовых примерах. Да и алгоритм не совсем понятен. Хотя на биткойнах-то работает..

Я был прав. Завтра копну глубже.
Работает ли тот код я не знаю. Не силен в js. Да и принцип работы я совсем понял. Понял только, что сверяет по первым значаниям вроде в hex. Реализацию base58 брал с githab. Буду благодарен если сможуте понять проблему.
ShadowInject вне форума Ответить с цитированием
Старый 03.12.2017, 15:48   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Вот тут
Код:
                    while (--j > 0)
поставьте
Код:
                    while (--j >= 0)
Black Fregat вне форума Ответить с цитированием
Старый 03.12.2017, 17:55   #5
ShadowInject
Пользователь
 
Регистрация: 08.11.2014
Сообщений: 37
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Вот тут
Код:
                    while (--j > 0)
поставьте
Код:
                    while (--j >= 0)
Благодарю, все замечательно работает. А вы можете объяснить как происходит там определение кошелька ? Точнее определение какой криптовалюты кошелек ?
ShadowInject вне форума Ответить с цитированием
Старый 04.12.2017, 17:35   #6
ShadowInject
Пользователь
 
Регистрация: 08.11.2014
Сообщений: 37
По умолчанию

Все разобрался. Спасибо.
ShadowInject вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как проверить proxy на валидность? Miller-1981 Общие вопросы C/C++ 3 31.10.2011 12:34
Как проверить proxy на валидность? Miller-1981 C/C++ Сетевое программирование 0 30.10.2011 10:13
Валидность СSS Sead HTML и CSS 0 24.09.2011 19:43
Ошибка в коде, валидность Sarumjan HTML и CSS 1 16.03.2010 23:54
Не проходит валидность Ururu HTML и CSS 2 05.04.2009 15:54