-
Notifications
You must be signed in to change notification settings - Fork 45
ar chunks transfer 机制
Sandy edited this page Apr 4, 2021
·
1 revision
ar 运用 merkle tree 把需要上传到 ar network 上的 data 等分成若干份,每一份数据视为一个 chunk. 然后通过 ar 的 chunk 接口把分割出来的 chunk 一个个 upload 到链上。
tx data 被等分为固定长度的若干份,这里的固定长度是最大长度 2561024, 最小长度 321024,如果data 分割到左最后发现剩下的长度小于最小长度32*1024, 则倒数第二个分割的 chunk 需要和最后一个 chunk 长度等分,让所有的chunk长度都满足最小长度的限制。
等分出来的 chunks 会作为 merkle tree 的叶子节点来进行 merkle tree 的构建。这里的 merkle tree 的构建实现就是标准的 merkle tree 的实现方式,这里不做算法的深入讨论。
构建出来 merkle tree 之后会得到三个数据: 作为叶子节点的chunks、merkle tree root、每个叶子节点 chunk 到 merkle tree root 的 proofs.
声明交易:在把 data 通过 chunks 方式上链之前,需要发送一笔声明交易到链上,向链上声明需要的 data size 和 data root。所以这笔交易的特殊之处在于 tx data 为空,但是 data size 和 data root 不为空。ar chain 会根据 data size 来计算存储费用,data root 就是 merkle tree root,作用是保证链上的数据完整性。
上述步骤执行完之后就要发送chunk 上链,ar 提供了一个专门发送 chunk 的api 接口。
该接口需要发送以下数据上链:
- data root: data merkle tree root
- data size
- dataPath: 当前 chunk 在 merkle tree 的 proofs
- offSet: 当前 chunk 在 总的proofs 的偏移位置
- chunk 本身数据
- chunk 发送不需要严格按照每个 chunk 在merkle tree 中的 leaf node 顺序以及不要求一次性必须把 所以的 chunk 都发送完,所以通过chunk 方式上传 data 可以实现断点续传的效果。
- 发送 chunk 之前不需要保证声明交易上链;甚至可以先发送 chunk 后发送声明交易。
- 如果是需要通过断点重传,由于断点之后是没有上下文环境也没有记录声明交易对象,所以这个时候需要通过 txId 去链上查询到对应的交易才能实现断点重传,所以这种情况就需要要去声明交易已经打包上链了。