Criação de várias transações
As transações feitas por vários clientes são enfileiradas no sistema; os mineiros pegam as transações dessa fila e as adicionam ao bloco. Eles então minerarão o bloco e o mineiro vencedor terá o privilégio de adicionar o bloco ao blockchain e, assim, ganhar algum dinheiro para si mesmo.
Descreveremos esse processo de mineração mais tarde, quando discutirmos a criação do blockchain. Antes de escrevermos o código para várias transações, vamos adicionar uma pequena função de utilidade para imprimir o conteúdo de uma determinada transação.
Exibindo transação
o display_transactionfunção aceita um único parâmetro do tipo de transação. O objeto de dicionário dentro da transação recebida é copiado para uma variável temporária chamadadict e usando as chaves de dicionário, os vários valores são impressos no console.
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 ('-----')
Em seguida, definimos uma fila de transações para armazenar nossos objetos de transação.
Fila de transações
Para criar uma fila, declaramos um global list variável chamada transactions como segue -
transactions = []
Vamos simplesmente anexar cada transação recém-criada a esta fila. Observe que, por questões de brevidade, não implementaremos a lógica de gerenciamento de fila neste tutorial.
Criação de vários clientes
Agora, vamos começar a criar transações. Primeiro, criaremos quatro clientes que enviarão dinheiro uns aos outros para obter vários serviços ou mercadorias de terceiros.
Dinesh = Client()
Ramesh = Client()
Seema = Client()
Vijay = Client()
Neste ponto, temos quatro clientes chamados Dinesh, Ramesh, Seema e Vijay. Presumimos atualmente que cada um desses clientes possui algumas TPCoins em suas carteiras para transações. A identidade de cada um desses clientes seria especificada usando a propriedade de identidade desses objetos.
Criação da primeira transação
Agora, iniciamos nossa primeira transação da seguinte forma -
t1 = Transaction(
Dinesh,
Ramesh.identity,
15.0
)
Nesta transação, Dinesh envia 5 TPCoins para Ramesh. Para que a transação seja bem-sucedida, teremos que garantir que Dinesh tenha dinheiro suficiente em sua carteira para este pagamento. Observe que precisaremos de uma transação de gênesis para iniciar a circulação de TPCoin no sistema. Você escreverá o código de transação para esta transação de gênesis muito em breve, enquanto lê.
Vamos assinar esta transação usando a chave privada de Dinesh e adicioná-la à fila de transações da seguinte forma -
t1.sign_transaction()
transactions.append(t1)
Após a primeira transação feita pela Dinesh, criaremos várias outras transações entre diferentes clientes que criamos acima.
Adicionar mais transações
Agora, criaremos várias outras transações, cada transação distribuída algumas TPCoins para outra parte. Quando alguém gasta dinheiro, não é necessário que ele verifique se há saldos suficientes nesta carteira. O minerador, de qualquer maneira, estaria validando cada transação para o saldo que o remetente tem ao iniciar a transação.
Em caso de saldo insuficiente, o minerador marcará esta transação como inválida e não a adicionará a este bloco.
O código a seguir cria e adiciona mais nove transações à nossa fila.
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)
Ao executar o código acima, você terá dez transações na fila para os mineiros criarem seus blocos.
Operações de despejo
Como um gerenciador de blockchain, você pode querer revisar periodicamente o conteúdo da fila de transações. Para este propósito, você pode usar odisplay_transactionfunção que desenvolvemos anteriormente. Para despejar todas as transações na fila, apenas itere a lista de transações e para cada transação referenciada, chame odisplay_transaction função conforme mostrado aqui -
for transaction in transactions:
display_transaction (transaction)
print ('--------------')
As transações são separadas por uma linha tracejada para distinção. Se você executar o código acima, verá a lista de transações conforme mostrado abaixo -
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
-----
--------------
Para resumir, imprimi apenas as primeiras transações da lista. No código acima, imprimimos todas as transações começando com a primeira transação, exceto para a transação do genesis que nunca foi adicionada a esta lista. Como as transações são adicionadas aos blocos periodicamente, geralmente você estará interessado em ver apenas a lista de transações que ainda não foram exploradas. Nesse caso, você precisará criar um apropriadofor loop para iterar pelas transações que ainda não foram extraídas.
Até agora, você aprendeu como criar clientes, permitir que eles se encontrem e manter uma fila das transações pendentes que devem ser mineradas. Agora, vem a parte mais importante deste tutorial, que é a criação de um blockchain. Você aprenderá isso na próxima lição.