O Bitcoin usa UDP?

Eu estava estudando protocolos e comecei a ler sobre o UDP(User Datagram Protocol) e gostaria de saber se esse é o protocolo utilizado pela rede do bitcoin tendo em vista que ele permite enviar mensagens sem destinatário num Broadcasting e acredito que isso seria benéfico para a propagação de informação numa rede peer to peer.

Acredito que é utilizado somente TCP.

UDP pode sim ser utilizado para multicast, mas geralmente isto é feito dentro de redes locais em topologias bem definidas. O multicast evita que seja necessário mandar um pacote para cada destinatário, mas todos os nós precisam estar dentro do mesmo domínio de broadcast (em linhas gerais, dentro de uma rede local). Portanto eu desconheço uma forma de usar isto em uma topologia descentralizada como uma rede p2p. (mas posso estar enganado)
Também é possível enviar pacotes UDP para o endereço broadcast como você disse, mas o mesmo problema persiste: os hosts precisam estar no mesmo domínio de broadcast.

Outro problema é que no UDP não há controle de pacotes perdidos. UDP é mais útil conexões em que pacotes perdidos não atrapalhem a comunicação e não precisem ser reenviados posteriormente.

Ok, mas se não é por UDP como um full node pode se conectar aos demais sem receber uma lista de ips do participantes da rede? Pois se toda a conexão fosse estabelecida de ponto a ponto o full node quando fosse se conectar precisaria saber o ip de pelo menos um outro full node.

Exatamente. Por isto existem os seed nodes, e estão fixos dentro do código do bitcoin.
Através deles um node consegue ver a lista de outros nós e “adentrar” a rede.

https://bitcoin.org/en/glossary/dns-seed

1 curtida

Ow, você sabe porque o tcp não pode ser deturpado enquanto o udp pode? Existe algum checksum ou algo assim no tcp?

Ambos tem um campo de checksum no cabeçalho. A diferença é que o UDP não tem controle de transmissão, portanto se um pacote UDP chega em seu destino com um checksum incorreto, ele simplesmente é descartado e a origem nunca fica sabendo que aquele pacote precisaria ser reenviado.

No TCP o reenvio de pacotes com checksum incorreto ou pacotes que nunca chegaram é tratado pelo próprio protocolo.

Só como curiosidade estão surgindo algumas criptomoedas que estão utilizando o UDP, para mim a principal vantagem é o ‘peso’, no caso da Nano por exemplo, é utilizado o tamanho mínimo de um pacote UDP para garantir velocidade e leveza, o ponto negativo disso, no caso da Nano, é abrir mão do timestamp para tornar o bloco mais leve.

Não conheço muito da nano, mas encontrei esse post aqui falando sobre os timestamps:

Não me parece que adicionar um timestamp aumentaria muito o tamanho do pacote. Em geral um unix timestamp é um time_t de 4 bytes (ou 8 bytes).

Pela própria arquitetura da nano me parece que não faria sentido enviar um timestamp já que a origem poderia falsificar o valor e a rede não teria como confirmar a informação, e o efeito colateral é de certa forma desejado como medida de privacidade.

Sabe se tem alguma discussão oficial sobre este tópico? Achei interessante.

Discussão oficial não tenho não, talvez deve ter algo falando sobre isso no whitepaper. Tem um artigo (https://medium.com/@chunming.vite/snapshot-chain-an-improvement-on-block-lattice-561aaabd1a2b) muito bom que o autor propõe a criação de uma nova cadeia de blocos (um snapshot) o qual daria através de consenso (dPoS) para armazenar timestamps.

1 curtida

Eu procurei no whitepaper mas não encontrei nada sobre timestamps, somente algumas menções sobre o uso de UDP.
Vou dar uma olhada no artigo. Valeu @bruno.