简介/致密区块
当全节点之间已共享许多相同内存池(mempool)内容时,使用简单的技术,就可能减少将新区块广播至全节点所需的带宽数量。发送方节点向接收方节点发出致密区块“概要内容”,这些概要内容包含以下这些信息:
新区块的80字节区块头;
缩短交易标识符(txids),其目的是为防止拒绝式服务攻击;
一些发送节点预测的,但接受对等节点不具备的完整交易;
接收方节点将尝试使用接收到的信息,以及在其内存池(memory pool)当中的交易,来重新构建整个区块。如果它仍然缺失某些交易,它将请求广播节点。
优点/致密区块
这种方法的优点,是交易数据仅需在最佳的情况下进行发送(当它们在初始广播当中),其大幅度地降低了总带宽。
此外,致密区块中继提议,还提供了第二种操作模式(称为高带宽模式),其中接收方节点,直接请求它的一些对等节点来发送新的区块,而无需先获得许可,这可能会增加带宽(因为在同一时间内,两个对等节点可能会发送同一个区块),但它进一步降低了区块传播的时间。
模式/致密区块
传统的中继方式,一个区块(灰色长条)是由节点A负责验证,然后节点A将发送一条inv消息到节点B ,以请求允许发送这个区块。节点B回复区块的请求(getdata),然后节点A发送区块。
在高带宽中继中,节点B使用了sendcmpt(1) (发送致密区块)来告诉节点A,它想要尽快接收区块。当一个新的区块抵达时,节点A会执行一些基本的验证(例如验证区块头),然后自动将区块头、缩短交易标识符(txids)以及预测缺失交易(如上所述)发送给节点B。节点B尝试重新构建区块,并请求任何仍处于丢失状态(getblocktxn)的交易,它们是由节点A发送(blocktxn)的。在此背景下,在将区块添加到各自的区块链副本之前,两个节点都完成了完整的区块验证,并和以前一样保持了相同的全节点安全性。
在低带宽中继中,节点B使用了sendcmpt(0)来告诉节点A,它想要尽量减少带宽的使用。当一个新的区块抵达时,节点A会完整验证它(因此它不会中继任何无效区块)。然后它会询问节点B是否想要区块(inv),这样,如果节点B已从另一个对等节点收到了区块,它就可以避免再次下载。如果节点B不想要区块,它要求在致密模式下(getdata(CMPCT))进行,节点A发送区块头、缩短交易标识符(txids)以及预测丢失交易。节点B试图重建区块,请求仍处于丢失的交易,而节点A发送这些交易。然后节点B完整验证这些区块。
网友评论