script (⏱,💰)

script (⏱,💰)

NG#8 - 契約アカウント

以下是对应文本的日语翻译:

NG8 start

契約アカウントには 3 つのサブタスクがあり、これらはすべて「bad account」シリーズを構成しています。この記事はシリーズの最初のタスク「Stealing Souls」です。

タスクをダウンロードすると、2 つのアカウント契約、tombkeeper_1.cairo と tombkeeper_2.cairo があります。デプロイ時には自動的に契約に 100 個の $SOUL が mint され、トランザクションごとに 0.1 個の $SOUL が差し引かれます。タスクは $SOUL をすべて盗むことを要求しています。

契約 1#

validate_calls には、コメントがあり、対話する契約アドレスがブラックリスト(=Soul ERC20 契約アドレス)でないことを検証すると述べています。つまり、Transfer Token のトランザクションを直接送信することはできません。

ただし、この契約の__execute__には caller の検証が欠落しており、__validate__をスキップして__execute__を呼び出すことができます。

snforge のテストでは、手数料を差し引いた soul トークンの一部を転送するためのコールを構築し、ローカルテストに合格した後、テストの calls をシリアライズして、sncast またはブラウザを使用してcalls: Array<felt252>__execute__に送信してタスクを完了します。

契約 2#

契約 2 ではバグ修正が行われています:

  • fn __execute__assert(get_caller_address().is_zero(), 'INVALID_CALLER');が追加され、他の契約ウォレットから直接関数を呼び出すことはできなくなりました。
  • to が $SOUL の契約の場合、非常に大きな IMPOSSIBLE_SOUL_FEE をガスとして必要とします。u256 の型ではオーバーフローすることはできません。

まず、__validate__に 1000 個の call の calldata を渡す方法を試しました。total_fee を 100 にするために、適当な call を作成して execute を 1 回呼び出してトークンを転送します。

total_fee を変更した後、最初の execute で契約が直接呼び出されないように設定されていることがわかりました。これは他の契約からの攻撃を防ぐためです。これにより、starkli やブラウザを使用して直接呼び出す方法が阻止されます。

アドバイザーに相談した後、Tombkeeper をアカウントとして使用して他の契約を呼び出すために、ローカルプライベートキーで署名することができるとのヒントを得ました。これには SDK が必要です。

私は入門 CTFの中の sand_devils 契約を再デプロイし、count を 1000 に設定しました。各呼び出しで 1000 から任意の数字を減算することができます。

SDK にはさまざまな言語のバージョンがありますが、私は starknet.js を使用しました。重要なステップは次のとおりです:

  1. getClassAtを使用して abi を取得し、sand_devil の Contract インスタンスを作成します。
  2. Tombkeeper2 アカウントアドレスと契約のデプロイ時に使用したプライベートキーを使用して Account インスタンスを作成します。
  3. await devilContract.invoke("slay", [1],{ parseRequest: false}を使用してトランザクションを送信します。

結果として、手数料は 0.1 SOUL しか差し引かれず、以前の 1000 個の__validate__は手数料を 100 SOUL に増やしませんでした。おそらく、__validate__だけでは状態の変更は引き起こさないため、__validate____execute__を同時に完了するためです。

それでは、starknetjs で 1000 個の calls のトランザクションを直接送信してみましょう。これにより、__validate____execute__が同時に完了し、アカウント契約がトランザクションのパッキング操作をサポートしているため、1000 件のトランザクションでもすぐに確認できます。

ブラウザでハッシュを確認すると、1000 件の slay と 1 件の transfer が 1 つのトランザクションに内包され、TompAccout の SOUL がすべて消費されました。

まとめ#

ng8 end

アカウントの抽象化は StarkNet の非常に重要な要素であり、2 つのタスクはそれぞれ契約側と SDK 側からカスタム契約を操作することで、ユーザーがアカウントの抽象化について理解を深めることができます。また、SDK の使用方法を初めて学び、バンドルトランザクションを送信する方法を理解しました。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。