源石币是一种具有无限可扩展性和零交易费用的、低延迟的、分布式加密货币
特性:去信任化、0交易费、低延迟
1 理解
RaiBlocks 是一个可扩展的、去信任化的、零交易费的、低延迟的分布式加密货币。
目前,高需求和有限的可扩展性增加了普通加密货币的平均交易时间和费用,产生了不尽人意的体验。在这里源石币是一种基于区块点阵(BlockLattice)结构的新型加密货币,其中每个账户都有自己的区块链,提供近乎瞬时的交易速度和无限的可扩展性。每个账户(即地址)都有自己的区块链,允许他们异步地更新到网络的其余部分,从而以极小的资源开销获得快速的交易确认。交易记录帐户余额而不是交易金额,使得系统可以在不牺牲安全性的情况下进行大幅度的数据库修剪。到目前为止,RaiBlocks 网络已经处理了420 万笔交易,这个数据库账本在未进行修剪的情况下只有 1.7GB 的大小。RaiBlocks 的无交易手续费、瞬时交易特性使其成为消费交易领域的最优加密货币。
它与比特币相比的特点是,技术上采用区块链点阵结构,使得每一个账户都拥有自己的区块链(即账户链)。使用 DPos 投票机制达成共识。同时也是用 Pow,但是这里使用 Pow 的目的与比特币不同,比特币是进行挖矿式的工作量证明,每挖一次矿大约需要10 分钟,由此避免出现双花等问题。原石币主要是用 Pow 来作为减少网络垃圾交易的工具,类似于 Hashcash。Pow 的工作量难度基本保证在几秒中完成。目前 Pow 的阈值是固定的,未来有考虑支持自适应阈值。
RaiBlocks 的关键组件包括交易、区块、账号、账本、节点,其中交易分四种类型:open、send、receive、change。
在这里区块和交易可以在一定程度上等价,因为一个区块只包含一笔交易,这也是与比特币不同的地方(比特币一个区块可以有多笔交易)。
每次交易都会有发送块和接受块,发送者签署发送块,接收者签署接收块。由接收块来决定每笔转账的优先的顺序;同时每个节点不关心该账号的完整历史交易记录,只关心最新的余额。
这样有几点优势:
1. 接收者总是维护一个最新的余额,可以保证随时可以以固定大小的数据交易任何金额(最小 UDP 包)
2. 如果节点对历史交易不感兴趣,只对最后余额感兴趣,这样可以在保持正确性的同时丢弃历史数据
2 技术详解
2.1 技术创新
目前,高需求和有限的可扩展性增加了普通加密货币的平均交易时间和费用,产生了不尽人意的体验。在这里源石币是一种基于区块点阵(BlockLattice)结构的新型加密货币,其中每个账户都有自己的区块链,提供近乎瞬
1. 区块链点阵(BlockLattice)结构:每个账户都有自己的区块链,即账户链
2. 每个账户(即地址)都有自己的区块链
3. 每一个区块只包含一笔交易
3. DPos 投票机制解决分叉
4. 非挖矿式的 Pow
在这里,Pow 主要是为了减少网络垃圾交易,而非挖矿式的工作量证明。 目前 Pow 阈值是固定的,但由于平均计划能力的逐年提升,将来可能会应用自适应阈值。
3.2 术语
1. 初始化交易
2. 初始金额
3. 最小 UDP 数据包
4. 传入交易类别:已结算交易、未结算交易
3.3 共识
RaiBlocks 通过余额权重对冲突交易的投票达成共识。这个共识体系提供了更快、更确定的交易,同时保持强大的,去中心化的系统。
3.3.1 RaiBlocks 组件
1. 账户
账户是数字签名密钥对的公钥部分。公钥也被称为地 址,而私钥则保密。数字签名的数据包确保内容得到私钥 持有者的认可。一个用户可以控制多个帐户,但每个帐户 只能有一个公共地址。
2. 交易/区块
“区块”和“交易”两个术语通常可以交替使用,一个块包含一个交易。交易特指动作,而区块特指交易的数字编码。交易由执行交易的帐户的私钥签名。(比特币里 交易和区块不能交替使用,一个区块可以包含多笔交易)
3. 账本
账本是一个全局集合,每个账户拥有自己的交易链。这是一个关键的组件,其使用设计时协议取代运行时协议;通过签名检查,每个人都同意只有帐户所有者可以修改自己的链。这将看似共享的数据结构(分布 式账本)转换为一组非共享数据结构。
4. 节点
节点是在计算机上运行的一个软件,它服从 RaiBlocks 协议并参与 RaiBlocks 网络。该软件管理着账本和节点可能控 制的任何账户(如果有的话)。一个节点可以存储整个账本或者只存储每个账户的最后几个区块的修剪历史记录。 建立新节点时,建议验证整个历史记录并在本地修剪。
3.3.2 系统总览
1. 交易
在发送方和接收方的账户中将金额作为单独的交易进行转账有以下几个重要目的:
1) 对固有的异步传入转账进行排序。
2) 保持交易小到可以放进 UDP 数据包。
3) 通过最小化数据足迹来促进账本修剪。
4) 将已结算的交易与未结算的交易分开。
多个账户转账到同一目标账户是异步操作;网络延迟和发送账户不一定相互通信意味着没有普遍适用的方法来知道哪一个交易首先发生。由于加法是混合运算,输入序列的顺序并不重要,因此我们只需要一个全局协议。这是将运行时协议转换为设计时协议的关键设计组件。接收账户可以决定哪一笔转账率先到达,并且由传入块的已签名顺序来表示。
问题:为什么这里只有加法,没有减法呢?
因为对于接收方来说只有加法,没有减法,接收方可以决定收到的转账的顺序和优先级
如果一个帐户想要进行一笔大额转账,而这笔金额本身是通过接收很多笔小的转账而得到的,我们想用一个适合 UDP 包的方式来表示这个转账。当一个接收账户对输入数据进行排序时,它会实时保持一个账户的总额,以便在任何时候都能够以固定大小的数据交易任何金额。这与比特币等其他加密货币使用的输入/输出交易模型不同。
一些节点对花费资源来存储账户的完整交易历史不感趣。他们只对每个账户的当前余额感兴趣。当账户进行交易时,会对其累计余额进行编码,这些节点只需要跟踪最新的块,这样可以在保持正确性的同时丢弃历史数据。
即使重点关注设计时协议,由于需要识别和处理网络中的不良参与者,验证交易时也会有一个延迟窗口。由于 RaiBlocks 中的协议快速达成(约为毫秒级到秒级),我们可以向用户展示两个相似的传入交易类别:已结算交易和未结算交易。已结算交易是帐户已经为其生成接收块的交易。未结算交易尚未纳入接收方的累计余额。这是对其他加密货币中复杂、不直观的确认度量的替代。
2. 创建账户
要创建一个账户,需要生成一个初始化交易
account:存储用于签名的私钥锁派生的公钥(地址)
source:包含发送资金的交易的哈希值
创建账户时,必须选择一位可以代你投标的代表,代表可以后面修改,可以声明自己作为代表。
3. 账户余额
帐户余额记录在帐本本身内。系统通过检查发送块的余额和前一个块的余额之间的差额来进行验证,而不是通过记录交易金额的方式。接收账户然后可以将之前的余额增加,并将其作为最终余额记录到新的接收块中。 这是为了提高下载大量区块时的处理速度。在请求帐户历史记录时,金额已经给出。
4. 从账户发送交易
要从一个地址发送,地址必须有一个已经存在的初始区块,因此有一个余额。previous 字段包含帐户链中前 一个块的哈希值。destination 字段包含要发送到的帐户。 一个发送区块被确认后是不可变的。一旦广播到网络, 资金立即从发送方的帐户的余额中扣除,并处于等待接收的状态,直到接收方签署一个区块接受这些资金。等待接收不应被视为等待确认,因为资金相当于已经被发送方使用,发件人无法撤销交易。
previous:包含账户链中前一个块的哈希值。destination:包含要发送到的账户
一个发送区块被确认后是不可变的。一旦广播到网络,资金立即从发送方的账户余额中扣除,并处于等待接受的状态,直到接收方签署一个区块接受这些资金。等待接收不应被视为等待确认,因为资金相当于已经被发送方使用,接收方无法撤销交易。
5. 接收交易
source:引用关联的发送交易的哈希值。
要完成一笔交易,接收方必须在自己的账户链上创建一个接收区块来接收资金。一旦创建并广播了该区块,账户余额就会更新,并且资金已经正式转入接收方账户。
6. 制定代表
账户持有人有能力选择代表为其进行投票,这是一个强大的去中心化工具,在工作量证明(PoW)或权益证明(PoS)协议中没有能与之相提并论的机制。在传统的 PoS 系统中,账户拥有者的节点必须运行参与投票。连续运行节点对许多用户来说是不切实际的,给予代表权力代表一个帐户投票放宽了这一要求。账户持有人有权随时重新分配共识给任何账户。变更交易通过从旧代表中减去投票权重并将权重添加到新代表处来改变账户的代表。这笔交易中没有资金被转移,代表也没有账户资金的消费权。
7. 分叉和投票
由于只有账户的所有者才有能力在他们的账户链上签名,所以一个分叉必然是账户所有者糟糕的变成或恶意意图(双花)造成的。 一旦检测到,代表将创建一个投票,在其账本中引用块块 bi ,并将其广播到网络。
1)节点投票的权重 wi :指其代表的所有账户余额的总和。
2)节点将观察来自其他 M 个在线代表的投票,并保持总计1分钟的4个投票期的累积计数,并确认获胜方。
3)投票多的块将被保留在该节点的账本中。投票少的区块将被丢弃。
4)如果代表取代了账本中的一个区块,它将创建一个更高序列号的新投票,并将新的投票广播给网络。这是代表投票的唯一使用场景。(疑问待解决:谁检查到?哪些节点投票?)
备注:某些情况下,短暂的网络链接问题可能导致一个广播不被所有节点接受。这个账户的任何后续块将被那些最初没有看到广播的节点忽略。这个块的重播将被其余节点接受,随后该块将被自动检索。即使出现分叉或缺失块,也只影响交易中引用的账户。网络的其余部分继续处理所有其他账户的交易。
8. 工作量证明
所有四中交易(创建、发送、接受、change)work 字段允许交易类型都有一个随机数,使得该随机数的哈希值与接受/发送/变更交易中的 previous 字段或初始化交易中的 account 字段串联计算后低于某个阈值。
与比特币不同的是,RaiBlocks 中的 Pow 被简单地用作反垃圾交易工具,类似于 Hashcash,耗时约为几秒。一旦发送了一个交易,由于之前的块的 previous 字段是已知的,所以可以预先生成后续块所需的 Pow,只要两笔交易之间的时间大于生成 Pow 所需的时间,用户的交易将在瞬间完成。(可以理解为“准瞬时”么?)
9. 交易验证
对于被认为合法的区块,必须具备以下属性:
1)区块不能已经存在与账本中(重复交易)
2)必须有账户所有者签名
3)前面的块是账户链的头块。如果它存在但不在头部,那么这是一个分叉(这里存在歧义)
4)账户必须有一个初始化区块
5)计算的哈希值符合 Pow 阈值要求
6)如果是一个接收块:检查源区块哈希值是否处于待完成状态,这意味着它尚未被兑付
7)如果是一个发送区块:余额必须小于之前的余额
10. 攻击途径
区块间隙同步、泛滥交易、sybil 攻击、Penny-Spend 攻击、预先生成 Pow 攻击、> 50% 攻击、引导中毒
3.3.3 实现
设计特性
1. 签名算法
用于所有的数字签名
1)ED25519 椭圆曲线算法(具有快速签名、快速验证、高安全特点)
2)Blak2b 哈希算法
2. 哈希算法
用于防止网络垃圾交易,与基于挖矿的加密货币相比,算法的选择并不那么重要。 Blak2b 哈希算法,作为对块内容的摘要算法。
3. 秘钥生成功能:Argon2(防止 ASIC 破解)
4. 区块间隔:由于每个账户都有自己的区块链,更新可以通过网络异步执行。因此不存在区块间隔,交易可以立即广播。
5. UDP 通信协议
1)系统被设计为:尽可能使用最少的计算资源来无限期地运行:系统中所有消息被设计为无状态,并且能容纳进单个 UDP 数据包。这也是的具有间断连接性的轻节点更容易地参与到网络中,而不需要重新建立短期的 TCP 链接。
2)TCP 链接仅在新的节点想要大量引导区块的时候建立。 通过观察来自其他节点的交易广播流量,节点可以确定它的交易已有网络接收,因为它应该看到多个副本会送给自己。
6. IPV6 多播
基于无连接 UDP 协议的构建,使未来的实现可以使用 IPv6 多播来替代传统的泛滥交易和投票广播。这将减少对网络带宽的消耗,并给予运行节点带来更多的策略灵活性。