Uniqys Kitプレビュー版を公開しました!

ころぴこと
12 min readAug 1, 2018

--

今すぐ試せます!

Uniqys Projectでは7/25にUniqys Networkの構想を公開し、同時にUniqys Kitプレビュー版を公開しました。

この記事では、プレビュー版Uniqys Kitでできることを紹介していきます。 プロジェクト全体でわれわれが目指す世界とその展望については、先に公開した記事をご覧ください。

What is Uniqys Kit?

DAppsを身近にするUniqys Networkの中で、Uniqys KitはDAppsを開発の側面からサポートするプロダクトです。 DAppごとのブロックチェーンを作成するChain Coreと、DAppをより簡単に開発するためのEasy Frameworkが現在開発中であり、デベロッパにもユーザにも優しいDAppsの開発を目指しています。

Chain Coreは、P2PネットワークとPBFTベースのコンセンサスアルゴリズム、Ethereumとの連携を提供する予定です。これによりDAppごとのブロックチェーンを構成し、スケーラビリティの問題を解消すると共に、ユースケースに合わせて手数料などを自由に選択できるようにします。

Easy Frameworkは、ブロックチェーンのことを意識せずに既存のスキルセットによってDAppが作成できるフレームワークを目指しています。これにより、周辺ツールを含めた資産を活用しつつ、アプリケーションの関心事に注力して開発ができるようになります。

それぞれの詳細は公式サイトのページもご覧ください。

プレビュー版でなにができるの?

プレビュー版の目的は、Uniqys Kitがどこまで出来ているか、およびEasy FrameworkによってどのようにDAppが作成できるかをお見せすることです。 Easy Frameworkを用いたDAppのサンプル(現在のところ1つですが今後追加する予定です)によって、Uniqys Kitを用いたDAppとはどのようなものか確認できるでしょう。

ただし、Chain CoreとEasy Frameworkをはじめ、現在公開しているUniqys Kitは開発初期段階のものです。

Chain Coreに関してはP2Pネットワークを一部実装しているものの、以下のような多くの未実装な機能があります。

  • コンセンサスアルゴリズム
  • Ethereumとの連携
  • ステークの管理
  • DAppsのデプロイ・アップデートの管理
  • Plasmaのようなセキュリティシステム
  • DoS攻撃への対策
  • 各ノードでのDAppsのサンドボックス化
  • ステートのMerkle Proofの提供

また、Easy Frameworkに関しても、現在の仕様が変わる可能性があります。お気をつけください。

なおサンプルアプリケーションは、ネットワーク機能をもたない開発用の chain-core-dev で動作しています。

これは長い旅路の最初の一歩である。

サンプルをうごかしてみよう

それでは、サンプルアプリを実際に動かしてみましょう!

ここではトークンを送りあえるメッセージ投稿アプリの 「Messages」を試してみます。

1. Uniqys Kitをセットアップする

まずはリポジトリをクローンします。

$ git clone git@github.com:uniqys/UniqysKit-preview.git
$ cd UniqysKit-preview

次にパッケージをセットアップします。 Uniqys Kitはnpmとlernaによるmonorepoとなっており、次の2つのコマンドでセットアップできます。

💡Node v10.9 以降を利用してください。ndenvの使用を推奨します。

$ npm install
$ npm run bootstrap

またUniqys KitはTypeScriptで実装されており、ビルドも必要です。

$ npm run build

2. Messagesを起動する

先程のセットアップでMessagesのビルドも行われているので、あとはディレクトリへ移動して起動スクリプトを実行するだけです。

$ cd packages/samples/messages 
$ npm start

3. Messagesを使ってみる

ブラウザで http://localhost:8080 を開くと、アプリを使えます。 メッセージの投稿とトークンの送金を試してみましょう。

3.1 メッセージを投稿する

入力欄にメッセージを入力して post message をクリックします。すると、署名する際の確認ダイアログが出るので許可します。

💡 確認ダイアログでどのようなアクションが実行されるかを改めて確認できます。

投稿が成功するとタイムラインに表示されるとともに、あなたはトークンを1つ得ることができます。

3.2 別のアカウントに切り替える

プレビュー版に含まれるEasy FrameworkのクライアントはブラウザのlocalStorageにアカウント情報を保存しています。(これは開発用の実装です。) そのため、別のアカウントに切り替える場合は、ブラウザのシークレットウィンドウ機能を使うと良いでしょう。

💡 Addressが別のものになり、トークン残高が0になります。

3.3 トークンを送る

切り替えたアカウントでメッセージを投稿してトークンを手に入れておきます。次に、自分以外のアカウントの投稿したメッセージの send token を押すと、そのアカウントにトークンを送れます。

もとのアカウントに戻ってページを更新すると、残高が増えている事が確認できるでしょう。

どうやって動いているの?

Messagesがどうやって動いているかコードも含めて見てみます。 なお、アプリケーションを起動したときのログも確認してみると、動作がより追えるでしょう。

全体の構成

MessagesのようなEasy Frameworkを使ったDAppは、Easy FrameworkとChain Core、そしてアプリケーションロジック(以下 App)とクライアントから構成されます。

Appのコードはブロックチェーンをほぼ意識する必要はなく、HTTPサーバアプリケーションとして実装されています。
https://github.com/uniqys/UniqysKit-preview/blob/632f79527a3fbd0a0547300aeb56f584b691ffd2/packages/samples/messages/server/src/app.ts

また、クライアントも通常のHTTPクライアントを用いたSPAとして実装されています。
https://github.com/uniqys/UniqysKit-preview/blob/632f79527a3fbd0a0547300aeb56f584b691ffd2/packages/samples/messages/client/app.vue

HTTPリクエストとプロキシ

まずブラウザで http://localhost:8080 にアクセスすると、そのHTTPリクエストをEasy Frameworkのゲートウェイが受け取ります。 ゲートウェイは、署名があるかを確認し、署名がある場合はトランザクションとしてブロックチェーンに取り込み、ない場合はAppへプロキシします。 ここでは署名がないので、GET /のリクエストとしてそのままAppへプロキシされ、インデックスページがレスポンスされます。

アプリケーションのDB

アプリケーションの状態は、Easy Frameworkが提供するDBに保存されています。 AppからはMemcachedプロトコルで値の取得と更新ができると共に、内部ではMerkle Patricia Trieを構成し、Chain Coreを介してそのRoot Hashがブロックチェーンに記録されます。

MemcachedプロトコルによるDBの操作:
https://github.com/uniqys/UniqysKit-preview/blob/632f79527a3fbd0a0547300aeb56f584b691ffd2/packages/samples/messages/server/src/app.ts#L31-L36

const db = new Memcached(dbUrl)...const message = await new Promise<{ sender: string, contents: string } | undefined>((resolve, reject) => {
db.get(`messages:${id}`, (err, message) => {
if (err) return reject(err)
resolve(message)
})
})

トランザクションの発行

アプリケーションの状態を更新する操作は、トランザクションとしてブロックチェーンに記録されます。Easy Frameworkでは、クライアントにおいて通常のHTTPリクエストを送るようにしてトランザクションを生成できます。 このとき、署名の確認ダイアログが表示されます。署名対象はもとのHTTPリクエストとなるので、ユーザは実際にどのようなアクションが行われるかをある程度読み取る事ができるでしょう。

トランザクションの発行:
https://github.com/uniqys/UniqysKit-preview/blob/632f79527a3fbd0a0547300aeb56f584b691ffd2/packages/samples/messages/client/app.vue#L155-L166

easy.post('/messages', { contents: message }, { sign: true })
.then(({ data }) => {
this.resolves.postMessage = {
id: data.id,
content: data.contents,
}
return this.updateMessages()
})
.then(() => {
return this.updateAccount()
})
.catch((err) => this.rejects.postMessage = err.toString())

ブロックチェーンを経由したトランザクションの実行

クライアントから発行されたトランザクションはChain Coreを介してブロックチェーンに記録されます。ブロックチェーンにおいてコンセンサスに至ると、senderの付いたHTTPリクエストとしてAppで実行されます。AppにおいてはMemcachedプロトコルで状態を更新します。

ブロックチェーン経由で呼び出されていることの確認: https://github.com/uniqys/UniqysKit-preview/blob/632f79527a3fbd0a0547300aeb56f584b691ffd2/packages/samples/messages/server/src/app.ts#L13-L18

function viaChain (ctx: Koa.Context): string {
const sender = ctx.header['uniqys-sender']
console.log(sender)
if (!(sender && typeof sender === 'string')) ctx.throw(403, 'access via chain required')
return sender
}

Uniqys Kitはまだまだ未熟ですが、DApps開発者のみなさんに支持されるよう、手を取り合って進化していくことが重要だと考えています。

DAppsが身近になった未来に向けて、今後も随時情報を公開して行く予定です。お楽しみに!

海で生まれた原始の生命は、進化し、世界へ広がった。DAppsの生命は、今後どう進化していくだろうか。

--

--