目次


IBM Blockchain VS Code 拡張機能を使用してスマート・コントラクトを開発する

スマート・コントラクトの開発、テスト、デプロイのプロセスを簡素化する

Comments

IBM Blockchain Platform の Visual Studio Code 拡張機能を使用して、スマート・コントラクトを開発、テスト、デプロイするプロセスを簡素化する方法を学んでください。このチュートリアルを完了すると、VS Code を使ってブロックチェーン・アプリケーションを迅速に開発してデモし、ローカルの Hyperledger Fabric ネットワークにデプロイする方法を把握できます。このチュートリアルでは、読者に Hyperledger Fabric の基礎知識があることを前提としています。

学習の目的

このチュートリアルでは以下の方法を説明します。

  • IBM Blockchain Platform の VS Code 拡張機能をインストールする
  • スマート・コントラクト・プロジェクトを新規に作成する
  • スマート・コントラクトをパッケージ化する
  • 事前に構成されたローカルの Hyperledger Fabric ランタイムを起動して使用する
  • local_fabric 上にスマート・コントラクトをデプロイする
  • ローカルにデプロイされたスマート・コントラクトに対してトランザクションを実行する

前提条件

この拡張機能を使用するには、次のソフトウェアがインストールされた環境が必要です。

  • VS Code バージョン 1.32 以降
  • Node v8.x 以降と npm v5.x 以降
  • Docker バージョン v17.06.2-ce 以降
  • Docker Compose v1.14.0 以降

Windows を使用する場合は、次の点も確認してください。

  • Hyper-V と Docker をサポートしているバージョンの Windows を使用していること。これに該当するバージョンは次のとおりです。
    • 1607 Anniversary Update 以降が適用された Windows 10 Enterprise、Pro、または Education
  • Docker for Windows が Linux コンテナーを使用するように構成されていること (これがデフォルトの構成です)
  • windows-build-tools に含まれる Windows 用 C++ Build Tools がインストール済みであること
  • Win32 OpenSSL に含まれる OpenSSL v1.0.2 がインストール済みであること。次の点に注意する必要があります。
    • 「light」としてマークされたバージョンではなく、通常のバージョンをインストールしてください。
    • Win32 バージョンは、32 ビット版システム上の C:\OpenSSL-Win32 にインストールします。
    • Win64 バージョンは、64 ビット版システム上の C:\OpenSSL-Win64 にインストールします。

インストールされているバージョンを確認するには、ターミナルから次のコマンドを実行します。

  • node --version
  • npm --version
  • docker --version
  • docker-compose --version

所要時間

前提条件がインストール済みであれば、このチュートリアルを完了するのに必要な時間は約 20 ~ 30 分です。

手順

手順を開始する前に、IBM Blockchain Platform VS Code 拡張機能のインストールが必要になる場合があります。インストールする VS Code は最新バージョンでなければなりません。すでに最新の VS Code 拡張機能がインストールされているかどうかを確認するには、「Code (コード)」 > 「Check for Updates (アップデートを確認)」 を表示します。次に、画面左側にあるサイドバーで「Extensions (拡張機能)」をクリックします。サイドバーの最上部で、拡張機能マーケットプレイスを検索して「IBM Blockchain Platform」を見つけます。「Install (インストール)」をクリックし、「reload (再ロード)」をクリックします。これで、拡張機能を使用する準備が整います。

1

スマート・コントラクト・プロジェクトを新規に作成する

VS Code 拡張機能により、Hyperledger Fabric でサポートしている任意のプログラミング言語でスマート・コントラクトのスケルトンを生成することができます。つまり、白紙からスタートするのではなく、基本的ながらも有用なスマート・コントラクトを出発点にできるというわけです。

このチュートリアルでは、プログラミング言語の例として TypeScript を使用します。

VS Code では、あらゆるコマンドをコマンド・パレットから実行することができます (Ctrl+Shift+P キーを押すか、Cmd+Shift+P キー (MacOS の場合) を押すと、コマンド・パレットが表示されます)。この拡張機能のコマンドの名前はすべて、IBM Blockchain Platform: で始まります。チュートリアルの手順では、UI 内のどこをクリックすればよいか説明しますが、コマンド・パレットでの代替コマンドを知りたいとしたら、このような名前のコメント・ボックスを探してください。
  1. 左側のサイドバーで、「IBM Blockchain Platform」アイコンをクリックします (正方形のように見えるアイコンです。最新の拡張機能がインストールされている場合は、一連のアイコンの一番下にあるはずです)。
  2. SMART CONTRACT PACKAGES (スマート・コントラクト・パッケージ)」パネルの上にマウスのカーソルを重ねて「...」メニューをクリックし、表示されるドロップダウンから「Create Smart Contract Project (スマート・コントラクト・プロジェクトの作成)」を選択します。
コマンド・パレットでの代替コマンド: Create Smart Contract Project (スマート・コントラクト・プロジェクトの作成)
  1. スマート・コントラクト言語を選択します。選択肢として、JavaScript、TypeScript、Java、Go のすべてが有効です。このチュートリアルでは、「TypeScript」を選択してください。
  2. 拡張機能により、生成されたコントラクト内に含まれるアセットに名前を付けるかどうか尋ねられます (デフォルトではアセット名が「MyAsset」に設定されますが、遠慮なく趣向を凝らした名前を付けてください。) ブロックチェーンを何の目的で使おうとしているのかを考えると、どのようなタイプのアセットをレジャー内で作成、更新、読み取るのかを判断できます。「大根」でも「パイナップル」でも「ペンギン」でも、お好きな名前を選んでください!このチュートリアルでは、退屈な名前ですが「MyAsset」を使用します。
上級者向けのヒント: アセットの名前を変更するとしたら、以降の手順では必ずコード内の「MyAsset」をその名で置き換えてください。
  1. プロジェクトの保存先を選択します。「Browse (参照)」をクリックし、「New Folder (新規フォルダー)」をクリックして、プロジェクトに任意の名前を付けます (例: 「demoContract」)。
上級者向けのヒント: プロジェクトの名前にはスペースを含めないようにしてください。
  1. Create (作成)」をクリックし、前のステップで新しく作成したフォルダーを選択してから、「Save (保存)」をクリックします。
  2. 選択項目のリストから「Add to workspace (ワークスペースに追加)」を選択します。

拡張機能により、選択した言語とアセット名に基づくスケルトン・コントラクトが生成されます。スケルトンが生成されたら、「Explorer (エクスプローラー)」ビューを表示します (通常は、左側サイドバーの一番上にある、ドキュメントのように見えるアイコンをクリックすると表示されます)。このビューで src/my-asset-contract.ts ファイルを開くと、スマート・コントラクト・コードの scaffold を確認できます。これで、スマート・コントラクトを使えるようになりました!どのような内容になっているのか見ていきましょう。

2

スマート・コントラクトを理解する

生成されたスマート・コントラクト・コードの scaffold は、ブロックチェーン・レジャー上のデータを処理する一般的なオペレーションのお手本となります。時間がないというのであれば、このセクションをスキップしても構いませんが、少々時間をかけてスマート・コントラクトの基本的な構造を理解する価値はあります。

@Transaction の後に続く行を見てください。これらの行は、コントラクトのトランザクションを定義する関数です。つまり、レジャーを処理するために使用できるトランザクションが定義されています。

最初の関数 myAssetExists を飛ばして createMyAsset 関数に注目してください。

    @Transaction()
    public async createMyAsset(ctx: Context, myAssetId: string, value: string): Promise<void> {
        const exists = await this.myAssetExists(ctx, myAssetId);
        if (exists) {
            throw new Error(`The my asset ${myAssetId} already exists`);
        }
        const myAsset = new MyAsset();
        myAsset.value = value;
        const buffer = Buffer.from(JSON.stringify(myAsset));
        await ctx.stub.putState(myAssetId, buffer);
    }

@Transaction() に含まれる空の括弧は、この関数によってレジャーの内容が変更されることを意味します。このようなトランザクションは一般に (評価 されるのではなく) 実行依頼 されます。これについては、このチュートリアルの後半で説明します。この createMyAsset という名前の関数は引数として myAssetIdvalue の値を取ります。この 2 つは、いずれも文字列です。このトランザクションが実行依頼されると、新しいアセットが作成され、そのキーは myAssetId に、値は value に設定されます。例えば、キーが「001」、値が「A juicy delicious pineapple」のアセットを作成するとします。後でキー 001 の値を読み取ると、この特定の状態の値が A juicy delicious pineapple であることがわかります。

次のトランザクションを見てください。

    @Transaction(false)
    @Returns('MyAsset')
    public async readMyAsset(ctx: Context, myAssetId: string): Promise<MyAsset> {
        const exists = await this.myAssetExists(ctx, myAssetId);
        if (!exists) {
            throw new Error(`The my asset ${myAssetId} does not exist`);
        }
        const buffer = await ctx.stub.getState(myAssetId);
        const myAsset = JSON.parse(buffer.toString()) as MyAsset;
        return myAsset;
    }

この関数は @Transaction(false) で始まっています。「false」は、この関数がレジャーの内容を変更するためのものではないことを意味します。このようなトランザクションは通常、評価 されます。このようなトランザクションは「クエリー」と呼ばれることもよくあります。ご覧のように、この関数は引数として myAssetId だけを取り、このキーが指す状態の値を返します。

時間があるときに、コントラクト内の他のトランザクションも調べてください。内容を把握した後は、コントラクトをパッケージ化してデプロイし、使い始めることができます。

3

スマート・コントラクトをパッケージ化する

スマート・コントラクトを作成して、その中に含まれるトランザクションを把握したら、コントラクトをパッケージ化します。スマート・コントラクト・プロジェクトは .CDS ファイルにパッケージ化されます。これは、Hyperledger Fabric ピア上にインストールできる特殊なタイプのファイルです。

  1. 左側のサイドバーで、「IBM Blockchain Platform」アイコンをクリックします。
  2. SMART CONTRACT PACKAGES (スマート・コントラクト・パッケージ)」パネルの上にマウスのカーソルを重ねて「...」メニューをクリックし、表示されるドロップダウンから「Package a Smart Contract Project (スマート・コントラクト・プロジェクトのパッケージ化)」を選択します。
コマンド・パレットでの代替コマンド: Package a smart contract project (スマート・コントラクト・プロジェクトをパッケージ化)
  1. 問題なく処理されると、リスト上に demoContract@0.0.1 (またはパッケージ化したコントラクトに指定した名前) という新しいパッケージが表示されます。

作成したこのパッケージを、任意の (正しいバージョンで稼働している) Hyperledger Fabric ピアにインストールできます。例えば、パッケージを右クリックして「Export Package (パッケージのエクスポート)」を選択すると、IBM Blockchain Platform のオペレーション・ツール・コンソールを使用してパッケージをクラウド環境にデプロイできます。その方法については後で説明します。とりあえず今は、VS Code 拡張機能で事前構成されたローカルのランタイム上にパッケージをデプロイするので、パッケージをエクスポートする必要はまだありません。

4

ローカル Fabric オペレーション

LOCAL FABRIC OPS (ローカル Fabric オペレーション)」パネル (IBM Blockchain Platform ビュー内) を使用すると、ローカル・マシン上で Docker を使ったシンプルな Hyperledger Fabric ランタイムを操作できます。最初にランタイムが停止されて、次のメッセージが表示されます。

Local Fabric runtime is stopped.Click to start.

このメッセージをクリックすると、拡張機能による Docker コンテナーの自動起動が開始されます。その時点で、「Local Fabric runtime is starting... (ローカル Fabric ランタイムが起動中です...)」というメッセージとロード・スピナーが表示されます。このタスクが完了すると、「Smart Contracts (スマート・コントラクト)」、「Channels (チャネル)」、「Nodes (ノード)」、「Organizations (組織)」というラベルが付いた一連の展開/折り畳み可能なセクションが表示されます。

コマンド・パレットでの代替コマンド: Start Fabric Runtime (Fabric ランタイムの起動)

このステップで必要な作業はこれだけですが、local_fabric が起動するまで待つ間、ランタイムの構成内容を簡単に説明しておきます。

このチュートリアルでは詳細を掘り下げることはしませんが、次の点を知っておくと役立ちます。

  • Smart Contract (スマート・コントラクト)」セクションには、Instantiated および Installed 状態のスマート・コントラクトが表示されます。つまり、このネットワーク上でインスタンス化されたコントラクトとインストール済みコントラクトです。このチュートリアルの以降のいくつかのステップで、パッケージ化したスマート・コントラクトを インストール してから インスタンス化 する方法を説明します。
  • Channels (チャネル)」セクションには、「mychannel」という名前のチャネルが 1 つだけあります。スマート・コントラクトを使用するには、チャネル上でスマート・コントラクトを インスタンス化 する必要があります。次のステップで、コントラクトをピア上にインストールした後、コントラクトをインスタンス化します。
  • Nodes (ノード)」セクションには、1 つのピア (peer0.org1.example.com) だけがあります。ピアには Hyperledger Fabric の命名規則に従った名前が付けられます。「org1」の部分から、このピアを所有している組織は Org1 であることがわかります (ピア名の後に小さな無限記号が示されている場合、ピアが現在開発モードであることを意味します。右クリック・メニューで開発モードをオン/オフに切り替えることができますが、これについては差し当たって気にする必要はありません)。
  • ca.org1.example.com という 1 つの認証局 (CA) と、orderer.example.com という 1 つの順序付けサービス・ノードもあります。これらのノードのタイプについても、独自のネットワークを構築する段階になったら説明します。現時点では、これらのノードはネットワークに不可欠の部分であるため、拡張機能によって自動的に作成されたということだけを知っていれば十分です。
  • このシンプルなブロックチェーン・ネットワークに含まれる組織は「Org1」だけです。前述のように、Org1 が「Nodes (ノード)」セクションに示されているピアを所有しています。ブロックチェーン・ネットワークの核心は、複数 の組織でレジャーを 共有 することであるため、実際の使用ケースでネットワークに 1 つの組織しかないことはないでしょう。けれども、ローカルでの開発が目的であれば、1 つの組織で十分です。「Organizations (組織)」セクションに示されている「Org1MSP」は、Org1 の MSP ID です。現段階では、この ID はそれほど重要ではありません。メンバーシップ・サービス・プロバイダー (MSP) については、独自のネットワークを構築する段階になったら説明します。
  • Docker の大ファンだとしたら、ローカル・マシン上で Orderer、Certificate Authority、CouchDB、Peer の各コンテナーが起動されることを知っておくと役立ちます。

ローカル Fabric ランタイムが起動中になりました。次は、スマート・コントラクトをインストールしてインスタンス化しましょう。

5

スマート・コントラクトをインストールする

実際のネットワークでは、トランザクションを承認する組織のそれぞれが、そのピア上にスマート・コントラクトをインストールします。インストールされたコントラクトは、チャネル上でインスタンス化されます。この基本的なローカル Fabric ランタイムには 1 つの組織 (Org1) と 1 つのピア (peer0.org1.example.com)、そして 1 つのチャネル (mychannel) しかありません。

したがって、ここで必要となる作業は、この 1 つのピア上にコントラクトをインストールして、そのコントラクトを mychannel 内でインスタンス化することだけです。 それには、次の手順に従います。

  1. LOCAL FABRIC OPS (ローカル Fabric オペレーション)」パネルで「Smart Contracts (スマート・コントラクト)」 > 「Installed (インストール済み)」を表示し、「+ Install (インストール)」を見つけてクリックします。
  2. ピアを選択するよう求められます。唯一の選択肢である peer0.org1.example.com を選択します。
  3. インストールするパッケージを選択するよう求められます。demoContract@0.0.1 を選択します。

Smart Contracts (スマート・コントラクト)」 > 「Installed (インストール済み)」リストに demoContract@0.0.1 が表示されます。

コマンド・パレットでの代替コマンド: Install Smart Contract (スマート・コントラクトのインストール)

これでインストールは完了です!次は、スマート・コントラクトをインスタンス化します。

6

スマート・コントラクトをインスタンス化する

インストールしたスマート・コントラクトは、まだクライアント・アプリケーションで呼び出せる状態ではありません。その状態にするには、ネットワーク内のすべての組織が使用できる、コントラクトの共有インスタンスが必要です。けれども、この単純化されたローカルの開発用ネットワークには組織が 1 つしかないため、インスタンスを共有することはできません。ただし今後のチュートリアルでわかるように、複数の組織が関与してくる場合、グループが共有する チャネル 上でコントラクトを インスタンス化 するには、その前に、同じコントラクトを組織のそれぞれがその ピア 上に インストール する必要があります。したがって、まだ初期の段階ですが、このデプロイメントを 2 つのステージからなるプロセスとして考えれば、後で慌てなくても済みます。

現時点では、mychannel に参加しているすべての (1 つの) ピア上にコントラクトをインストールするだけで、インスタンス化を開始できます。

  1. LOCAL FABRIC OPS (ローカル Fabric オペレーション)」パネルで「Smart Contracts (スマート・コントラクト)」 > 「Instantiated (インスタンス化済み)」を表示し、「+ Instantiate (インスタンス化)」を見つけてクリックします。
  2. チャネルを選択するよう求められます。唯一の選択肢である mychannel を選択します。
  3. インスタンス化するコントラクトを選択するよう求められます。demoContract@0.0.1 を選択します。
  4. 呼び出す関数を指定するよう求められます。特定の関数をインスタンス化の一環として使用する場合は、その関数を入力します。今後取り組むチュートリアルでは関数を入力することになりますが、今回は Enter キーを押してこのステップをスキップします。
  5. 非公開のデータ構成ファイルを指定するかどうか選択するよう求められます。このチュートリアルでは「No (いいえ)」をクリックしてください。これについては、今後のチュートリアルで詳しく説明します。

コントラクトのインスタンス化には、インストールの場合よりも時間がかかります。成功メッセージが表示されて、「Smart Contracts (スマート・コントラクト)」 > 「Instantiated (インスタンス化済み)」リストに demoContract@0.0.1 が表示されていれば、インスタンス化が成功したことになります。

コマンド・パレットでの代替コマンド: Instantiate Smart Contract (スマート・コントラクトのインスタンス化)
7

トランザクションの実行依頼と評価を行う

Fabric ゲートウェイは、Hyperledger Fabric ネットワークに参加しているピアと接続する手段です。クライアント・アプリケーションではこのゲートウェイを使用してトランザクションを実行依頼できます。「LOCAL FABRIC OPS (ローカル Fabric オペレーション)」でローカル・ランタイムを起動したときに、ゲートウェイも自動的に作成されています。そのゲートウェイは、「FABRIC GATEWAYS (Fabric ゲートウェイ)」に「local_fabric」という名前で示されています。

ゲートウェイを 使用 するには、該当するネットワーク上でのトランザクションに有効な ID も必要になります。ローカル Fabric ランタイムでは、この ID もすでに自動的にセットアップされています。「FABRIC WALLETS (Fabric ウォレット)」を見ると、local_fabric_wallet という名前のウォレットがあるはずです。このウォレット内に admin という ID が含まれています。「FABRIC GATEWAYS (Fabric ゲートウェイ)」パネル内で「local_fabric」の上にマウスのカーソルを重ねると、「Associated wallet: local_fabric_wallet (関連付けられているウォレット: local_fabric_wallet)」と表示されます。

ゲートウェイが作成され、そのゲートウェイ内のウォレットに単一の ID が関連付けられているということは、ゲートウェイが使用できる状態になっているということです。

  1. local_fabric」(「FABRIC GATEWAYS (Fabric ゲートウェイ)」内) をクリックして、このゲートウェイを介してピアに接続します。「Connected via gateway: local_fabric, Using ID: admin (接続に使用されているゲートウェイ: local_fabric、使用されている ID: admin)」というメッセージと、折りたたまれた状態の「Channels (チャネル)」セクションが表示されます。
  2. Channels (チャネル)」セクションを展開し、「mychannel」、「demoContract@0.0.1」を展開します。スマート・コントラクト内に定義されているすべてのトランザクションのリストが表示されます。
  3. 次に必要となる作業は、アセットを作成することです。「createMyAsset」を右クリックし、「Submit Transaction (トランザクションの実行依頼)」を選択します。トランザクションの引数を入力するよう求められます。試しに ["001", "a juicy delicious asset"] と入力します (または任意のキーと値を入力することもできますが、使用したキーを必ず覚えておいてください)。
上級者向けのヒント: 引数は JSON として送信されます。したがって、上記に示されているとおりに引数を入力して、このトランザクションに必要な 2 つの文字列の配列を送信する必要があります。
コマンド・パレットでの代替コマンド: Submit Transaction (トランザクションの実行依頼)
  1. トランザクションの一時データを設定するよう求められます。今のところ、一時データの設定は必要ありません。トランザクションの一時データについては今後のチュートリアルで説明します。今回は、Enter キーを押すだけで構いません。
  2. 同じようにして「updateMyAsset」を実行依頼します。この場合の引数には、同じキーと異なる値を入力します。例として、["001", "a tremendously delicious asset"] と入力してください。これにより、レジャー上のキー 001 の値が「a tremendously delicious asset」となるはずです。値を読み込んで確かめましょう。
  3. readMyAsset は、レジャーにデータを書き込むための関数ではなく、レジャーからデータを読み取るための関数です。したがって、今回は「Evaluate Transaction (トランザクションの評価)」を選択します。引数として ["001"] (またはキーに設定した値) を入力します。出力コンソールに次のメッセージが表示されるはずです。
[SUCCESS] Returned value from readMyAsset: {"value":" a tremendously delicious asset"}
コマンド・パレットでの代替コマンド: Evaluate Transaction (トランザクションの評価)

これで、トランザクションの実行依頼と評価によってレジャーの更新、読み取りを行えることが証明されました!

まとめ

お疲れさまでした。このチュートリアルを完了した今、ローカルでのスマート・コントラクト開発ワークフローを構成する主要なステップを把握できたはずです。このチュートリアルでは、スケルトン・コントラクトを生成してローカルにデプロイし、そのコントラクトを使用してトランザクションを実行依頼/評価しました。

ローカルでの独自のスマート・コントラクトの開発にさらに時間を費やしたい場合は、拡張機能のホームページからアクセスできるサンプルが、開発のコンセプトを探るのに役立つはずです。コードを何度も繰り返し処理するとしたら、ReadMe 内で説明されている デバッグ 方法を読んでください。これは開発者にとって 非常に 有用な情報です!

IBM Blockchain Platform 入門における次のステップに進むには、VS Code 拡張機能のホームページから全 3 回からなるチュートリアル・シリーズにアクセスして、各チュートリアルの手順に従ってください。お疲れ様でした。第 1 回のチュートリアルが、たった今完了しました!「Tutorial 2: Create a cloud blockchain deployment 」へ進んで学習を続けてください。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing
ArticleID=1065938
ArticleTitle=IBM Blockchain VS Code 拡張機能を使用してスマート・コントラクトを開発する
publish-date=08082019