Sia的共识规则(1) --- 加密算法、货币与数据编码

来源:互联网 发布:端口被屏蔽怎么办 编辑:程序博客网 时间:2024/06/14 16:08

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

共识规则(Consensus Rules)

本文档旨在从较高层次对Sia的加密体系进行良好的概述,并不会完全阐述所有的细枝末节。对共识规则最精准的说明需要参照共识包(译者注:consensus package,源代码存在于sia/modules下)(以及所有依赖库)。

如果您对区块链工作量证明(PoW: Proof of Work) 已有一般性的了解,而不是还需要尝试从最初级的原理开始着手的话,理解本文档的内容将会更容易一些。

加密算法(Cryptographic Algorithms)

Sia使用加密散列(cryptographic hashing)和加密签名(cryptographic signing),两者均有许多潜在的安全的算法可供选择使用。不可否认的是,我们对此缺乏足够经验,我们选择这些算法并非源于我们自身对这些算法特性的信心,而是因为其他人似乎对其抱有信心。

  • 对于散列算法,我们主要的关注点是使用的算法不能与比特币(Bitcoin)进行合并挖掘,哪怕只是一部分。次要的关注点是包括手机和其他低功率设备在内的消费者硬件上的散列速度。

  • 对于签名算法,我们的主要的关注点是签名校验的速度。次要的关注点是能够支持HD密钥。第三位的关注点是支持阈值签名。

散列算法: blake2b

选择blake2b作为散列算法是因为它是快速的,并且它的代码经过大量地审核,足够坚固到可以抵抗长度扩展攻击(length extension attack)。

blake2b的另一个特别重要的特征是,它不是SHA-2。我们希望避免与比特币进行合并挖掘,因为这可能导致许多比特币矿工漠然地挖掘我们的区块链,从而使软分叉(soft fork)更加难以协调。

签名算法: 可变类型签名(variable type signature)

每个公钥均具有一个说明符(specifier)(一个16字节的数组)和包含公钥编码(encoding)的字节切片(byte slice)。说明符用来指定在校验签名时使用哪个签名算法。每个签名将是一个字节切片,其编码可以通过查看相应公钥的说明符来确定。

这种方法可以轻松地将新的签名类型添加到货币(currency)中,且不会使现有的输出(output)和键(key)无效 。添加新的签名类型需要硬分叉(hard fork),但可以作为一种保护机制以防加密算法被破解的情况,并且如果在诸如校验速度、环签名(ring signature)等领域中有任何突破,也很容易移植到新的加密算法上。

可选算法:

  • ed25519: 说明符必须匹配字符串“ed25519”。公钥必须被编码为32字节。签名和公钥将需要遵循ed25519规范。更多的信息可以在ed25519.cr.yp.to找到。

  • entropy: 说明符必须匹配字符串“entropy”。签名将始终无效。这提供了一种方式,可以将熵缓冲区(entropy buffer)添加到SpendCondition对象以保护低熵信息,同时又能够证明熵缓冲区是无效的公钥。
    (译者注:这一段好晕,需要进一步研究之后再加工)

添加ECDSA secp256k1和Schnorr secp256k1算法也在计划之中。新的签名算法能够通过一个软分叉添加到Sia,因为无法识别的算法类型总是被认为具有有效的签名。

货币(Currency)

Sia加密体系下有两种类型的货币。第一种是云储币(siacoin)。云储币在每个区块中产生并分发给矿工们。然后,这些矿工可以使用获得的云储币为文件合同提供资金,或者可以将云储币转送给其他人。云储币由一个无限精度无符号整数所表示。

Sia加密体系中的第二种货币是云储基金(siafund),它是一种限制在10,000个不可分割单位的特殊资产。每次进行文件合同支付(payout)时,支付金额的3.9%被放入云储基金池中。在云储基金池中的云储币的数量必须总是可以除以10,000,从文件合同支付中取出的云储币数量将向下舍入到最接近的10,000。云储基金也是由一个无限精度无符号整数所表示。

云储基金所有者可以在云储基金池收集云储币。云储基金池中每增加10,000个云储币时,云储基金的所有者可以提取1个云储币。约8790个云储基金由Nebulous Inc.拥有,剩余的云储基金由Sia项目的早期支持者拥有。

未来有计划使Sia兼容侧链(sidechain)。这将允许其他货币,例如比特币,可以适用于云储币流通的所有相同的地方。

数据编码(Marshalling)

许多Sia的数据类型需要在某些场合进行散列,这就需要一个一致的算法,用于将这些类型的数据编码为可以被散列的字节数组。散列规则如下:

  • 整数是小字节序(little-endian),总是被编码为8字节。

  • 布尔被编码为一个字节,其中0为假,1为真。

  • 诸如字符串的可变长度类型,前置8个字节的数据长度。

  • 数组和结构体中的元素各自被编码并连接在一起。结构体中元素的顺序由结构体定义确定。仅有一种方法来编码每个结构。

  • 货币类型(无限精度整数)编码为大字节序(big-endian),使用尽可能多的必要的字节来表示底层数字。由于它是一个可变长度类型,它以8个字节的数据长度为前缀。


(未完待续)

0 0
原创粉丝点击