作者介绍了去中心化存储平台Sia。 Sia能够在对等节点之间形成存储合约。 合约是存储提供商与其客户之间的协议,定义将以何种价格存储数据。 他们要求存储提供商定期证明他们仍在存储客户的数据。
合约存储在区块链中,使其公开可审计。 在这方面,Sia可以被视为比特币衍生品,新增的功能包括对这些合约的支持。 Sia最初将作为Altcoin(这里的Altcoin是指参考BTC的实现)实施,后来通过双向挂钩与比特币进行了交易上的连接。
Sia是一个去中心化的云存储平台,倾向于在P2P和企业级领域与现有存储解决方案进行竞争。 Sia不是从集中供应商处租用存储,而是从彼此租用存储。 Sia本身只存储各方之间形成的存储合同,定义其安排条款。用于此目的区块链与比特币[1,12]类似。
通过签订合约,存储提供商(也称为主机)同意存储客户数据,并定期提交其持续存储的证明,直至合约到期。主机补偿他们提交的每一份证据,并因缺少证据而受到处罚。由于这些证据是公开可验证的(并且可以在区块链中公开获得),因此可以使用网络共识来自动执行存储合约。重要的是,这意味着客户不需要亲自验证存储证明;他们可以简单地上传文件,然后让网络完成剩下的工作。
我们承认,将数据存储在单个不可信任的主机上几乎无法确保可用性,带宽或服务质量的一致性。相反,我们建议在多个主机上冗余存储数据。特别是,使用纠删码(erasure codes)可以实现高可用性,而不会出现过多冗余。
Sia最初将实施为基于区块链的Altcoin。未来计划支持与比特币进行双向挂钩,详见“使用侧链促进区块链创新(Enabling Blockchain Innovations with Pegged Sidechains)”[5]。 Sia协议在很大程度上与比特币相似,除了下面所述的变化。
Sia从比特币的主要出发点在于它的交易。 比特币使用脚本系统来启用一系列交易类型,例如pay-to-public-key-hash和pay-to-script-hash。 Sia选择在所有交易中使用M-N多重签名方案,完全避开了脚本系统。 这减少了复杂性和攻击可能性。
Sia还扩大交易范围,以创建和执行仓储合约。 有三个扩展用于完成这项工作:合约,证明和合约更新。 合约声明主机的存储空间以存储具有特定大小和散列的文件。 它们定义了主机必须提交存储证据的规则。 一旦建立,合约可以稍后通过合约更新进行修改。 这些交易类型的细节在第4节和第5节中定义。
交易包含以下字段:
字段 | 描述 |
---|---|
Version | 协议版本号 |
Arbitrary Data | 用于元数据或其他 |
Miner Fee | 给矿工的奖励 |
Inputs | Incoming funds |
Outputs | Outgoing funds (optional) |
File Contract | 见: File Contracts (optional) 文件合约 |
Storage Proof | 见: Proof of Storage (optional) 存储证明 |
Signatures | Signatures from each input |
输出包括一定量的加密币。 每个输出都有一个关联的标识符,它是从输出中出现的交易派生而来的。输出i在交易t中的标识定义为:
H(t ||“output”|| i)
其中H是密码哈希函数,“output”是字符串文字。 块奖励和矿工费用有特殊的输出ID,由下式给出:
H(H(Block Header)||“blockreward”)
每个输入必须来自先前的输出,所以输入只是一个输出ID。
输入和输出也与一组支出条件配对。 输入包含消费条件本身,而输出包含它们的Merkle根散列[2]。
支出条件是在加密币“解锁”并且可以花费之前必须满足的属性。支出条件包括时间锁定和一组公共密钥以及所需签名的数量。直到时间锁定已经超时并且足够的指定密钥添加了他们的签名,才能使用输出。
支出条件被散列到Merkle树中,使用时间锁定,所需签名的数量以及公钥作为叶子。该树的根散列用作加密币发送的地址。为了消费加密币,必须提供与地址散列对应的花费条件。 Merkle树的使用允许各方在消费条件中选择性地揭示信息。例如,可以揭示时间锁而不揭示公钥的数量或所需签名的数量。
应该指出的是,时间锁定和签名数量具有较低的熵,使得它们的哈希容易受到暴力威胁。这可以通过给这些字段添加一个随机的随机数来解决,以空间效率为代价增加它们的熵。
交易中的每个输入都必须签名。 密码签名本身与一个输入ID,一个时间锁和一组指示交易的哪些部分已被签名的标志配对。 输入ID指示正在应用签名的输入。 时间锁定指定签名何时生效。 交易中的任何字段子集都可以签名,但签名本身除外(因为这是不可能的)。 还有一个标志,表示整个交易除了签名都应该签名。 这允许更多的交易方案。
然后,正在签名的实际数据是时间锁定,输入ID,标志和每个标记字段的串联。 交易中的每一个这样的签名都必须有效,以便交易被接受。
文件合约是存储提供商与其客户之间的协议。文件合约的核心是文件的Merkle根哈希。为了构造这个散列,文件被分割成大小不变的段并散列到Merkle树中。根散列以及文件的总大小可用于验证存储证据。
文件合约还规定了持续时间,挑战频率和支付参数,包括有效证明的奖励,无效或缺少证据的奖励以及可以错过的最大证明数量。挑战频率指定必须提交存储证明,并创建离散挑战窗口,在此期间主机必须提交存储证明(每个窗口一个证明)。在挑战窗口中输入有效的证明会触发对“有效证明”地址(推测为主机)的自动付款。如果在挑战窗口结束时没有提交有效的证明,加密币将被发送到“错过的证明”地址(可能是一个不可靠的地址以抑制DoS攻击;请参阅7.1节)。合约定义了可以错过的最大证明数量;如果超过这个数字,合同变得无效。
如果合约在合约期限结束时仍然有效,则合约成功终止,并将剩余的加密币奖励发送到有效的证明地址。相反,如果在持续时间过去之前合约资金已经用完,或者超过了最大错过证明数量,合约就不会终止,剩余的加密币将被发送到错过的证明地址。
完成或缺少证明会导致属于合约中指定的收件人的新交易输出。证明的输出ID取决于合约ID,定义为:
H(transaction || “contract” || i)
i是交易中合约的索引。证明的输出ID可以从以下方面确定:
H(contract ID || outcome || W[i])
其中W[i]是窗口索引,即自合约形成以来经过的窗口数。outcome是一个字符串文字:无论是“valid-proof”还是“missedproof”,都与证明的有效性相对应。
合约终止的输出ID定义为:
H(contract ID ||outcome)
outcome具有预定义的值“success-fultermination”和“unsucessfultermination”,则与合约的终止状态相对应。
文件合约也是通过“编辑条件”列表创建的,类似于交易的支出条件。如果编辑条件满足,合约可能会被修改。任何值都可以修改,包括合约基金,文件散列和输出地址。由于这些修改可能会影响后续存储证明的有效性,因此合约编辑必须指定一个未来的挑战窗口,以使其生效。
从理论上讲,对等节点可以创建“微编辑渠道”以促进频繁编辑;请参阅小额支付渠道的讨论,第7.3节。
定期提交存储证明交易以履行文件合约。 每个存储证明都针对特定的文件合约。 存储证明不需要任何输入或输出; 只需要一个合约ID和证明数据。
主机通过从文件的Merkle树中提供一段原始文件和一系列哈希来证明它们的存储。 这些信息足以证明该段来自原始文件。 由于证明提交给区块链,任何人都可以验证其有效性或无效性。 每个存储证明使用随机选择的段。 挑战窗W[i]的随机种子由下式给出:
H(contract ID || H(B[i-1]))
其中B[i-1]是紧接在W[i]开始之前的块。
如果主机始终能够证明拥有一个随机段,那么他们很可能会存储整个文件。 只存储50%文件的主机将无法完成大约50%的证明。
随机数发生器可以通过分块攻击来进行操作,在分块攻击中,攻击者阻止分块,直到他们找到一个能产生有利随机数的分块为止。然而,攻击者只有一次机会操纵随机数进行特定挑战。此外,扣留一个块来操纵随机数会使得攻击者获得块奖励。
如果攻击者能够挖掘50%的块,那么可以操纵50%的挑战。但是,其余的50%仍然是随机的,所以攻击者仍然会失败一些存储证据。具体来说,他们将失败的一半,他们会没有扣压的攻击。
为了防止这种攻击,客户可以指定很高的挑战频率,并对丢失的证据进行大量处罚。这些预防措施应足以阻止任何经济动机的攻击者控制网络散列能力的50%以下。无论如何,建议客户围绕潜在的拜占庭攻击进行规划,这可能不会有经济动机。
如果证明交易进入区块链,主机只能完成存储证明。 矿工可能会恶意排除大量存储证据,剥夺交易费用,但会对主机施加惩罚。 另外,矿工可以通过要求大笔费用来包含存储证据来侵占主机,因为他们知道它比平均交易更重要。 这被称为封闭的窗户攻击,因为恶意矿工人为地“关闭了窗户”。
防御措施是使用大窗口大小。 主机可以合理地假设,有一定比例的矿工将包括他们的证明以换取交易费用。 由于主机同意所有文件合约,他们可以自由拒绝任何他们认为容易受到封闭窗口攻击的合约。
每笔交易都有一个任意数据字段,可用于任何类型的信息。 如果任意数据由交易中的任何签名签名,节点将被要求存储任意数据。 节点最初将接受每块最多64 KB的任意数据。
这种随意的数据为主机和客户提供了一种分散的方式来组织自己。 它可用于宣传可用空间或寻找主机的文件,或创建分散的文件跟踪器。
任意数据也可以用来实现其他类型的软分叉。 这可以通过创建“任何人都可以花费”的输出来完成,但是在任意数据中指定了限制。 理解这些限制的矿工可以阻止在不满足必要条件的情况下花费输出的任何交易。 单纯功能的节点将保持同步,而不需要能够解析任意数据。
Sia依赖于一个促进分散存储的生态系统。 存储提供商可以使用任意数据字段向网络宣布他们自己。 这可以使用标准化的模板完成,客户可以阅读。 客户可以使用这些公告创建潜在主机的数据库,并仅与他们信任的人签订合同。
合约需要存储提供商及其客户的同意,允许提供商拒绝不利条款或不需要的(例如非法)文件。 提供者也可能拒绝签署合约,直到整个文件上传给他们。
合约条款为存储提供商提供了一些灵活性。 他们可以宣传自己为最低限度可靠,价格低廉,并同意对丢失文件采取最低限度的处罚; 或者他们可以宣传自己是高度可靠的,提供更高的价格并同意对丢失文件进行更严厉的处罚。 有效的市场将优化存储策略。
主机容易受到拒绝服务攻击,这可能会阻止他们提交存储证明或传输文件。 主机有责任保护自己免受此类攻击。
客户可以使用纠删码,例如重新生成代码[4],以防止主机脱机。这些方法通常通过将文件分成n个片段来操作,使得文件可以从m个独特片段的任何子集中恢复。 (n和m的值根据特定的纠删码和冗余度因素而有所不同。)然后,每个部分都被加密并存储在多个主机中。即使平均网络可靠性较低,这也允许客户端获得较高的文件可用性。作为一个极端的例子,如果只需要100件中的10件来恢复文件,那么客户端实际上依赖于10个最可靠的主机,而不是平均可靠性。通过重新托管主机已脱机的文件,可以进一步提高可用性。其他指标也受益于此策略;客户端可以通过从最近的10台主机下载来降低延迟,或者通过从10台最快的主机下载来提高下载速度。这些下载可以并行运行以最大化可用带宽。
存储证明不包含执行持续正常运行时间的机制。也没有规定要求主机根据请求将文件传输到客户端。然后,人们可能会看到主机把他们客户的档案作为人质并要求高昂的费用来下载它们。但是,如7.2节所述,通过使用删除码可以减轻这种攻击。该策略使客户可以自由地忽略不合作的主机,只与那些合作的主机合作。结果,电力从主机转移到客户,而“下载费用”成为“上传激励”。
在这种情况下,客户为发送文件提供奖励,主机必须竞争以提供最佳的服务质量。客户可随时要求提供文件,以激励主机以最大限度地延长正常运行时间,以尽可能多地收集奖励。客户还可以通过比例更大的奖励激励更大的吞吐量和更低的延迟。客户甚至可以执行随机的“检查”,即使他们不希望下载任何东西,也只是为了上网而奖励主机。但是,我们重申,时间激励不是Sia协议的一部分;他们完全依赖于客户的行为。
预计下载付款将通过预先存在的微支付渠道提供[11]。微型支付渠道允许客户以最小的延迟和区块链膨胀进行连续的小额支付。主机可以传输一小段文件,然后等待接收微支付后再继续。连续多次付款的使用可以让每一方减少被骗的风险。微支付足够小,速度足够快,可以在几秒钟内完成支付,而不会对吞吐量产生任何重大影响。
客户需要一个可靠的方法来选择质量主机。分析他们的历史是不够的,因为历史可能被欺骗。主机可以重复地与自己签订合同,同意存储大量的“假”文件,例如只包含零的文件。在没有实际存储任何内容的情况下对这些数据执行存储证明将是微不足道的。
为了缓解Sybil攻击,客户可以要求在任意数据部分宣布自己的主机也包含大量时间锁定加密币。如果10个加密币在未来14天内被锁定时间,则主人可以说已经创建了一个价值为140个币日的锁。通过支持创建高价值锁的主机,客户可以降低Sybil攻击的风险,因为有价值的锁并非微不足道。
每个客户可以选择他们自己的拣选主机公式,并且可以使用大量因素,包括价格,锁定值,存储容量以及主机为丢失文件而愿意支付的处罚。更复杂的系统,比如那些使用人工评估或其他指标的系统,可以在更集中的环境中实现带外。
Sia是Nebulous Incorporated的产品。 Nebulous是一家盈利性公司,Sia旨在成为公司的主要收入来源。货币预挖并不是一个稳定的收入来源,因为它需要创造一种新货币并将公司的收入与该货币的增值联系起来。当公司需要花钱的时候,它必须交换部分收入来源。另外,预分险意味着一个实体控制了大量货币,因此可能对市场产生巨大的破坏性控制。
相反,Nebulous打算按照与Sia增加的价值成比例的方式从Sia获得收入,这取决于客户和主机之间的合同价值。这是通过对所有合同征收费用来实现的。合同成立后,合同基金的3.9%将被清除并分配给合资基金的持有人。 Nebulous公司最初将持有约。 88%的Siafunds和Sia的早期众筹基金支持者将持有其余的股份。
Siafunds可以发送到其他地址,就像siacoins可以发送到其他地址一样。但是,它们不能用于资助合同或矿工费。当siafunds转移到新地址时,会创建一个额外的未支出输出,其中包含自上次转帐后sia-funds所赚取的所有siacoins。这些siacoins发送到与siafunds相同的地址。
Sia的主要货币是siacoin。 siacoins的供应将永久增加,所有新鲜的供应将作为一个块补贴给予矿工。第一个区块将有30万个siacoin产生。这个数字每块会减少1个siacoin,直到达到每块至少30,000个siacoin。在各区块之间达到10分钟的目标之后,供应年增长率为:
年份 | 1 | 2 | 3 | 4 | 5 | 8 | 20 |
---|---|---|---|---|---|---|---|
增长 | 90% | 39% | 21% | 11.5% | 4.4% | 3.2% | 2.3% |
Sia奖励计划内效率低下。 Sia的主要目标是提供强化存储合同的区块链。但是,最低报酬与所创建合约的总价值间接相关。
特别是最初,siacoin可能具有较高的波动性。如果货币价值在合约中移动,主机可能会受到不利影响。因此,我们预计主机将增加长期合约的价格作为对冲波动的对冲。此外,主机可以以更稳定的货币(如美元)宣传其价格,并在签订合约前立即转换为siacoins。最终,与其他加密资产一起使用双向绑定将为主机提供额外的手段,使自己免于波动。
Sia是比特币协议的一个变体,通过密码合约实现分散的文件存储。这些合约可以用来执行客户和主机之间的存储协议。同意存储文件后,主机必须定期向网络提交存储证据。无论客户端的行为如何,主机将自动获得存储文件的补偿。
重要的是,合约不要求主机在请求时将文件传回客户端。相反,必须创建一个带外生态系统来奖励主机进行上传。客户和主机也必须找到协调的方式;一种机制是区块链中的任意数据字段。已经列举了各种预防措施,有助于缓解Sybil攻击和主机的不可靠性。
Siafunds被用作为负责释放和维护Sia的公司Nebulous Inc.创造收入的机制。通过使用Sia-funds而不是预先分配,Nebulous更直接地将收入与网络的实际使用相关联,并且基本上不受恶意实体可能使用网络货币玩的市场游戏的影响。矿工也可以从siafunds获得部分区块补贴,具有类似的收益。长期来看,我们希望增加对各种货币双向挂钩的支持,这将使消费者能够隔离单一货币的不稳定性。
我们相信Sia将为无信任环境中的去中心化云存储提供一个强大的平台。
[1] Satoshi Nakamoto, Bitcoin: A Peer-to-Peer Electronic Cash System.
[2] R.C. Merkle, Protocols for public key cryptosystems, In Proc. 1980 Symposium on Security and Privacy,
IEEE Computer Society, pages 122-133, April 1980.
[3] Hovav Shacham, Brent Waters, Compact Proofs of Retrievability, Proc. of Asiacrypt 2008, vol. 5350, Dec 2008, pp. 90-107.
[4] K. V. Rashmi, Nihar B. Shah, and P. Vijay Kumar, Optimal Exact-Regenerating Codes for Distributed Storage at the MSR and MBR Points via a Product-Matrix Construction.
[5] Adam Back, Matt Corallo, Luke Dashjr, Mark Friedenbach, Gregory Maxwell, Andrew Miller, Andrew Peolstra, Jorge Timon, Pieter Wuille, Enabling Blockchain Innovations with Pegged Sidechains.
[6] Andrew Poelstra, A Treatise on Altcoins.
[7] Gavin Andresen, 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 consumption costly. 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#Example 7: Rapidly-adjusted .28micro.29payments to a pre- determined party
[12] Bitcoin Developer Guide, https://bitcoin.org/en/developer-guide