Isolution666
@Isolution666
Full-Stack Developer

Как проверить достоверность введёных данных?

Здравствуйте.
--
У меня вопрос по ICO.
При покупке токенов, пользователь вводит свой эфирум кошелёк. Как узнать или проверить, что он ввёл верный адрес. Я заметил на других проектах, что это всё валидируется. Предполагаю, что это так же как и с API криптовалют. (получаешь массив данных, если среди адресов указанного нет, значит такого адреса не существует.) Проверял литкоин, биткоин и эфирум кошельки сгенерированные на кошельке payeer/ - всё работает. Может эти адреса, как в блокчейн, внесли в реестр, ведь будет нелогичным отправлять криптовалюту на несуществующий адрес.

Кто делал подобное, подскажите, как это устроено?
  • Вопрос задан
  • 882 просмотра
Решения вопроса 3
dimonchik2013
@dimonchik2013
non progredi est regredi
у демонов (geth, bitcoind Etc) есть функции, проверяющие валидность кошелька
например, все тестовые у битка начинаются с m (или даже mm, ml)

но никто не проверит, что кошелек акутальный, если он не записан в блокчейн,
а новый кошель в блокчейн естественно не записан
Ответ написан
Комментировать
semennovikov123
@semennovikov123
Backend Developer
Самый простой способ через регулярные выражения, они есть почти во всех языках. Вот пример для эфира:
^0x[0-9a-fA-F]{40}$
Ответ написан
Isolution666
@Isolution666 Автор вопроса
Full-Stack Developer
Я искал решение для фреймворка Yii2 и для всех криптовалют, к сожалению теги по убирали, поэтому, те кто искал решение для Yii - возможно не увидят моего решения.
К слову о валидации: https://etherscan.io/apis#contracts
Это сайт может помочь в проверке "эфирум-кошельков"
---
Обратите внимание:
1) https://api.etherscan.io/api?module=contract&actio...
2) https://api.etherscan.io/api?module=contract&actio...
что у ссылки (2) - ошибка, и "status":"0", у ссылки (1) - видны блоки и "status":"1","message":"OK"
По сути своей, это API в виде json файла.
если сделать себе свой ключ (хотя странно что без ключа тоже работает), то можно создать свой класс на php - где создать правила валидации:
// for Yii2
    public function rules()
    {
        return [
            ...
            ['sender', 'validateSender'],
            ...
        ];
    }

И само правило:
// for Yii2
    public function validateSender($attribute, $params)
    {
        $money = self::rightAdress($this->sender);
        if ($money == 0) {
            $this->addError($attribute, 'Неправильный адрес Ethereum-кошелька.');
        }
    }

Естественно, чтобы это проверить, нужно сделать GET запрос к API:
public function rightAdress($sender = '') 
    {
        $json = self::viewUrlContent($sender);
        $obj = json_decode($json);
        return ($obj->result == 'Invalid Address format') ? '0' : '1'; // Invalid Address format
    }

Я сделал две функции, чтобы в дальнейшем можно было сделать более гибкое решение:
public static function formUrlAddressETH($sender = '')
    {
        // Tokensell::formUrlAddressETH()
        return self::APIurl.'?module=contract&action=getabi&address='.$sender.'&apikey='.self::YourApiKeyToken;
    }
    
    
    public static function viewUrlContent($sender = '')
    {
        return file_get_contents(self::formUrlAddressETH($sender));
    }

Грубо говоря делаем либо публичные переменные, либо как я, константы:
const APIurl = 'https://api-rinkeby.etherscan.io/api';
    const YourApiKeyToken = 'тут ваш ключ от которого никакого толка ))) ';

Так же я делал проверку на баланс, ну я думаю дальше проще понять, и тут будет уже не по теме.
Мы же рассматривали варианты, чтобы проверить, верно указан кошелёк, или адрес не верный.
Универсального решения я пока не нашёл, может быть появится, или сам создам. Но по сути больше никак не проверишь, так как их (крипто-кошельков) очень много, хранить на сайте смысла нет, они постоянно обновляются XD
Поэтому только API, благо оно для криптовалюты есть.
Учитывая, что на Lavarel и на Simfony - php class особо не отличаются, можно сделать похожее решение.

Предупреждаю, что валидация срабатывает после отправки формы, после перезагрузки страницы, так что советую добавить ajax

У меня всё, надеюсь кому помог, или кому-то пригодится.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы