репликация в python того, что делает электронный кошелек во время (детерминированного) создания кошелька

Я пытаюсь воспроизвести в python то, что делает кошелек Electrum во время (детерминированного) создания кошелька. ИМХО, документы немного скудны по этому поводу, возможно, потому, что он выполняется только один раз для большинства пользователей, все учебные пособия и т. Д., Похоже, сосредоточены на графическом интерфейсе, и я не смог разработать код Python из spesmilo github для Электрума .

Из того, что я вижу, Electrum генерирует случайное семя генерации кошелька.

  1. мнемоника из 13 слов ( или 12 слов плюс контрольная сумма? )

  2. который не зашифрован. Это также главный закрытый ключ?

  3. Затем пользователь вводит пароль/фразу-пароль (или нет), которая шифрует семя, чтобы его можно было сохранить в виде кошелька (файла).

  4. Файл кошелька можно расшифровать только с помощью пароля/парольной фразы.

  5. Затем из кошелька генерируется главный открытый ключ [Кто-нибудь знает об этом подробнее?] .

  6. Затем 25-байтовый двоичный биткойн-адрес = {[MPK>sha256>RIPEMD160]+[MPK>sha256>RIPEMD160>versionByteadd>sha256>sha256>first4bytes]}

  7. который, в свою очередь, является 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 , но не получил большого удовольствия от этого фрагмента.

Вы экспериментировали с pybitcointools ? Может быть хорошим местом для начала обучения.
да, на самом деле у меня есть Джон, я не удосужился вставить код Виталика, поскольку он делает то же самое. На самом деле я предпочитаю pybitcointools, потому что он поддерживает тестовую сеть (электрум - нет). В любом случае, не было большой радости, поэтому я хотел уточнить / исправить, если возможно: может быть, отредактировать мой пост (пожалуйста), как это сделал Ник?
Похоже, сейчас ведутся некоторые работы, и люди хотят протестировать Segregated Witness: github.com/spesmilo/electrum/issues/541 .
да, это будет здорово, потому что, как я только что понял, кажется, что невозможно отправить multisig txns (mk_multisig_script) в тестовую сеть с помощью pybitcointools (не без настройки Виталика transaction.py).

Ответы (1)

Bip32 — это реализация иерархических детерминированных кошельков. Это полностью описывает то, что вы обсуждаете здесь. Полный текст bip32 можно найти по адресу https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki . Мнемоника сопоставляется с определенными битами для шифрования, сами слова не используются. Прочтите немного о расширении ключей, в нем также объясняется, как генерируется главный открытый ключ. Это также объясняет три вывода, которые можно сделать из открытых и закрытых ключей, а именно:

Родительский закрытый ключ -> дочерний закрытый ключ

Родительский закрытый ключ -> дочерний открытый ключ

Родительский открытый ключ -> дочерний открытый ключ

Стоит отметить, что дочерний закрытый ключ не может быть сгенерирован из родительского открытого ключа.

большое спасибо, Марк ... я думаю, что понял концепцию и прочитал BIP32 (спасибо за ссылку!); Я полагаю, что мой пост был больше о реализации этого на Python: я знаю, что ленив, но отчасти надеялся, что кто-то был на моем месте раньше и мог просто выплюнуть код: я видел реализацию pycoin, но не смог понять, как он делает это в тестовой сети.