Как проверить, действителен ли адрес Ethereum?

Я много раз читал, что вы никогда не должны вводить адрес вручную, если вы не хотите случайно отправить Эфир в без земли. Я хотел бы знать, какими могут быть эти контрольные суммы. Есть ли способ сказать, что опечатка произошла? как и каковы правила форматирования? Я спрашиваю, могу ли я создать функцию-оболочку, которая проверяет эти вещи перед отправкой в ​​сеть.

47 голосов | спросил ZMitton 15 FebruaryEurope/MoscowbMon, 15 Feb 2016 05:20:34 +0300000000amMon, 15 Feb 2016 05:20:34 +030016 2016, 05:20:34

6 ответов


40

Обычный адрес

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
}
ответил eth 15 FebruaryEurope/MoscowbMon, 15 Feb 2016 11:24:39 +0300000000amMon, 15 Feb 2016 11:24:39 +030016 2016, 11:24:39
22

Теперь проще с web3:

https://web3js.readthedocs.io/о /1,0 /web3-utils.html? выделить = isAddress # isaddress

web3.utils.isAddress('0xc1912fee45d61c87cc5ea59dae31190fffff232d');
> true
ответил rstormsf 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 15 Sep 2017 20:33:01 +0300 2017, 20:33:01
8

Стандартные 40-символьные шестнадцатеричные адреса теперь имеют контрольную сумму в виде заглавной буквы. Если адрес имеет хотя бы одну заглавную букву, то он проверяется и, если он вводится на сайт, который проверяет сумму, он вернет false, если это не действительный адрес.

Схема такова:

  

преобразуйте адрес в hex, но если i-я цифра является буквой (т. е. является одним из abcdef), напечатайте ее в верхнем регистре, если i-й бит хэша адреса (в двоичной форме) равен 1, иначе распечатайте его в в нижнем регистре

Вы можете прочитать полную запись VBs здесь: https://github.com/ethereum/EIPs/вопросы /55

ответил tayvano 6 Mayam16 2016, 02:09:54
4

Пакет 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-документация

ответил Balidator 7 MaramWed, 07 Mar 2018 03:12:33 +03002018-03-07T03:12:33+03:0003 2018, 03:12:33
2

До сих пор адреса ether не имеют контрольной суммы и представляют собой просто HEX-кодирование байтов адреса. Однако есть предложение для кодирования и контрольной суммы: ICAP: межсетевой протокол адресов клиентов .

ICAP имеет предварительную поддержку, объединенную в одном клиенте Ethereum.

ответил Gustav Simonsson 15 FebruaryEurope/MoscowbMon, 15 Feb 2016 05:33:06 +0300000000amMon, 15 Feb 2016 05:33:06 +030016 2016, 05:33:06
2
function validateInputAddresses(address) {
        return (/^(0x){1}[0-9a-fA-F]{40}$/i.test(address));
}
ответил Stepan Poperechnyi 23 FebruaryEurope/MoscowbFri, 23 Feb 2018 15:53:13 +0300000000pmFri, 23 Feb 2018 15:53:13 +030018 2018, 15:53:13

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132