Сделки, совершенные различными клиентами, ставятся в очередь в системе; майнеры забирают транзакции из этой очереди и добавляют их в блок. Затем они будут добывать блок, и победивший майнер получит привилегию добавить блок в цепочку блоков и тем самым заработать немного денег для себя.
Мы опишем этот процесс майнинга позже, когда будем обсуждать создание блокчейна. Прежде чем писать код для нескольких транзакций, добавим небольшую служебную функцию для печати содержимого данной транзакции.
Просмотр транзакции
Функция display_transaction принимает один параметр типа транзакции. Объект словаря в полученной транзакции копируется во временную переменную с именем dict, и с помощью ключей словаря различные значения выводятся на консоль.
def display_transaction(transaction): #for transaction in transactions: dict = transaction.to_dict() print ("sender: " + dict['sender']) print ('-----') print ("recipient: " + dict['recipient']) print ('-----') print ("value: " + str(dict['value'])) print ('-----') print ("time: " + str(dict['time'])) print ('-----')
Далее мы определяем очередь транзакций для хранения наших объектов транзакций.
Очередь транзакций
Чтобы создать очередь, мы объявляем переменную глобального списка под названием транзакции следующим образом:
transactions = []
Мы просто добавим каждую вновь созданную транзакцию в эту очередь. Обратите внимание, что для краткости мы не будем реализовывать логику управления очередями в этом руководстве.
Создание нескольких клиентов
Теперь мы начнем создавать транзакции. Сначала мы создадим четырех клиентов, которые будут отправлять друг другу деньги для получения различных услуг или товаров от других.
Dinesh = Client() Ramesh = Client() Seema = Client() Vijay = Client()
На данный момент у нас есть четыре клиента: Динеш, Рамеш, Сима и Виджай. В настоящее время мы предполагаем, что у каждого из этих клиентов есть несколько TPCoin в их кошельках для проведения транзакций. Идентификационные данные каждого из этих клиентов будут определены с помощью свойства identity этих объектов.
Создание первой транзакции
Теперь мы начинаем нашу первую транзакцию следующим образом:
t1 = Transaction( Dinesh, Ramesh.identity, 15.0 )
В этой транзакции Динеш отправляет 5 TPCoins Рамешу. Чтобы транзакция была успешной, мы должны убедиться, что у Динеша в кошельке достаточно денег для этого платежа. Обратите внимание, что нам потребуется транзакция генезиса, чтобы запустить циркуляцию TPCoin в системе. Вы напишете код транзакции для этой генезисной транзакции очень скоро, когда будете читать дальше.
Мы подпишем эту транзакцию, используя закрытый ключ Динеша, и добавим ее в очередь транзакций следующим образом:
t1.sign_transaction() transactions.append(t1)
После первой транзакции, сделанной Dinesh, мы создадим еще несколько транзакций между различными клиентами, которые мы создали выше.
Добавление дополнительных транзакций
Теперь мы создадим еще несколько транзакций, каждая транзакция выдаст несколько TPCoins другой стороне. Когда кто-то тратит деньги, нет необходимости, чтобы он проверял наличие достаточных остатков в этом кошельке. В любом случае майнер будет проверять каждую транзакцию на баланс, который имеет отправитель при инициации транзакции.
В случае недостаточного баланса майнер пометит эту транзакцию как недействительную и не добавит ее в этот блок.
Следующий код создает и добавляет еще девять транзакций в нашу очередь.
t2 = Transaction( Dinesh, Seema.identity, 6.0 ) t2.sign_transaction() transactions.append(t2) t3 = Transaction( Ramesh, Vijay.identity, 2.0 ) t3.sign_transaction() transactions.append(t3) t4 = Transaction( Seema, Ramesh.identity, 4.0 ) t4.sign_transaction() transactions.append(t4) t5 = Transaction( Vijay, Seema.identity, 7.0 ) t5.sign_transaction() transactions.append(t5) t6 = Transaction( Ramesh, Seema.identity, 3.0 ) t6.sign_transaction() transactions.append(t6) t7 = Transaction( Seema, Dinesh.identity, 8.0 ) t7.sign_transaction() transactions.append(t7) t8 = Transaction( Seema, Ramesh.identity, 1.0 ) t8.sign_transaction() transactions.append(t8) t9 = Transaction( Vijay, Dinesh.identity, 5.0 ) t9.sign_transaction() transactions.append(t9) t10 = Transaction( Vijay, Ramesh.identity, 3.0 ) t10.sign_transaction() transactions.append(t10)
Когда вы запустите приведенный выше код, у вас будет десять транзакций в очереди, чтобы майнеры могли создавать свои блоки.
Демпинг транзакций
Как менеджер блокчейна, вы можете периодически просматривать содержимое очереди транзакций. Для этой цели вы можете использовать функцию display_transaction, которую мы разработали ранее. Чтобы сбросить все транзакции в очереди, просто выполните итерацию списка транзакций и для каждой указанной транзакции вызовите функцию display_transaction, как показано здесь:
for transaction in transactions: display_transaction (transaction) print ('--------------')
Транзакции разделены пунктирной линией для различия. Если вы запустите приведенный выше код, вы увидите список транзакций, как показано ниже —
sender: 30819f300d06092a864886f70d010101050003818d0030818902818100bb064c99c49214 4a9f463480273aba93ac1db1f0da3cb9f3c1f9d058cf499fd8e54d244da0a8dd6ddd329e c86794b04d773eb4841c9f935ea4d9ccc2821c7a1082d23b6c928d59863407f52fa05d8b 47e5157f8fe56c2ce3279c657f9c6a80500073b0be8093f748aef667c03e64f04f84d311 c4d866c12d79d3fc3034563dfb0203010001 ----- recipient: 30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e 674abe7abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8ad d126b6e1a1308fb98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa93977 04de625d1836d3f42c7ee5683f6703259592cc24b09699376807f28fe0e00ff882974484 d805f874260dfc2d1627473b910203010001 ----- value: 15.0 ----- time: 2019-01-14 16:18:01.859915 ----- -------------- sender: 30819f300d06092a864886f70d010101050003818d0030818902818100bb064c99c49214 4a9f463480273aba93ac1db1f0da3cb9f3c1f9d058cf499fd8e54d244da0a8dd6ddd329e c86794b04d773eb4841c9f935ea4d9ccc2821c7a1082d23b6c928d59863407f52fa05d8b 47e5157f8fe56c2ce3279c657f9c6a80500073b0be8093f748aef667c03e64f04f84d311 c4d866c12d79d3fc3034563dfb0203010001 ----- recipient: 30819f300d06092a864886f70d010101050003818d0030818902818100a070c82b34ae14 3cbe59b3a2afde7186e9d5bc274955d8112d87a00256a35369acc4d0edfe65e8f9dc93fb d9ee74b9e7ea12334da38c8c9900e6ced1c4ce93f86e06611e656521a1eab561892b7db0 961b4f212d1fd5b5e49ae09cf8c603a068f9b723aa8a651032ff6f24e5de00387e4d0623 75799742a359b8f22c5362e5650203010001 ----- value: 6.0 ----- time: 2019-01-14 16:18:01.860966 ----- -------------- sender: 30819f300d06092a864886f70d010101050003818d0030818902818100be93b516b28c6e 674abe7abdb11ce0fdf5bb728b75216b73f37a6432e4b402b3ad8139b8c0ba541a72c8ad d126b6e1a1308fb98b727beb63c6060356bb177bb7d54b54dbe87aee7353d0a6baa93977 04de625d1836d3f42c7ee5683f6703259592cc24b09699376807f28fe0e00ff882974484 d805f874260dfc2d1627473b910203010001 ----- recipient: 30819f300d06092a864886f70d010101050003818d0030818902818100cba097c0854876 f41338c62598c658f545182cfa4acebce147aedf328181f9c4930f14498fd03c0af6b0cc e25be99452a81df4fa30a53eddbb7bb7b203adf8764a0ccd9db6913a576d68d642d8fd47 452590137869c25d9ff83d68ebe6d616056a8425b85b52e69715b8b85ae807b84638d8f0 0e321b65e4c33acaf6469e18e30203010001 ----- value: 2.0 ----- time: 2019-01-14 16:18:01.861958 ----- --------------
Для краткости я напечатал только первые несколько транзакций в списке. В приведенном выше коде мы печатаем все транзакции, начиная с самой первой транзакции, за исключением транзакции генезиса, которая никогда не была добавлена в этот список. Поскольку транзакции периодически добавляются в блоки, вам, как правило, будет интересно просматривать только список транзакций, которые еще предстоит отработать. В этом случае вам нужно будет создать соответствующий цикл for для итераций по транзакциям, которые еще не добыты.
До сих пор вы узнали, как создавать клиентов, разрешать их между собой и поддерживать очередь ожидающих транзакций, которые должны быть добыты. Теперь самая важная часть этого урока — это создание самой блокчейна. Вы узнаете это на следующем уроке.