Address

使用 python 或 php 將私鑰轉換為比特幣地址

  • May 28, 2020

我有這樣的私鑰5JYJWrRd7sbqEzL9KR9dYTGrxyLqZEhPtnCtcvhC5t8ZvWgS9iC如何使用 python 或 php 轉換為比特幣地址?

比特幣地址範例 18V7u8YNHKwG944TCkzYYj32hb6fdFPvQf

我認為這個影片會詳細解釋它(python): https ://youtu.be/tX-XokHf_nI

使用來自 video、pip packagesecdsahashlib的程式碼base58

import ecdsa
import hashlib
import base58

# WIF to private key by https://en.bitcoin.it/wiki/Wallet_import_format
Private_key = base58.b58decode_check("5JYJWrRd7sbqEzL9KR9dYTGrxyLqZEhPtnCtcvhC5t8ZvWgS9iC") 
Private_key = Private_key[1:]

# Private key to public key (ecdsa transformation)
signing_key = ecdsa.SigningKey.from_string(Private_key, curve = ecdsa.SECP256k1)
verifying_key = signing_key.get_verifying_key()
public_key = bytes.fromhex("04") + verifying_key.to_string()

# hash sha 256 of pubkey
sha256_1 = hashlib.sha256(public_key)

# hash ripemd of sha of pubkey
ripemd160 = hashlib.new("ripemd160")
ripemd160.update(sha256_1.digest())

# checksum
hashed_public_key = bytes.fromhex("00") + ripemd160.digest()
checksum_full = hashlib.sha256(hashlib.sha256(hashed_public_key).digest()).digest()
checksum = checksum_full[:4]
bin_addr = hashed_public_key + checksum

# encode address to base58 and print
result_address = base58.b58encode(bin_addr)
print ("Bitcoin address {}".format(result_address))

我沒有在 python 中做很多工作,但我想我會嘗試解決這個問題,以發現新開發人員進入該領域以計算像地址這樣的簡單事物是多麼容易。

我注意到的第一件事是,儘管有很多比特幣 Python 包的搜尋結果,但很難評估它們中的任何一個是否合法或由知名開發人員編寫。最受歡迎的比特幣包似乎是由 Vitalik 編寫並在多年前被棄用的包。

我決定走另一條路:Electrum。

Electrum 是一個非常受歡迎的錢包,擁有出色的支持,我親自見過開發人員。程式碼庫在 github 上,維護良好,審查良好。我碰巧知道它是用python編寫的。

複製並安裝 repo 後:https ://github.com/spesmilo/electrum/

您的問題的答案分為兩行:

$ cd electrum
$ python3

Python 3.7.6 (default, Dec 30 2019, 19:38:28) 
[Clang 11.0.0 (clang-1100.0.33.16)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> from electrum import bitcoin
>>> bitcoin.address_from_private_key('5JYJWrRd7sbqEzL9KR9dYTGrxyLqZEhPtnCtcvhC5t8ZvWgS9iC')
'1AsSgrcaWWTdmJBufJiGWB87dmwUf2PLMZ'

作為健全性檢查,我使用我更熟悉的 bcoin(一個 Javascript 比特幣庫)重新執行了計算:

$ node

Welcome to Node.js v12.13.0.
Type ".help" for more information.

> const bcoin=require('bcoin')
undefined

> bcoin.KeyRing.fromSecret('5JYJWrRd7sbqEzL9KR9dYTGrxyLqZEhPtnCtcvhC5t8ZvWgS9iC')
{
 witness: false,
 nested: false,
 publicKey: '04fb95541bf75e809625f860758a1bc38ac3c1cf120d899096194b94a5e700e891c7b6277d32c52266ab94af215556316e31a9acde79a8b39643c6887544fdf58c',
 script: null,
 program: null,
 type: 'pubkeyhash',
 address: '1AsSgrcaWWTdmJBufJiGWB87dmwUf2PLMZ'
}

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