PyTeal、スマートコントラクトのABIサポートを導入
PyTealがメジャーなアップデートを行いました。このアップデートは、TEALを愛する最後の純粋主義者を納得させ、彼らの生活をちょっと甘いものにするものです。
PyTealの背景
具体的な話に入る前に、初心者のために背景を少し説明します。
アルゴランドのスマートコントラクト・プラットフォームは、Algorand Virtual Machine (AVM)です。AVMにコンパイルするためのプログラミング言語がTEAL(Transaction Execution Approval Language)です。つまり、TEALはアルゴランド上のスマートコントラクトのためのプログラミング言語なのです。
TEALはアセンブリ言語です。低レベルのアセンブリ作業にはある種の満足感があり、個々の行で、何が起こっているのかが正確にわかります。1行1行で何が起こっているのかがよくわかるのです。抽象化されていないので、慎重な開発者にとっては魅力的です。スマートコントラクトのロジックが数百万Algoの価値を持つ可能性がある以上、その抽象化の下にあるものには懐疑的であるべきです。
とはいえ、アセンブリ言語の記述について考えるとき、私は大学時代にシステムコースの一環として迷路脱出をプログラミングしたことを思い出します。迷路という題材は、コードのエラーを見つけようとしたときに感じた、まったくもって迷子のような気持ちを見事に言い表していました。
PyTealの登場、「TEALのための構文解析ツール(syntactic sugar)」とも呼ばれています
PyTealはPythonで書かれています。PyTealはPythonそのものではありませんが、Pythonのランタイムでコンパイルされています。つまり、こういうことです:PyTealはPythonの構文を使っていますが、ほとんどのPythonの構文は正しいPyTealではありません。
PyTealコードは、対応するTEALコードを生成するプログラム・ロジックを記述する抽象構文木(AST)を構築しています。これは興味深く、少し変わったパラダイムです:実際に実行されるプログラムを生成するコードを書いているのです。
TEALに対するPyTealの主な利点の1つは、開発者がスタック管理について常に考える必要がなくなり、オペコードを通して歩きながら頭の中にスタックを保持することができることです。
しかし、PyTealはAVMプリミティブに忠実でありながら、これを実現しています。PyTealの開発者は、AVMが自分のコードのロジックをどのように処理するのかを理解しています。これにより、驚きを回避し、スマートコントラクトを最適化するための制御を行うことができます。
そのアーキテクチャのおかげで、開発者はPyTealと一緒にPythonのコードを使用することができます。Pythonの変数から式を構成できることも非常に強力な機能であり、PyTealの魅力の1つです。
ABIの簡単な紹介
基本的に、スマートコントラクトはどのように使うのでしょうか?アプリケーションID、呼び出す特定のアプリ・メソッド、呼び出しに必要な引数を指定します。アプリコール・トランザクションを処理する際、ノードはTEALの1行目からプログラムを評価します。
メソッド名、必要な引数、そしてそれをAVMの意図通りに解釈される有効なアプリコールにまとめるには、どうすればいいのでしょうか?ABIがその方法です!ABIはApplication Binary Interfaceの略で、一般的な開発者が以前に遭遇したことがあるかないかを問わない概念です。
アルゴランドABIは、スマートコントラクトのメソッド呼び出しをエンコードし、その戻り値をデコードするための標準です。このABIは2021年秋にアルゴランドに導入され、JSONエンコーディングを使用するARC-4標準に準拠しています。この規格により相互運用が可能となり、アプリが誰からも簡単に呼び出せるようになります。アルゴランドABIの詳しい紹介は、こちらでご覧いただけます。
現在開発中のほとんどのアプリはARC-4への準拠を目指しており、この規格は非常に貴重であり、今後も続いていくでしょう。
ABIをPyTealに取り込む
上記のABIの説明では、見かけによらず簡単そうに聞こえます。しかし実際には、アルゴランドでのスマートコントラクト開発において、メソッドのルーティングや値のエンコード・デコードは、これまで最も時間のかかる部分でした。値を人間が読める形にしようとしたとき、何度ちんぷんかんぷんな場面に直面したことでしょう?
最新のPyTealのアップデートは、開発者のこの作業を大幅に簡素化します。これはいくつかの機能で構成されています。
メソッド・ルーティングは、基本的にあなたのために処理されます。ABIメソッドにデコレーターを追加するだけでよくなりました。
ABI型が導入されたので、メソッドの引数のエンコードやデコードを気にする必要がなくなりました。文字列やブール値のような古典的なデータ型から、アルゴランド・アプリの呼び出しに特化したReferenceやTransactionの引数型まで、様々な型があります。
さらに、便利な特典として、PyTealをコンパイルする際にABI JSONが生成されます。
詳しい使い方は、こちらの(素晴らしい)ユーザーガイドをご覧ください。
ここで何が起こっているのかを体験してもらうために、ある例を見てみましょう。
Aliceは、お金を預けたり、引き出したり、残高を確認したりすることができる銀行アプリケーションを書いています。
Aliceのアプリには、クライアントが呼び出す3つのメソッドがあります:deposit、withdraw、getBalanceです。AliceのPyTealでは、呼び出し可能な各メソッドにルーター・デコレーターを追加しています。withdrawについては、以下のようになります。
@router.method
def withdraw(amount: abi.Uint64, recipient: abi.Account) -> Expr:
ルータは、アプリへの呼び出しが正しいメソッドにルーティングされることを保証します。
Aliceの上記のwithdrawメソッドは2つの引数を取ります: 引き出したい金額と、資金を送る口座です。Aliceはこれらの引数に ABI データ型 abi.Uint64 と abi.Account を使っています。その結果、アプリケーションに渡されるこれらの値をどのようにエンコードするかを心配する必要がありません。
Aliceのスマートコントラクトの全貌をここに示します(あくまで例であり、監査されたコードではありません)。
この使用例では、引数は整数とアカウントであることに注意してください。TEALは似たような型をネイティブにサポートしているので、これらをエンコードするのはそれほど難しくありません。PyTeal ABIはタプルや配列のような複雑な型もサポートしており、それ無しで正しく動作させるのはもっと難しいのです。
BobはAliceのスマートコントラクトを自分のアプリケーションに使いたいと考えています。彼は、彼女のスマートコントラクトへのインターフェースを指定する、彼女の公開されたABIのJSON記述を見つけます。
BobはSDKのアトミック・トランザクション・コンポーザー(ATC)を使って、自分のフロントエンドからAliceのコントラクトのメソッドを呼び出すトランザクション群を構成します。Bobは ATC を使って必要な引数を与えます...そしてそれはうまくいきます!Bobは今、Aliceのスマートコントラクトを使用しており、これ以上の細工は必要ありません。
PyTealの次なる展開は?
まもなく、PyTealはAVM 7のサポートをリリースし、PyTeal開発者がState OroofsやBetanetに登場する他のすべての新しいAVMグッズで遊び始められるようにします。
PyTeal自体については、現在、デバッグを容易にすることに重点を置いています。PyTealは実際に実行されるTEALコードを生成するため、報告されたエラーと書かれたPyTealの間に若干の断絶があります。どの行のPyTealがバグを引き起こしたのか?私たちは、この質問に答えることを目的としています。
元記事:https://medium.com/algorand/pyteal-introduces-abi-support-for-smart-contracts-605153e91c5e
Commentaires