我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Rust之Substrate框架中的pallet详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Rust之Substrate框架中的pallet详解

引言

Substrate 是一个区块链开发框架,它提供了一系列模块化和可扩展的组件,可以帮助开发人员快速构建自定义区块链。 Pallet 是 Substrate 区块链的基础模块,它定义了区块链的业务逻辑和状态转换规则。开发人员可以使用现有的 Pallet 来快速构建区块链,也可以开发自定义的 Pallet 来实现特定的功能。

Pallet 概述

Pallet是一个 Rust 程序包,它定义了一组特定的功能和接口。每个 Pallet 都包含了一组存储项、一组调用函数和一组事件。

一个典型的 Substrate Pallet 由以下部分组成:

  • 配置 Trait:定义了 Pallet 的配置接口。
  • 存储项:定义了 Pallet 的状态存储。
  • 调用函数:定义了 Pallet 的外部调用接口。
  • 事件:定义了 Pallet 的事件类型。

Pallet 开发

要开发 Substrate Pallet,首先需要搭建开发环境。我们需要安装 Rust 编程语言、Substrate 开发包和 Node.js 等工具。下面是一个简单的安装示例:

# 安装 Rust 编程语言
curl https://sh.rustup.rs -sSf | sh

# 安装 Substrate 开发包
curl https://getsubstrate.io -sSf | bash

# 安装 Node.js
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs

开发一个 Substrate Pallet 的流程大致如下:

  • 定义配置 Trait:定义 Pallet 的配置接口。

  • 定义存储项:定义 Pallet 的状态存储。

  • 定义调用函数:定义 Pallet 的外部调用接口。

  • 定义事件:定义 Pallet 的事件类型。

  • 实现业务逻辑:实现 Pallet 的业务逻辑。

  • 定义配置 Trait:定义 Pallet 的配置接口。 配置 Trait 是一个 Rust Trait,它定义了 Pallet 的配置接口。我们需要在配置 Trait 中定义一些类型和常量,以便在 Pallet 中使用。下面是一个简单的配置 Trait 示例:
pub trait Trait: system::Trait {
    type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
}

在这个示例中,我们定义了一个 Trait Trait,它继承自 system::Trait。我们在 Trait 中定义了一个类型 Event,它用来表示 Pallet 的事件类型。

  • 定义存储项:定义 Pallet 的状态存储。 存储项是 Pallet 的状态存储,它用来存储区块链的状态数据。我们可以使用 decl_storage! 宏来定义存储项。下面是一个简单的存储项示例:
decl_storage! {
    trait Store for Module<T: Trait> as TemplateModule {
        pub Something get(fn something): Option<u32>;
    }
}

在这个示例中,我们使用 decl_storage! 宏定义了一个存储项 Something。它是一个可选的 u32 类型,可以使用 get 函数来获取它的值。

  • 定义调用函数:定义 Pallet 的外部调用接口。 调用函数是 Pallet 的外部调用接口,它用来接收外部调用并执行相应的操作。我们可以使用 decl_module! 宏来定义调用函数。下面是一个简单的调用函数示例:
decl_module! {
    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
        fn deposit_event() = default;

        pub fn do_something(origin, something: u32) -> Result {
            let who = ensure_signed(origin)?;
            <Something<T>>::put(something);
            Self::deposit_event(RawEvent::SomethingStored(something, who));
            Ok(())
        }
    }
}

在这个示例中,我们使用 decl_module! 宏定义了一个调用函数 do_something。它接收两个参数:origin 和 somethingorigin 表示调用方的身份;something 表示要存储的数值。在函数体内,我们首先使用 ensure_signed 函数检查调用方的身份;然后使用 <Something<T>>::put 函数将数值存储到存储项中;最后使用 Self::deposit_event 函数触发一个事件。

  • 定义事件:定义 Pallet 的事件类型。 事件是 Pallet 的一种通知机制,它用来通知外部模块 Pallet 内部状态的变化。我们可以使用 decl_event! 宏来定义事件。下面是一个简单的事件示例:
decl_event!(
    pub enum Event<T> where AccountId = <T as system::Trait>::AccountId {
        SomethingStored(u32, AccountId),
    }
);

在这个示例中,我们使用 decl_event! 宏定义了一个事件 SomethingStored。它包含两个字段:u32 和 AccountIdu32 表示存储的数值;AccountId 表示调用方的身份。

  • 实现业务逻辑:实现 Pallet 的业务逻辑。 在完成了上述步骤之后,我们就可以开始实现 Pallet 的业务逻辑了。我们需要在调用函数中编写相应的代码,以实现 Pallet 的功能。下面是一个简单的业务逻辑示例:
decl_module! {
    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
        fn deposit_event() = default;

        pub fn do_something(origin, something: u32) -> Result {
            let who = ensure_signed(origin)?;
            <Something<T>>::put(something);
            Self::deposit_event(RawEvent::SomethingStored(something, who));
            Ok(())
        }
    }
}

在这个示例中,我们在调用函数 do_something 中实现了一个简单的业务逻辑:将传入的数值存储到存储项中,并触发一个事件。

Pallet 集成

集成现有 Pallet 要集成现有的 Pallet,我们需要在 Runtime 中引入对应的 Pallet 模块,并在 construct_runtime! 宏中声明它。下面是一个简单的示例:

// 引入 Balances 模块
use pallet_balances as balances;

// 在 construct_runtime! 宏中声明 Balances 模块
construct_runtime!(
    pub enum Runtime where
        Block = Block,
        NodeBlock = opaque::Block,
        UncheckedExtrinsic = UncheckedExtrinsic,
    {
        // ...
        Balances: balances::{Module, Call, Storage, Config<T>, Event<T>},
    }
);

要开发自定义的 Pallet,我们需要按照上文提到的开发流程来实现。下面是一个简单的自定义 Pallet 示例:

use support::{decl_module, decl_storage, decl_event, dispatch::Result};
use system::ensure_signed;

pub trait Trait: system::Trait {
    type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
}

decl_storage! {
    trait Store for Module<T: Trait> as TemplateModule {
        pub Something get(fn something): Option<u32>;
    }
}

decl_event!(
    pub enum Event<T> where AccountId = <T as system::Trait>::AccountId {
        SomethingStored(u32, AccountId),
    }
);

decl_module! {
    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
        fn deposit_event() = default;

        pub fn do_something(origin, something: u32) -> Result {
            let who = ensure_signed(origin)?;
            <Something<T>>::put(something);
            Self::deposit_event(RawEvent::SomethingStored(something, who));
            Ok(())
        }
    }
}

在这个示例中,我们定义了一个自定义的 Pallet,它包含了一个存储项 Something、一个调用函数 do_something 和一个事件 SomethingStored。存储项 Something 用来存储一个数值;调用函数 do_something 用来修改存储的数值;事件 SomethingStored 用来记录修改操作。

总结

Substrate的Pallet具有很多优点,例如模块化、可扩展性和可升级性等。开发人员可以使用现有的 Pallet 来快速构建区块链,也可以开发自定义的 Pallet 来实现特定的功能。

以上就是Rust之Substrate框架中的pallet详解的详细内容,更多关于Substrate pallet的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Rust之Substrate框架中的pallet详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Rust之Substrate框架中的pallet详解

Pallet是Substrate区块链的基础模块,它定义了区块链的业务逻辑和状态转换规则。开发人员可以使用现有的Pallet来快速构建区块链,也可以开发自定义的Pallet来实现特定的功能,感兴趣的小伙伴可以参考阅读下
2023-05-18

Rust之Substrate框架中Core详解

Substrate是一个用于构建区块链的开发框架,它由Parity团队基于Rust语言开发而成,是一个开箱即用的区块链构造器,本文详细介绍了Substrate框架中的Core,需要的朋友可以参考下
2023-05-18

详解RustSubstrate框架中的Runtime

ubstrate是一个区块链开发框架,它提供了一系列模块化和可扩展的组件,可以帮助开发人员快速构建自定义区块链。Runtime是Substrate区块链的核心部分,文中有详细的代码示例,需要的朋友可以参考下
2023-05-18

node中的Express框架详解

这篇文章主要介绍了node中的Express框架,框架是为了规范开发流程,降低开发难度,提高开发效率而制定的一套共人们使用的功能模块或者是编程的约定,需要的朋友可以参考下
2023-05-17

Rust中的宏之声明宏和过程宏详解

Rust中的宏是一种强大的工具,可以帮助开发人员编写可重用、高效和灵活的代码,这篇文章主要介绍了Rust中的宏:声明宏和过程宏,需要的朋友可以参考下
2023-05-17

Flask框架中的session设置详解

Flask是一个使用Python编写的轻量级Web应用框架。其WSGI工具箱采用Werkzeug,模板引擎则使用Jinja2。Flask使用BSD授权。Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能
2023-02-23

详解Spring框架之基于Restful风格实现的SpringMVC

如果说现在你要做一个系统,假设说有一个模块属于公告管理,那么我们可能安排路径的时候会这样安排NewsAction路径: 增加新闻:/pages/back/admin/news/add.action; 新闻列表:/pages/back/adm
2023-05-31

.NET中的MassTransit分布式应用框架详解

MassTransit是一款优秀的分布式应用框架,可作为分布式应用的消息总线,也可以用作单体应用的事件总线,这篇文章主要介绍了.NET中的MassTransit分布式应用框架,需要的朋友可以参考下
2022-11-13

详解Flask框架中Flask-Login模块的使用

Flask-Login是一个Flask模块,可以为Flask应用程序提供用户登录功能。这篇文章将通过一些示例为大家介绍一下Flask-Login模块的使用,需要的可以参考一下
2023-01-13

详解Python的Flask框架中的signals信号机制

Flask 提供了信号(Signals)功能,是一种消息分发机制。类似于钩子(Hooks)。使用信号功能可以降低程序的耦合,分解复杂的业务模型。例如在更新了产品数据后,可以发送一个信号。当有需要对产品数据进行处理的功能时,就可以捕获信号进行
2022-06-04

详解CI框架中引用CSS样式的步骤

教程:CI框架中引入CSS样式的详细步骤,需要具体代码示例引言:在开发网页应用程序中,样式是至关重要的一部分。使用CSS(层叠样式表)可以美化网页并提供更好的用户体验。而在使用CodeIgniter(CI)框架进行开发时,如何正确引入CS
详解CI框架中引用CSS样式的步骤
2024-01-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录