2017-07-15 9 views
3

私はちょうどコーディング初心者のチュートリアルに進みました。このチュートリアルはhttps://www.youtube.com/watch?v=tX-XokHf_nIです。そして私はBitcoinのアドレス/ privkeysを、(暗号ではなく)読みやすい1つのPythonファイルで生成したかったのです。ちょうどコードが書かれているスタイルです。Python 2.7 Bitcoin特権キーをWIF特権キーに変換

チュートリアルでは、 "1"で始まるBitcoinアドレスを取得した部分に到達しましたが、 "5"で始まるプライベートキーは取得しませんでした。私はBIP38が秘密鍵を暗号化する方法(「6」から始まる)を逃しています。これは、Bitcoinのメインネットワークの場合と同様です。

https://en.bitcoin.it/wiki/Wallet_import_formatをチュートリアル後のステップガイドとして使用していました。結局私は自分がすべてそれがゴミだったので自分自身でやろうとしたとコメントしました。 (「SHA256が拡張された秘密鍵を追加した部分が多くのレベルで間違っています」)私は80バイトを秘密鍵に追加した部分が正しいと思います。

PS:静的秘密鍵を使用していますが、これはすべてが機能するまで実行されます。そのため、非静的秘密鍵部分がコメントされています。これは、私が「非静的秘密鍵の使用法」とコメントした部分を介して生成されています。また、署名付きメッセージコード行(コードの最後にあります)は、チュートリアルに表示されているため、キー/アドレスの生成には重要ではないためコメントアウトしました。私はまた、ファイルの一番下にだけ印刷物などを置いて少し違うものをソートしてコードを少し美化しようとしましたが、Python 2.7ではそれが気に入らなかったことが判明しました。

私はPython 2.7を使用していますが、すべて正常にインストールされました。コードは、コメントアウトされた部分で現在のように動作しています。チュートリアルのアップローダーのように、bitaddress.orgで印刷した結果を確認しました。解決策を見つけることを試みましたが、私は検索結果から何か役に立つものを得ることができませんでした。

コードが欠落していてもお役に立てれば幸いです。また、コード内で何が何をしているのかを説明/コメントすることもできます。特にBIP38 Privkeyパスワードの暗号化がまだ不足している場合だから私は何が何であり、理解できるかを見ることができます。

.pyスクリプトを実行すると、追加した80バイトを除いて有効な結果が返されます。これが正しく行われていれば、アイデアはありません。 80バイトを追加することは、最後の秘密鍵を "5"で始めるために必要なステップです。それは印刷し実行

:私はチュートリアルに従って可能性があるのでここで

This is my Private Key: 29a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736 
This is my 80 Byte Private Key: 8029a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736 
This is my Public Key: 04d370b77a4cf0078ab9e0ba3c9e78e8dd87cc047fa58d751b3719daa29ac7fbf2c3ba8338f9a08f60a74a5d3a2d10f26afa2f703b8c430eecad89d59a9df00ec5 
This is my Bitcoin Address: 1B3wS8dQHtfMpFMSmtT5Fy4kHCYvxejtVo 

あなたは私のコードを見ることができますが、良いとしてあちこちのコメント: (「これは私のハッシュ化された内線privのあるコメントアウトし忘れました混乱のため申し訳ありませんキーのチェックサム」の部分は、これは私が今、助けを必要とするコードです。)あなたはおそらくBitcoin Wiki's段階から誤解何

import os 
import ecdsa 
import hashlib 
import base58 

## STATIC KEY USAGE 
private_key_static = "29a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736" 
## PRINTOUT FROM STATIC PRIVATE KEY 
print "This is my Private Key: " + private_key_static 

## NON STATIC PRIVATE KEY USAGE 
#private_key = os.urandom(32).encode("hex") 
#print "this is my private key: " + private_key 

## 80-BYTE EXTENDED PRIVATE KEY 
private_key_plus_80byte = (('80') + private_key_static) 

## PRINTOUT 80-BYTE EXTENDED PRIVATE KEY 
print "This is my 80 Byte Private Key: " + private_key_plus_80byte 

## SHA256 HASHED EXTENDED PRIVATE KEY 
## THIS IS WRONG ON SO MANY LEVELS 
#hashed_ext_priv_key_checksum = hashlib.sha256(hashlib.sha256(private_key_plus_80byte).digest()).digest()[:4] 
#hashed_ext_priv_key_checksum = hashed_ext_priv_key_checksum.decode("hex") 
#print "This is my hashed ext priv key checksum: " + hashed_ext_priv_key_checksum 

## PRIVATE! SIGNING KEY ECDSA.SECP256k1 
sk = ecdsa.SigningKey.from_string(private_key_static.decode("hex"), 
         curve = ecdsa.SECP256k1) 

## PUBLIC! VERIFYING KEY (64 BYTE LONG, MISSING 04 BYTE AT THE BEGINNING) 
vk = sk.verifying_key 

## PUBLIC KEY 
public_key = ('\04' + vk.to_string()).encode("hex") 
## PRINTOUT PUBLIC KEY 
print "This is my Public Key: " + public_key 

## PUBLIC KEY ENCODING (2x RIPEMD160) 
ripemd160 = hashlib.new('ripemd160') 

ripemd160.update(hashlib.sha256(public_key.decode('hex')).digest()) 

middle_man = ('\00') + ripemd160.digest() 

checksum = hashlib.sha256(hashlib.sha256(middle_man).digest()).digest()[:4] 

binary_addr = middle_man + checksum 

addr = base58.b58encode(binary_addr) 

print "This is my Bitcoin Address: " + addr 

## MESSAGE CONTENT 
#msg = "hello world" 

## SIGN MESSAGE CONTENT 
#signed_msg = sk.sign(msg) 

## VERIFY MESSAGE CONTENT 
#assert vk.verify(signed_msg, "hello world") 

## PRINTOUT SIGNED MESSAGE ENCODED TO HEX 
#print "This is a HEX encoded signed Message: " + signed_msg.encode("hex") 
+0

良い詳細@BloodyPythonNewbie!サイトへようこそ。ただのヒント - それの背後にある個人的なストーリーなしで質問を読む方が簡単です。質問内容自体に影響を与えないいくつかの文章を削除しました。あなたはすぐにいくつかの答えを得ることを願って:) – viraptor

+0

ありがとう!実際にあなたが編集したのと同じように、私はそれを1つの読みやすさと謎めいたファイルではない部分として削除したようです。ちょうど今のように! :) 私が理解しているコード行の助けが必要でしょうか。ネット上に本当に隠されたPythonコードをたくさん見ましたが、それを使用していません。ちょうどこのコードのように私を助けるのに最高でしょう! – BloodyPythonNewbie

答えて

3

は、すべてのハッシュとスタッフがとしてキーに行われなければならないということですバイト、文字列としてではありません。

これは、あなたの秘密鍵"29a59..."からWIFキーを導出したい場合は、文字列"8029a59..."しかしバイナリデータの代わりに、それに対応をハッシュする必要がないことを意味します。

ここ

binascii.unhexlify(...)は私たちに16進数の文字列によって表されるバイナリデータを告げる
# importing binascii to be able to convert hexadecimal strings to binary data 
import binascii 

# Step 1: here we have the private key 
private_key_static = "29a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736" 
# Step 2: let's add 80 in front of it 
extended_key = "80"+private_key_static 
# Step 3: first SHA-256 
first_sha256 = hashlib.sha256(binascii.unhexlify(extended_key)).hexdigest() 
# Step 4: second SHA-256 
second_sha256 = hashlib.sha256(binascii.unhexlify(first_sha256)).hexdigest() 
# Step 5-6: add checksum to end of extended key 
final_key = extended_key+second_sha256[:8] 
# Step 7: finally the Wallet Import Format is the base 58 encode of final_key 
WIF = base58.b58encode(binascii.unhexlify(final_key)) 
print (WIF) 

を働く不足しているスニペット。

あなたのコードの残りの部分はうまく動作します。)

+0

ありがとう!私はすぐにそれを試してみるために詳しく見て、返信します。 :) 再度、感謝します! – BloodyPythonNewbie

+0

@BloodyPythonNewbieハッピーに役立つ。この回答があなたの問題を解決した場合は、それを合格とマークしてください。それ以外の場合は、私たちにもっとお気軽にお問い合わせください。 – Marco