Data Availability Sampling 技术带来的好处是什么?为什么我们会需要它?
拍摄者@testalizeme?utm_source=medium&utm_medium=referral">测试我 在未飞溅
先备知识:
以下会以 资料发布(Data Publication)来称呼 资料可得性(Data Availability),但某些 Data Availability 相关的词汇例如 DAS、DAC 则会保留原字,避免读者无法和英文原文连结。关于 Data Publication 这个名称的介绍可以参考:
这个系列文将会透过 Danksharding 介绍 DAS 的运作机制、以及 Celestia、EigenDA、AvailDA 这几个方案的异同之处。第一篇将会介绍为什么我们会需要 DAS 以及 DAS 所带来的好处。
目前在 Ethereum 生态系中最常讨论到资料发布的情境是在讨论 L2 的设计的时候:L2 自己也是一条链,所以也会有自己的区块与交易资料,那这些资料要放在哪?因为使用者需要这些资料来确保安全性。
更多关于 Rollup 与资料发布的关系可以参考:
本文将介绍资料可用性与 Rollup 的关联,Rollup 要怎么在资料可用性上做出一些牺牲来换取更低的交易成本。
但其实不只是L2,Ethereum 这条链本身也会需要面对资料发布的问题,因为轻节点不会像全节点一样下载完整的区块资料,所以轻节点需要相信「当一个新的区块出现时,该区块的完整资料真的有被发布」。当一个轻节点被诱骗而相信一个「资料不完整的」区块,这和它被诱骗去相信一个「不合法的」区块的影响是一样的— 它接上的都是一条不被其他人承认的分叉链。
全节点不会相信不完整的区块,但轻节点会相信
那目前 Ethereum 的轻节点是相信谁来确保一个新的区块的资料有被完整发布?答案是「验证者(Validator)们」。当轻节点收到一个新的区块,它不会下载完整区块资料,但它会看有多少验证者投票给这个区块。当有足够多的验证者投票给这个区块,它就会相信这个区块的完整资料有确实被发布。这是属于 Honest Majority 的假设,也就是相信大多数的验证者是好人。
当足够多的验证者对区块签名,轻节点就会相信区块有完整发布
注:目前Ethereum 轻节点并不是真的采计数十万个验证者的投票来计算,因为数量太多、计算太耗资源,而是指派另一批在数量上少得多的Sync Committee,由里面的验证者签名作为给轻节点的担保。这算是一个过渡的做法,等待未来更完整成熟的设计取而代之。
「相信大多数的验证者是好人」听起来已经是个合理且不错的选择,但如果我们能做得更好呢?如果有一天真的发生大多数的验证者想联合起来欺骗我们说有完整区块资料但其实没有,不过只需要 p2p 网路中存在少数好人,我们就可以免于上当呢?
这么棒的能力肯定不会凭空出现,要具备这个能力需要构建出够稳固的 p2p 网路、有足够多的使用者,甚至要能在网路层加入隐私的功能。这个能力就是这个系列文的重点 — Data Availability Sampling(DAS)。
在一个具备DAS 的区块链中,轻节点不会只是被动接收新的区块资料,而是要共同参与到DAS 的运作之中:每个轻节点都要针对每一个区块,到p2p 网路中去索求该区块身上的几段资料并保存这些资料,并且在其他节点索求资料时分享给对方。就像分散式的档案分享协议 BitTorrent 一样,网路中的节点们一起保存、共享他们所在乎的资料,而不是仰赖某个中心化伺服器。
轻节点们一起透过 p2p 网路索求与分享区块的片段资料
注:理想的情境中,区块链的使用者都会运行轻节点,一起参与到 DAS 的运作中、一起确保安全性,而不是像现在完全相信其他节点。
每个轻节点在它成功拿到它索求的每段资料之前,都不能相信区块资料已经被完整发布,不过一但索求的每段资料都拿到了,它就可以放心地相信区块资料已经被完整发布了。但为什么轻节点明明只拿了片段的资料却可以放心相信完整的区块资料有被发布?这是因为网路中的其他轻节点们也会各自保管片段资料,因此在有需要的时候,大家将可以合力藉由彼此的片段资料拼凑出完整的资料,而且DAS 另一个神奇的能力是:轻节点们合力保存的资料不需要涵盖完整的区块资料,轻节点们只要拿到其中50% 的资料就可以还原出100% 的资料。
轻节点们只要有超过 50% 的片段资料,就能还原出完整的区块资料
注:不一定是 50%,可能会更高,端看该 DAS 的设定,但一定会小于 100%。
所以在 DAS 中,即便大多数的验证者都投票给某个区块,轻节点也不会轻易相信该区块。轻节点会进行采样(Sampling),也就是索求该区块的片段资料,当索求的片段都拿到手后才会相信区块资料有被完整发布。
相比于目前没有DAS 的Ethereum,轻节点必须仰赖「大多数验证者是好人」,也就是Honest Majority 的假设;Ethereum 加入DAS 后,轻节点仰赖的是只要有「少数的节点是(会采样并保管资料的)好人」,也就是Honest Minority 的假设。
注:「少数」指的是需要采样并保管足以还原出完整资料的轻节点数量相对于网路里所有(非常多)的轻节点是相对的少数。
前面有提到过,当一个轻节点收到它所索求的所有片段资料后,它就会相信区块资料有被完整发布,而且网路中的轻节点们在有需要的时候可以合力借由片段资料还原出完整资料,但是…如果产出区块的人是恶意的,而且它一开始就没有要释放出足够的区块资料呢?如果它就是针对某个轻节点,并在提供给那个轻节点所需要的片段资料之后就不再提供任何资料呢?
Alice 成功拿到索求的资料,因此相信区块资料有被完整发布,最终她将会接上这个被其他节点丢弃的区块
那这个可怜的轻节点就得乖乖受骗了,而这也是DAS 的限制与Trade-off:DAS 提供的「资料有完整发布」的保证是机率上的保证,不是百分之百、斩钉截铁可以确定的保证,但这仍然好过于得原本得完全相信大多数的验证者的情况。如果你觉得机率上的保证不够安全、想要百分之百确认区块资料到底有没有完整发布,那很抱歉,你只能自己跑一个全节点把完整区块资料下载下来。
注:运行轻节点的程式没办法知道自己被骗,对程式来说,只要收到所有索求的资料就会相信区块是有完整发布。使用者只能透过自己的社交渠道来得知某个区块实际上是没完整发布的,并赶快指示自己的轻节点将该区块标记为资料不完整。
如果产出区块的人是恶意的且它就想要骗某些轻节点,那很遗憾地,它将能够骗到那些轻节点。不过这个受骗的数量会有一个上限,毕竟攻击者也不能释出太多区块导致轻节点们真的可以合力还原出完整资料。
这时大家可能在担心,难道自己的安全性只能建立在「和产出区块的人无仇」、「攻击者不知道我是谁所以不会盯上我」吗?是的,但这也是为什么前面会提到DAS 需要网路层的隐私功能,因为如果攻击者能知道是「谁」在索求片段资料、或知道A,B,C 这三个片段是「同一个人」在索求的,那它自然就能轻松地瞄准目标受害者并提供资料给对方。如果今天网路层具备隐私功能,那攻击者就没办法知道现在到底是谁来索求这个片段资料,自然也就没办法让目标上当受骗,攻击者的攻击效率就会大大降低:它完全没办法确定是否有骗到受害者,或什至骗到任何一个轻节点。
如果攻击者不知道是谁来索求资料,就非常难骗到轻节点
DAS 要能确保安全性,需要:
如果区块没有经过纠删码进行编码,而是让轻节点们直接采样原始的区块内容会有什么问题?答案是:轻节点们采样的片段资料要达到 100% 覆盖率才能确保资料的完整。即便轻节点们合力采样了 99% 的区块资料,这个区块一样是不完整的、是不被承认的。
没有纠删码的情况下,只要一丁点的区块遗失,就等于区块没完整发布
如果区块经过纠删码的编码,那只要例如任意的50% 资料就能还原出100% 资料,这表示轻节点们只要合力采样的片段资料达到50% 的覆盖率就可以确保一定能还原出完整的区块资料。相比于 100% 的覆盖率,50% 覆盖率的要求就简单了许多,恶意的出块者想要藏着部分资料来欺骗轻节点就会困难许多。
注:50% 只是一个例子,不同需求会有不同的还原所需 % 数。
如果轻节点保存不够多的片段资料,那即便区块资料透过纠删码编码了,还是没办法还原出 100% 资料。例如假设轻节点们一共只储存了 40% 的片段资料,它们合力也无法还原出 100% 的资料,那这些节点们就会全都上当,相信区块资料有被完整发布。
要怎么确保轻节点们有保存足够多的资料?我们需要有足够多的轻节点或是每个轻节点进行足够多的采样。如果轻节点够多,那每个轻节点采样的次数就不用高;但如果轻节点不够多,那每个轻节点采样的次数就要够高,才能确保轻节点们合力有保存足够多的资料。
注:如果轻节点的数量持续增长,那在采样次数不变的前提下,它们合力能储存的资料大小其实也可以跟着提高,例如这个系列文会介绍到的Celestia 便是能支援弹性区块大小的区块链:Celestia 的区块大小是可以因应网路中轻节点的数量去调整的。
轻节点们需要透过 p2p 网路来分享片段资料,以便能在有需要的时候还原出完整区块资料。如果 p2p 网路不稳定、无法处理大量资料请求的话,就有可能导致节点们获取不到某些片段资料。另外也要避免全部的片段资料都流通在同一个p2p 网路中导致网路频宽过载,理想上一个轻节点应该要能只收到它索求的资料,而不是其他无关紧要的资料也全都透过p2p 网路流经它的手上。
此外网路层还会需要具备隐私的功能,否则轻节点就会被攻击者识别出来,攻击者不会公布超过50% 的资料,但它会提供被它锁定的轻节点所索求的片段资料来误导该轻节点相信区块资料有被完整发布。
这三个部分的细节还会在这个系列文中做更详尽的介绍。
Data Availability Sampling 技术带来的好处是什么?为什么我们会需要它?
拍摄者@testalizeme?utm_source=medium&utm_medium=referral">测试我 在未飞溅
先备知识:
以下会以 资料发布(Data Publication)来称呼 资料可得性(Data Availability),但某些 Data Availability 相关的词汇例如 DAS、DAC 则会保留原字,避免读者无法和英文原文连结。关于 Data Publication 这个名称的介绍可以参考:
这个系列文将会透过 Danksharding 介绍 DAS 的运作机制、以及 Celestia、EigenDA、AvailDA 这几个方案的异同之处。第一篇将会介绍为什么我们会需要 DAS 以及 DAS 所带来的好处。
目前在 Ethereum 生态系中最常讨论到资料发布的情境是在讨论 L2 的设计的时候:L2 自己也是一条链,所以也会有自己的区块与交易资料,那这些资料要放在哪?因为使用者需要这些资料来确保安全性。
更多关于 Rollup 与资料发布的关系可以参考:
本文将介绍资料可用性与 Rollup 的关联,Rollup 要怎么在资料可用性上做出一些牺牲来换取更低的交易成本。
但其实不只是L2,Ethereum 这条链本身也会需要面对资料发布的问题,因为轻节点不会像全节点一样下载完整的区块资料,所以轻节点需要相信「当一个新的区块出现时,该区块的完整资料真的有被发布」。当一个轻节点被诱骗而相信一个「资料不完整的」区块,这和它被诱骗去相信一个「不合法的」区块的影响是一样的— 它接上的都是一条不被其他人承认的分叉链。
全节点不会相信不完整的区块,但轻节点会相信
那目前 Ethereum 的轻节点是相信谁来确保一个新的区块的资料有被完整发布?答案是「验证者(Validator)们」。当轻节点收到一个新的区块,它不会下载完整区块资料,但它会看有多少验证者投票给这个区块。当有足够多的验证者投票给这个区块,它就会相信这个区块的完整资料有确实被发布。这是属于 Honest Majority 的假设,也就是相信大多数的验证者是好人。
当足够多的验证者对区块签名,轻节点就会相信区块有完整发布
注:目前Ethereum 轻节点并不是真的采计数十万个验证者的投票来计算,因为数量太多、计算太耗资源,而是指派另一批在数量上少得多的Sync Committee,由里面的验证者签名作为给轻节点的担保。这算是一个过渡的做法,等待未来更完整成熟的设计取而代之。
「相信大多数的验证者是好人」听起来已经是个合理且不错的选择,但如果我们能做得更好呢?如果有一天真的发生大多数的验证者想联合起来欺骗我们说有完整区块资料但其实没有,不过只需要 p2p 网路中存在少数好人,我们就可以免于上当呢?
这么棒的能力肯定不会凭空出现,要具备这个能力需要构建出够稳固的 p2p 网路、有足够多的使用者,甚至要能在网路层加入隐私的功能。这个能力就是这个系列文的重点 — Data Availability Sampling(DAS)。
在一个具备DAS 的区块链中,轻节点不会只是被动接收新的区块资料,而是要共同参与到DAS 的运作之中:每个轻节点都要针对每一个区块,到p2p 网路中去索求该区块身上的几段资料并保存这些资料,并且在其他节点索求资料时分享给对方。就像分散式的档案分享协议 BitTorrent 一样,网路中的节点们一起保存、共享他们所在乎的资料,而不是仰赖某个中心化伺服器。
轻节点们一起透过 p2p 网路索求与分享区块的片段资料
注:理想的情境中,区块链的使用者都会运行轻节点,一起参与到 DAS 的运作中、一起确保安全性,而不是像现在完全相信其他节点。
每个轻节点在它成功拿到它索求的每段资料之前,都不能相信区块资料已经被完整发布,不过一但索求的每段资料都拿到了,它就可以放心地相信区块资料已经被完整发布了。但为什么轻节点明明只拿了片段的资料却可以放心相信完整的区块资料有被发布?这是因为网路中的其他轻节点们也会各自保管片段资料,因此在有需要的时候,大家将可以合力藉由彼此的片段资料拼凑出完整的资料,而且DAS 另一个神奇的能力是:轻节点们合力保存的资料不需要涵盖完整的区块资料,轻节点们只要拿到其中50% 的资料就可以还原出100% 的资料。
轻节点们只要有超过 50% 的片段资料,就能还原出完整的区块资料
注:不一定是 50%,可能会更高,端看该 DAS 的设定,但一定会小于 100%。
所以在 DAS 中,即便大多数的验证者都投票给某个区块,轻节点也不会轻易相信该区块。轻节点会进行采样(Sampling),也就是索求该区块的片段资料,当索求的片段都拿到手后才会相信区块资料有被完整发布。
相比于目前没有DAS 的Ethereum,轻节点必须仰赖「大多数验证者是好人」,也就是Honest Majority 的假设;Ethereum 加入DAS 后,轻节点仰赖的是只要有「少数的节点是(会采样并保管资料的)好人」,也就是Honest Minority 的假设。
注:「少数」指的是需要采样并保管足以还原出完整资料的轻节点数量相对于网路里所有(非常多)的轻节点是相对的少数。
前面有提到过,当一个轻节点收到它所索求的所有片段资料后,它就会相信区块资料有被完整发布,而且网路中的轻节点们在有需要的时候可以合力借由片段资料还原出完整资料,但是…如果产出区块的人是恶意的,而且它一开始就没有要释放出足够的区块资料呢?如果它就是针对某个轻节点,并在提供给那个轻节点所需要的片段资料之后就不再提供任何资料呢?
Alice 成功拿到索求的资料,因此相信区块资料有被完整发布,最终她将会接上这个被其他节点丢弃的区块
那这个可怜的轻节点就得乖乖受骗了,而这也是DAS 的限制与Trade-off:DAS 提供的「资料有完整发布」的保证是机率上的保证,不是百分之百、斩钉截铁可以确定的保证,但这仍然好过于得原本得完全相信大多数的验证者的情况。如果你觉得机率上的保证不够安全、想要百分之百确认区块资料到底有没有完整发布,那很抱歉,你只能自己跑一个全节点把完整区块资料下载下来。
注:运行轻节点的程式没办法知道自己被骗,对程式来说,只要收到所有索求的资料就会相信区块是有完整发布。使用者只能透过自己的社交渠道来得知某个区块实际上是没完整发布的,并赶快指示自己的轻节点将该区块标记为资料不完整。
如果产出区块的人是恶意的且它就想要骗某些轻节点,那很遗憾地,它将能够骗到那些轻节点。不过这个受骗的数量会有一个上限,毕竟攻击者也不能释出太多区块导致轻节点们真的可以合力还原出完整资料。
这时大家可能在担心,难道自己的安全性只能建立在「和产出区块的人无仇」、「攻击者不知道我是谁所以不会盯上我」吗?是的,但这也是为什么前面会提到DAS 需要网路层的隐私功能,因为如果攻击者能知道是「谁」在索求片段资料、或知道A,B,C 这三个片段是「同一个人」在索求的,那它自然就能轻松地瞄准目标受害者并提供资料给对方。如果今天网路层具备隐私功能,那攻击者就没办法知道现在到底是谁来索求这个片段资料,自然也就没办法让目标上当受骗,攻击者的攻击效率就会大大降低:它完全没办法确定是否有骗到受害者,或什至骗到任何一个轻节点。
如果攻击者不知道是谁来索求资料,就非常难骗到轻节点
DAS 要能确保安全性,需要:
如果区块没有经过纠删码进行编码,而是让轻节点们直接采样原始的区块内容会有什么问题?答案是:轻节点们采样的片段资料要达到 100% 覆盖率才能确保资料的完整。即便轻节点们合力采样了 99% 的区块资料,这个区块一样是不完整的、是不被承认的。
没有纠删码的情况下,只要一丁点的区块遗失,就等于区块没完整发布
如果区块经过纠删码的编码,那只要例如任意的50% 资料就能还原出100% 资料,这表示轻节点们只要合力采样的片段资料达到50% 的覆盖率就可以确保一定能还原出完整的区块资料。相比于 100% 的覆盖率,50% 覆盖率的要求就简单了许多,恶意的出块者想要藏着部分资料来欺骗轻节点就会困难许多。
注:50% 只是一个例子,不同需求会有不同的还原所需 % 数。
如果轻节点保存不够多的片段资料,那即便区块资料透过纠删码编码了,还是没办法还原出 100% 资料。例如假设轻节点们一共只储存了 40% 的片段资料,它们合力也无法还原出 100% 的资料,那这些节点们就会全都上当,相信区块资料有被完整发布。
要怎么确保轻节点们有保存足够多的资料?我们需要有足够多的轻节点或是每个轻节点进行足够多的采样。如果轻节点够多,那每个轻节点采样的次数就不用高;但如果轻节点不够多,那每个轻节点采样的次数就要够高,才能确保轻节点们合力有保存足够多的资料。
注:如果轻节点的数量持续增长,那在采样次数不变的前提下,它们合力能储存的资料大小其实也可以跟着提高,例如这个系列文会介绍到的Celestia 便是能支援弹性区块大小的区块链:Celestia 的区块大小是可以因应网路中轻节点的数量去调整的。
轻节点们需要透过 p2p 网路来分享片段资料,以便能在有需要的时候还原出完整区块资料。如果 p2p 网路不稳定、无法处理大量资料请求的话,就有可能导致节点们获取不到某些片段资料。另外也要避免全部的片段资料都流通在同一个p2p 网路中导致网路频宽过载,理想上一个轻节点应该要能只收到它索求的资料,而不是其他无关紧要的资料也全都透过p2p 网路流经它的手上。
此外网路层还会需要具备隐私的功能,否则轻节点就会被攻击者识别出来,攻击者不会公布超过50% 的资料,但它会提供被它锁定的轻节点所索求的片段资料来误导该轻节点相信区块资料有被完整发布。
这三个部分的细节还会在这个系列文中做更详尽的介绍。