【区块链】SIA白皮书翻译

来源:互联网 发布:陆遥 数据 编辑:程序博客网 时间:2024/05/16 10:35

Sia: 简单的去中化存储

作者

David Vorick Nebulous Inc. david@nebulouslabs.com

Luke Champine Nebulous Inc. luke@nebulouslabs.com

November 29, 2014

 

摘要

Sia,一个实现去中心化的数据存储平台。Sia使存储节点之间的合同约束成为可能。合同是存储提供者和他们的客户之间,定义了什么数据将被存储,以什么样的价格存储。他们要求存储提供者保证在规定的时间内能够储存客户数据。合同是存储在区块链上,使它们能被公开审查。在这方面,Sia可以看作为一个比特币衍生工具,包括支持以上描述的存储合同。Sia最初是作为一个竞争币出现,以后可以同比特币在金融上双向挂钩。

 

1.       介绍

Sia是一个去中心化的数据云存储平台,它区别与现有的存储解决方案,Sia网络中节点之间互相租用存储空间,而不是向中心化的存储空间提供者租用。Sia网络本身只存储当事人之间的合同,定义他们之间的条款。实现这个目的的基础是区块链(功能上类似于比特币)。

通过形成一个合同,存储供应商(托管主机)同意存储客户数据,并定期的证明它们能继续提供存储服务,直到合同到期。主机可以通过提交证明得到奖励,但是丢失证明会受到相应的处罚。这些证明在区块链上是公开的可以被审计的,网络自动保证存储合同的一致性。这就意味着,客户不需要去验证合同,他们只需要上传数据,其它的都交给网络去做。

我们认为只把数据存储在一台不受信任的主机上,在可用性,带宽和服务质量上得不到很好的保证。相反,我们建议把数据跨多主机存储。特别是,纠删码(erasure codes)技术的使用可以保证数据的高可用性和无冗余。

Sia最初是作为一个基于区块链的竞争币出现,将来计划同比特币进行双向挂钩。(详细介绍可以参考文献”固定侧链的区块链创新”[5])。Sia协议在很大程度上类似于比特币,除了以下描述的特性。

 

2.       通用架构

Sia和比特币主要区别在于它们的交易。比特币使用脚本系统实现一系列的交易类型,比如pay-to-public-key-hash 和 pay-to-script-hash。Sia为所有的交易使用一种M-of-N的签名方案,完全避开脚本系统。这降低了复杂性和攻击范围(attack surface)。

Sia还扩充了交易,使创建和执行存储合同成为可能,以下三个扩展用于完成这个:“合同”,“证明”和“合同更新”。”合同”声明了主机以一定大小和散列存储文件,定义了托管主机按一定规则提交”证明”,一旦连接建立后,合同通过”合同更新”来修改。具体可以参考章节4,5

 

3.       交易

交易包含了以下的字段:

描述

Version

协议版本号

Arbitrary Data

用于元数据或其它

Miner Fee

矿工的奖励

Inputs

收入

Outputs

支出(可选)

File Contract

见:文件合同 (可选)

Storage Proof

见:存储证明 (可选)

Signatures

签名

 

3.1  输入和产出

产出由大量币组成,每个产出关联一个标识符,产出的标识(i)及交易(t)的由以下函数定义

H(t||"output"||i)

H是加密散列函数,output是字符串。区块奖励和矿工费用有特殊的产出ID,定义如下:

           H(H(BlockHeader)||"blockreward")

每一个输入必定来自先前的产出,所以输入是一个简单的输出ID??。输入和产出也是搭配的一组消费条件(spend conditions)”,输入包含” spend conditions”本身,而输出包含它们的Merkle根散列(Merkle Tree 是由计算机科学家 Ralph Merkle 在很多年前提出)。

 

3.2  消费条件(Spendconditions)

消费条件属性必须满足币被解锁和能被消费。消费条件包含时间锁和一组公钥以及所需签名的数量。直到时间锁过期和足够数量签名,产出(output)才可以被消费。

  消费条件散列成一个Merkle树,时间锁,所需的签名数量和公钥作为叶子节点。树的根散列作为币的发送地址。为了发送币,必须提供与消费条件一致的地址散列。使用Merkle树允许当事人有选择的在消费条件上披露信息。例如,可以披露时间锁而不披露公钥或所需签名数量。

  需要值得注意的是,时间锁和签名数是低熵的,使得它们的散列易于受到暴力破解。这个可以通过给这些值加随机标识,增加它们在空间效率成本上的熵。

 

3.3  签名

  每个交易的输入必须被签名。加密签名本身搭配一个输入ID、一个时间锁和一组标志指示的哪些部分的交易已经签名。输入ID指示哪个输入的签名已经被应用。时间锁指定什么时候签名无效。交易中的任何字段的子集都可以签名,除签名本身。还有一个标识位,表明整个交易都应该签名(除了签名本身)。

  实际的数据被签名,然后,串联时间锁,输入ID,标识符还有每个标记字段。

 

4.       文件合同

  文件合同是存储提供者和客户之间的协议,文件合同的核心是文件的Merkle根散列。为了构建这个散列,文件被分成固定大小的段散列到一个Merkle树上。根散列以及文件的总大小,可以用来验证存储证明。

  文件合同还指定持续时间, challenge frequency(挑战频率?)和支付参数,包括奖励一个有效的证明,惩罚(原文这边写的是奖励,但是我的理解应该是惩罚)一个无效的或丢失的证明,以及最大可以丢失的证明数目。challenge frequency指定多长时间必须提交存储证明,在创建离散的challenge窗口期间主机必须提交存储证明。存储证明的提交会触发向具有有效证明的地址(假定是托管主机)发起付费。如果,在challenge窗口的最后时间点,没有提交有效的证明,币会被发到一个名为“丢失证明”的地址(可能是一个无法花费的地址,目的是为了阻止dos攻击)。 合同定义了最大可丢失证明数,如果超过这个数,合同就视为无效。

  如果合同在合同期结束时仍然是有效的,它会成功的终止并且剩余的币会发送到有效的证明地址。相反,如果资金在合同期限内消耗完,或超出了证明的最大数量,合同会失败终止,剩余的币发送到“丢失证明”的地址。证明的输出ID取决于合同ID,定义如下:

H(transaction||"contract" || i)

 “i”的定义是:交易中的合同的索引(index). 证明的产出ID由以下公式定义:

           H(contractID || outcome || Wi)

Wi是窗口的索引,例如:合同形成以后运行的窗口的数量。“outcome”是一个字符串文字:是“validproof”和“missedproof”中任意一个,对应了证据的有效性。

合同终止的输出ID定义如下:

H(contract ID || outcome)

结果值可能是“successfultermination”和“unsucessfultermination”,对应合同的终止状态。文件合同也创建一个"编辑条件(edit conditions)"的列表,类似于交易的"消费条件(spend conditions)"。 如果“编辑条件”满足了,这个合同就可能可以被修改。任何值都可以被修改,包括合同金额,文件散列,和输出地址。这些修改会影响后续的存储证明的有效性,合同编辑必须指定未来的“挑战窗口(challengewindow)”,在那个窗口期开始生效。理论上,节点可以创建“微小的支付渠道(micro-edit channels)”使频繁的小额支付变得容易;参见7.3小额支付渠道。

 

5.       存储的证明

为了实现文件合同,存储证明定期的被提交。每个存储证明面向一个特定的文件合同。存储证明不需要任何输入或输出;只要有一个合同ID和证明数据。

 

5.1  算法

主机通过原始文件的分割段和Merkle树上的散列的列表来证明它们的存储。这些信息足以证明这个分割段是来自于原始文件。因为证明是提交到区块链上的,每个人都可以证明它是有效还是无效的。每个存储使用一个随机选择的分割段。“挑战窗口(challenge window)” 索引Wi的随机种子定义如下:

           H(contractID || H(Bi-1))

Bi-1是Wi开始之前的那个块。

如果主机能持续的证明拥有一个随机分割段,那么它们很可能存储了整个文件。主机只存储50%的文件不能完成大约50%的证明。

 

5.2  区块截留攻击(BlockWithholding Attacks)

随机数生成器通过”区块截留攻击”而受到操纵,攻击者保留区块直到他们找到一个有利的随机数。然而,攻击者只有一次机会来操纵随机数。并且截留一个区块来操纵随机数会花费攻击者的区块奖励。如果一个攻击者开采了50%的区块,那么他就有50%的资源可以操纵。但是,剩余的50%仍然是随机的,所以攻击者还是会无法获取一些存储证明。

为防止此类攻击,客户可以指定一个高的“挑战频率(challenge frequency)“以及对丢失证明的大的惩罚。这些预防措施应该足以阻止任何追求金钱攻击者控制不到50%的网络算力。另外,客户都需要对潜在的拜占庭攻击制定计划,因为它的行为可能不是受金钱驱动的。

 

5.3  关闭窗口攻击(ClosedWindow Attacks)

交易使主机进入区块链后,主机只能完成一次存储证明。矿工可以恶意的从块上删除存储证明,丧失他们的交易费用但是迫使主机受到处罚。或者,矿工在知道交易很重要时,通过可以在块上删除存储证明来敲诈主机。这称为关闭窗口攻击,因为是恶意矿工人为的“关闭窗口”。

防御办法是定义一个比较大的窗口大小,主机可以合理的假设一定比例的矿工拥有证明,以换取交易费用。主机可以自由的拒绝他们感觉易受“关闭窗口攻击”的合同。

 

6.       任意交易数据(Arbitrary Transaction Data)

每个交易都有一个任意数据(Arbitrary Data)字段,可以用于任何类型的信息。如果在交易中被签名了,主机需要存储任意数据(Arbitrary Data)。主机初始化的接受64KB/块的任意数据。这种任意数据为主机和客户提供了一个分散的方式来组织自己。它可以被用来通告可用空间,或创建一个分散的文件追踪系统。任意数据也可以用于实现其他类型的soft forks(软叉),通过创建一个“anyone-can-spend”输出但在任意数据中指定限制。矿工了解限制可以阻塞任何不满足必要规定的交易。对于单纯的节点,只需要保持同步就可,不需要解析这个任意数据(Arbitrary Data)。

 

7.       存储生态系统

Sia依赖一个去中心化存储的生态系统。存储提供商可以使用”任意数据(Arbitrary Data)“字段在网络上宣告自己。可以通过使用标准化模板,客户易于阅读。客户端可以使用这些声明创建一个潜在主机的数据库,并只和他们信任的主机形成合同。

7.1  主机保护

合同需要存储提供者和客户双方的认可,允许存储提供者拒绝存储不想要的或是非法的文件。存储提供者也可以拒签合同,就算文件都已经上传上来。合同条款给了存储提供者一些灵活性,它们可以宣称自己是低可靠的,低价的,丢失文件接受少许罚金的,或是可以宣称自己是高可靠性的,提供高价的并且丢失文件可以接受大额罚金的。一个高效的市场将优化存储策略。

主机很容易受到拒绝服务攻击(denial of service attacks),这可能阻止他们提交存储证明或传送文件。这是主机自己的责任,以保护自己免受此类攻击。

7.2  客户保护

客户可以使用纠删码(如再生码[4]),防止主机离线。这些编码通常是操作一个文件分割成n份,这样文件可以从任意的m个不相同的子集恢复(m和n基于实际的纠删码和冗余因素,比如一个文件分成30份,存于30台host,但是10台host就能恢复一个文件)。 每一份都被加密然后存于多台不同的主机。这样,就算平均网络可靠性低的情况下,客户端也能实现较高的文件可用性。作为一个极端的例子,如果100份里只有10台主机被用来恢复文件,客户端实际上是依赖于这10台最可靠的主机,而不是依赖平均的可靠性。通过移植离线主机上的分片,可以进一步提高可靠性。其他指标也受益于这一策略,客户端可以通过从最近的10个主机下载来减少延时,或增加下载速度通过从下载速度最快的10台主机。这些下载可以以最大可用带宽并行运行。

7.3  正常运行时间奖励

存储证明不包含实施稳定运行时间的机制,也没有规定要求主机传输文件给客户。有人可能会认为,这样的话,主机可能会持有客户的文件作为抵押,要求比较高的下载费用。然而,这种攻击可以通过纠删码可以得到缓解,如7.2节所述。通过策略客户可以自由的忽略不合作的主机,只和那些合作的主机交互。这样,主动权从主机转移到客户,“下载费用”成为一个“上传的动机。”

在这个场景中,客户端提供一个奖励发送一个文件,主机必须通过竞争来提供最好的服务质量。客户可以随时请求一个文件,它鼓励主机正常运行时间最大化,以获取尽可能多的回报。客户也可以通过提高回报的比率来鼓励主机提供更大的吞吐量和更低的延迟。然而,我们重申,正常运行时间激励不是sia协议的一部分,他们完全依赖于客户的行为。

下载的支付通过先前存在的小额支付渠道来提供[11]。小额支付渠道允许客户有非常多的小额支付情况下而延时最小,区块链膨胀最小。主机可以传输文件的一小段,等待接受小额付款之后再继续。使用许多连续支付允许每一方被欺骗的风险降到最低。小额支付足够小并且足够快,可以每隔几秒支付,对吞吐量没能什么影响。

 

7.4  基本的信誉系统

客户需要一个可靠的方法来挑选有质量的主机。分析他们的历史是不够的,因为历史上可能是有欺骗的。主机可以反复与本身形成合同,存储“假”文件,实际并没有执行任何存储。

为减轻这个攻击,客户可以要求主机宣布自己在任意数据部分还包括大量的时间锁币。如果10个币时间锁定在未来14天,主机可以说自己已经创建了个值为140“coin-days”的锁。通过支持主机可以创建时间锁,客户端可以减轻此攻击,因为不值得为琐碎的事创建比较有价值的时间锁。每个客户端可以根据自己的方式选择主机,可综合利用大量的因素,包括价格,锁定值,存储空间和主机愿意支付丢失的文件的处罚。更复杂的系统,例如通过人工审查或其他指标,可以实现带外(out-of-band OOB)更集中设置。

 

8.       Sia基金

Sia是Nebulous公司的一个产品。Nebulous是一个以营利为目的的公司,Sia旨在成为一个为公司主要的收入来源。币预挖不是一个稳定的收入来源,它需要创建一个新币而且绑定了公司的税收和币的增值。当公司需要花钱,它必须卖掉部分的收入来源。此外,预挖意味着一个实体控制大量的货币,因此潜在的对市场有控制性和破坏性。

相反,Nebulous打算从Sia的附加值上获得收入,由建立在客户端和主机之间合同的价值决定,通过征收所有合同的费用来完成的。创建合同时,3.9%合同资金分配给“Sia基金”。Nebulous公司持有88%的“Sia基金”,剩余的分配给早期的Sia众酬者。

“Sia基金”可以发送给其它地址,siacoin可以同样的被发送到其它地址。然而它们不可以用来资助合同或挖矿费用。当“Sia基金”转移到新地址,一个额外的未被使用的产出(output)被创建出来,包含了所有的来自于前次转移“Sia基金”获得的siacoin.

 

9.       Sia经济学

Sia的主要货币是siacoin。siacoin的供应是永久增加的,每个区块产生的Siacoin从最开始的300,000个币,每下一个区块链所产生的币比前一个区块链减少一个币,直到到达30,000。以下是siacoin的一个增长率:

Year

1

2

3

4

5

8

20

Growth

90%

39%

21%

11.50%

4.40%

3.20%

2.30%

          

 

 

Sia的激励方案有低效性,Sia的主要目标是提供在区块链上执行合同。挖矿奖励只是间接的和合同总价关联。Siacoin在一开始肯定会存在很大的波动性,主机会因为在合同期间,币的波动而受到影响。因此,我们期望主机对长期合同增加一些费用来规避一些损失。此外主机还可以选择一些稳定的货币(比如美元),在合同最后迅速转换成siacoin。最终,使用双向挂钩和其它“crypto-assets(加密资产??)”,可以使主机免受波动影响。

 

10.   总结

Sia可以理解为一个变种的比特币,通过加密的合同协议实现文件分散存储。这些合同可以用来执行存储客户端和主机之间的协议,同意存储文件之后,主机必须定期向网络提交存储证明。主机会通过存储文件自动的获得补偿。重要的是,合同不需要当请求的时候传输文件回给客户。相反,必须创建一个带外生态系统奖励主机上传。客户端和主机也必须找到一个方法来相互协调;一种机制是在区块链上的“任意值数据(arbitrarydata)”字段。各种防范措施也列举了来减轻Sybil攻击和主机的不可靠。Sia基金创造收入用于Nebulous公司,该公司负责Sia的发布和维护。

通过使用Sia基金而不是预挖,Nebulous的直接相关收入来自于网络上的实际应用,会很大的减轻来自于市场上恶意炒作币的影响。长期而言,我们希望能支持同多种货币的双向挂钩,这将使消费者免受单一货币的不稳定。我们相信Sia将提供一个在不信任的环境中肥沃的分散的云存储平台。

 

参考文献

 [1] Satoshi Nakamoto, Bitcoin: APeer-to-Peer Electronic Cash System.

 

[2] R.C. Merkle,Protocols for public key cryptosystems, In Proc. 1980 Symposium on Security andPrivacy,IEEE Computer Society, pages 122-133, April 1980.

 

[3] HovavShacham, Brent Waters, Compact Proofs of Retrievability, Proc. of Asiacrypt2008, vol. 5350, Dec 2008, pp. 90-107.

 

[4] K. V.Rashmi, Nihar B. Shah, and P. Vijay Kumar, Optimal Exact-Regenerating Codes forDistributed Storage at the MSR and MBR Points via a Product-MatrixConstruction.

 

[5] Adam Back,Matt Corallo, Luke Dashjr, Mark Friedenbach, Gregory Maxwell, Andrew Miller,Andrew Peolstra, Jorge Timon, Pieter Wuille, Enabling Blockchain Innovationswith Pegged Sidechains.

 

[6]Andrew Poelstra, A Treatise on Altcoins.

 

[7] GavinAndresen, O(1) Block Propagation, https://gist.github.com/gavinandresen/e20c3b5a1d4b97f79ac2

 

[8]Gregory Maxwell, Deterministic Wallets, https://bitcointalk.org/index.php?topic=19137.0

 

[9]etotheipi, Ultimate blockchain compression w/ trust-free lite nodes,

https://bitcointalk.org/index.php?topic=88208.0

 

[10]Gregory Maxwell, Proof of Storage to make distributed resource consumptioncostly.

https://bitcointalk.org/index.php?topic=310323.0

 

[11]Mike Hearn, Rapidly-adjusted (micro)payments to a pre-determined party,

https://en.bitcoin.it/wiki/Contracts#Example7:Rapidly-adjusted.28micro.29payments_to_a_pre-determined_party

 

[12]Bitcoin Developer Guide, https://bitcoin.org/en/developer-guide

 

0 0