Я пытаюсь воспроизвести в python то, что делает кошелек Electrum во время (детерминированного) создания кошелька. ИМХО, документы немного скудны по этому поводу, возможно, потому, что он выполняется только один раз для большинства пользователей, все учебные пособия и т. Д., Похоже, сосредоточены на графическом интерфейсе, и я не смог разработать код Python из spesmilo github для Электрума .
Из того, что я вижу, Electrum генерирует случайное семя генерации кошелька.
мнемоника из 13 слов ( или 12 слов плюс контрольная сумма? )
который не зашифрован. Это также главный закрытый ключ?
Затем пользователь вводит пароль/фразу-пароль (или нет), которая шифрует семя, чтобы его можно было сохранить в виде кошелька (файла).
Файл кошелька можно расшифровать только с помощью пароля/парольной фразы.
Затем из кошелька генерируется главный открытый ключ [Кто-нибудь знает об этом подробнее?] .
Затем 25-байтовый двоичный биткойн-адрес = {[MPK>sha256>RIPEMD160]+[MPK>sha256>RIPEMD160>versionByteadd>sha256>sha256>first4bytes]}
который, в свою очередь, является Base58Check, закодированным в формате биткойн-адреса .
Может ли кто-нибудь проверить, верны ли мои предположения (от 1 до 7)/поправьте меня? Кроме того, ниже показано, как далеко я продвинулся с python (вероятно, совершенно неправильно!):
from electrum import mnemonic
import ecdsa
import hashlib
import base58
import getpass
mnemonicInstance = mnemonic.Mnemonic(lang='en')
randseed = mnemonicInstance.make_seed()
print "this is my 13 word wallet gen seed" + randseed
private_key = mnemonicInstance.mnemonic_to_seed(randseed , getpass.getpass()).encode('hex')
print "this is my private key: " + private_key
#the line of code below failed!:
sk = ecdsa.SigningKey.from_string(private_key.decode("hex"), curve = ecdsa.SECP256k1)
vk = sk.verifying_key
public_key = ('\04' + vk.to_string()).encode("hex")
print "this is my public key: " + public_key
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 BTC address: " + addr
(некоторые из вышеперечисленных взяты из github Шульци ). Я также консультировался с Андреасом Mastering Bitcoin , но не получил большого удовольствия от этого фрагмента.
Bip32 — это реализация иерархических детерминированных кошельков. Это полностью описывает то, что вы обсуждаете здесь. Полный текст bip32 можно найти по адресу https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki . Мнемоника сопоставляется с определенными битами для шифрования, сами слова не используются. Прочтите немного о расширении ключей, в нем также объясняется, как генерируется главный открытый ключ. Это также объясняет три вывода, которые можно сделать из открытых и закрытых ключей, а именно:
Родительский закрытый ключ -> дочерний закрытый ключ
Родительский закрытый ключ -> дочерний открытый ключ
Родительский открытый ключ -> дочерний открытый ключ
Стоит отметить, что дочерний закрытый ключ не может быть сгенерирован из родительского открытого ключа.
Джонатан Кросс
кумарз
Джонатан Кросс
кумарз