• Nenhum resultado encontrado

F 2 corpo finito com dois elementos

2.3 Notação e Nomenclatura

Figura 2.4: Exemplo de transação com uma saída TxnSai Sa´ıda Valor : 4 btc Script de Sa´ıda: Parˆametros: [T xn], ASk In´ıcio: retorne VrfAssinatura(P k, [T xn], ASk) = 1

Fonte: Elaborada pelo autor.

Commitque transfere a mesma quantidade de moedas que TA→Be pode ser reivindicada de duas maneiras:

1. Apresentando-se uma assinatura de Alice e o valor s que gera h. Ou seja, Alice coloca o valor h no script de saída de Commit. Isso serve para Alice se comprometer com s,

2. Apresentando-se uma assinatura de Alice e outra de Bob.

A ideia é que Alice reivindique Commit em até 1 mês utilizando o método 1. Dessa forma Bob receberá s e conseguirá reivindicar TA→B. Se Alice não o fizer, então Bob reivindicará

Commit através do método 2. Ele não estará apto a reivindicar TA→B mas receberá a mesma

quantidade de moedas.

Para que esse esquema funcione, Alice cria uma transação Fuse que referencia Commit, coloca sua assinatura nela e a envia para Bob. O campo locktime de Fuse deve ser superior a 1 mês. Através de Fuse Bob poderá reivindicar Commit. Note que Fuse não sofre com a maleabilidade porque referencia uma transação já presente na blockchain (Commit).

Com esse esquema, Bob consegue detectar intenções desonestas de Alice, caso Commit ou TA→B não sejam publicadas, Fuse não seja recebida ou qualquer uma dessas transações

estiverem incorretas. Mas, caso essas transações sejam criadas corretamente, Bob terá a garantia de receber suas moedas e Alice, a de que a transferência só ocorrerá no tempo acordado. 2.3 Notação e Nomenclatura

Ao longo deste trabalho, precisaremos lidar apenas com um subconjunto das funcionali- dades do Bitcoin. Mais especificamente, teremos que representar transações, com suas entradas, saídas e, quando necessário, seus campos locktime. Representaremos as transações como nas Figuras 2.4, 2.5 e 2.6.

Sempre incluiremos um nome na representação de uma transação para facilitar a refe- rência textual. Isso é equivalente a fazer referência a uma transação por meio de seu campo id.

Figura 2.5: Exemplo de transação com uma entrada TxnEnt

Entrada

Sa´ıda Referenciada: a ´unica sa´ıda de TxnSai Script de Entrada:

In´ıcio:

forne¸ca [TxnEnt], Assina(Sk, [TxnEnt]) para a sa´ıda referenciada.

Fonte: Elaborada pelo autor.

Uma parte que merece atenção especial na representação de uma transação é a imple- mentação dos scripts de suas entradas e saídas. Fizemos a opção por apresentar esses scripts na forma de um pseudo-código ao invés de utilizar uma linguagem semelhante à definida pelo Bitcoin. Pretendemos, com isso, tornar a apresentação mais legível e intuitiva, poupando o leitor da necessidade de interpretar programas escritos em uma linguagem baseada em pilha. Essa decisão aproxima nossa apresentação daquela contida em ANDRYCHOWICZ et al. (2014a).

Com o objetivo de mostrar como as saídas e seus scripts serão representados, ilustramos, na Figura 2.4, a transação TxnSai. Ela possui uma única saída que disponibiliza 4 bitcoins (btc) sob a condição de que seu script seja satisfeito. Na nossa representação isso significa que o script precisa retornar 1 ao fim de sua execução. De maneira geral, os scripts das saídas retornam o resultado de uma operação lógica calculada sobre seus parâmetros e sobre constantes introduzidas no código no momento da criação da transação.

Um parâmetro comumente presente nos scripts das saídas é a versão simplificada da transação que reivindica essa saída. Denotamos a versão simplificada de uma transação T xn por [T xn].

Como mencionamos anteriormente, um dos tipos mais comuns de transações é aquele em que a transferência de bitcoins é feita para o portador de uma determinada chave secreta13 Sk. Para que um usuário comprove ser tal portador, ele precisa criar uma transação T contendo uma assinatura digital AT gerada com Sk sobre[T ]. Por essa razão, é comum que nos scripts das saídas

se precise verificar a validade de uma assinatura. Para isso utilizamos a função VrfAssinatura. Adiantando a apresentação da Definição 3.27, definimos que a função VrfAssinatura recebe como entrada a chave pública Pk (correspondente à Sk), a mensagem original[T ] e uma possível assinatura AT e retorna 1 se a assinatura for válida e 0 caso contrário.

Juntando as peças até aqui, podemos entender que a transação TxnSai da Figura 2.4 transfere 4 btc para o portador da chave secreta correspondente à chave pública Pk. A origem desses bitcoins não é especificada porque omitimos a entrada (ou entradas) de TxnSai. Sempre que fizermos isso será para deixar claro que não impomos restrições sobre a origem dos bitcoins

2.3. NOTAÇÃO E NOMENCLATURA 36

Figura 2.6: Exemplo de transação com múltiplas entradas e saídas TxnMult locktime: 400 blocos. Sa´ıdas para todo i∈ {1, · · · , n} Saidai Valor : n btc Script de Sa´ıda: Parˆametros: [T xn], ASk0 i In´ıcio: retorne VrfAssinatura(P k0i, [T xn], ASk0 i) = 1 Entradas para todo i, j ∈ {1, · · · , n} Entradai,j

Sa´ıda Referenciada: a j-´esima sa´ıda de TxnAnte Script de Entrada:

In´ıcio:

forne¸ca Assina(Ski, [TxnMult])

Fonte: Elaborada pelo autor.

de uma transação.

Na Figura 2.5 representamos uma transação que reivindica TxnSai. Isso fica claro a partir da referência feita à saída de TxnSaina única entrada de TxnEnt. O script dessa entrada fornece os argumentos necessários e na ordem correta para satisfazer o script da saída de TxnSai. Um desses argumentos é uma assinatura da versão simplificada da própria TxnEntfeita com a chave secreta Sk. Para gerar essa assinatura, usamos a função Assina. Mais uma vez, adiantando a Definição 3.27, definimos que a função Assina(V, Sk) serve para gerar uma assinatura válida de V feita com Sk. Ou seja, se Pk é a chave pública correspondente a Sk, VrfAssinatura(V, Pk, Assina(V, Sk)) = 1.

De maneira semelhante ao que fizemos com as entradas de TxnSai, omitimos as saídas de TxnEnt. Com isso queremos deixar claro que não impomos restrições sobre como TxnEnt disponibiliza os bitcoins que reivindica.

Quando uma transação contiver várias entradas ou, de maneira semelhante, várias saídas, elas possuirão índices para facilitar a referência textual. A representação de uma transação com múltiplas entradas e saídas é ilustrada na Figura 2.6. Definimos nos títulos das entradas e das saídas quais valores os índices podem assumir.

A transação TxnMult da Figura 2.6 possui n2 entradas. A Entradai, j, para todo i, j∈

{1,··· ,n}, reivindica bitcoins da j-ésima saída de uma transação TxnAnte

i através do fornecimento

saídas. Cada Saidaidisponibiliza n bitcoins para o portador de uma chave secreta correspondente

à chave pública Pki0.

Como o campo locktime de TxnMult tem valor igual a 400, essa transação só pode ser publicada quando a blockchain contiver, pelo menos, 400 blocos. Quando esse campo for omitido, a transação pode ser prontamente publicada.

Por fim, ressaltamos que o objetivo da notação apresentada aqui não é ser completa, no sentido de abranger todas as possibilidades de transações do Bitcoin. Ela foi pensada para ser simples, mas expressiva o suficiente para representar as variações de transações apresentadas no decorrer deste trabalho.

38 3 DEFINIÇÕES

Neste capítulo definiremos conceitos importantes que serão utilizados ao longo deste trabalho. Nosso objetivo não é apresentar uma discussão profunda e exaustiva de cada um deles, mas apenas registrar o necessário para o entendimento de futuras referências. Por essa razão, não nos preocupamos em descrever realizações práticas nem em demonstrar formalmente certas propriedades.

As definições apresentadas neste capítulo foram adaptadas de GOLDREICH (2004), GOLDREICH (2001), KATZ e LINDELL (2014) e BENTOV e KUMARESAN (2014). Deixa- mos explícita a fonte de cada definição.

3.1 Funções Desprezíveis

Uma função é desprezível (negligible) se seu valor é limitado, em módulo, pelo inverso de um valor polinomialmente ligado à sua entrada. Esse tipo de função é extensamente utilizado para limitar superiormente outras funções, expressando o qual pequeno são seus valores. Definição 3.1 (Função desprezível). Uma função µ : N→ R é desprezível se, para todo inteiro positivo c> 1, existe um inteiro Nctal que, para todo x> Nc:

|µ(x)| <x1c

Dizemos que uma probabilidade é desprezível se a função que a calcula é limitada por uma função desprezível. O fato de uma probabilidade ser desprezível ressalta o quão raramente um determinado evento ocorre.