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

Транзакции в биткойнах очень похожи на физические проверки. Чтобы совершать транзакции в блокчейне, мы, по сути, должны:

  1. Создайте транзакцию и заполните поля _1 _, _ 2_ и Amount
  2. Подпишите транзакцию

В физическом мире вы используете номер своего счета вместо поля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, спасибо, что заглянули и прочитали!