Генерируем Bitcoin-адрес на Python

Тема криптовалют снова начинает будоражить интернет. Супер, что вам не надо идти в отделение банка с паспортом и выстаивать очередь, чтобы открыть счет. Сгенерировать кошелек Bitcoin — дело нескольких строк кода на Python.

Нам понадобятся библиотеки base58 и ecdsa. base58 – это кодирование бинарных данных 58-ю печатными символами (цифрами и латинскими буквами, кроме 0, O, I, l, которые похожи друг на друга). ecdsa – библиотека криптографии на эллиптических кривых.

pip install base58 ecdsa

Импортируем то, что нужно:

import hashlib
import ecdsa
from binascii import hexlify
from base58 import b58encode

Нам нужен приватный ключ, из него мы вычислим публичный ключ, а из него – адрес кошелька Bitcoin. (Обратная процедура не возможна без полного перебора до конца времен). Приватный ключ – это 32 байта данных, которые мы получим из криптографически-надежного источника случайных чисел. Вообще можно придумать свой приватный ключ самостоятельно, если так хочется. Для генерации случайного приватного ключа мы воспользуемся библиотекой ecdsa:

private_key = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)

Вычислим этой же библиотекой публичный ключ и добавим спереди байт 0x4 (это признак «несжатого» публичного ключа; есть и другие форматы).

public_key = b'\04' + private_key.get_verifying_key().to_string()

Теперь нужно из публичного ключа сделать привычный число-буквенный адрес Bitcoin. Взглянем на схему:

Схема генерации адреса BTC из публичного ключа.

Для получения адреса из публичного ключа вычисляем сначала RIPEMD160(SHA256(public-key)):

ripemd160 = hashlib.new('ripemd160')
ripemd160.update(hashlib.sha256(public_key).digest())

Дополняем его префиксом 0x0 (главная сеть Bitcoin):

r = b'\0' + ripemd160.digest()

Вычисляем контрольную сумму (нужна, чтобы наши денюжки не пропадали, если мы ошибемся в каком-то символе адреса). Контрольная сумма это первые 4 байта от SHA256(SHA256(r)):

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

Получаем адрес кошелька, закодировав в base58 сложенные r и checksum:

address = b58encode(r + checksum)

Выведем результат:

print(f'private key: {hexlify(private_key.to_string())}')
print(f'public key uncompressed: {hexlify(public_key)}')
print(f'btc address: {address}')

Генерация приватного ключа из своего источника случайностей, например, os.urandom:

def random_secret_exponent(curve_order):
    while True:
        bytes = os.urandom(32)
        random_hex = hexlify(bytes)
        random_int = int(random_hex, 16)
        if random_int >= 1 and random_int < curve_order:
            return random_int


def generate_private_key():
    curve = ecdsa.curves.SECP256k1
    se = random_secret_exponent(curve.order)
    from_secret_exponent = ecdsa.keys.SigningKey.from_secret_exponent
    return from_secret_exponent(se, curve, hashlib.sha256).to_string()

Важно для конфиденциальных данных, вроде приватного ключа, использовать криптографически безопасный источник случайности. Об этом я писал в одной из недавних статей!

Полный пример кода генерации кошельков.

Проверить ключи и адрес можно здесь. (Нажимаем Skip, дальше Enter my own…)

Подробнее по теме можно почитать здесь.

Специально для канала @pyway.

NXT Coin

NXT server on my window
NXT server on my window

Решил поставить у себя сервер для новой криптовалюты. Ну не поставить, а повесить скорее 🙂 Небольшое описание:

Криптовалюта второго поколения Nxt (от «Next») запущена 24.11.2013 г.: основная веткапервоначальная ветка.
Это чисто PoS система, ~1 блок/минута, сложность пересчитывается каждый блок.
Всего эмитирован 1 млрд монет (пропорционально биткоинам, которые ранние адепты Nxt переводили автору), больше эмиссии не будет, майнинг происходит полностью за счёт транзакционных сборов (т.е. как это будет с Биткоином через 30 лет), минимальная комиссия — 1 Nxt.

Вообще-то это совсем не форк биткоина, т.к. софт (полностью на java) написан с нуля.
Чтобы Nxt не форкнули немедленно, автор намерен полностью опубликовать исходники не ранее 3-го января 2014 г., сейчас исходный код доступен частично.

Nxt — система по-настоящему децентрализованная, нет даже wallet.dat. Клиента как отдельного приложения тоже нет, весь функционал доступен через web-браузер. Счёт пользователи себе заводят через web-интерфейс(весёленький, нужно отменить) путём выбора длинной сложной фразы, примерно как в Brainwallet или Electrum. Войти в свой счёт можно с любого веб-браузера, лучше через IP адрес своего сервера, но можно и через любой другой сервер (если вы ему доверяете). В любом из этих случаев после открытия счёта монеты участвуют в PoS-майнинге, правда, свежекупленные монеты должны для этого вылежаться 1440 блоков, т.е. ~ 1 сутки.

(Источник: https://bitcointalk.org/index.php?topic=345882.0)

Небольшой FAQ (вопросы и ответы):

Вопрос. Зачем тебе это надо?

Ответ. Потому что могу. У меня оборудование, которое лежит без дела, и я хочу его пустить на благое дело – развитие новой финансовой системы. Bitcoin завоевал уже серьезную популярность и даже признание со стороны правительств. А NXT – только первая ласточка второго поколения криптовалюты. Хочу помочь проекту, тем более, что это мне ничего не стоит. Я потратил на это минимум денег и времени.

Вопрос. Тебя обманывают! (Это не вопрос). А вдруг оно взламывает пароли Пентагона?

Ответ. Я никому не плачу за это. Моя информация сохранна (так как все крутится на отдельной железке). Взламывает пароли? Вздор! Да, исходные коды еще полностью не открыты, но скоро будут открыты. Это обязательное условия признания валюты общественностью, мы будем наверняка знать, что делает эта программа. Даже если она взламывает чужие пароли, то мой девайс абсолютно в этом не эффективен. Это, наверное, самый медленный мой компьютер. Никому он вреда, кроме самого злоумышленника он не нанесет, а взломщику придется перекладывать задания с моего сервера на другой, так как мой с ним и не справится (грубо говоря). Обвинить меня в соучастии не получится, ведь я скачивал программу для совершенно других целей и только окажусь невинной жертвой мошенника. Также сложно вычислить отдельных людей, потому что в системе уже участвуют тысячи… В общем слишком много «но», чтобы эта бредовая идея была похожа на правду.

Вопрос. Ты не будешь успевать гнаться за нарастающими мощностями, требуемыми для майнинга монет. Потратишь кучу денег на ненужное оборудование и электроэнергию. 

Ответ. Иди читай статью. В NXT не нужны вычислительные мощности. Это все в прошлом. Все работает по-другому. Майнинга нет. Сервера нужны, чтобы поддерживать и подтверждать транзакции. Поэтому оконного сервера мне хватает за глаза. Я не скоро обновлю эту железку. А она потребляет максимум 2.5 Ватта (от обычного USB). Это в 400 раз меньше, чем утюг или чайник или даже мой стационарный компьютер (там БП аж на 1100 Ватт).

Вопрос. А что за железяка-то?

Ответ. PCduino (ARM), 1 Ghz, 1 Gb RAM, 4 Gb ROM, HDMI, GPIO (Arduino-like), Ubuntu. NXT сам на JAVA. Штукенция обошлась мне в 60 баксов, которые я взял из рекламных денег моей игры. Настройка и чтение отняли около двух часов времени.

Вопрос. Где ты узнал про NXT?

Из поста Артема в ВК.