<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ubunto Archives - Global Financeiro</title>
	<atom:link href="https://globalfinanceiro.com.br/tag/ubunto/feed/" rel="self" type="application/rss+xml" />
	<link>https://globalfinanceiro.com.br/tag/ubunto/</link>
	<description>Plataforma de Gestão Financeira</description>
	<lastBuildDate>Fri, 04 Oct 2024 15:40:54 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>

<image>
	<url>https://globalfinanceiro.com.br/wp-content/uploads/2024/02/cropped-icon-GF-2024-32x32.png</url>
	<title>ubunto Archives - Global Financeiro</title>
	<link>https://globalfinanceiro.com.br/tag/ubunto/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Como funciona a Blockchain?</title>
		<link>https://globalfinanceiro.com.br/blockchain/</link>
		
		<dc:creator><![CDATA[Guto Modesto]]></dc:creator>
		<pubDate>Tue, 11 Sep 2018 11:09:34 +0000</pubDate>
				<category><![CDATA[Gestão do Negócio]]></category>
		<category><![CDATA[Blockchain]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[transação]]></category>
		<category><![CDATA[ubunto]]></category>
		<guid isPermaLink="false">https://globalfinanceiro.com.br/?p=1665</guid>

					<description><![CDATA[<p>Aprenda os conceitos básicos sobre os funcionamentos da Blockchain, blocos, transações e geração de hash.</p>
<p>The post <a href="https://globalfinanceiro.com.br/blockchain/">Como funciona a Blockchain?</a> appeared first on <a href="https://globalfinanceiro.com.br">Global Financeiro</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading"><strong>Quer aprender os conceitos básicos sobre o funcionamento da Blockchain, blocos, transações e geração de hash? Continue lendo!</strong></h3>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Blockchain é um tema bastante difundido na comunidade e apesar de ser algo revolucionário, no que diz respeito à recursos utilizados, basicamente são tecnologias que já existem há tempos, como sistemas distribuídos, comunicação P2P e criptografia. Quando olha-se pra ela com mais calma, a sensação que fica é de “por que não fizemos isso antes?”. Neste post,  iremos desmistificar alguns desses conceitos.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<h4 class="wp-block-heading"><strong>Do que é feita a blockchain?</strong></h4>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>O próprio nome já uma uma definição do que se trata: uma cadeia de blocos onde todos os blocos estão interligados:</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Os blocos geralmente são constituídos por: suas transações; um hash; e o hash do bloco anterior.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>As transações são basicamente informações contidas neste bloco, indo de, informações em textos, snippets de código, no caso dos smart contracts da Ethereum ou até qualquer outra coisa que sua blockchain queira armazenar.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Os blocos têm um tamanho máximo permitido e isso é definido no momento de criação da rede, então, é importante que as transações caibam dentro desse bloco.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Já o hash é uma assinatura única para cada bloco que é gerada através de algum algoritmo de criptografia. Geralmente ela é formada através da combinação entre o hash de cada transação e o hash do bloco anterior.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Mas como chego nesse hash?</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>No site do Ubuntu temos um bom exemplo. Nele encontramos as ISOs para download (<a href="http://releases.ubuntu.com/18.04/" target="_blank" rel="noreferrer noopener">http://releases.ubuntu.com/18.04/</a>).</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>O que acontece quando eu tento gravar essa imagem em um pendrive ocorre um erro? Será que minha ISO está corrompida ou é minha unidade USB que está com problema? Terei que baixar quase 2BG novamente?</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Um jeito rápido de descobrir é testando o Checksum do meu arquivo usando o algoritmo MD5,  como no seguinte exemplo:<br />Este comando irá ler byte a byte do arquivo e gerar uma assinatura usando o algoritmo MD5, de tal forma que, se um único detalhe for alterado, a assinatura de saída será algo completamente diferente.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Feito isso, basta eu comparar a assinatura gerada com a assinatura disponível no site do Ubuntu:<br />Neste caso, eu consigo garantir que minha ISO é exatamente igual à disponível para download.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Para entender melhor tudo isso, vamos construir nossa própria blockchain.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>





<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<h4 class="wp-block-heading"><strong>Construindo a Blockchain</strong></h4>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Primeiramente, vamos definir nossa transação. Para isso, criamos uma classe chamada <strong>Transaction</strong> que terá um conteúdo no formato texto, ou seja, uma String.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Também iremos sobrescrever o método <strong>hashCode</strong>, para que ele retorne o valor hash da String “content”:</p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow">
<p><em><strong>public class Transaction {      private final String content;      @Override   public int hashCode() {       return content.hashCode();   }}</strong></em></p>
</blockquote>



<p>Agora vamos definir nosso bloco. Ele deverá ter uma lista de transações, um valor de <em>hash</em> e o valor do <em>hash</em> do bloco anterior.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Para simplificar um pouco as coisas, vamos usar o próprio <em>hash</em> que o Java nos fornece, que é um valor int. Também iremos marcar atributos como final, para tornar nossa <em>blockchain</em> imutável, ficando assim:</p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow">
<p><em><strong>public class Block {   private final List&lt;Transaction&gt; transactions;   private final int hash;   private final int previousBlockHash;}</strong></em></p>
</blockquote>



<p>Para criar um bloco, então, devemos informar a lista de transações e o bloco anterior, do qual utilizaremos seu hash, desta forma, o construtor terá esses parâmetros.</p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow">
<p><em><strong>public Block(List&lt;Transaction&gt; transactions, Block previousBlock) {   this.transactions = new ArrayList&lt;&gt;(transactions);   this.previousBlockHash = previousBlock.hash;   this.hash = Arrays.hashCode(new Object[] { transactions, this.previousBlockHash });} </strong></em></p>
</blockquote>



<p>Aqui, vale uma observação. O primeiro bloco de uma blockchain, chamado de <em>Genesis Block</em>, não possui valor do hash bloco anterior, já que esse bloco não existe. Então, ele deve ser <em>hard coded</em>, com informações das primeiras transações.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Vamos criar um construtor privado e um método estático que retorna nosso <em>Genesis Block</em> e seu valor de <em>hash</em> será criado com base somente no <em>hash</em> das transações:</p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow">
<p><em><strong>private Block(List&lt;Transaction&gt; transactions) {   this.transactions = new ArrayList&lt;&gt;(transactions);   this.previousBlockHash = 0;   this.hash = transactions.hashCode();}  public static Block createGensisBlock(List&lt;Transaction&gt; transactions) {   return new Block(transactions);}</strong></em></p>
</blockquote>



<p>Um detalhe apenas para o getter de transações, nele retornaremos uma nova lista, para garantir que a nossa continue imutável:</p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow">
<p><em><strong>public List&lt;Transaction&gt; getTransactions() {   return new ArrayList&lt;&gt;(transactions) ;}</strong></em></p>
</blockquote>



<p>Agora para ver como funciona nossa blockchain. Vamos criar uma classe de teste:</p>





<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow">
<p><em><strong>public class BlockChainTest {    @Test   public void blockChainTest() {       Transaction firstTransaction = new Transaction(&#8220;My first transaction ever!&#8221;);       Block genesisBlock = Block.createGensisBlock(Arrays.asList(firstTransaction));        System.out.println(&#8220;Genesis block hash: &#8221; + genesisBlock.getHash());   }}</strong></em></p>
</blockquote>



<p>Ao executar esse teste, a saída no console que obtivemos será Genesis block hash: <strong>-209303716</strong>.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Então vamos criar um assert esperando esse valor:</p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow">
<p><em><strong>Assert.assertEquals(genesisBlock.getHash(), -209303716);</strong></em></p>
</blockquote>



<p>Vamos fazer uma pequena alteração, removendo o ponto de exclamação de nossa transação e re-executar o teste.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Observe que apenas um caractere fez com que o valor do hash mudasse completamente:</p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow">
<p><em><strong> java.lang.AssertionError: Expected :-1253677693Actual      :-209303716</strong></em></p>
</blockquote>



<p> Retornando o ponto de exclamação na nossa transação, vamos criar nosso segundo bloco e já lhe adianto que o hash gerado será 1258751948:</p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow">
<p><em><strong>Transaction secondTransaction = new Transaction(&#8220;129292a182136a35e1f89c586dbac2e2&#8221;);Block secondBlock = new Block(Arrays.asList(secondTransaction), genesisBlock);Assert.assertEquals(secondBlock.getHash(), 1228451966);</strong></em></p>
</blockquote>



<p>Aqui, nossa blockchain já assume o comportamento padrão: cada bloco terá suas transações e o valor do hash do bloco anterior, que é interceptado dentro do nosso construtor.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Nossa transação contém o número do hash checksum MD5 da ISO do Ubuntu 18.04, aquela mesma que usei como exemplo a pouco.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Sem mais delongas, vamos criar nosso terceiro bloco.</p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow">
<p><em><strong>Block thirdBlock = new Block(Arrays.asList(    new Transaction(&#8220;</strong><a href="http://releases.ubuntu.com/18.04/ubuntu-18.04-desktop-amd64.iso"><strong>http://releases.ubuntu.com/18.04/ubuntu-18.04-desktop-amd64.iso</strong></a><strong>&#8220;),    new Transaction(&#8220;</strong><a href="http://releases.ubuntu.com/18.04/ubuntu-18.04-desktop-amd64.iso.torrent"><strong>http://releases.ubuntu.com/18.04/ubuntu-18.04-desktop-amd64.iso.torrent</strong></a><strong>&#8220;)), secondBlock); Assert.assertEquals(thirdBlock.getHash(), -1716700900);</strong></em></p>
</blockquote>



<p>Observe que criamos um bloco com duas transações, o que é totalmente permitido.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Lembre-se: um bloco pode ter quantas transações você quiser, desde que seja respeitado o limite máximo de cada bloco.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Nessas duas transações, foram incluídas URLs para download da ISO do Ubuntu. Como o hash é gerado com base no hash do bloco anterior, uma alteração nos primeiros blocos quebraria todos os testes subsequentes.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Você pode conferir o código completo aqui: <a href="https://github.com/alancesar/blockchain">https://github.com/alancesar/blockchain</a></p>



<h2 class="wp-block-heading"><strong>Conclusão</strong></h2>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Temos um exemplo real de uma blockchain rodando em uma instância, porém, ela tem o poder de ser descentralizada, isto é, ele não existe em apenas em um lugar, ou seja, nosso código pode rodar em dezenas ou até centenas de máquinas.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Sempre que um bloco surge com novas transações, esse bloco é replicado por toda a rede e cada nó da blockchain passa a ter as mesmas informações.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Se supostamente, alguma pessoa má intencionada alterasse as URLs e o checksum de nossa ISO por de uma outra imagem não confiável, isso alteraria o valor do hash de toda a cadeia subsequente. Porém, para seu plano audacioso funcionar, ele teria que fazer essa alteração em pelos menos 51% de nossas instâncias.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>É assim que a blockchain consegue ser tão confiável. Diferente de um bando de dados centralizados, onde as informações estão armazenadas em um só lugar, a rede blockchain é distribuídas entre diversos servidores.</p>



<div class="wp-block-spacer" style="height: 20px;" aria-hidden="true"> </div>



<p>Uma rede blockchain pode ser privada, onde somente determinados servidores têm acesso, ou pública, onde cada um pode baixar para si uma cópia, como é o caso do Bitcoin, porém, o princípio da descentralização sempre existirá.</p>
<p>The post <a href="https://globalfinanceiro.com.br/blockchain/">Como funciona a Blockchain?</a> appeared first on <a href="https://globalfinanceiro.com.br">Global Financeiro</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
