跳到主要内容

架构及实现原理

架构

技术原理

并发拉取区块信息

arsyncer 使用 golang ant 并发库从 arweave 中批量获取指定高度范围内的区块。

当并发的获取区块数据时,会根据区块的高度依次输出。 arsyncer 的实现方式是在每个并发任务中指定区块的起始高度和结束高度,构造一个定长的数组(len = end - start),获取到区块信息后,根据该区块的高度放入数组的指定位置,从而实现区块数据的顺序输出。

注意:必须在 arweave 上成功获取每个区块。 arsyncer 首先从 arweave.net 网关拉取区块,如果失败,它使用 goar 的 getBlockFromPeers() 方法从全网节点请求块。如果仍然失败,程序会 panic。

并发拉取交易

arsyncer 获取到区块数据后,需要从每个区块并发的拉取交易信息。

为了实现高性能的交易同步,需要启动多个线程在多个区块中并发的拉取交易。

需要解决的问题:并发拉取的区块中的交易需要按照区块高度顺序输出。

从单个区块并发拉取交易后也需要按照交易在区块中的排列顺序依次输出,这与前文所述的并发拉取区块信息相同。

为了将并发拉取的区块中的交易按照区块高度顺序输出,arsyncer 设置了一个全局变量 nextSubscribeTxBlock 来判断当前线程是否应当执行当前区块高度的交易输出。nextSybscribeTxBlock 在每次线程成功执行交易输出后会增加 1。每个线程每次拉取的交易都是在某一个确定的区块高度的,只有在该线程所绑定的区块高度和 nextSubscribeTxBlock 相等的时候才会将交易进行输出,这样就确保了交易是按照区块高度顺序输出的。

注意:arsyncer 首先从 arweave 网关拉取交易,如果失败了,则使用 goar 的 getTxFromPeers() 方法从 Arweave 网络中的所有节点去拉取交易。如果仍然失败,则返回的结构体中只会包含 arId。这样做的目的是因为 Arweave 存在一些交易的丢失,返回一个空交易会让 arsyncer 使用者知道这笔交易失败了。

交易过滤

用户可以自定义 arsyncer 的过滤参数,这样 arsyncer 将只会返回经过过滤的交易。

arsyncer 拉取到区块中的交易后,首先将这些交易放入过滤器进行过滤,然后返回过滤后的交易。

过滤器目前可以配置三种类型的参数,ownerAddress、 target 和 tags