Sia的共识规则(3) --- 交易

版权声明:本译文为博主原创翻译文章,未经博主允许不得转载。

交易(Transactions)

一个交易(Transaction)主要由以下几个对象组成:

  • 云储币输入(Siacoin Inputs)
  • 云储币输出(Siacoin Outputs)
  • 文件合约(File Contracts)
  • 文件合约修订(File Contract Revisions)
  • 存储证明(Storage Proofs)
  • 云储基金输入(Siafund Inputs)
  • 云储基金输出(Siafund Outputs)
  • 矿工酬劳(Miner Fees)
  • 任意数据(Arbitrary Data)
  • 交易签名(Transaction Signatures)

所有云储币输入(siacoin input)的总和必须等于所有矿工酬劳(miner fee)、云储币输出(siacoin output)和文件合约支出(file contract payout)的总和,没有剩余。所有云储基金输入(siafund input)的总和必须等于所有云储基金输出(siafund output)的总和。

在上述的某几个对象中存在解锁散列值(unlock hash)。解锁散列值是“解锁条件(unlock condition)”对象的Merkle树根节点。解锁条件包含一个时间锁(timelock)、若干必需的签名以及可在签名期间使用的一组公钥。

解锁条件(unlock condition)对象的Merkle树根节点,是由时间锁(timelock)、公钥(每个公钥对应1个叶子节点)以及签名的数量所构成的Merkle树的根节点。这种排序是特别选择的,因为时间锁(timelock)和签名的数量是低熵的。通过使用随机数据作为第一个和最后一个公钥,可以安全地暴露任何公钥,而不暴露低熵项。

需要提供足够多的签名,并且区块链的高度至少等于时间锁(timelock)的值,才能满足解锁条件(unlock condition)。

解锁条件(unlock condition)包含一组公钥,每个公钥只能在提供签名时使用一次。相同的公钥可以被包含两次,这意味着它可以使用两次。所需签名的数量指示必须使用多少公钥来验证输入(input)。如果所需的签名数量为“0”,则输入(input)是“任何人都可以消费”。如果所需的签名数量大于公钥的数量,则输入(input)是不可消费的。

签名数量必须有足够多的。例如,如果存在3个公钥和仅2个所需的签名,则只有2个签名可以被包含在交易中。

云储币输入(Siacoin Inputs)

每个输入(input)消费一个输出(output)。所消费的输出(output)必须存在于共识集合(consensus set)中。输出(output)的”value”字段显示在交易(Transaction)的输出(output)中必须使用多少个云储币。有效的输出是矿工酬劳(miner fee)、云储币输出(siacoin output)和文件合约支出(file contract payout)。

云储币输出(Siacoin Outputs)

云储币输出(siacoin output) 包含一个币值和一个解锁散列值(unlock hash)(也称为币址)。解锁散列值是消费条件的Merkle树根节点,消费条件必须被满足才能消费此输出(output)。

文件合约(File Contracts)

文件合约是某方用以证明在某给定的时间点拥有某文件的一种协议。合约包含被存储数据的Merkle树根节点,以及被存储数据的字节大小。

通过将文件分割成64字节的数据段,并对每个数据段进行散列以形成Merkle树的叶子结点,从而构成Merkle树根节点。最后一个数据段不补齐(padded out)(译者注:指64字节补齐)

存储证明(storage proof)必须在合约中的“WindowStart”与“WindowEnd”字段所代表的区间内提交。合约中存在一个“支付(payout)”金额,它表示在提交存储证明时提供多少个云储币。该支付金额的3.9%(向下舍入到最接近的10,000)将被抽取给云储基金的所有者。如果存储证明(storage proof)被提供且有效,则剩余的支付金额被放入可由“有效证明消费散列(valid proof spend hash)”消费的输出(output)中;如果在“WindowEnd”之前没有向区块链提供有效的存储证明,则剩余的支付金额被放入可由“缺失证明消费散列(missed proof spend hash)”消费的输出(output)中。

所有的合约都必须有一个非零的支付金额(payout),“WindowStart”必须在“WindowEnd”之前,’WindowStart’必须大于区块链的当前高度。在高度为“WindowEnd”的区块中提交存储证明是可以被接受的。

文件合约创建时包含了一个“修订散列(Revision Hash)”,它是一个解锁条件(unlock condition)对象的Merkle树根节点。提交满足解锁条件对象的“文件合约修订”,使文件合约被替换成修订中所指定的新文件合约。

文件合约修订(File Contract Revisions)

文件合约修订可以修改一个文件合约。文件合约具有一个修订号,提交给区块链的任何修订必须具有更高的修订号才是有效的。除了支付(payout)字段之外,文件合约中的任何字段都可以更改,即:在修订中无法向文件合约中增加或减少云储币,虽然可以更改成功或不成功的存储证明的目标(destination ???)。

文件合约修订的最大的应用场景是提供文件内容变更的一种渠道,即:当用户向托管主机(host)上传新的或不同的内容时,文件合约可以在区块链外(off-blockchain)被编辑许多次。这提高了Sia的整体可伸缩性。

存储证明(Storage Proofs)

一个存储证明交易是包含存储证明(storage proof)的任何交易。存储证明交易不允许有云储币或云储基金输出,并且不允许包含文件合约。

当创建存储证明(storage proof)时,只需证明您有一个64字节的文件段。需要被证明的这一文件段使用文件合约id和’触发区块(trigger block)’的id来随机挑选。触发区块(trigger block)是高度为“Start”-1的区块,其中“Start”是履行此存储证明的文件合约中的字段“Start”的值。

该文件由若干64字节的段组成,其散列构成Merkle树的叶子节点。当证明你拥有文件时,必须证明你有一个叶子节点。为了确定是哪个叶子节点,取文件合约id连接触发区块(trigger block)id的散列值,然后取其与段数量的模:

Hash(文件合约id + 触发区块id) % 段数量

存储证明是通过提供64字节的段形成,然后其余的散列值需要被填充直至填满整棵树。存储证明的总大小将是64字节 + 32字节 * log(段数量),并且可以由知道根散列值和文件大小的任何人来验证。

存储证明交易是不允许有云储币输出、云储基金输出,或文件合约。由存储证明创建的所有输出不能在后续50个区块之内使用。

这种限制是适当的,因为简单的区块链重组可以更改触发区块(trigger block),这将使存储证明无效,导致整个交易无效。这使得双重消费攻击(double spend attack)和虚假消费攻击(false spend attack)变得更加容易的。

云储基金输入(Siafund Inputs)

云储基金输入的工作原理类似于云储币输入。它包含将要消费的云储基金输出的id,以及消费此输出所需的解锁条件。

当把云储基金输出用作输入时,将会创建一个特殊的输出。云储基金中自上次消费以来累积的所有云储币,都被发送到云储基金输出中的“索取消费散列(claim spend hash)”,这是一个正常的云储币地址。通过在创建输出时取出云储币池的大小并将其与云储币池的当前大小进行比较来确定云储币输出的值。方程是:

((当前云储币池大小 - 先前云储币池大小) / 10,000) * 云储基金数额

像矿工输出和存储证明输出一样,一旦区块链重组,输出的值可能会改变,因此云储基金输出不能在后续50个区块之内使用。然而,重组不会导致交易失效,因此不需要制定有关合约与输出的禁令。

云储基金输出(Siafund Outputs)

像云储币输出一样,云储基金输出包含一个值和一个解锁散列。该值表示被放到输出中的云储基金数额,并且解锁散列是输出被消费的解锁条件对象的Merkle树根节点。

云储基金输出还包含一个索取解锁散列(claim unlock hash)字段,其指示在云储基金输出被消费时创建的云储币输出的解锁散列。所创建的输出的值将取决于在输出创建时点与消费时点之间的云储币池的增长。通过存储“索取开始(claim start)”来测量这种增长,该索取开始(claim start)表明在创建云储基金输出的时点的云储基金池的大小。

矿工酬劳(Miner Fees)

矿工酬劳是添加到区块补贴中的一定数量的云储币。

任意数据(Arbitrary Data)

任意数据是一组被共识集合忽略的数据。将来可以用于软分叉,与“任何人都可以消费”的交易相匹配。同时,它给第三方应用程序使用云储币区块链提供了一种简便的方法。

交易签名(Transaction Signatures)

每个签名指向单个解锁条件(unlock condition)对象中的单个公钥索引。对于同一组解锁条件,不存在两个签名同时指向相同的公钥索引。

每个签名包含一个时间锁(timelock),签名在区块链达到时间锁指定的高度之前是无效的。

签名还包含一个“涵盖字段(covered fields)”对象,其指示交易的哪些部分包括在签名中。还有一个“全部交易(whole transaction)”标志,它指示除了签名之外,交易的每个部分都被包括在签名中,这消除了交易中签名之外的任何部分的可延展性。交易的签名字段也可以被单独包含,以强制指定此签名仅在某些其他签名存在时才是有效的。

如果未设置全部交易(whole transaction)标志,则需要(向签名的涵盖字段(covered fields)对象中)手动添加所有相应的字段,并且其他方也可以添加新字段,这意味着交易将是可延展的。这允许其他方在您签署交易后添加额外的输入(input)、酬劳(fee)等,而不会使您的签名失效。如果设置了全部交易(whole transaction)”标志,则涵盖字段(covered fields)对象中,除签名字段外的所有其他元素必须为空。

涵盖字段(covered fields)对象包含交易的每个元素的索引切片(云储币输入、矿工酬劳等)。切片必须排序,并且不能有重复的元素。

完全不可延展的交易可以通过设置“全部交易(whole transaction)”标志,然后提供最后一个签名,包括签名中(译者注:应该是交易中???)的所有其他签名。由于不允许无意义的签名,在此签名无效前,交易无法被更改。

(完)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值