Wallet

python的地址生成器錯誤

  • July 13, 2020

我創建了一個創建比特幣私鑰、公鑰和地址的腳本,用於檢查是否一切正常我這樣做是為了讓我的腳本創建一個與 walletgenerator 返回的地址不同的地址。

Python腳本:

import secrets

導入 hashlib 導入 ecdsa 導入編解碼器 導入 base64

類地址():定義初始化(自我):self.private_key = self.create_private_key()

self.public_key = self.private_key_to_public(self.private_key)self.address = self.public_key_to_address(self.public_key)

@staticmethod
def create_private_key():
   bits = secrets.randbits(256)
   bits_hex = hex(bits)
   private_key = bits_hex[2:]
   return private_key


@staticmethod
def private_key_to_public(private_key):
   verify_key = ecdsa.SigningKey.from_string(codecs.decode(private_key, "hex"), curve=ecdsa.SECP256k1).verifying_key
   key_hex = codecs.encode(verify_key.to_string(), "hex")
   bitcoin_type = b'04'
   public_key = bitcoin_type + key_hex
   return public_key
   

@staticmethod
def public_key_to_address(public_key):
   public_key_bytes = codecs.decode(public_key, "hex")
   
   sha256_bpk = hashlib.sha256(public_key_bytes)
   sha256_bpk_digest = sha256_bpk.digest()
   
   ripemd160_bpk = hashlib.new("ripemd160")
   ripemd160_bpk.update(sha256_bpk_digest)
   ripemd160_bpk_digest = ripemd160_bpk.digest()
   ripemd160_bpk_hex = codecs.encode(ripemd160_bpk_digest, "hex")
   network_byte = b'00'
   network_bitcoin_public_key = network_byte + ripemd160_bpk_hex

   network_bitcoin_public_key_bytes = codecs.decode(network_bitcoin_public_key, 'hex')
   # Double SHA256 to get checksum
   sha256_nbpk = hashlib.sha256(network_bitcoin_public_key_bytes)
   sha256_nbpk_digest = sha256_nbpk.digest()
   sha256_2_nbpk = hashlib.sha256(sha256_nbpk_digest)
   sha256_2_nbpk_digest = sha256_2_nbpk.digest()
   sha256_2_hex = codecs.encode(sha256_2_nbpk_digest, "hex")
   checksum = sha256_2_hex[:8]

   address_hex = (network_bitcoin_public_key + checksum).decode('utf-8')
   return Address.base58(address_hex)

@staticmethod
def base58(address_hex):
   alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
   b58_string = ''
   # Get the number of leading zeros
   leading_zeros = len(address_hex) - len(address_hex.lstrip('0'))
   # Convert hex to decimal
   address_int = int(address_hex, 16)
   # Append digits to the start of string
   while address_int > 0:
       digit = address_int % 58
       digit_char = alphabet[digit]
       b58_string = digit_char + b58_string
       address_int //= 58
   # Add ‘1’ for each 2 leading zeros
   ones = leading_zeros // 2
   for _ in range(ones):
       b58_string = '1' + b58_string
   return b58_string

正在做

foo = Address()
print(foo.private_key, foo.public_key, foo.address)

返回

# 5598c164e8bcec667589267cdaf0f14a6b9399ae0b2a6b10972602a6feaf682d 
# b'04cbeefab6ecfa84f5f120503de4574952f2d1fa5b11b8f6c80a13df02e6512090e6fede6dde3e65256c484162e38 
# 39cf599c3d08a236432e8e307784b741ffca5' 18NFnELB9YpRiEbLMmRLKymYpvxC9yzkC2

然後,如果我檢查https://walletgenerator.net/5598c164e8bcec667589267cdaf0f14a6b9399ae0b2a6b10972602a6feaf682d上的私鑰,它會返回:

Public address: 1LBLgjq3ntVdb8MqB41rHReWnrKgT41Lwv
Public address compressed: 1LBLgjq3ntVdb8MqB41rHReWnrKgT41Lwv

您的 python 腳本生成未壓縮的公鑰,並且它們似乎計算正確。

當我使用自己的腳本時,結果是:

Private key: ---------------------------------------
5598c164e8bcec667589267cdaf0f14a6b9399ae0b2a6b10972602a6feaf682d
Private WIF: ---------------------------------------
Kz66jawQ5eb7pQYJx3tTNmFQBS46x1rg92To2js3bY1SKrPxVWvL
Public key: ----------------------------------------
04cbeefab6ecfa84f5f120503de4574952f2d1fa5b11b8f6c80a13df02e6512090e6fede6dde3e65256c484162e3839cf599c3d08a236432e8e307784b741ffca5
pubkeyhash: ----------------------------------------
50cdf408e049ddab4bd8ebda8a6500e93831a633
BTC Address: ---------------------------------------
18NFnELB9YpRiEbLMmRLKymYpvxC9yzkC2

對您的結果沒有任何影響。

但是 walletgenerator.net 的計算似乎有一個錯誤:

他們聲稱未壓縮的地址與壓縮的地址相同,這是不正確的。您在他們的網站上使用了哪個標籤,是Wallet Details嗎?

作為一個壓縮的比特幣地址,1KJKsAzDeH1127x6w8e2xZyzRdvFkiLhme當我使用自己的腳本時,我會得到,我的 Electrum 客戶端會確認該結果(當我使用私鑰導入功能時)。

所有這些都與 的結果不符walletgenerator.net,所以我的結論是他們的網站有問題。

引用自:https://bitcoin.stackexchange.com/questions/96972