简单介绍Substrate:下一代区块链开发框架

Substrate

区块链系统可以分为两部分:

  1. 区块链基础部分(core)
  2. 区块链功能部分(runtime)

其中,区块链基础core)一般由以下几部分构成:

  • 共识系统
  • p2p连接与广播系统
  • 存储系统
  • 交易池系统
  • RPC系统(也就相当于api,用于与外界交互)

区块链功能runtime)有以下例子:

  • 比特币和以太坊1.0的记账方式——UTXO
  • 以太坊虚拟机,及智能合约系统,以太坊2.0的账户系统
  • eos账户系统,及虚拟机
  • 随机数,对赌……等等的各种功能

Substrate就是这样一个区块链框架,它将区块链分为上面所说的两部分:

  • Substrate Core
  • Runtime

根据这样的划分,当开发者使用Substrate框架的时候,无需关心区块链基础功能(也就是Core部分)的工作,只需关心自己链能够提供的功能,也就是Runtime部分的工作。

虚拟机EVM也是Runtime的一个组件。与以太坊的结构相比,相当于把以太坊的智能合约功能也能随意作为一个链的功能组件添加进入使用Substrate开发的链中。

由于Substrate将Runtime单独抽离出来,Substrate实现了经典区块链都无法实现的unique功能:区块链系统升级。

区块链版本升级是一件非常复杂的事情,首先需要社区/开发者提出,将升级方案广播给每一个区块链上的网络节点,再由每个网络节点自行选择是否认可,进行升级。而如果有一定数量(小于拜占庭容错)的节点出现分歧,则会在区块链上产生硬分叉,将导致这些节点上运行着不同的区块链版本。而如果大部分节点都不支持升级,则可能导致社区分裂等更严重的问题。

并且,当一个区块链系统升级后,开发者不得不在代码中进行许多重复的“区块高度判断”,以区分不同高度下运行的代码版本,兼容旧版本数据,保证区块链节点的同步能够正常执行。

这种做法很原始但是又无法绕开,给开发者带来极大的思维负担,且需要大量的测试来保证不出现Bug。比如目前比特币的源码中就有许多的区块高度判定使得在同步老区块的时候执行老代码,新区块的时候执行新代码。

Substrate的出现完美的解决了这个区块链升级的问题。其采用模块化思想,将Runtime作为一个单独的组件,一个以wasm(WebAssembly)形式存在并运行的“链上代码”。

简单来说,Runtime在Substrate框架下,将会用同一份代码编译出两份可执行文件:

一份Rust的本地代码,我们一般称为native代码,native与其他代码无异,是这个执行文件中的二进制数据,直接运行。在Substrate的相关代码以native命名

一份wasm的链上代码,我们一般成为wasm代码,wasm被部署到链上,所有人可获取,wasm通过构建一个wasm的运行时环境执行
。在Substrate的相关代码以wasm命名

在节点启动的时候可以选择执行策略,使用native
possible,wasm或者both。不同的执行策略会执行不同的执行文件,这部分后续以后的文章详细描述。

由于这两份代码是由相同的代码编译出来的,所以其执行逻辑完全相同
(有一些很小的暗坑要注意)。其中wasm将会部署到链上,所有人都可以获取到,也就是说即使本地运行的不是最新版本的节点,只要同步了区块,一定可以获取到最新的wasm代码。

换句话说,一个写在Runtime内部的代码,也就是代表这条链功能性的代码,存在两份,分别是native与wasm。wasm代码被部署到链上,是“链上数据”,可以通过同步区块所有人统一获取并执行。这样就可以保证在区块链中所有矿工执行的都是最新的代码。

ps:这里需要强调,代码的部署可以通过“民主提议”,“sudo控制权限”,“开发者自定一种部署条件”等方式进行,到底哪种方式“更区块链”,“更合理”,不在本文讨论范围内,这与这条链的设计目的相关。Substrate只是提供了这种“热更新”的强大机制,如何使用这种机制是这条链的问题。

总而言之,使用wasm进行区块链升级绝对是一个全新的思路。

由此可见,由于wasm代码的存在,可以保证即使节点没有更新到最新版本,仍然能够以最新的代码运行,保证不会因为代码的不同而分叉。同时在节点同步老数据的过程中也不会因为本地代码是最新的而导致同步出错。

本文引用内容来自:https://zhuanlan.zhihu.com/p/56383616

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Substrate 区块链上调用 HTTP 可以通过使用 Substrate 提供的 `http` 模块来实现。`http` 模块允许你在 Substrate 运行时中发送 HTTP 请求并处理响应。 首先,你需要在你的 Substrate 运行时的 Cargo.toml 文件中添加 `http` 依赖: ```toml [dependencies] http = "0.2" ``` 接下来,你可以在你的 Substrate 运行时模块中使用 `http` 模块来发送 HTTP 请求。以下是一个简单的例子,演示如何使用 `http` 模块发送 GET 请求并处理响应: ```rust use http::Request; use http::Response; use http::header::HeaderValue; /// 发送 HTTP GET 请求并处理响应 fn send_http_request() { // 构建 HTTP 请求 let request = Request::builder() .uri("https://example.com") .header("User-Agent", HeaderValue::from_static("Substrate")) .body(()) .expect("failed to build request"); // 发送 HTTP 请求并获取响应 let response = request .send() .expect("failed to send request"); // 处理响应 match response.status().as_u16() { 200 => { // 响应状态码为 200 OK let body = response .into_body() .concat2() .wait() .expect("failed to read response body"); // 处理响应体 println!("Response body: {:?}", body); }, _ => { // 处理其他响应状态码 println!("Received non-200 response: {:?}", response.status()); } } } ``` 请注意,上述示例仅演示了如何发送简单的 GET 请求并处理响应。你可以根据你的需求自定义请求头、请求方法和请求体。此外,你还可以使用其他 HTTP 方法(如 POST、PUT 等)来发送不同类型的请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值