Substrate에서 블록체인과 애플리케이션 만들기 런타임 설정부터 ~게임 플레이까지
지난 여기 기사에서는 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
Reference
이 문제에 관하여(Substrate에서 블록체인과 애플리케이션 만들기 런타임 설정부터 ~게임 플레이까지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SotaWatanabe/items/b08c1e5f744cedca0c94
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 {}
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;
}
}
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(())
}
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
Reference
이 문제에 관하여(Substrate에서 블록체인과 애플리케이션 만들기 런타임 설정부터 ~게임 플레이까지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SotaWatanabe/items/b08c1e5f744cedca0c94
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<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>
................
this.seedAccount.use()
this.runtime = new Bond;
//これ
this.player = new Bond;
}
Reference
이 문제에 관하여(Substrate에서 블록체인과 애플리케이션 만들기 런타임 설정부터 ~게임 플레이까지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/SotaWatanabe/items/b08c1e5f744cedca0c94텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)