存储与查询

总览

对存储层与网络查询层来说,每个节点都被视为一个本地节点,通过异步的方式来访问租借存储区域的数据库。不过实际上,存储与查询是完全分离的,共同服从于共识算法。根据区块链固有的微交易能力,RChain上的dApp用户使用代币来支付他们使用的区块链资源(计算,内存,存储和网络)。在RChain的设计中,所有的数据会被存储,只不过并不是所有的数据都是永远存储的。RChain的数据存储区域是可以租借的,存储资源的价格由数据的大小,复杂度,存储时长决定。消费者每次访问数据都可能被要求付费。数据的生产者以及消费者间接地向RChain节点的运营者付费。

从经济学的角度来看,租赁存储空间时用户必须付费是合理的。否则用户的数据很难被可靠地或永久地存储。我们选择直接定制经济规则。假设存储是免费的,仅通过一些不相关的措施来补贴存储的开销,这并不是一个环境友好型的想法。真实成本的其中一小部分可以在数据中心的热签名中测量出来。对数据访问需要付费的机制也有利于减少针对于存储的攻击,即存储非法的内容来抹黑相关技术。

RChain支持多种格式的数据,包括公开未加密的json格式的数据,加密的大文件或者混合的数据格式。这些数据可以是简单的指针或是存储于私有/公有/联盟链中的内容哈希。

数据语义

状态数据、本地交易记录以及相关的合约数据将会被存储在RChain区块链上。与以太坊类似,RChain也将实现加密-经济型的可验证的交易语义,以便于创建在区块链上进行运算的线性时间历史记录。请注意,区块链语义结构下的数学被称作可追溯的范畴论。如果想了解更多的细节,请参阅Masahito Hasegawa发表的该主题的论文Recursion from Cyclic Sharing:Traced Monoidal Categories and Models of Cyclic Lambda Calculi。

数据访问层以及领域专属语言

SpecialK是用于数据访问的DSL,而KVDB是DSL背后的分布式内存数据结构。SpecialK以一致的方式定义了分布式数据访问模式,如下所示:

  数据项级别的读写(分布式锁定) 数据库读写 消息发布与订阅 历史信息发布与订阅
数据 暂时的 持久化的 暂时的 持久化的
**连续(K)**[1] 暂时的 暂时的 持久化的 持久化的
**生产者动作**[2] 放置 存储 发布 携带历史发布
用户动作 获取 读取 订阅 订阅

SpecialK的数据访问模式图

从SpecialK的DSL和API角度来看,当它执行一个数据访问动作,比如Get(带有一个请求模式)请求时,对于这个数据是存储在本地还是在远程(即存储在其他网络节)是不做区分的。无论如何都有一个单一的查询机制。

在2016年之前,SpecialK的技术栈(包括代理服务,SpecialK,KV数据库,RabbitMQ以及MongoDB)提供了一个分散的内容交付网络,尽管它不是资源计量或者资源货币化的方式。SpecialK和KVDB组件基于底层数据库MongoDB以及一个优化的消息队列协议(ZeroMQ),以创建用于存储和检索内容(包括本地和远程内容)的去中心化逻辑。目前SpecialK和KVDB的1.0实现都是用Scala编写的。

查询语义根据体系结构中相关的级别而有所不同。在SpecialK级别,键值是prolog表达式,该表达式可以通过datalog表达式进行查询。在架构级别,标签的prolog表达式用于存储,标签的datalog表达式用于查询。在RChain中,SpecialK和KVDB层将用Rholang重新实现(与先前在Scala中的定制实现有界连续和代码序列化的实现有所不同)。

更多相关信息,请参阅SpecialK&KVDB - 一种Web的模式语言。

KVDB - 数据,连续访问和缓存

数据将使用SpecialK语义进行访问,存储在去中心化的键值数据库(KVDB)中。下图显示了两个节点如何协作响应一个GET请求:

../_images/specialk.png

SpecialK的去中心化数据访问方式

  1. 节点首先在内存缓存中查找所请求的数据。如果没有在缓存中命中,
  2. 在本地存储中进行查询,如果没有命中,则在该位置存储一个定界符
  3. 在网络中进行查询,如果在网络中查找到了合适的值,定界符将在范围内返回并且将检索到的数据作为参数返回。

为什么RChain没有选择分布式存储的IPFS(星际文件系统)?除了存在集中化风险之外,IPFS使用内容路径来访问内容,而SpecialK使用完整树来访问内容。IPFS有一个直观的路径模型,但是这个设计存在如何进行查询的问题。 SpecialK从寻址开始。一旦SpecialK查询语义设计完成,RChain项目还可以借鉴IPFS的成果,例如利用哈希来完成内容的路由。SpecialK还可以利用一个随机生成的数据无关的键。

P2P节点通信

SpecialK去中心化存储语义需要节点通信的基础设施。与其他去中心化实现相似,在RChain中P2P通信组件还是处理节点的发现、节点间的信任以及节点间的通信等问题。现在的实现方案采用了基于RabbitMQ的P2P架构,尽管我们同时也在考虑是否采用ZeroMQ。

[1]请注意,按照惯例,一个连续函数会被当作一个参数名为k的参数。
[2]这只是这个功能分解下动作的一个子集。例如fetch动作,在没有数据的情况下,在数据检索过程中不会留下任何有界连续信息。