プログラマブル コントラクトをデプロイする

ユニバーサル台帳は、ネットワークにデプロイして、関係する参加者間の合意を自動化して実施できるプログラマブル コントラクトをサポートしています。

このチュートリアルでは、ユニバーサル台帳ネットワークでプログラマブル コントラクトを開発、デプロイ、操作するために必要な手順をデベロッパーに示します。

始める前に

このチュートリアルを完了するには、次のものが必要です。

  • Google Cloud コンソールで Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

  • ROLE_CONTRACT_CREATOR を持つ Universal Ledger ユーザー アカウント。このアカウントが契約のオーナーになります。

  • ROLE_CONTRACT_PARTICIPANT を持つ 1 つ以上のユニバーサル台帳ユーザー アカウント。契約所有者と同じアカウントにできます。

  • 必要に応じて、これらのユーザー アカウントに代わってトランザクションに署名して送信できるように、Universal Ledger CLI を設定します。

ユニバーサル台帳のロールは、アカウント マネージャーが作成したユーザー アカウントに、CreateAccount トランザクションの送信時に割り当てることができます。アカウントがすでに存在する場合は、後で AddRoles トランザクションを使用して変更することもできます。テスト目的で、Universal Ledger CLI を使用してアカウントを管理することもできます。

環境の設定

設定を簡単にするため、このチュートリアルは Cloud Shell セッションで提供されるデフォルト環境を対象に作成されています。別の環境を使用している場合は、これらのコマンドの変更が必要になることがあります。

gculpyc コンパイラは、GCULpy 言語で記述されたソースコードを受け取り、ユニバーサル台帳のバイトコードを生成します。

次の各コマンドを実行して、gculpyc Docker イメージを pull し、バイナリを実行するエイリアスを定義して、バイナリが動作することを確認します。

docker pull us-docker.pkg.dev/gcul-artifacts/images/client/gculpyc:preview
alias gculpyc="docker run --rm -i --user $(id -u):$(id -g) \
    --volume .:/workspace --workdir /workspace \
    us-docker.pkg.dev/gcul-artifacts/images/client/gculpyc:preview"
gculpyc --help

契約書を作成する

GCULpy は、ユニバーサル台帳のコントラクトを記述するために使用される言語です。これは、明確で監査可能で理解しやすいコントラクト ロジック用に最適化された Python の静的型付きサブセットです。この設計では、安全なコードの作成が優先され、予期しない動作や安全でない動作が制限されます。詳細については、GCULpy 言語のリファレンスをご覧ください。

GCULpy は Python の厳密なサブセットであるため、既存のワークフローや開発プラクティスとともに、お好みの統合開発環境(IDE)を引き続き使用できます。

たとえば、コードは次のようになります。

import gcul

class Counter(gcul.Contract):
    """Example contract implementing a counter."""

    value: int

    def increment(self) -> None:
        """Increments the counter value by 1."""
        self.value += 1

このサンプルコードをコピーして、counter.py という名前のファイルに保存します。

ローカルでテストする

近い将来、デベロッパーはローカル シミュレーション環境にアクセスできるようになります。gcul Python モジュールの一部として提供され、Python 環境内で Universal Ledger ネットワークをネイティブにシミュレートするために必要な機能を提供するように設計されています。そのため、ローカルでコントラクトを実行し、任意のテスト フレームワークを使用して単体テストを作成して、デプロイ前にコントラクトの信頼性と正確性を確保できます。

契約をコンパイルする

次の gculpyc コマンドを使用して、上記のコントラクト ソースコードをバイトコードにコンパイルします。

gculpyc --source_file counter.py --output_file counter.bin

コントラクトをデプロイする

ROLE_CONTRACT_CREATOR を保持するユーザー アカウントによって署名された CreateContract トランザクションを送信して、コントラクトを Universal Ledger ネットワークにデプロイします。

Universal Ledger CLI を使用している場合は、次のコマンドを実行してこれを行うことができます。

ul-cli contracts create \
    --alias counter-contract \
    --sender OWNER_ALIAS \
    counter.bin

次のように置き換えます。

  • OWNER_ALIAS: ROLE_CONTRACT_CREATOR を持つユーザー アカウントのエイリアス。

トランザクションが確定すると、このコマンドの出力に新しくデプロイされたコントラクトの ID が含まれます。次に例を示します。

Contract created: 1:CTR:005XvYfiSm3913Jwv4y8HVQucStJ2Ev15Sar6A1kNNX10

コントラクト メソッドを呼び出す

コントラクトがデプロイされると、ROLE_CONTRACT_PARTICIPANT を持つユーザー アカウントは InvokeContractMethod トランザクションを送信して、コントラクト内の任意の公開メソッドを呼び出すことができます。

Universal Ledger CLI を使用している場合は、次のコマンドを実行してこれを行うことができます。

ul-cli contracts invoke \
    --alias counter-contract \
    --method-name increment \
    --sender PARTICIPANT_ALIAS

次のように置き換えます。

  • PARTICIPANT_ALIAS: ROLE_CONTRACT_PARTICIPANT を持つユーザー アカウントのエイリアス。

契約の状態を読み取る

このチュートリアルを終了するには、QueryAccount リクエストを送信して、台帳に保存されているコントラクトの状態を読み取って確認します。これは、ユニバーサル台帳アカウントの詳細をクエリして取得するために使用される API メソッドと同じです。

Universal Ledger CLI を使用して、次のコマンドを実行できます。

ul-cli accounts describe --alias counter-contract

これにより、カウンタ値が 1 に設定され、次のような出力が生成されることを確認します。

Account: 1:CTR:005XvYfiSm3913Jwv4y8HVQucStJ2Ev15Sar6A1kNNX10
Contract account details:
  Owner: 1:USR:XCL:022uF6cVkTJBaa6pViqTuYqP4455jnRbRc4bWannZGg0b
  Contract fields:
    value: int64_value:1

  Balances:
    None

次のステップ