ソラナブロックとのステッキスマート契約の構築


概要
ソラナは、Anatoly Yakavenkoによってつくられる分散したブロックチェーンプラットホームです.ソラナは400時間のブロック時間を持っています.それはpohメカニズムのために気まぐれに速くあります.私はソラナブロックでPOHの詳細情報を書くつもりはありません.あなたがより多くの情報を得たいならば、私はあなたにソラナのwhitepaperを通過するよう勧めます.この記事では、私はソラナブロックチェーンの基本的なXTokenステッキスマート契約プログラムを扱うつもりです.
前提条件
  • 錆プログラミング
  • ソラナツールスーツ
    アンカーフレームワーク
  • あなたがstakingスマート契約プログラミングを構築する前に、PC上で前提条件をインストールする必要があります.それらはタスクのためにプログラムする必要があります.
    Rustは非常に強力な汎用プログラミング言語です.
    ソラナツールスーツ-これはソラナCLIを含みます.
    アンカーは、いくつかの開発ツールを含むソラナスマート契約を開発するためのフレームワークです.したがって、基本的に、アンカーはLifeSaverであり、それは本当にスマート契約を開発する簡単です.
    始める
    開始するには、コンソールに新しいアンカープロジェクトを作成しますanchor init basicStakingプロジェクトの構成では、次のファイルとフォルダが表示されます.
    プログラム-これはソラナプログラムのディレクトリです
    テスト-これはJavaScriptテストコードが住んでいるところです
    移行-これは展開スクリプトです
    これはフロントエンドが構築される予定です
    我々のリブを見ましょう.プログラムディレクトリのRSファイル.
    use anchor_lang::prelude::*;
    declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
    #[program]
    pub mod basicStaking {
        use super::*;
        pub fn initialize(ctx: Context<Initialize>) -> ProgramResult {                  Ok(())
        }
    }
    #[derive(Accounts)]
    pub struct Initialize {}
    
    これはCLIによって書かれた最も基本的なプログラムです.起動時に初期化される関数があります.初期化関数は、初期化関数のコンテキストを定義します.
    XTokenを所有している利害関係者はいくつかの金額をstakingスマート契約に賭けます.代わりに、所有者によっていくつかの金額を奪うのは、契約の契約は、いくつかの期間後にXトークンとして報酬トークンを提供します.
    私たちはソラナCliによってXToken ToolSupplyでXTokenを作成したと仮定します.この部分についてよく理解していない場合は、ソラナのドキュメントを参照してどのようにソラナのブロックにカスタムトークンを作成することができます.
    同様に、スマート契約を台無しに利害関係者に報酬を返すために1000万xtokensが含まれています.
    これらはTGEステップ前のトキソミクスによって許可される.TGE -トークン生成イベント.
    それでは、シンプルなステッカースマート契約を構築しましょう.
    // pub mod utils;
    use {
    // crate::utils::*,
    anchor_lang::{prelude::*, solana_program::program::{invoke,invoke_signed}},
    spl_token::state,
    };
    declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
    #[program]
    pub mod basic_staking {
    use super::*;
    pub fn initialize(ctx: Context<Initialize>) -> ProgramResult {
    Ok(())
    }
    pub fn stake(ctx:Context<Stake>,amount: u64) -> ProgramResult{
        let account = &mut ctx.accounts.holder;
        //invoke to transfer token into staking contract
        let token_program = ctx.accounts.token_program.clone();
        let source = ctx.accounts.stake_token.clone();
        let destination = ctx.accounts.stake_pot.clone();
       let authority = ctx.accounts.authority.clone();
      invoke(&spl_token::instruction::transfer(
             token_program.key,
             source.key,
             destination.key,
             authority.key,
             &[],
             amount,
            )?,
            &[source, destination, authority, token_program],
        );
       account.stake_amount += amount;
      let now_ts = Clock::get().unwrap().unix_timestamp;
      account.stake_time = now_ts;
      Ok(())
    }
    pub fn unstake(ctx:Context<Stake>,amount:u64) -> ProgramResult{
       let account = &mut ctx.accounts.holder;
      //invoke to transfer token into holder address
      account.stake_amount -= amount;
      let now_ts = Clock::get().unwrap().unix_timestamp;
      account.stake_time = now_ts;
      Ok(())
    }
    pub fn claim(ctx:Context<Stake>) -> ProgramResult{
       let account = &mut ctx.accounts.holder;
      //invoke to transfer reward token into holder
      Ok(())
    }
    }
    #[derive(Accounts)]
    pub struct Initialize {}
    #[derive(Accounts)]
    pub struct SetAuthority<'info>{
    #[account(mut, signer)]
    authority: AccountInfo<'info>,
    #[account(mut)]
    new_authority: AccountInfo<'info>,
    #[account(mut, owner = spl_token::id())]
    stake_pot:AccountInfo<'info>,
    #[account(address=spl_token::id())]
    token_program:AccountInfo<'info>,
    }
    #[derive(Accounts)]
    pub struct Stake<'info>{
    #[account(mut, signer)]
    authority: AccountInfo<'info>,
    #[account(mut,signer)]
    pub holder:Account<'info,StakeAccount>,
    #[account(mut, owner=spl_token::id())]
    stake_token: AccountInfo<'info>,
    #[account(mut, owner=spl_token::id())]
    stake_pot: AccountInfo<'info>,
    #[account(address=spl_token::id())]
    token_program:AccountInfo<'info>,
    }
    #[account]
    pub struct StakeAccount{
    pub stake_amount:u64,
    pub stake_time:i64,
    }
    
    stakeaccount構造体は、私たちのアカウントは、私たちの株式データを格納するために起こっているカウント変数が含まれています.
    Start structは、アカウントを作成するためのコンテキストを定義する命令構造体です.
    我々は、ステイクのための3つの関数を宣言します.これらは起動する命令です.
    クール.我々はこの驚くべきプログラムで行われます.
    さて、テストを実行します.anchor testテストをパスした後、プログラムを展開することができます.ソラナテストバリデータが実行されていることを確認してください.anchor deploy結論
    ストーキングのロジックに基づくいくつかのコードベースのため、このコードベースを使用しないかもしれません.Staaking契約を実行するCodeBaseの束があります.私は、この記事でstaking契約ビルディングを構成する方法を説明しました.それで、私はあなたにここのそれらのステップを理解するよう勧めます.今日私の記事を検討してくれてありがとう!