Как проверить правильность адреса Ethereum PHP / Laravel?

Как я могу проверить, действителен ли адрес Ethereum из ввода Laravel с точки зрения формата?

2

Решение

Вот этот Ларавел пользовательское правило проверки для проверки адресов Эфириума против EIP 55 Спецификация. Чтобы узнать, как это работает, просмотрите комментарии.

<?php

namespace App\Rules;

use bb\Sha3\Sha3;
use Illuminate\Contracts\Validation\Rule;

class ValidEthereumAddress implements Rule
{
/**
* @var Sha3
*/
protected $sha3;

public function __construct(Sha3 $sha3)
{
$this->sha3 = $sha3;
}

public function passes($attribute, $value)
{
// See: https://github.com/ethereum/web3.js/blob/7935e5f/lib/utils/utils.js#L415
if ($this->matchesPattern($value)) {
return $this->isAllSameCaps($value) ?: $this->isValidChecksum($value);
}

return false;
}

public function message()
{
return 'The :attribute must be a valid ethereum address.';
}

protected function matchesPattern(string $address): int
{
return preg_match('/^(0x)?[0-9a-f]{40}$/i', $address);
}

protected function isAllSameCaps(string $address): bool
{
return preg_match('/^(0x)?[0-9a-f]{40}$/', $address) || preg_match('/^(0x)?[0-9A-F]{40}$/', $address);
}

protected function isValidChecksum($address)
{
$address = str_replace('0x', '', $address);
// See: https://github.com/ethereum/web3.js/blob/b794007/lib/utils/sha3.js#L35
$hash = $this->sha3->hash(strtolower($address), 256);

// See: https://github.com/web3j/web3j/pull/134/files#diff-db8702981afff54d3de6a913f13b7be4R42
for ($i = 0; $i < 40; $i++ ) {
if (ctype_alpha($address{$i})) {
// Each uppercase letter should correlate with a first bit of 1 in the hash char with the same index,
// and each lowercase letter with a 0 bit.
$charInt = intval($hash{$i}, 16);

if ((ctype_upper($address{$i}) && $charInt <= 7) || (ctype_lower($address{$i}) && $charInt > 7)) {
return false;
}
}
}

return true;
}
}

зависимости

Чтобы проверить адреса контрольной суммы, нам нужен SHA-3 реализация, которая еще не поддерживается встроенным hash() функция. Вы должны получить в это чистая реализация PHP чтобы вышеприведенное правило работало.

Он не зарегистрирован на Packagist, зарегистрируйте репо как композитор VCS репозиторий.

Есть также реализация расширения PHP, которую я сейчас не чувствую.

1

Другие решения

Любая строка из 42 символов, начинающаяся с 0x и следующая за 0-9, A-F, a-f (допустимые шестнадцатеричные символы) представляют действительный адрес Эфириума.

Вы можете найти больше информации о строчных и частично прописных (для добавления контрольной суммы) формате адресов Эфириума Вот.

0

По вопросам рекламы [email protected]