比特币网络节点发现

[TOC]

0x0 概述

比特币节点发现,指节点寻找其他节点的地址(IP和PORT)的方法。主要有以下几种:

  • 节点发现本节点的外部IP
  • 节点接收远程连接节点的回调地址
  • 节点使用DNS服务发现地址
  • 节点使用软件本身硬编码的地址列表
  • 节点与其他节点交换地址列表
  • 节点把地址列表存储到数据库,在启动时从数据库中读取
  • 节点在启动时从配置文件中读取地址列表

为每个地址保留时间戳,以跟踪节点地址上次被查看的时间。当从节点收到消息(message)时,该时间戳被更新。时间戳仅在地址上更新,并且在时间戳超过20分钟时保存到数据库。

0x1 getaddr消息

当一个节点收到一个“getaddr”请求时,它首先计算出它在最近3个小时内有多少个地址有时间戳。如果地址数量超过2500个,它随机选择2500个最新的地址。

0x01 发现方法

本地节点的外网地址

本地节点发现自己的外网地址需要使用到公共服务。比特币网络(中本聪版本)中的过程如下:

  • 节点尝试连接91.198.22.70:80 #checkip.dyndns.org
  • 若上述操作失败,尝试连接74.208.43.192:80
  • 如果连接成功,则发送HTTP请求,解决http response数据,获取IP地址。该地址作为该节点的外部地址广播给周边的其他节点

IRC地址

不再支持

DNS地址

节点在启动时,发布dns解析请求,请求种子节点的地址。截至到2017年,种子节点的域名列表如下:

  • seed.bitcoin.sipa.be
  • dnsseed.bluematt.me
  • dnsseed.bitcoin.dashjr.org
  • seed.bitcoinstats.com
  • seed.bitcoin.jonasschnelli.ch
  • seed.btc.petertodd.org

硬编码种子地址

这些地址仅用作最后的手段。

地址广播(addr消息)

节点在发送“getaddr”请求之后可以在“addr”消息中接收地址,或者“addr”消息可能未经请求而到达,因为节点在中继地址时会无条件地通告地址(见下文) 或建立连接时。

如果地址来自真正的旧版本,则会被忽略; 如果来自不太旧的版本,如果我们已经有1000个地址,它将被忽略。

如果发件人发送超过1000个地址,则全部被忽略。

从“addr”消息收到的地址有一个时间戳,但时间戳不一定是可信的。

对于消息中的每个地址:

如果时间戳太低或太高,则设置为5天前。

我们从时间戳中减去2小时并添加地址。

如果地址在过去24小时内出现过,而时间戳现在已超过60分钟,那么它会更新到60分钟前。

如果在过去24小时内没有看到地址,并且时间戳目前已超过24小时,则会更新到24小时前。

地址中继

一旦地址从“addr”消息中被添加(见上文),则它们可以被中继到其他节点。 首先,必须设定以下标准[9]:

  • 处理后的地址时间戳在当前时间的60分钟内
  • “addr”消息包含10个地址或更少
  • 并且fGetAddr未在节点上设置。 当我们从节点请求地址时,fGetAddr开始为false,设置为true,当我们从一个节点接收少于1000个地址时,它被清除。
  • 地址必须可路由

对于符合上述条件的每个地址,节点都会对地址,当天(以整数形式)和随机256位值(在客户端启动时生成)进行hash。 该节点获取散列值最低的两个地址,并向它们中继“addr”消息。 这确保了每个节点只在任何给定时间将“addr”消息中继给另外两个客户端,另外两个客户端是随机选择的,并且随机选择至少每24小时开始一次。

自广播

每24小时,节点将自己的地址通告给所有连接的节点。

它还会清除我们认为远程节点具有的地址列表,这将触发发送到节点的刷新。

地址入库

地址入库操作大概每0.1秒调用执行一次。

文本文件提供的地址

客户端将自动读取比特币数据目录中名为“addr.txt”的文件,并将其中找到的任何地址添加为节点地址。 这些节点没有特别优先于其他地址。 他们只是添加到地址池中。

从文本文件加载的地址最初被赋予零时间戳,因此它们不会响应“getaddr”请求而被公布。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 一、快速术语检索 比特币地址:(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串...
    不如假如阅读 15,901评论 4 88
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,639评论 18 139
  • 腰椎间盘突出症是较为常见的疾患之一,主要是因为腰椎间盘各部分(髓核纤维环及软骨板),尤其是髓核,有不同程度的退行性...
    红火太阳阅读 216评论 0 0
  • 好久没有在这样夜里,静静的听歌了。不是不想,是因为太忙。忙于繁杂的工作,忙于带娃的琐碎,忙于对于家庭的责任。 ...
    阿里Alex阅读 454评论 0 3