在Perl中验证比特币地址

时间:2014-05-13 00:27:38

标签: perl sha256 bitcoin

您好我试图使用一些Perl代码来检查比特币公共地址是否有效。我从这里获得了代码: http://rosettacode.org/wiki/Bitcoin/address_validation#Perl

然而,代码甚至无法验证页面上提供的示例公共地址而不会失败。它似乎通常做它应该做的事情 - 解压缩校验和检查它。虽然代码对我来说有点太神秘了。我会很感激帮助找出问题所在。这是用于测试的有效公共地址:1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i

#!/usr/bin/perl -w

use strict;
use warnings;
use bigrat;

my @b58 = qw{
      1 2 3 4 5 6 7 8 9
    A B C D E F G H   J K L M N   P Q R S T U V W X Y Z
    a b c d e f g h i j k   m n o p q r s t u v w x y z
};
my %b58 = map { $b58[$_] => $_ } 0 .. 57;

sub unbase58 {
    use integer;
    my @out;
    for my $c ( map { $b58{$_} } shift =~ /./g ) {
        for (my $j = 25; $j--; ) {
            $c += 58 * ($out[$j] // 0);
            $out[$j] = $c % 256;
            $c /= 256;
        }
    }
    return @out;
}

sub check_bitcoin_address {
    # does nothing if the address is valid
    # dies otherwise
    use Digest::SHA qw(sha256);
    my @byte = unbase58 shift;
    die "wrong checksum" unless
    join('', map { chr } @byte[21..24]) eq
    substr sha256(sha256 pack 'C*', @byte[0..20]), 0, 4;
}


check_bitcoin_address("1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i"); # Fails with "wrong checksum"

0 个答案:

没有答案