Как проверить, действителен ли адрес Ethereum?
Я много раз читал, что вы никогда не должны вводить адрес вручную, если вы не хотите случайно отправить Эфир в без земли. Я хотел бы знать, какими могут быть эти контрольные суммы. Есть ли способ сказать, что опечатка произошла? как и каковы правила форматирования? Я спрашиваю, могу ли я создать функцию-оболочку, которая проверяет эти вещи перед отправкой в сеть.
6 ответов
Обычный адрес
EIP 55 добавлен " контрольная сумма на основе капиталов ", которая была реализована Geth к маю 2016 года. Вот Код Javascript от Geth:
/**
* Checks if the given string is an address
*
* @method isAddress
* @param {String} address the given HEX adress
* @return {Boolean}
*/
var isAddress = function (address) {
if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) {
// check if it has the basic requirements of an address
return false;
} else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) {
// If it's all small caps or all all caps, return true
return true;
} else {
// Otherwise check each case
return isChecksumAddress(address);
}
};
/**
* Checks if the given string is a checksummed address
*
* @method isChecksumAddress
* @param {String} address the given HEX adress
* @return {Boolean}
*/
var isChecksumAddress = function (address) {
// Check each case
address = address.replace('0x','');
var addressHash = sha3(address.toLowerCase());
for (var i = 0; i < 40; i++ ) {
// the nth letter should be uppercase if the nth digit of casemap is 1
if ((parseInt(addressHash[i], 16) > 7 && address[i].toUpperCase() !== address[i]) || (parseInt(addressHash[i], 16) <= 7 && address[i].toLowerCase() !== address[i])) {
return false;
}
}
return true;
};
Адрес ICAP
ICAP имеет контрольную сумму, которая может быть проверена. Вы можете просмотреть icap.go Geth's и вот фрагмент от него:
// https://en.wikipedia.org/wiki/International_Bank_Account_Number#Validating_the_IBAN
func validCheckSum(s string) error {
s = join(s[4:], s[:4])
expanded, err := iso13616Expand(s)
if err != nil {
return err
}
checkSumNum, _ := new(big.Int).SetString(expanded, 10)
if checkSumNum.Mod(checkSumNum, Big97).Cmp(Big1) != 0 {
return ICAPChecksumError
}
return nil
}
Теперь проще с web3
:
https://web3js.readthedocs.io/о /1,0 /web3-utils.html? выделить = isAddress # isaddress
web3.utils.isAddress('0xc1912fee45d61c87cc5ea59dae31190fffff232d');
> true
Стандартные 40-символьные шестнадцатеричные адреса теперь имеют контрольную сумму в виде заглавной буквы. Если адрес имеет хотя бы одну заглавную букву, то он проверяется и, если он вводится на сайт, который проверяет сумму, он вернет false, если это не действительный адрес.
Схема такова:
преобразуйте адрес в hex, но если i-я цифра является буквой (т. е. является одним из abcdef), напечатайте ее в верхнем регистре, если i-й бит хэша адреса (в двоичной форме) равен 1, иначе распечатайте его в в нижнем регистре
Вы можете прочитать полную запись VBs здесь: https://github.com/ethereum/EIPs/вопросы /55
Пакет python 'ethereum' имеет функцию "check_checksum" в модуле utils:
from ethereum.utils import check_checksum
check_checksum('0xc1912fee45d61c87cc5ea59dae31190fffff232d')
> True
Я создаю небольшой проект для этого, который я использую программно в своих приложениях. Он имеет «микро» api:
https://balidator.io/api/ethereum/0xea0258D0E745620e77B0A389e3A656EFdb7Cf821
Он также имеет проверку адреса для биткойнов, monero и рябь.
Здесь вы можете найти документацию: balidator.io/api-документация
До сих пор адреса ether не имеют контрольной суммы и представляют собой просто HEX-кодирование байтов адреса. Однако есть предложение для кодирования и контрольной суммы: ICAP: межсетевой протокол адресов клиентов .
ICAP имеет предварительную поддержку, объединенную в одном клиенте Ethereum.
function validateInputAddresses(address) {
return (/^(0x){1}[0-9a-fA-F]{40}$/i.test(address));
}