• Nenhum resultado encontrado

Descoberta da Rede

No documento Dominando Bitcoin (páginas 154-159)

Quando um novo nodo é ligado, ele deve descobrir outros nodos bitoins na rede para que possa participar. Para iniciar esse processo, um nodo novo deve descobrir pelo menos um nodo existente na rede para conectar-se a ele. A localização geográfica dos outros nodos é irrelevante; a topologia da rede bitcoin não é definida geograficamente. Logo, qualquer nodo bitcoin existente pode ser selecionado aleatoriamente.

Para se conectar a um ponto conhecido, os nodos estabelecem uma conexão TCP, geralmente na porta 8333 (a porta geralmente conhecida como uma das usadas pelo bitcoin), ou a uma porta alternativa caso tenha sido fornecida. Ao estabelecer a conexão, o nodo iniciará um "aperto de mão" (ver O aperto de mãos inicial entre os pontos) ao transmitir uma mensagem de versão, que contém basicamente informações de identificação, incluindo:

PROTOCOL_VERSION

Uma constante que define a versão do protocolo P2P do bitcoin através da qual o cliente se "comunica" (ex: 70002)

nLocalServices

Uma lista dos serviços locais suportados pelo nodo, atualmente apenas NODE_NETWORK

nTime

A hora atual

addrYou

O endereço IP do nodo remoto da maneira que é visto por esse nodo

addrMe

O endereço IP do nodo local, da maneira que é descoberto pelo nodo local

subver

Uma sub-versão mostrando o tipo de software sendo executado nesse nodo (ex: "/Satoshi:0.9.2.1/")+

BestHeight

A altura dos blocos da blockchain deste nodo

(Veja GitHub para um exemplo da mensagem de rede version.)

O nodo ponto responde com verack para reconhecer e estabelecer uma conexão, e opcionalmente envia sua própria mensagem versão caso ele desejar estabelecer uma conexão recíproca e se conectar como um ponto.

"sementes (seeds) de DNS," que são servidores DNS que fornecem uma lista de endereços IP dos nodos bitcoin. Algumas dessas sementes DNS fornecem uma lista estática de endereços IPs de nodos bitcoin de escuta. Algumas dessas sementes DNS são implementações customizadas de BIND (Berkeley Internet Name Daemon) que retornam um conjunto aleatório a partir de uma lista de endereços de nodo bitcoin coletada por um crawler ou um nodo bitcoin de longa-execução. O cliente Bitcoin Core contém os nomes de cinco sementes DNS diferentes. A diversidade de donos e a diversidade de implementação das diferentes sementes DNS oferece um alto nível de confiabilidade para o processo de bootstrapping inicial. No cliente Bitcoin Core, a opção para usar as sementes DNS é controlada pela opção switch -dnsseed (definida como 1 por padrão, para usar a semente DNS).

De maneira alternativa, um nodo bootstrapping que não saiba nada da rede deve receber o endereço IP de pelo menos um nodo bitcoin, a partir do qual ele poderá estabelecer conexões através de novas introduções. O argumento de linha de comando -seednode pode ser usado para conectar a um nodo somente para introduções, utilizando-o como uma semente (seed). Após o nodo semente inicial ser usado para formar as introduções, o cliente irá se desconectar dele e usará os novos pontos recém- descobertos.

Figure 4. O aperto de mãos inicial entre os pontos

Assim que uma ou mais conexões são estabelecidas, o novo nodo irá enviar uma mensagem addr contendo seu próprio endereço IP para seus vizinhos. Seus vizinhos irão, por sua vez, retransmitir a mensagem addr para seus vizinhos, garantindo que os novos nodos conectados se tornem bem conhecidos e melhor conectados. Adicionalmente, o novo nodo conectado pode enviar getaddr para os vizinhos, solictando-os que retornem uma lista de endereços IP de seus pontos. Dessa maneira, um nodo pode encontrar pontos para conectar-se e divulgar sua existência na rede para que outros nodos o encontrem. Propagação e descoberta do endereço demonstra o protocolo de descoberta de endereço.

Figure 5. Propagação e descoberta do endereço

Um nodo precisa conectar-se a alguns poucos peers diferentes para estabelecer vários caminhos na rede bitcoin. Os caminhos não são confiáveis—os nodos ficam online e offline—e então o nodo precisa continuar a descobrir novos nodos à medida que ele perde conexões antigas, assim como auxilia outros nodos quando eles fazem bootstrap. Somente uma conexão é necessária para fazer bootstrap, porque o primeiro nodo pode oferecer apresentações para seus nodos pontos e esses pontos podem oferecer novas apresentações subsequentes. Conectar-se a mais de alguns nodos também é desnecessária e desperdiça recursos da rede. Após fazer bootstrap, um nodo irá se lembrar de suas conexões de sucesso mais recentes com pontos, de maneira que se reiniciado ele poderá rapidamente reestabelecer conexões com sua rede de pontos prévia. Se nenhum dos antigos pontos responder à sua solicitação de conexão, o nodo pode usar os nodos sementes para fazer bootstrap novamente.

Em um nodo executando o cliente Bitcoin Core, você pode listar as conexões com os peers através do comando getpeerinfo: $ bitcoin-cli getpeerinfo [   {   "addr" : "85.213.199.39:8333",   "services" : "00000001",   "lastsend" : 1405634126,   "lastrecv" : 1405634127,   "bytessent" : 23487651,   "bytesrecv" : 138679099,   "conntime" : 1405021768,   "pingtime" : 0.00000000,   "version" : 70002,   "subver" : "/Satoshi:0.9.2.1/",   "inbound" : false,   "startingheight" : 310131,   "banscore" : 0,   "syncnode" : true   },   {   "addr" : "58.23.244.20:8333",   "services" : "00000001",   "lastsend" : 1405634127,   "lastrecv" : 1405634124,   "bytessent" : 4460918,   "bytesrecv" : 8903575,   "conntime" : 1405559628,   "pingtime" : 0.00000000,   "version" : 70001,   "subver" : "/Satoshi:0.8.6/",   "inbound" : false,   "startingheight" : 311074,   "banscore" : 0,   "syncnode" : false   } ]

Para desativar a administração automática dos pontos e especificar uma lista de endereços IP, os usuários podem usar a opção -connect=<EndereçoIP> e especificar um ou mais endereços IP. Se essa opção for utilizada, o nodo irá conectar-se somente aos endereços IP selecionados, ao invés de automaticamente descobrir e manter conexões com pontos.

Se não houver tráfico em uma conexão, os nodos irão periodicamente enviar uma mensagem para manter a conexão. Se um nodo não se comunicar em uma conexão por mais de 90 minutos, assume-se que ele esteja desconectado e um novo ponto será procurado. Logo, a rede dinamicamente ajusta-se aos nodos transitórios e aos problemas da rede, e pode crescer e diminuir organicamente conforme necessário, sem a necessidade de um controle central.

No documento Dominando Bitcoin (páginas 154-159)