【问题标题】:Dogecoin Address generation - Address not valid狗狗币地址生成 - 地址无效
【发布时间】:2022-02-04 06:08:11
【问题描述】:

我正在尝试生成狗狗币地址。生成的地址与 RPC-API getnewaddress 生成的有效狗狗币地址具有相同的长度和相同的长度,但它们不起作用。它们无效。

步骤如下:

  1. 来自 secp256k1 的公钥
  2. 将 SHA256,然后 RIPEMD-160 应用于 SHA256 的结果
  3. 在 RIPEMD-160 结果的开头添加 0x1E(狗狗币版本)
  4. 将 SHA256 两次应用于校验和哈希的加密公钥
  5. 将校验和哈希的前 4 个字节(8 个字符)添加到加密公钥的末尾
  6. 应用 BASE56

这会生成一个以 D 开头的 34 个字符的地址,看起来非常真实,但没有一个是有效的。为什么?

    use strict;
    use warnings;
    use Digest::SHA qw(sha256);
    use Crypt::PK::ECC;
    use Crypt::RIPEMD160;
    use v5.10;
    
    use Bitcoin::Crypto::Base58 qw(
            encode_base58
            decode_base58
            encode_base58check
            decode_base58check
    );
    
    # Bitcoin Version 0x00
    # Dogecoin Version 0x1E
    
    sub append_checksum_and_version {
        my ($binstr) = @_;
    
        return (chr(0x1E) . $binstr . substr(sha256(sha256($binstr)), 0, 4));
    }
    
    
    my $pk = Crypt::PK::ECC->new();
    $pk->generate_key('secp256k1');
    my $public_raw = $pk->export_key_raw('public');
    my $encrypted_pubkey = Crypt::RIPEMD160->hash(sha256($public_raw));
    say "Private Key: " . unpack "H*", $pk->export_key_raw('private');
    say "Dogecoin Address: " . encode_base58(append_checksum_and_version($encrypted_pubkey));  

输出:

Dogecoin Address: DGRHFUwqvzh8VBFR1gAhRFVbM476bATZVK

Dogecoin Address: DEvMuu6PbQLDQE72aofFzxk5c8AmzRZos9

Dogecoin Address: DM1zqiW5ZPb1MD8hP1sxtBsPkQAofFTRTw

也许校验和计算不正确?即使我对比特币使用 0x00 而不是 0x1E。比特币地址也无效。

【问题讨论】:

    标签: perl cryptography bitcoin


    【解决方案1】:

    原来是少了一个字节。

    return (chr(0x1E) . $binstr . substr(sha256(sha256($binstr)), 0, 4));
    

    必须替换为

    return (chr(0x1E) . $binstr . substr(sha256(sha256(chr(0x1E) . $binstr)), 0, 4));
    

    0x1E(狗狗币)或 0x00(比特币)的版本字节必须包含在校验和的双 sha256 计算中。

    use strict;
    use warnings;
    use Digest::SHA qw(sha256);
    use Crypt::PK::ECC;
    use Crypt::RIPEMD160;
    use Bitcoin::Crypto::Base58 qw(encode_base58 decode_base58 encode_base58check decode_base58check);
    use v5.10;
    
    # Version byte: Bitcoin 0x00, Dogecoin 0x1E
    sub cv {
        my ($binstr) = @_;
        return (chr(0x1E) . $binstr . substr(sha256(sha256(chr(0x1E) . $binstr)), 0, 4));
    }
    
    my $pk = Crypt::PK::ECC->new()->generate_key('secp256k1');
    my $dogecoin_address = encode_base58(cv(Crypt::RIPEMD160->hash(sha256($pk->export_key_raw('public')))));
    say "Dogecoin Address: " . $dogecoin_address; 
    

    提供有效地址:

    Dogecoin Address: DR61RhFNCkswmDx6JjLyVPSoq51gBtxxjK
    Dogecoin Address: DFFV4xa9Ph2LUXaKbyxMtViHFhu9e9h88J
    Dogecoin Address: DAk4ZbSoWnhpt2exkEevG2j93CVEL7g5Fu
    

    更新:

    如果您想从 pubkey 生成 Dogecoin 的 wifkey。主网版本字节为0x9E(狗狗币)和0x80(比特币)

    sub toWifKey {
        my ($binstr) = @_;
        return (chr(0x9E). $binstr . substr(sha256(sha256(chr(0x9E) . $binstr)), 0, 4));
    }
    
    my $wifkey = encode_base58(toWifKey($pk->export_key_raw('private')));
    

    【讨论】:

      猜你喜欢
      • 2014-03-27
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      相关资源
      最近更新 更多