Recentemente, publiquei dois pequenos artigos explicando de uma forma "mão na massa", como você poderá autenticar um documento, seja qual for, trecho de um código fonte, uma música, um vídeo, uma monografia, fotos, plantas em AutoCAD, enfim, tudo que possa ser transformado em um documento digital. Sugiro sua leitura antes para que este seja melhor entendido:
Para facilitar também o entendimento, recomendo que leiam minhas publicações anteriores. Inicialmente, eu não pretendia fazer uma série, mas acabou se tornando dada ao amplo leque de possibilidades e aplicações empregando a
Blockchain:
São apenas provas de conceito, se bem que totalmente funcionais, mas têm o inconveniente que você necessitaria fazer uma transação enviando uma quantia mínima de
Bitcoins ou
Ethereums, para gerar o
TimeStamp do seu documento.
Pensando nisso, nasceu a iniciativa
OpenTimestamps que são servidores de calendário onde você pode obter de forma livre, gratuita e sem qualquer necessidade de inscrições, chaves de API, contas, logins, senhas etc., a prova de existência, temporalidade e teor de seus documentos.
Nesse artigo falarei apenas do cliente opentimestamps-client, mas o GitHub do projeto há também outros componentes, inclusive um server, para o caso de você querer implementar o seu próprio servidor de calendário.
Requisitos
O opentimestamps-client é escrito em
Python3.x, portanto, você deverá te-lo instalado na máquina, VM ou Container que irá rodar o opentimestamps-client.
Embora desejável, não é absolutamente necessário que você esteja rodando um daemon bitcoind. Não vou adentrar nesse particular, pois há farto material disponível sobre o assunto. Fica o link:
Bitcoin - Open source P2P money, recomendo o Bitcoin Core por questões de compatibilidade e visto que não testei a solução com outros tipos de carteiras.
Embora não tenha testado, creio que não haverá problemas com o uso de carteiras remotas, como a do
Blockchain - The Most Trusted Crypto Company, que é gratuita.
Instalação e uso
1. Instalando o cliente:
pip3 install opentimestamps-cliente
2. Criando um timestamp para um documento:
ots stamp CV_CarlosEAHenriques.pdf
A saída será um print dos servidores de calendário default:
Submitting to remote calendar https://a.pool.opentimestamps.org
Submitting to remote calendar https://b.pool.opentimestamps.org
Submitting to remote calendar https://a.pool.eternitywall.com
Submitting to remote calendar https://ots.btc.catallaxy.com
O cliente criará um arquivo ".ots" referente ao arquivo original com o nome "CV_CarlosEAHenriques.pdf.ots".
3. Obtendo informações do timestamp:
ots info CV_CarlosEAHenriques.pdf.ots
A saída será com vários hashes de tempo dos servidores e o hash sha256sum do arquivo "CV_CarlosEAHenriques.pdf", parecido com o que segue abaixo:
`File sha256 hash: a3f20adf0b6ac0478e62b6573b7d83e0edc58c10a7e27b2aa7d16fb289e8b6c9
Timestamp:
append 7b5e56d75abbe37343b00c1351c1b8a0
sha256
-> append 38470a6e9c936b40b7c24706b80b8f47
sha256
prepend 5c710433
append 688c139ed8f5887f
verify PendingAttestation('https://btc.calendar.catallaxy.com')
-> append 52ca4f9c96c4c8f28f0a8fe65361b9dc
sha256
prepend 5c710434
append e60d69b0da08e3df
verify PendingAttestation('https://alice.btc.calendar.opentimestamps.org')
-> append a2c9f0326b0be9e6487cd1900536578e
sha256
append 02d7847ff57d8fe5e395a385e397ab5d
sha256
prepend 5c710434
append dd30ce0eeac4b735
verify PendingAttestation('https://finney.calendar.eternitywall.com')
-> append cad697ad152fed15e4f8163cadd0cba0
sha256
prepend 5c710433
append b75043f74472ff38
verify PendingAttestation('https://bob.btc.calendar.opentimestamps.org')
`
Notem a linha: "File sha256 hash: a3f20adf0b6ac0478e62b6573b7d83e0edc58c10a7e27b2aa7d16fb289e8b6c9", esse é o hash sha256sum do arquivo e que é o que garantirá o seu teor.
4. Verificando o timestamp (essa é a prova de quando foi criada a time stamp do arquivo CV_CarlosEAHenriques.pdf):
ots --no-bitcoin verify CV_CarlosEAHenriques.pdf.ots
Caso você não disponha do daemon da carteira Bitcoin, a saída será parecida com isso:
`Assuming target filename is 'CV_CarlosEAHenriques.pdf'
Not checking Bitcoin attestation; Bitcoin disabled
To verify manually, check that Bitcoin block 564202 has merkleroot ea95fd6f3fd8547ca48ef54ab64ecb9840395c76751c88bd3425acec1297c40f
Not checking Bitcoin attestation; Bitcoin disabled
To verify manually, check that Bitcoin block 564202 has merkleroot ea95fd6f3fd8547ca48ef54ab64ecb9840395c76751c88bd3425acec1297c40f
Not checking Bitcoin attestation; Bitcoin disabled
To verify manually, check that Bitcoin block 564203 has merkleroot a2edddb28d8e50f4b8edfb8cbbeb9da45b6370b68e8deda6c137df10180bdf12
`
Nesse caso, para verificar a timestamp na Blockchain, você terá que faze-lo manualmente. Optei por um browser de modo texto para exemplo.
lynx -dump -nomargins https://www.blockchain.com/btc/block-height/564203 | fgrep "Merkle Root"
$ lynx -dump -nomargins https://www.blockchain.com/btc/block-height/564202 | fgrep "Merkle Root"
Caso você esteja rodando o daemon da carteira Bitcoin, fará da seguinte forma:
ots verify CV_CarlosEAHenriques.pdf
Assuming target filename is 'CV_CarlosEAHenriques.pdf'
Success! Bitcoin block 564202 attests existence as of 2019-02-22 -03
Enquanto não houver confirmação de transações, a saída será como abaixo ( atente que as confirmações podem levar até algumas horas):
ots verify CV_CarlosEAHenriques.pdf.ots
Assuming target filename is 'CV_CarlosEAHenriques.pdf'
Calendar https://bob.btc.calendar.opentimestamps.org: Timestamped by transaction b46906609e4cb03ed892b8dc0ff7f85e9ec330abbd44786ab4c0b0401cc7506b; waiting for 5 confirmations
Calendar https://alice.btc.calendar.opentimestamps.org: Timestamped by transaction d3ee224553b3845f40ceec5abe689de9523054823c0aaf97e44780cdb237b842; waiting for 5 confirmations
Calendar https://finney.calendar.eternitywall.com: Timestamped by transaction 32bb29c98da5a1a69e62d196c451a90ac640d211b814d76d2ac5db4d16a24a1e; waiting for 5 confirmations
Calendar https://btc.calendar.catallaxy.com: Timestamped by transaction 7d551376eae49108930d61843bb1c8abcedfa112045c8cf1056b9575135baa72; waiting for 5 confirmations
`
Só com isso, já dá para "sair do chão".
No portal do projeto há muito mais e todos os códigos fontes.
Bom trabalho a todos!