본문 바로가기
DEVEL/PHP

PHP 비트코인 주소 검증

by codebyai 2024. 1. 19.
반응형

http://appu.kr/?i=12385552 

 

인플루언서 마케팅 애드릭스-CPA CPI CPS 제휴마케팅 재택알바 광고

블로그 재택알바 유튜브 SNS로 집에서돈버는방법 애드릭스입니다. 순위 차트 CPA CPS CPI 광고 홍보 수익을 내보세요. 부업 투잡 창업

www.adlix.co.kr

 

기본적으로 비트코인 주소는 Base58Check 인코딩을 사용합니다.

PHP에서 이를 구현하기 위해 다음 단계를 따르면 됩니다.

 

1. 주소가 Base58 문자만 포함하고 있는지 확인합니다.

2. 주소를  Base58에서 바이트 배열로 디코딩합니다.

3. 디코딩된 바이트 배열의 마지막 4바이트가 체크섬입니다. 체크섬을 제외한 나머지 부분에 대해 SHA-256을 두번 적용합니다.

4. 더블 SHA-256 해시의 첫 4바이트가 체크섬과 일치하는지 확인합니다.

 

예제

function decodeBase58($input) {
    $alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
    $base = strlen($alphabet);
    $length = strlen($input);
    $num = 0;
    $chars = str_split($input);
    $charMap = array_flip(str_split($alphabet));

    for ($i = 0; $i < $length; ++$i) {
        $num *= $base;
        if (!isset($charMap[$chars[$i]])) {
            throw new Exception('Invalid character found');
        }
        $num += $charMap[$chars[$i]];
    }

    $hex = '';
    while ($num > 0) {
        $hex = dechex($num % 256) . $hex;
        $num = floor($num / 256);
    }

    foreach ($chars as $char) {
        if ($charMap[$char] === 0) {
            $hex = '00' . $hex;
        } else {
            break;
        }
    }

    return $hex;
}

function validateBitcoinAddress($address) {
    if (preg_match('/[^1-9A-HJ-NP-Za-km-z]/', $address)) {
        return false;
    }

    $decoded = decodeBase58($address);
    if (strlen($decoded) != 50) {
        return false;
    }

    $checksum = substr($decoded, -8);
    $rawAddress = substr($decoded, 0, -8);
    $hash1 = hash('sha256', hex2bin($rawAddress));
    $hash2 = hash('sha256', hex2bin($hash1));

    if (substr($hash2, 0, 8) !== $checksum) {
        return false;
    }

    return true;
}

// 예시 주소 검증
$address = 'address';
$isValid = validateBitcoinAddress($address);
echo $isValid ? 'Valid address' : 'Invalid address';
반응형