O Bitcoin e seu funcionamento

O Bitcoin é a primeira forma de dinheiro digital descentralizado a ganhar popularidade. Devido ao seu design inivador, 10 anos após a sua criação continua a ser a criptomoeda de maior expresão no mercado respondendo por cerca de 50% de todo o volume de transações do mercado de criptomoedas.


In [1]:
from bitcoin import *

Interagindo com a tecnologia da Bitcoin

Neste notebook vamos utilizar algumas ferramentas já disponíveis na linguagem Python para explorar o funcionamento da Bitcoin. Certifique-se de estar usando pelo menos a versão 3.5 do Python antes de começar. Os pacotes Python necessários estão listados no arquivo requirements.txt na raiz deste repositório. Para instalá-los basta executar o seguinte comando:

pip3 install -r requirements.txt

Entendendo os endereços

vamos começar criando uma chave privada. Na bitcoin, a chave privada é apenas um número inteiro de 256 bits. Logo utilizaremos uma função Hash para gerar este número a partir de uma frase-senha. Mais adiante vamos explorar melhor as funções Hash, por ora basta saber que esta função mapeia qualquer input para um números de 256 bits. Logo, o tamanho do conjunto imagem é $2^{255}$.


In [2]:
priv = sha256('some big long brainwallet password')
priv


Out[2]:
'57c617d9b4e1f7af6ec97ca2ff57e94a28279a7eedd4d12a99fa11170e94f5a4'

A chave pública pode ser calculada a partir da chave privada, mas o contrário não é verdadeiro.


In [3]:
pub = privtopub(priv)
pub


Out[3]:
'0420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9'

Vamos tentar entender como a chave pública é gerada a partir da chave privada.


In [4]:
privtopub??


Signature: privtopub(privkey)
Docstring: <no docstring>
Source:   
def privkey_to_pubkey(privkey):
    f = get_privkey_format(privkey)
    privkey = decode_privkey(privkey, f)
    if privkey >= N:
        raise Exception("Invalid privkey")
    if f in ['bin', 'bin_compressed', 'hex', 'hex_compressed', 'decimal']:
        return encode_pubkey(fast_multiply(G, privkey), f)
    else:
        return encode_pubkey(fast_multiply(G, privkey), f.replace('wif', 'hex'))
File:      /usr/local/lib/python3.6/dist-packages/bitcoin/main.py
Type:      function

cada par de chaves pública e privada correspondem a um endereço na blockchain da Bitcoin: Também chamado de uma carteira. O endereço é basicamente uma "abreviação" da chave pública, por meio da aplicação de uma segunda hash function, a RIPEMD-160 sobre a chave pública. Isto é feito para que o endereço seja mais "curto".


In [5]:
end = pubtoaddr(pub)
end


Out[5]:
'1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6'

vamos verificar o histórico de transações desta carteira


In [6]:
h = history(end)
h


Out[6]:
[{'address': '1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6',
  'value': 500000,
  'output': 'b0aad2e5184099b20d53100a678e9bec2eab1b0710fb06930f333387492a82b3:0',
  'block_height': 363957,
  'spend': '05551814576ba084a0736abd8df411061c5ea7e4ae72d334317f5504f6b331d6:0'},
 {'address': '1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6',
  'value': 50000,
  'output': '97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e:0',
  'block_height': 262537,
  'spend': '772bebdf445d719d90d52a3029d27e90aa8f26eca8d431fc77cc487c377a89c4:0'},
 {'address': '1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6',
  'value': 50000,
  'output': '4cc806bb04f730c445c60b3e0f4f44b54769a1c196ca37d8d4002135e4abd171:1',
  'block_height': 262537,
  'spend': '772bebdf445d719d90d52a3029d27e90aa8f26eca8d431fc77cc487c377a89c4:1'}]

In [6]:
history??

In [ ]: