Во второй части мы собираемся реализовать последние последние части создания криптовалюты на блокчейне - транзакции, и, как мы увидим позже, нам также понадобится кошелек, но сначала немного теории.
Транзакции в биткойнах очень похожи на физические проверки. Чтобы совершать транзакции в блокчейне, мы, по сути, должны:
- Создайте транзакцию и заполните поля _1 _, _ 2_ и
Amount
- Подпишите транзакцию
В физическом мире вы используете номер своего счета вместо поляFrom
и номер счета получателя в полеTo
и ручку для подписи транзакции. Поскольку мы работаем в цифровом пространстве, мы будем использовать Digital Keys
для обозначения номеров счетов и Digital Signatures
для подписи транзакций.
Для цифровых подписей требуются два ключа: Public
, которым вы можете поделиться с кем угодно, и Private
, который должен храниться в секрете. Вы подписываете транзакцию с помощью ключа Private
и проверьте подпись с помощью Public
ключа.
Цифровые ключи позволяют нам проверить, действительно ли вы совершили транзакцию, не зная, кто вы.
В традиционном банковском деле у вас есть учетная запись в системе, и вы получаете номер учетной записи, но в Биткойне учетных записей нет, и вместо них в качестве номеров счетов используются ключи Public
. Как мы увидим позже, создать KeyPair
очень легко, и нередко иметь несколько из них для разных целей, например, у вас может быть пара для небольших повседневных покупок и еще один ключ для хранения большей части ваших монеты.
Кошелек
Давайте создадим Wallet
класс для хранения Public
и Private
ключей.
В качестве примера мы создаем новый KeyPair
каждый раз, когда создаем кошелек, а также, в отличие от Биткойна, мы используем RSA
ключей.
Когда вы отправляете монету, вы делаете это на Public
ключ получателя, и мы сохраняем эту информацию в блокчейне. Это называется неизрасходованными выходами транзакций или UTXO
, а концепция баланса создается Wallet
, который собирает их все:
Баланс - это сумма всех
UTXO
, которыеWallet
пользователь может потратить с помощьюPublic
ключа, который он контролирует.
Чтобы у вас была монета, кто-то должен сначала отправить ее вам, и это будет в виде UTXO
, связанного с вашим ключом.
Сделки
В Биткойне каждая транзакция по существу потребляет список из UTXO
и создает другой список из UTXO
. Кроме того, поскольку баланс где-то не записан, при необходимости кошелек должен сгенерировать изменение в виде UTXO
отправки обратно отправителю.
Если у вас есть только 10 монет одного достоинства и вы хотите отправить 5 монет Бобу, Wallet сгенерирует два
UTXO:
one для Боба с 5 монетами и еще один обратно вам с 5 монетами.
Каждая транзакция должна быть подписана, чтобы купить Private Key
отправителя, чтобы подтвердить, что именно отправитель действительно хочет отправить средства. С точки зрения реализации это означает, что нам нужно добавить еще пару функций расширения к стандартному классу String:
После этого пора создать класс Transaction
:
Собираем все вместе
Теперь, когда у нас есть класс Transaction, пора добавить функции к классу Wallet, чтобы иметь возможность отправлять средства, а также расширить Block, чтобы включить созданную транзакцию, и Blockchain, чтобы обновить его UXTO
после успешного майнинга блока.
Чтобы отправить средства, мы сначала проверяем, достаточно ли у нас монет, а затем генерируем TransactionOutputs
для хранения данных транзакции. Кроме того, при необходимости мы генерируем выходные данные изменения, чтобы отправить изменение обратно в наш открытый ключ.
Каждый блок теперь также будет содержать список транзакций:
Наконец, мы расширяем BlockChain и обновляем массив UTXO
новыми TransactionOutputs, а также удаляем старые:
И теперь мы можем совершать сделки:
На этом все заканчивается. Я выполнил свою цель - узнать немного больше о внутреннем устройстве блокчейна, и я надеюсь, что вы также узнали что-то новое или теперь лучше понимаете это. Конечно, это не готовая к производству реализация, и все еще существует сеть и множество проверок ошибок и крайних случаев, но моя цель не заключается в реализации готовой к производству цепочки блоков.
Как и раньше, весь код доступен на Github, спасибо, что заглянули и прочитали!