Substrate에서 블록체인과 애플리케이션 만들기 런타임 설정부터 ~게임 플레이까지

18976 단어 Substrate블록체인
안녕하세요, Staked 와타나베 창태입니다.

지난 여기 기사에서는 Substrate 설치부터 계정 생성까지 수행했습니다. 이 기사는 계속됩니다. Gavin Wood의 Web3 Summit에서 발표를 참조하고 있습니다.

Runtime 모듈 작성



Runtime은 Substrate에서 블록 처리 로직 등을 결정하는 기능입니다. State Transaction Functiuon이라고도 하는 경우도 있어 WebAssembly 바이너리로 온 체인에 기재되어 있습니다. 자세한 내용은 Scrapbox에 설명되어 있습니다.

마지막으로 substrate-node-template를 설치했지만 ./runtime/src/demo.rs 폴더에 나열되어 있습니다.



작성한 demo.rs에 여러 라이브러리를 설치하십시오.
use parity_codec::Encode;
use support::{StorageValue, dispatch::Result, decl_module, decl_storage};
use runtime_primitives::traits::Hash;
use {balances, system::{self, ensure_signed}};

pub trait Trait: balance::Trait {}

Web3 Summit의 프레젠테이션에서는 간단한 베팅 게임을 만들었습니다. 게임을 이기면 Pot에 모인 금액을 얻을 수 있으며, 잃으면 Pot에 몰수된다는 간단한 구조입니다.

라이브러리를 설치했으므로 모듈을 선언해야 합니다. (module declaration)
decl_module! {
    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
        fn play(origin) -> Result{
            //ゲームをプレイするロジック
        }

        fn set_payment(_origin, value: T::Balance) -> Result{
            //ゲームのpaymentの仕様
        }
    }
}

decl_storage! {
  trait Store for Module<T: Trait> as Demo {
    Payment get(payment): Option<T::Balance>;
    Pot get(pot): T::Balance;
  }
}

strage 모듈은 온체인에 게재되는 정보를 정의하는 데 사용됩니다.

그런 다음 모듈의 논리를 작성합니다.

게임을하는 로직


fn play(origin) -> Result {

  let sender = ensure_signed(origin)?;
  //decl_strage!で宣言しているからpaymentが使える
  let payment = Self::payment().ok_or("Must have payment amount set")?;
 //senderの残高を減少させる
  <balances::Module<T>>::decrease_free_balance(&sender, payment)?;

  //ハッシュ関数を通してハッシュ値の最初のbyteが128以下であれば勝ち。potにあった金額がSenderに払われる
  if (<system::Module<T>>::random_seed(), &sender)
  .using_encoded(<T as system::Trait>::Hashing::hash)
  .using_encoded(|e| e[0] < 128)
  {
    <balances::Module<T>>::increase_free_balance_creating(&sender, <Pot<T>>::take());
  }
 
  //結果どうあれ、senderが賭けに参加した金額がデポジットされる
  <Pot<T>>::mutate(|pot| *pot += payment);

  Ok(())
}

게임 내 Payment 로직



fn set_payment(_origin, value: T::Balance) -> Result {
 //イニシャルpaymentがセットされていない場合の処理
  if Self::payment().is_none() {

    <Payment<T>>::put(value);
    <Pot<T>>::put(value);
  }

  Ok(())
}

변경사항 업데이트



위에서 Module을 설정했습니다. 변경을 수행하기 위해 ./runtime/src/lib.rs를 편집합니다.
mod demo; 추가.


impl demo::Trait for Runtime {} 추가


Demo: demo::{Module, Call, Storage}, 추가



위에서 새로운 Runtime 모듈을 만들었으므로 블록체인을 업데이트합니다.

Substrate-node-template 디렉토리에서 빌드substrate-node-template $ ./build.sh


빌드 후, substrate-ui npm run dev로 접속한 localhost8000에서 맨 아래에 Runtime Upgrade가 가능하므로 Select Runtime을 누르고,
./runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm
를 선택합니다. 이제 런타임 업데이트가 완료되었습니다. Developer Console에서 보면 움직이는 것을 알 수 있습니다.



UI 정돈



UI를 정렬하려면 substrate-ui 리포지토리를 편집해야 합니다../substrate-ui/src/app.jsx를 편집합니다.

새로 다음 섹션을 추가합니다.
<Divider hidden />
<Segment style={{margin: '1em'}} padded>
  <Header as='h2'>
    <Icon name='game' />
    <Header.Content>
      Play the game
      <Header.Subheader>Play the game here!</Header.Subheader>
    </Header.Content>
  </Header>
  <div style={{paddingBottom: '1em'}}>
    <div style={{fontSize: 'small'}}>player</div>
    <SignerBond bond={this.player}/>
    <If condition={this.player.ready()} then={<span>
      <Label>Balance
        <Label.Detail>
          <Pretty value={runtime.balances.balance(this.player)}/>
        </Label.Detail>
      </Label>
    </span>}/>
  </div>
  <TransactButton
    content="Play"
    icon='game'
    tx={{
      sender: this.player,
      call: calls.demo.play()
    }}
  />
  <Label>Pot Balance
    <Label.Detail>
      <Pretty value={runtime.demo.pot}/>
    </Label.Detail>
  </Label>
</Segment>


동시에 export 부분에 this.player = new Bond;를 추가합니다.
................
this.seedAccount.use()
this.runtime = new Bond;
//これ
this.player = new Bond;
}

이제 UI를 빌드하고 게임을 플레이할 수 있습니다.



Source: htps //w w. 요츠베. 이 m/와 tch? v = 0 이오 Z 5 5 s & t = 22s

좋은 웹페이지 즐겨찾기