FROM :https://docs.blockstack.org/core/atlas/howitworks.html
Atlas旨在克服所有分布式哈希表固有的结构弱点。特别是,它使用一个非结构化的对等网络来最大限度地提高对网络链接故障的恢复能力,并使用底层的区块链(通过BNS)来限制块通知的速率。
本节包括以下各节:
节点的选择
和DHTs相比
--- 块审查
--- 邻居审查
块传播
库存查询块
节点选择
Atlas对等点自组织成一个非结构化的对等网络。Atlas对等网络是一个随机的k -正则图。每个节点维护从Atlas对等点集合中随机选择的K个邻居。
Atlas节点通过执行对等图的无偏随机游走来选择对等点。当“访问”一个节点N时,它会询问N的邻居,然后“步进”其中一个,其概率依赖于N的出度和邻居的入度。
该采样算法是基于MH (metropolitan - hastings, MH)随机图行走算法,但有几个关键的区别。特别是,该算法试图计算一个无偏的对等图样本,该样本解释了这样一个事实:大多数节点将是短期的或不可靠的,而少数持久节点将长期在线。采样算法的调整如下:
-
如果所访问节点N的邻居都无响应,则随机游走将重置为随机选择的已知邻居。在本例中,对等图上没有回溯。
-
从N到活动邻居的转移概率不像MH算法那样是最小(1,次(邻居)/次(N))。相反,转移概率不鼓励回溯到前一个邻居N_prev,但在某种程度上仍然保证采样将保持无偏。
-
在查询时,对等点不会报告它的整个邻居集,但只报告满足最小健康阈值的对等点的随机子集。
-
只有当一个新邻居属于相同的BNS叉集时,才会选择它(也就是说,它报告有一个最近有效的共识散列)。
该算法改编自Lee、Xu和Eun在2012年ACM SIGMETRICS会议上的研究成果。
和DHTs比较
Atlas使用非结构化随机对等网络而不是分布式哈希表(DHT)的原因是DHT易受Sybil攻击。自适应对手可以将恶意节点插入到DHT中,以阻止受害者解析块或找到诚实的邻居。
块审查
在DHT中,攻击者可以通过将节点插入对等节点的路由表来检查块,从而控制块的所有哈希桶。它可以在第一次存储块之后的任何时间点这样做,因为只有维护块的哈希桶的对等方必须存储它。这是基于内容散列执行请求路由的结构化覆盖网络的一个基本问题——它们让攻击者了解查询通过对等图的路径,从而减少攻击者为了审查块而必须中断的路径数量。
Atlas使用了一个非结构化的覆盖网络,并结合了100%块复制策略,以便最大限度地增加对手审查块的工作量。在Atlas中,所有的对等点都复制一个块,块通过网络的路径独立于内容,并由软件随机化(因此不能预先预测路径)。攻击者唯一的方法是快速识别可以服务于块的节点,并将它们与网络的其他部分进行分区,以便进行审查攻击。这要求它们能够看到Atlas网络中的绝大多数网络链接(这是非常困难的,因为实际上Atlas对等点维护最多65536个邻居的知识,并且在被要求时只报告10个随机对等点)。
邻居审查
DHTs的另一个问题是它们的覆盖网络结构是由优先附件决定的。并不是每个与给定DHT节点接触的对等节点都有相同的机会成为它的邻居。相反,节点将对一组对等节点进行排序,认为它们或多或少是邻居的理想选择。在DHTs中,一个节点对另一个节点的偏好程度通常是节点的自定义节点标识符的函数(例如,一个节点可能希望根据键空间中的邻近程度选择邻居)。
优先附件属性意味着自适应对手可以通过插入不转发路由或查找请求的恶意节点来玩弄节点的邻居选择算法。攻击者甚至不必隐藏受害者节点—受害者节点只会更愿意与攻击者的无用节点通信,而不是与有用的诚实节点通信。通过这样做,攻击者可以防止诚实的对等方发现彼此和彼此的块。
Atlas的邻居选择策略不显示基于任何自报告节点属性的优先附件。只有通过无偏随机图遍历到达节点并正确响应查询时,才会选择该节点作为邻居。在这样做时,攻击者被迫完全隐藏一组节点,以便将它们与网络的其余部分断开。
块传播
Atlas节点维护已知存在的块的清单。每个节点独立地从其BNS数据库计算块库存。由于BNS中的名称操作历史是线性化的,因此每个节点都可以构造一个线性化的名称操作子历史,该子历史可以将块哈希设置为它们的名称状态。这给了它们一个线性化的块序列,每个Atlas对等点将通过读取相同的区块链独立地到达相同的序列。
Atlas对等点跟踪哪些块存在,哪些块不存在。它们各自构造一个由块V组成的库存向量,如果节点的块的散列位于块序列的第i个位置,则将V[i]设置为1(如果没有散列,则设置为0)。
Atlas对等点与其邻居交换它们的库存向量,以便找出它们各自拥有的块。Atlas节点按稀有-优先顺序从邻居下载数据块,以便为当前最有可能由于节点故障而消失的数据块确定数据复制的优先级。
Screen Shot 2019-08-06 at 6.21.51 PM.png图2:Atlas节点块目录和BNS名称状态之间的关系。
一些名称操作在区块链中声明名称状态,即地图集
解释为块哈希。Atlas节点构建一个包含多个块的向量
它有哪些没有,并向其他地图集同行公布
它们可以获取丢失的块。在本例中,节点的
库存向量是[1,0,1],因为存在第0和第2块
但是第一块不见了。
库存查询块
开发人员可以查询节点的库存向量如下:
import blockstack
result = blockstack.lib.client.get_zonefile_inventory("https://node.blockstack.org:6263", 0, 524288)
print len(result['inv'])
11278
这里的变量result['inv']是一个大端位向量,如果块序列中有第i个块,则第i个位被设置为1。i=0处的位(最早的块)是指最左边的位。
一个示例程序,它检查一组Atlas节点的库存向量,并确定哪些缺失了哪些块可以在这里找到。
网友评论