佛萨奇2.0系统开发项目源码丨佛萨奇系统开发技术方案

简介: 佛萨奇2.0系统开发项目源码丨佛萨奇系统开发技术方案

在runtime中声明一个常量值是定义固定值或定义根据某些因素动态变化的值的有用工具。

接下来一起看看,如何创建用于重置u32存储值的pallet常量。这个值,我们称之为SingleValue,也可以使用一个名为add_value的方法来修改。

配置pallet的类型、事件和错误
1.定义pallet中的常量
MaxAddend将是元数据中显示的值。
ClearFrequency跟踪块编号并将用于重置SingleValue。

[pallet::config]

pub trait Config: frame_system::Config {

type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;

#[pallet::constant] // put the constant in metadata
/// Maximum amount added per invocation.
type MaxAddend: Get<u32>;

/// Frequency with which the stored value is deleted.
type ClearFrequency: Get<Self::BlockNumber>;

}
2.声明存储项目和事件。
使用存储属性宏,声明SingleValue每个块周期都会修改的值。

[pallet::storage]

[pallet::getter(fn single_value)]

pub(super) type SingleValue<T: Config> = StorageValue<_, u32, ValueQuery>;
3.定义pallet的事件。

[pallet::event]

[pallet::generate_deposit(pub(super) fn deposit_event)]

pub enum Event<T: Config> {

/// The value has been added to. The parameters are
/// (initial amount, amount added, final amount).
Added(u32, u32, u32),
/// The value has been cleared. The parameter is the value before clearing.
Cleared(u32)

}

  1. 添加处理操作溢出的错误:

[pallet::error]

pub enum Error {

/// An operation would lead to an overflow.
Overflow

}
创建pallet方法和运行时常量
1.配置on_finalize.
在块执行结束时运行的 on_finalize 函数中的每个 ClearFrequency 块数将 SingleValue 设置为 0。 在 #[pallet::hooks] 属性下指定此逻辑

[pallet::hooks]

impl<T: Config> Hooks<BlockNumberFor> for Pallet {

fn on_finalize(n: T::BlockNumber) {
    if (n % T::ClearFrequency::get()).is_zero() {
        let current_value = <SingleValue<T>>::get();
        <SingleValue<T>>::put(0u32);
        Self::deposit_event(Event::Cleared(current_value));
    }
}

}
2.创建一个允许用户指定值的方法。
只要每次调用增加的值小于 MaxAddend 值,add_value 方法就会增加 SingleValue。

对于此方法,必须遵循以下:

Include checks.
Keep track of the previous value.
Check for overflow.
Update SingleValue.
// Extrinsics callable from outside the runtime.

[pallet::call]

impl<T: Config> Pallet {

#[pallet::weight(1_000)]
fn add_value(
    origin: OriginFor<T>,
    val_to_add: u32
) -> DispatchResultWithPostInfo {
    let _ = ensure_signed(origin)?;
    ensure!(val_to_add <= T::MaxAddend::get(), "value must be <= maximum add amount constant");
    // previous value got
    let c_val = SingleValue::<T>::get();
    // checks for overflow when new value added
    let result = c_val.checked_add(val_to_add).ok_or(Error::<T>::Overflow)?;
    <SingleValue<T>>::put(result);
    Self::deposit_event(Event::Added(c_val, val_to_add, result));
    Ok(().into())
}

}
3.为runtime提供常量值。
在 runtime/src/lib.rs 中,为您的托盘的 MaxAddend 和 ClearFrequency 的运行时实现声明值:

parameter_types! {

pub const MaxAddend: u32 = 1738;
pub const ClearFrequency: u32 = 10;

}

impl constant_config::Config for Runtime {

type Event = Event;
type MaxAddend = MaxAddend;
type ClearFrequency = ClearFrequency;

}

作者:元苍子
链接:https://www.jianshu.com/p/8ccf5c31dfe4
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章
|
8月前
|
网络安全 区块链
佛萨奇Metaforce2.0系统开发(成熟源码)
智能合约是一种可编程的自动执行合约,其代码被嵌入到区块链中
|
8月前
|
区块链
DAPP众筹互助系统开发(成熟技术)|DAPP众筹互助系统开发案例分析
智能合约是一种以代码形式存在的合约constructor()public
|
10月前
|
存储 算法 区块链
链游项目系统开发(方案设计)丨DAPP链游系统开发(案例分析)/成熟技术/区块链游戏开发/源码说明
  在区块链中,每个块包含了一定数量的交易信息和该块的唯一标识符,同时还包含了前一个块的哈希值。这样的设计保证了区块之间的顺序和完整性,一旦一个块被添加到区块链中,它就不可更改。This makes blockchain a secure and trustworthy distributed ledger that can be used to record and verify various types of transactions.
魔豹联盟佛萨奇2.0源码系统开发搭建(成熟技术)
魔豹联盟佛萨奇2.0源码系统开发搭建(成熟技术)
|
Kubernetes Shell Docker
MetaForce佛萨奇2.0系统开发详细方案丨佛萨奇系统开发技术讲解
MetaForce佛萨奇2.0系统开发详细方案丨佛萨奇系统开发技术讲解
129 0
|
区块链 开发者
佛萨奇2.0是什么项目?佛萨奇2.0系统开发源码分析
FORSAGE(佛萨奇)是全球首创100%分散-以太坊营销共享矩阵计划,以太坊公链上开发的智能合约DAPP,FORSAGE是国际众筹平台!FORSAGE是革命性的智能合约技术为分布式的市场参与者提供了直接从事个人和商业交易的能力。Forsage分布式全球共享矩阵项目的智能合约是公开透明的,永远可以在区块链上查看。
|
区块链 数据库
佛萨奇2.0系统开发(马蹄链开发)丨佛萨奇2.0系统开发(案例及项目)丨佛萨奇2.0源码成品
  智能合约(Smart contract)是依托计算机在网络空间运行的合约,它以信息化方式传播、验证或执行合同,由计算机读取、执行,具备自助的特点。而区块链的去中心化,数据的防篡改,决定了智能合约更加适合于在区块链上来实现
|
存储 区块链 数据库
Forsage/MetaForce佛萨奇2.0系统开发(方案及案例),MetaForce/Forsage佛萨奇2.0系统开发(源码及项目)
 该技术方案主要让参与系统中的任意多个节点,通过一串使用密码学方法相关联产生的数据块(block),每个数据块中包含了一定时间内的系统全部信息交流数据,并且生成数据指纹用于验证其信息的有效性和链接(chain)下一个数据库块。
|
Linux Go 区块链
佛萨奇dapp开发详细丨佛萨奇dapp系统开发(2.0升级版)丨佛萨奇系统源码流程
 package main//sdk代码中,有且仅有一个main()方法func main(){//main()方法中,下面的代码为必须代码,不建议修改main()方法当中的代码//其中,TestContract为用户实现合约的具体名称err:=sandbox.Start(new(FactContract))if err!=nil{log.Fatal(err)}}
|
区块链
合约版丨佛萨奇2.0系统开发丨NFT佛萨奇原力项目开发介绍代码搭建方案
合约版丨佛萨奇2.0系统开发丨NFT佛萨奇原力项目开发介绍代码搭建方案