Wallet
python的地址生成器錯誤
我創建了一個創建比特幣私鑰、公鑰和地址的腳本,用於檢查是否一切正常我這樣做是為了讓我的腳本創建一個與 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
,所以我的結論是他們的網站有問題。