什么是 Substrate

article/2025/8/26 11:29:58

如果你关注了 Polkadot 项目,可能会多次看到「Substrate」这个词。 它是 Polkadot 项目的重要组成部分,但有关它的信息非常少。 白皮书或黄皮书里找不到, 至少没有专门的介绍「Substrate」。 从较高的层面来看,Substrate 是一个可以创建数字货币和其他去中心化系统的框架。 这太笼统了,本文详细说说。

首先,Parity Substrate 是独立于 Polkadot 的项目。 Polkadot 是基于 Substrate 构建的,现在你可以使用 Substrate 来构建新的区块链项目,而不用等 Polkadot 开发进度。

那到底什么是 Substrate 呢? 它是一个框架,类似于 Express 框架或其他 Web 应用程序框架,只不过是用于构建分布式或去中心化系统,比如加密货币项目,或消息总线系统。 正如大多数 Web 应用程序不需要重新实现自己的 HTTP 一样,我们认为创建新区块链也不需要从头实现网络和共识部分的代码。网络和共识的开发需要密码学专家、网络安全专家、网络工程师、网络运维人员等等,但是其实你应该专注在产品的核心业务逻辑上。 所以如果你使用 Substrate,只需要实现非常少量的回调,就能得到这些特性:

  • 共识机制,不可逆性,出块投票逻辑。 即使你的项目不需要构建加密货币,甚至不是需要区块链的项目,Substrate 也可以用于需要拜占庭容错机制的项目,比如网络中部分节点宕机、失效或者被恶意控制,但整个网络仍然可以继续正常工作。

  • p2p 网络。比如 p2p 节点的搜索,同步等等。

  • 运行时的 WebAssembly 虚拟机。可以运行智能合约,或者其他基于 Substrate 开发的项目。 虽然你可以编写自己的虚拟机解释器,但我们坚信使用 WebAssembly 运行时的好处是,可以让你利用在 WebAssembly 社区的工作成果 ;

  • 在浏览器中运行一个节点,并与其他节点通信 ;

  • 跨平台的数据库 / 文件存储系统,还支持浏览器环境 ;

  • 客户端平滑更新。对于可能影响共识的更新,会将代码编译成 WebAssembly 的执行文件,然后部署时作为网络上的一条消息。 这样的机制提供了这种可能,就是你还可以本地保有多个版本的共识代码,并在本地执行一个与部署环境不同版本的共识,Substrate 会去处理本机环境与部署环境的差异。因为 WebAssembly 有回退机制,所以保证不会有不受控制的硬分叉或其他难以解决的共识导致的问题。

  • Polkadot 发布时立即接入你的项目。 虽然说使用 Substrate 构建的项目可以编译出一个独立的客户端程序(就像现有的区块链项目一样),但是把你的项目接入 Polkadot 就可以共享 Polkadot 的安全性和链之间的互操作性。 Polkadot 本身就是使用 Substrate 构建的。Polkadot 实现了 Substrate API,会对 Substrate 框架中的任何漏洞进行快速反馈,很方便的运行 Polkadot 测试网,甚至再启动一个 Polkadot 链作为侧链。 这篇博客比较详细的介绍了 Polkadot。https://medium.com/polkadot-network/how-polkadot-tackles-the-biggest-problems-facing-blockchain-innovators-1affc1309b0f

那你需要自己实现哪些东西呢?从本质上讲,Substrate 是状态机,可以包括交易等内容。为了使 Substrate 尽可能通用,它本身没有任何交易。它有我们所谓的「Extrinsic 外部交易」,这个「外部交易」是一个二进制 BLOB,可以用来存储你想要的任何数据。对于大多数链而言,这些 BLOB 数据包括了交易,但使用 Substrate,你完全可以从网络中去掉货币的概念,然后创建一个分散的 Erlang 样式的 actor 模型并发系统,赋予该系统一组受信任的权限,来验证网络行为的正确性。

如果你需要货币和交易,那么可能更简单 , 只要约定一个协议和一个数据库来访问数据。它比其他分布式架构(如微服务)更容易 ,因为运行的代码和数据存储在同一个地方,仅为数据存储提供向后兼容性就可以。对于具有私有交易的链,实现要复杂一些。

下面简要介绍启动并运行一个完整的区块链需要做什么:

1、初始化块的函数。该函数根据前一个块的头创建一个新的块。 块的头包括:1. 块高度 ; 2. 块状态的加密索引,主要用于轻客户端验证块是否正确。 加密索引类似于 hash; 3. 块中二进制 BLOB 的加密索引 ; 4. 父块的 hash 值 ;

2、块头的自定义数据。轻客户端仅同步块头,更新轻客户端时,注意处理块头中自定义的数据。

3、将交易写入块的函数。 这个函数也更新链的状态(例如,账户余额);

4、生成块的函数。生成一个写好头、写好 BLOB 数据的块。这个块就可以广播出去了。

5、校验块的函数。 全节点运行这个函数,确认接收到的块在接受之前是有效的。 例如,在资产链中,你可以检查是否有人人花费超过其自身余额的钱。

需要注意的是,块头包含块状态的信息,在生成块的函数里,要把块状态从初始状态设为完成状态,校验块的函数里,要把从完成状态变成校验通过状态。 块状态错了的话可能会导致共识问题。虽然以后可能会用其他方式来处理块状态,但是现在还需要这么做。当前的方式也不会太麻烦,额外写一个校验 BLOB 数据的工具函数就好了。

此外,你需要自己维护一个公钥集合,用于验证块的签名。块的签名验证与链使用的共识机制无关。 给块签名的私钥所对应的公钥应该放进这个公钥集合, 集合里的公钥可以变化,但每个块都由块创建时选择的集合进行验证。公钥集合里的公钥变化会产生的不同的公钥集合版本,以及由此引出的问题 Substrate 都会自动处理好。 公钥越少,安全性越低,公钥越多,验证耗费越多,这里要自己衡量。 通过签名验证后,块就被认为是「最终的」(即不可逆的)²。

使用 Substrate 创建链需要手动的处理 POS,不是所有项目都要在链上发行数字货币。比如,测试网的币就没价值,还有消息总线的项目根本不需要数字货币。但是,在 Substrate 上编写一个库可以很容易地发行数字货币,并自动支持交易和 POS 共识³。比较推荐的使用 Substrate 方式,是在 Substrate 上构建更高级别的库,把 Substrate 作为项目的模块。随着 Substrate 的完善,会像编写现代 Web 应用程序一样轻松构建新链。

现在 Substrate 还没什么学习资料。 如果不是 Polkadot 团队的成员,很难学会本文讲的东西。 不过 Substrate 教程和文档很快就会有了。

补充 3 点:

你可能希望有向后兼容性,以便外部工具可以轻松地与你的链进行交互,你可以使用 protobuf 免费获得高效的向后兼容存储。

举一个例子,像比特币或以太坊这样的纯 POW 链根本不具有终结性,因为可能的验证器集是无限的。

例如,一个简单的 POS 链可能会在每个区块设置一次验证器,通过选择拥有最多权益的 100 个账户,并在获得不当行为证明时惩罚它们的权益。

最初于 2018 年 7 月 9 日在 paritytech.io 上发表,原文 https://medium.com/paritytech/what-is-substrate-29af4231d7e0


http://chatgpt.dhexx.cn/article/JmxyBoU3.shtml

相关文章

Substrate之旅3:Substrate是什么

Substrate 是从Polkadot 孵化出来的项目。它是一个用来搭建区块链的通用框架,具有以下特点: 可扩展。模块化。开源。 Substrate的框架与组件 框架 其中: P2P: libp2p网络协议,Substrate基于该协议实现了一个不带任何假设的&…

Substrate 基础 -- 教程(Tutorials)

官网 github DOC 面向未来的区块链框架 Substrate 使开发人员能够快速、轻松地构建适合任何用例的未来 证明区块链(future proof blockchains)。 Substrate 文档包括区块链构建器(blockchain builders)和parachain 项目团队的概念、过程和参考信息。…

【Android 逆向】substrate 框架 ( substrate 简介 | substrate 相关文档资料 )

文章目录 一、substrate 简介二、substrate 相关文档资料 一、substrate 简介 substrate 官网 : http://www.cydiasubstrate.com substrate 框架 是 Cydia 下的逆向工具 , 该框架是开源的 ; substrate 配合对应的 so 动态库 和 头文件 , 可以在 Android / iOS 平台中独立运行 …

ios tableView那些事(三)给tableView添加些图片

感觉光有数据的tableView很丑&#xff0c;那么我们就来美化下吧&#xff0c;加一些图片 #import <UIKit/UIKit.h> /*tableview 一定要用到这两个delegate UITableViewDataSource,UITableViewDelegate */ interface ViewController :UIViewController <UITableViewDa…

QT的TableView实现多级表头

QT的TableView实现多级表头 最近项目需要支持多级表头&#xff0c;QT本身不支持。可重写QHeaderView表头实现。 demo如下&#xff1a; FSItemDelegate.h #pragma once/* 自定义委托类 */ #include <QItemDelegate> #include <QSpinBox> #include <QDoubleSpin…

QML类型:TableView

一、描述 TableView 显示从内置 QML 类型&#xff08;如 ListModel 和 XmlListModel&#xff09;创建的模型中的数据&#xff0c;这些模型仅填充 TableView 中的第一列。要创建具有多列的模型&#xff0c;请使用 TableModel 或继承 QAbstractItemModel 的 C 模型。 TableView…

QML TableView表格使用示例

前言 QML中实现表格可以使用多种方式&#xff0c;比如直接使用ListView&#xff0c;定义每一行delegate&#xff0c;或者自定义Rectangle&#xff0c;放到Flipable中组合使用。Qt Quick Control1中 从5.1版本开始就提供了表格控件&#xff0c;但是感觉不怎么好用&#xff0c;在…

Qt TableView的简单使用

软件环境&#xff1a; ubuntu -------------------------------------------------------------------------------------------------------- 最终效果图&#xff1a; --------------------------------------------------------------------------------------------------…

PyQt5 TableView组件

一、话不多说&#xff0c;先看图 本次要实现的是主窗口内添加widget组件&#xff0c;widget内设置成垂直盒布局&#xff0c;然后在布局中添加tableView、PushButton组件 二、看main函数 if __name__ __main__:app QApplication(sys.argv)# 现在这创建 主窗口 &#xff08;不然…

优雅的开发TableView

前言 UITableView&#xff08;UITableViewController&#xff09;是iOS开发使用频率最高的一个组件。 不管是使用UITableView还是还是UITableViewController&#xff0c;在开发的时候&#xff0c;我们都需要实现两个协议&#xff1a; UITableViewControllerDataSourceUITabl…

JavaFX控件——TableView

在JavaFX 应用中对创建表格最重要的是TableView, TableColumn和TableCell这三个类。 你可以通过实现数据模型&#xff08;data model&#xff09; 和 实现 单元格工厂(cell factory) 来填充表格。 表格类提供了表格列嵌入式的排序能力和必要时调整列宽度的功能。 下面开始学…

ios开发:多个Section的TableView

开发多个Section的tableView。 首先应该考虑到数据源该如何得到 我们这里可以通过两种方式:第一种是读取plist文件。第二种是通过代码进行数据存储以及读取。 多个Section需要的数据源是一个字典&#xff0c;字典里的内容是一个数组。在plist文件中可以这样去创建 在.h文件中…

tableview概述

转自&#xff1a;http://www.cnblogs.com/smileEvday/archive/2012/06/28/tableView.html                 下面分9个方面进行介绍&#xff1a; 一、UITableView概述 UITableView继承自UIScrollView&#xff0c;可以表现为Plain和Grouped两种风格&#xff0c;分…

ios tableView那些事(一)创建一个简单的tableView

工作也有半年多了&#xff01;几乎每个项目中的会用到tableview这个神奇而好用的控件&#xff0c;在学习和工作中都会看别人的博客&#xff01;对我有很大的帮助&#xff0c;就如同站在巨人的肩膀上的感觉吧 哈哈&#xff01;于是决定重新开始写博客&#xff0c;希望能帮助像我…

JavaFX TableView和ListView的点击事件

项目场景&#xff1a; 最近在用JavaFX做一个简易的商城界面&#xff0c;大概想实现这样的功能&#xff1a; 左边显示用户的最近五个购买的产品 使用ListView 点击ListView的项目会定位到相应的tablerow位置 方便用户快速查找中间显示所有可用产品 使用TableView 双击tablerow…

JavaFX【TableView使用详解】

目录 概述 组件 Student ObservableList TableView setCellValueFactory() TableColumn 1. Callback 2. PropertyValueFactory 增加到末行 1、tableView.getItems().add(Student s) 2、list.add(Student s) 删除指定行 1、tableView.getItems().remove(int i) 2、…

QT中TableView数据展示

QT中TableView数据展示 最近在学习QT,大量数据从数据库取出放入QT界面中展示&#xff0c;这时用到了tableView&#xff0c;一些简单的使用分享给大家。 创建数据模型 QStandardItemModel *modelnew QStandardItemModel(); QStandardItemModel是Qt库中的一个类&#xff0c;它…

JAVAFX的TableView基本用法

JAVAFX中的表格显示主要使用TableView 与TableView相关的类: TableColumn TableRow TableCell TablePosition TableViewFocusModel TableViewSelectionModel JavaFX TableView例子: import javafx.application.Application; import javafx.scene.Scene; import javafx.scene…

QT之Tableview

想要了解更多的tableview可以看这位博客Qt深入浅出&#xff08;十五&#xff09;QTableView​ 这里做了一个简单的学生系统查询功能显示Tableview&#xff1a; 表格视图控件QTableView&#xff0c;需要和QStandardItemModel, 配套使用&#xff0c;这套框架是基于MVC设计模式设…

QML TableView 使用详解

目录 一、—个简单的TableView实例 二、TableViewColumn 属性讲解 三、定制表格外观 3.1 itemDelegate3.2 rowDelegate3.3 headerDelegate3.4 定制表格外观后的示例 四、动态增删改查 TabelView TableView 就是 Qt Quick 为表格式呈现数据提供的组件。想必兄台用过 Excel…