RSKjのユニットテストを構築するためのDSL「AngelLang」でスマートコントラクトを作成・呼び出しする方法

はじめに

Angel “Java” Lopezは、RSKjプラットフォームの最初のコア開発者の一人です。2016年に彼はトランザクション、ブロック、コントラクトを含むRSKユニットテストを簡単に作成するためのDSL(領域特定言語)を作成しました。悲しいことに、Angelはもう私たちと一緒ではありませんが、彼に敬意を表して、この便利な(しかしまだ名前のない)言語をAngelLangと名付けることにします。

最近、AngelLangをちょっとだけ弄る機会がありました。私はこの小さな物語を作り、私の最近の経験を生かしたいと思いました。もしこれが、使おうとしていて、うまく使うための文書化された方法が見つからない人の助けになればと思います。この記事は、シニア開発者でもジュニア開発者でもフォローできるように書いています。完全なサンプルはこのレポートにあります。

AngelLangでスマートコントラクトを作成する

「Mastering Ethereum」で説明したように、EthereumとRSKのコントラクトはゼロアドレスを使用してデプロイされます。AngelLang言語でこれを指定する方法は、receiverAddressに0, 00を設定するか、receiverAddressを含めない方が良い場合は、これと同じ動作がデフォルトで行われます。

スマートコントラクトがあり、このコントラクトを使用したテストケースを作成することを想像してください。最初のステップは、最初のブロックb01に含めるトランザクションtx01を作成することである。このコントラクトは「Payable」という名前で、入金、振込、出金などの基本的な操作を追加する予定です。以下はコントラクトのコードです。

RSKでは、Ethereumと同様に、コントラクトは特別なトランザクションの下で作成され、calldataはコントラクトのByteCodeをエンコードしたものです。このcalldataを取得するために、以下のいずれかの方法を用いることができます。

  • Remix:コンパイラタブでByteCodeを選ぶことができる
  • Solc:Solidityコンパイラを使用して、ここに記載されているようにcontractをコンパイルします。出力ファイルには、contractのエンコードされた ByteCode が含まれます。
  • Solcjs:ここに記載されているとおりです。出力ファイルには、エンコードされたcontractの ByteCode が含まれます。

結果として得られるByteCodeは、次の画像に表示されているように、コントラクト作成トランザクションの「data」パラメータに配置する必要があります。

ByteCodeに0xプレフィックスが含まれている場合、それを削除する必要があることに注意してください。

これを設定すると、contract deployment transactionが適切に設定されます。

そして、最初のブロックを作成し、ブロックチェーンに接続することができます。

AngelLangでスマートコントラクトを利用する

スマートコントラクトを作成し、最初のブロックでデプロイしたら、それを使いたいと思うかもしれないので、contractの関数の1つを呼び出す2番目のトランザクションが必要です。

contractを呼び出せるようにするためには、どの関数を呼び出すか、その関数にどのようにパラメータを送るかという情報がトランザクションに含まれていなければならないことを考慮し、contractの呼び出しがどのように機能するかを理解する必要があります。Ethereumでは(そしてRSKでは)、contractにデータを送るための特定のフォーマットがあり、それによってあなたが何をしようとしているのかが理解できるようになっています。理論を簡単にするために、関数の16進エンコードされたシグネチャの最初の4バイトを送る必要があると言い、関数が引数を受け取る場合は、この関数のABI仕様に従ってエンコードされたそれらの引数を送ります。より詳細な説明は、「Mastering Ethereum」のこのセクションや、Solidityの仕様書を自由に読んでください。

これらの情報を得る最も簡単な方法は、Remixを使用することです。もし前のステップ(contractのデプロイ)で remix を使っていれば、デプロイタブの下にある Remix インターフェースから簡単に操作することができます。テストから使いたい関数を呼び出すことができ、その関数に与えたいパラメータも指定できます。例えば、引数を受け取らない “deposit()” 関数を呼び出して、300 WEI をcontractに送信するとします。

AngelLangの例で使えるようにRemixから入力データを取り出すには、デバッグコンソールをチェックして、目的のトランザクションを展開し、「入力」フィールドの内容を選びます。これはまさに必要なものです(ABI仕様で指定されている、エンコードされた関数シグネチャの最初の4バイトとエンコードされた引数)。web3やethersjsを使って実現する方法もありますが、RemixのようなGUIを使う方が少しシンプルだと思いました。

そして、AngelLangの定義に行き、その入力データをトランザクションの呼び出しデータとして置くだけでいいのです。

RSKのAngelLangでは、ブロックチェーンの状態や実行したトランザクションを検証するために使えるコマンドがいくつかあるので、ブロックチェーンの定義に直接アサーションすることが可能です。この場合、私のcontractが送った300weiを効果的に受け取ったことと、ブロック2(b02)がブロックチェーンに正常に接続されたことを検証したいと思います(結局、最高のブロックになったのです)。

このAngelLangの仕様をコードから利用する方法は、RSKj DSL testsフォルダに既に存在する例のように、そのファイルを使い、その内容をパースしてブロックチェーンをビルドするテストケースを作成することです。

TDDとAngelLang

お気づきかもしれませんが、AngelLangは、ブロックチェーンの動作に変更を加える必要がある制御されたシナリオを、途中で何も壊れないことを保証できる方法で作成したい場合に、非常に強力なツールです。開発にTDDを使用したい場合には、完璧にマッチします。ただ、ほとんどドキュメントがないので、最初のうちは使い方があやふやになることもあります。みなさんがこの記事を読んで役に立ったなら幸いです。


原文:https://medium.com/iovlabs-innovation-stories/how-to-create-and-call-smart-contracts-with-angellang-a-dsl-for-building-rskj-unit-tests-79d8ae0c0acc By medium Research & Innovation