Blockchain as a Service「kaleido」の使用感を確認したよ

前回の予告どおり、今回はBaaSの「kaleido」の使用感についてです。 よくあるブロックチェーンのサンプルやチュートリアルのようなことを、kaleidoではどうやるかという観点で確認してみました。 情報源は基本的に公式サイト(英語)ですが、Qiitaで記事を書かれている方が3名ほどいらっしゃいましたのでそちらも参考にしております。

アカウント作成~ノードの作成まで

AWSアカウントの作成

ググれば大丈夫のはずなので本記事では省略。クレジットカード情報が必要。12か月は無料とのこと。

kaleidoアカウントの作成

AWSマーケットプレイスのkaleidoのサイト右上の"Continue to Subscribe"ボタンをクリックすると、kaleidoのサイトに移動するので画面の案内に従ってアカウントを作成します。 f:id:handatec:20200626134217p:plain 今回は1アカウントのみアクセス可能なStarterプラン(無料プラン)としました。

この時点で"Membership ID"と"Organization ID"が付与されるようです。

ネットワーク(コンソーシアム)の作成

ここからネットワーク(コンソーシアム)、環境、ノードの順に作成していきます。 f:id:handatec:20200626134411p:plain

2020年6月現在でのkaleidoの画面は新画面(NEW CONSOLE)が規定になっています。 ネットで調べると出てくる手順では、旧画面(OLD CONSOLE)で記載されているので、言葉が異なっていること注意が必要です。

旧ボタン:Create Consortium

新ボタン:CREATE NETWORK

また、"OLD CONSOLE"でしか表示されない画面がある(例:Ether Poolに関連する画面)ことも注意が必要です。 本記事では、特に注釈がないものは新画面を想定しています。 ちなみに、旧画面へは画面右上にある"BACK TO OLD CONSOLE"ボタンで切り替え可能です。

ネットワーク名を適当に入力してNEXTボタンをクリック。 f:id:handatec:20200626134539p:plain ホームリージョンを設定してNEXTボタンをクリック。 今回はOhio(AWS、US-east-2)を選択。 f:id:handatec:20200626134559p:plain マルチリージョンにもできるけど、Starterプランなので選択できない。 このままFINISHボタンをクリック。 f:id:handatec:20200626134615p:plain この時点で"consortia_id"(コンソーシアムID)が付与されるようです。 kaleidoでは自動付与されるID類は"u0"で始まるみたいです。

環境(Environment)の作成

CREATE ENVIRONMENTボタンをクリック f:id:handatec:20200626134740p:plain プロトコルを選択。2020年6月現在ではEthereum系とCorda(beta)が選択可能。 今回はEthereum系を選択してNEXTボタンをクリック。 f:id:handatec:20200626134817p:plain

環境名を適当に入力。 今回はStarterプランなのでマルチリージョンは選択できません。 NEXTボタンをクリック。 f:id:handatec:20200626134831p:plain プロバイダを選択。 Geth、Quorum、Hyperledger Besuが選択可能。 今回はQuoram、コンセンサスアルゴリズムはRaftを選択してFINISHボタンをクリック。 f:id:handatec:20200626134842p:plain この時点で、"environment_id"(環境ID)が付与されるようです。 また、環境は複数作れるようです。

ノードの作成

CREATE NODEボタンをクリックして環境へノード追加します。 f:id:handatec:20200626135117p:plain メンバシップはprivateしか選べませんでした。プランによるのでしょう。 ノードの名前を適当に付けてNEXTボタンをクリック。 f:id:handatec:20200626135147p:plain

クラウドコンフィグレーションはとりあえず何もせずにNEXTボタンをクリック。 f:id:handatec:20200626135232p:plain ノードサイズはSmallしか選べませんでした。これもプランによるのでしょう。 「コンセンサス上の役割(Role in Consensus)」はあまり理解していませんが、もともと「署名者にする」にチェックが入っていたので、そのまま。 FINISHボタンをクリック。 f:id:handatec:20200626135244p:plain この時点でNode IDが付与されています。 しばらく待つとノードの状態がInitializing(オレンジ)からStarted(グリーン)に変わるはずです。 f:id:handatec:20200626135442p:plain 最初のノードを作成した際に、「System Monitor」というノードも自動で生成されます。 また、ノードはStarterプランでも複数作成できます。今回は3つのノード作成しました。(Node01、Node02、Node03) f:id:handatec:20200626135836p:plain ここまで実施すると、 ネットワーク(コンソーシアム)-環境-ノード-アカウント という構造になっているはずです。

メモ:アカウント、ウォレットについて

ノードを作成した際に、そのノードに紐づくアカウントが1つ生成されます。 画面左のメニュー MANAGE RESOURCES -> Nodes -> Walletの画面でアカウントの追加が可能です。 下の画面ショットでは、自動で生成されたアカウント1つ、手動で追加したアカウント1つが表示されています。 f:id:handatec:20200626140038p:plain WALLETもノードを作成した際に、アカウントと同時に生成されます。 Type(分類)は「Node Wallet」となっています。

スマートコントラクトのデプロイ、関数の利用

ノード情報を表示する画面の右側に2つのボタンが見えます。

  • CONNECT APP
  • IMPORT SMART CONTRACT

f:id:handatec:20200626140443p:plain

CONNECT APP:外部からの接続時における認証情報「App Cred」(旧画面でいう「App Credential」)を作成できます。

画面左のメニューの、MANAGE RESOURCES -> Apps & Integrations->Securityで表示される「App Creds」からも新しいCredの生成や確認が可能です。 f:id:handatec:20200626140814p:plain Credを生成すると、ID、パスワード、JSON/RPC HTTPエンドポイント、REST API Gatewayエンドポイントなどの情報が表示されます。 パスワードはCred生成直後しか表示されないので、メモし忘れた場合は再生成が必要です。

App Credは、IDとパスワードを":"(コロン)で繋げた文字列です。

{App Cred} = {ID}:{password}

truffle等で接続する際のJSON/RPC HTTPエンドポイントは以下のようになるはずです。

https://{App Cred}@{environment_id}-{Node ID}-rpc.{region}.kaleido.io/

また、REST API Gatewayエンドポイントは以下のようになります。(後述します)

https://{App Cred}@{environment_id}-{Node ID}-connect.{region}.kaleido.io/gateways/{API endpoint}/

IMPORT SMART CONTRACT:以下の4つの方法でコントラクトの配置ができます。

  1. Use our Token Factory
  2. Upload file with source code
  3. Paste compilation metadata
  4. Import from Github

f:id:handatec:20200626141111p:plain

本記事では、1.と2.を試しました。

Use our Token Factory(ERC20、ERC721トークンの作成)

Kaleidoが用意しているERC20、ERC721テンプレートからトークンを生成できます。 Kaleido Token Factory テンプレートは OpenZeppelinベースとのことです。 なので、このようなトークンを作る場合はコーディングレスです。

ちなみに、後述する「Upload file with source code」機能で、OpenZeppelinをimportしているソースコード単体をアップロードしてもコンパイルエラーとなります。

Upload file with source code(コントラクトソースコードのアップロード)

手持ちのSolidityコードをアップロードしてコントラクトを作成できます。複数のファイルをZIPでまとめてアップロードもできるようです。 今回は、前回記事で作成していたSimpleStorage.sol(よく見かけるやつ)を利用しました。

pragma solidity ^0.5.0;

contract simplestorage {
  uint public storedData;

  constructor(uint initVal) public {
    storedData = initVal;
  }

  function set(uint x) public {
    storedData = x;
  }

  function get() view public returns (uint retVal) {
    return storedData;
  }
}

アップロードすると、Solidityコードの各関数に対応するAPIが生成されます。

画面左のメニュー MANAGE RESOURCES -> Apps & Integrations -> Gateway API'sに生成したAPI endpointが表示されます。 アップロードした時点ではコンパイルがされるだけでデプロイまではされていないようです。 f:id:handatec:20200626141455p:plain

アップロードしたコントラクトのデプロイ

API endpointの一覧から当該エンドポイントを選択すると次の画面が表示されます。 f:id:handatec:20200626141739p:plain Gateway API Details画面の右上「VIEW GATEWAY API」ボタンをクリック

-> 任意のノードを選択して、「VIEW API」をクリック

-> 表示されたリンクをクリック

するとブラウザの別タブでAPIの一覧が表示されます。 イメージとしてはSwagger Editorのような画面で、API実行機能もついています。 f:id:handatec:20200626142423p:plain 最上行のPOST / はコンストラクタとなっており、これを動かすとコントラクトがデプロイされます。 当該行をクリックして展開し、BODY DATAの欄でEXAMPLEタブをクリックすると以下のような表示がされると思います。

f:id:handatec:20200626161458p:plain

^-?[0-9]+$の部分に適当な数字を上書きしてTRYボタンを押してみましょう。 デプロイのトランザクションが発行され、ブロックが生成されます。 コントラクトのstoredDataには上書きした数値が設定されたはずです。

コントラクトの関数の実行

同画面にget、set、storedDataのメソッドが並んでいました。 get関数で先ほどデプロイしたコントラクトの状態を見てみましょう。

f:id:handatec:20200626161509p:plain

get関数のREST APIアドレスは以下のようになっています。

https://{environment_id}-{Node ID}-connect.{region}.kaleido.io/gateways/{API endpoint}/{address}/get

{address}の部分はコントラクトのアドレスで、同画面上のPATH PARAMETERS項目から設定できます。必須の赤いアスタリスクがついてますね。 コントラクトのアドレスは、先ほどまでのkaleido画面のメニュー、Data Explorer -> Smart Contractsから当該コントラクトを選択、Contract Info画面から確認、クリップボードへコピーできるはずです。 f:id:handatec:20200626143726p:plain コピーしたアドレスを貼り付け、TRYボタンを押すとstoredDataの値が表示されます。

f:id:handatec:20200626161521p:plain

同様の手順でset、storedDataも動かすことができます。

外部からREST APIを使ってコントラクトへアクセスする

上述のgetと同じことをREST APIを使ってローカルから接続して確認してみましょう。今回はお手軽にPostmanを利用しました。curlとかでもよいかと思います。 f:id:handatec:20200626152752p:plain REST APIアドレスは先に書いたものと同じで、以下のようになっています。(画面ショット上は{environment_id}と{Node ID}は伏せています)

https://{environment_id}-{Node ID}-connect.{region}.kaleido.io/gateways/{API endpoint}/{contract address}/get

AuthorizationはTYPEを「Basic Auth」にし、UsernameとPasswordを指定しています。UsernameとPasswordはApp Credで生成したものを使います。

また、以下のURLでも同じようにアクセスできます。この場合、Authorizationは「No Auth」でOKです。

https://{App Cred}@{environment_id}-{Node ID}-connect.{region}.kaleido.io/gateways/{API endpoint}/{contract address}/get

curlだと以下のようなコマンドで同じことができます。

curl -X GET "https://{App Cred}@{environment_id}-{Node ID}-connect.{region}.kaleido.io/gateways/{API endpoint}/{contract addresss}/get?kld-from={account address}" -H "Accept: application/json, application/json"

メモ:gas不足対応について

コントラクトのset関数を実行しているとgas不足で実行できないと言われる場合があるかもしれません。 先人の方によると、アカウントにethを割り当てることで対応可能とのことですが、その割り当て画面、OLD CONSOLEでしか表示されません。 (自分が辿れてないだけなのか、実装漏れなのか。。。)

やり方は以下の通り。

  1. OLD CONSOLEに切り替え
  2. EnvironmentのHOME -> SERVICES -> Ether-Pool -> Fund Account で画面を表示
  3. 以下の例を参考に項目値を設定してFUNDボタンをクリック

f:id:handatec:20200626171130p:plain:w340

  • Token Type:eth
  • RECEIVER ACCOUNT:ethを付与したいアカウントのアドレス
  • AMOUNT:1000とか適当に大きな値
  • Unit (単位):Ether

ちなみに、kaleidoでは環境を作成した際に10億ethがあらかじめプールされているようです。

メモ:その他のAPIについて

kaleidoにはまだまだ多くのAPIが備わっていて、Ledger APIなども試しています。 例えば、以下のようなAPIeth.getBlockコマンドと同じようにブロックの情報を取得することもできます。

https://console.kaleido.io/api/v1/ledger/{consortia_id}/{environment_id}/blocks/{block_number}

やり残しているいこと

  • 作成したERC721トークンをアカウントに配布する方法
  • ERC721トークンとERC20トークンの交換
  • "PrivateFor"でコントラクトの参照を特定ノードに制限する方法
  • TruffleからのJSON/RPC HTTP接続、操作

今回はここまで。