Catena 是一个基于区块链的分布式数据库,可以使用 SQL 进行访问。Catena 以去中心化的方式在互不信任或无法互相信任的节点之间为数据库事务 (SQL) 添加时间戳,同时强制执行先前商定的修改权限(“授权”)。
Catena 区块链包含 SQL 事务,这些事务按顺序执行时,将导致数据库达到商定的状态。这些事务会自动复制到参与客户端、由其验证并在其上重放。客户端应用程序可以使用 PostgreSQL wire 协议 (pq) 连接到 Catena 数据库。
只有修改数据或结构的 SQL 语句才会包含在区块链中。这与例如 MySQL(“binlog”)使用的复制日志非常相似。
Catena 可以在 macOS 上构建。您的系统需要安装最新版本的 XCode(>=8.3.2)。使用以下命令克隆 Catena 仓库并在调试配置中构建
git clone https://github.com/pixelspark/catena.git catena
cd catena
swift build
也可以生成一个 XCode 项目并从中构建 Catena
swift package generate-xcodeproj
完全支持在 Linux 上构建。要构建,首先确保已安装 Swift 4 并已添加到 PATH 环境变量中。然后确保 clang 和所需的库已安装。
apt install clang build-essential libicu-dev libcurl4-openssl-dev openssl libssl-dev
git clone https://github.com/pixelspark/catena.git catena
cd catena
swift build
以上内容已在安装 Swift 4 的 Ubuntu 16.04 以及 Debian Stretch 上测试通过。
注意:由于 Swift 中没有跨平台的 WebSocket 客户端实现(当前实现使用 Starscream),因此 Linux 客户端不支持出站对等连接。入站对等连接是可能的,客户端可以使用它“回话”,因此无论如何客户端都是可用的。
Docker 镜像可在 Docker Hub 上获取。要从源代码构建 Docker 镜像(例如,如果您没有/无法在本地安装 Swift,这将非常有用)
git clone https://github.com/pixelspark/catena ./catena
cd ./catena
docker build -t pixelspark/catena .
Catena 包含一个 Web 客户端,资源位于 Resources/
文件夹中。已包含 Web 客户端的已构建版本。要从头开始构建,请首先安装所需的构建工具,然后使用 gulp 编译和打包文件
cd Resources/
npm install
gulp
使用 gulp watch
可以让 gulp 在文件更改时重新编译文件。
以下命令启动 Catena 并初始化一个新的链(在构建发布版本后,将“debug”替换为“release”)
./.build/debug/Catena -p 8338 -m -i -s 'my seed string'
-i 开关告诉 Catena 初始化一个链(这将删除任何持久化数据,默认情况下数据存储在当前目录的 catena.sqlite 中)。-s 开关为 Catena 提供一个字符串,告知它要接受哪个创世区块。要启用区块挖矿,请添加“-m”命令行开关。
要在本地启动另一个对等节点,请使用以下命令
./.build/debug/Catena -p 8340 -s 'my seed string' -j ws://NODEID@127.0.0.1:8338 -d peer2.sqlite
注意,上面命令中的节点 URL 可以从第一个节点的输出中复制。引导启动只需要一个节点(节点将执行对等交换)。
docker pull pixelspark/catena
docker run -p 8338:8338 -p 8339:8339 pixelspark/catena [ARGS]
注意:Catena 在容器内监听的端口号必须等于容器外部使用的端口号(因为 Catena 会将其通告给对等节点)。
Catena 在端口 8338(默认)上提供了一个 Web 界面,可用于内省区块链和执行查询。它还在同一端口上提供了一个 WebSocket 服务,用于对等节点之间的通信。提供 --no-web-client 命令行选项可以禁用 Web 客户端和相关的 API(请注意,当前公开的 API 不允许任何更改操作)。
(私有的)SQL 接口在端口 8339(默认)上可用。如果您设置了不同的 HTTP 端口(使用“-p”命令行开关),则 SQL 接口将假定端口为 port+1。您可以使用 PostgreSQL 命令行客户端连接到 SQL 接口
psql -h localhost -p 8334 -U random
您的用户名应该是公钥(由 Catena 生成),密码是私钥。当初始化新链(使用 -i 选项)时,Catena 将打印“root”用户的公钥和私钥,并且还会打印一个 psql 命令行供您以 root 用户身份连接。
默认情况下,任何用户都可以执行 CREATE DATABASE
语句;这将创建一个数据库,调用者将成为该数据库的所有者。调用者随后可以使用 GRANT
和 REVOKE
语句来授予其他用户对数据库的权限。
可以使用模板授权来授予更细粒度的权限。这些授权允许用户使用自行选择的参数值执行特定的参数化查询。模板查询被哈希并存储在授权表中。任何查询的哈希值(删除参数值后)与授予用户的模板哈希值匹配的查询都可以执行。模板授权可以通过 Web 客户端最容易地创建。
模板授权可以使用 IF
语句进一步限制允许的参数值集
IF ?amount > 0 THEN UPDATE balance SET balance = balance + ?amount WHERE iban = ?iban ELSE FAIL END;
不能。Catena 的目标是让习惯使用 SQL 的开发人员和管理员尽可能轻松地采用区块链技术。Catena 支持 PostgreSQL (pq) wire 协议来提交查询,这使得 Catena 可以从许多不同的语言(例如 PHP、Go、C/C++)中使用。但是,Catena 和“常规”数据库系统之间存在根本差异
Catena 支持有限的 SQL 子集(Catena 实现了自己的 SQL 解析器来清理和规范化 SQL 查询)。目前,支持以下类型的语句
Catena 使用基于 SHA-256 哈希的工作量证明区块链,难度可配置。区块包含包含 SQL 语句的事务。Catena 是从头开始编写的,因此与 Bitcoin、Ethereum 等完全不同。
Catena 节点公开 HTTP/WebSocket 接口。节点连接到它知道的所有其他节点的 WebSocket 接口(最初从命令行指定),以获取区块信息和交换对等节点。为了使两个节点能够通信,至少一个节点必须能够接受入站连接(即,不在 NAT 或防火墙之后)。
SQL 语句分组在事务中,事务成为区块的一部分。一旦区块被区块链接受,并被足够数量的新区块所取代,该区块就成为区块链账本的不可变部分。
由于新区块仍然存在被已挖掘的竞争区块“取代”的风险(可能包含也可能不包含最近的事务),因此最新的事务存在被回滚的风险。
事务需要使用私钥签名。
修改任何表或行的事务都需要使用有权修改该特定表或行的私钥进行签名。权限授予存储在特殊的“grants”表中(该表反过来可以由有权修改该表的人修改)。
为了防止重放已签名的事务,Catena 为每个公钥存储一个事务计数器,对于执行的每个事务,该计数器都会原子递增。如果事务的事务号低于区块链中记录的最新编号,则该事务将不会(再次)执行。为了成功提交事务,调用者必须为每个事务将计数器递增 1(或每次使用不同的密钥)。
Catena 在意大利语中是“链”的意思。
链由其创世(第一个)区块的哈希值标识。要创建私有链,请使用“-s”选项来指定不同的起始种子。
Copyright (c) 2017 Pixelspark, Tommy van der Vorst
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
我们欢迎各种形式的贡献 - 从错别字修复到完整的重构和新功能。如果您想从事一些大型项目,请务必与我们联系,以避免重复劳动。您可以通过以下方式提供帮助
请注意,在我们接受任何新代码到仓库之前,我们需要您以书面形式确认您的贡献是根据 MIT 许可证的条款提供给我们的。