
みなさん、こんにちは!
最近では、Waves Labs 分散型アプリケーション向けの RIDE スマート コントラクト言語拡張機能のリリースに専念する開発者向けのコンテスト Ride4Dapps をテスト ネットワークに導入します。
DAO ケースを選択した理由は次のとおりです。 投票、資金調達、信託管理などのソーシャル機能を備えた dApps を開発する予定です。
簡単な例から始めました と - 例 .
この例を見て仮説を検証し、いくつかの奇妙な点を見てみましょう。
アリス - dApp オーナーを迎えましょう
ブーブとクーパーはアリスのパートナーであり、アリス-BC DAOの共同創設者です。
ネリは資金を必要としている経営者です
銀行 - トークンを配布する銀行
ステージ 1. 天びんの初期化
Waves テスト ネットワークでトークンを受け取るには、に連絡する必要があります。 トークンの送信先アドレスを指定します。
IDE でアカウントの詳細を開くと、アドレスを見つけることができます。
Bank 10 WAVES をハイライトします。 次に、それらがブロックおよびトランザクション ブラウザーを介して到着したことを確認します。
次に、銀行から残りの参加者にトークンを配布しましょう。 (注: Waves ネットワーク上のすべての取引は無料ではないため、取引を行うにはすべての参加者が最低でもプラスの残高を必要とします)。
量は整数のみであるため、1 WAVES = 100000000 単位 (ウェーブレット)
0.01 WAVES (取引手数料) = 1000000
銀行 -> [3 WAVES] -> アリス、TransferTransaction (タイプ: 4) 経由。
トランザクションの署名に使用された env.SEED が銀行と一致することを確認します。


一致するシード フレーズがない場合は、[アカウント] タブでシード フレーズに切り替えて、再度確認してください。
この後、3 WAVES アリスの譲渡のためのトランザクションを作成、発表、署名します。
env.accounts 変数を通じてアリスのデータを見つけることもできます。 番号付けは 0 から始まるため、Alice は env.accounts[1] になります。

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))
結果はブラウザでも確認でき、実行後すぐにその結果へのリンクが返されます。 .
アリスの残高が 3 WAVES で補充され、銀行残高が 10 - 3 - 0.01 = 0.699 のままであることを確認します。


同じ方法で、Boob と Cooper にそれぞれ 3 WAVE、Neli、Xena、Mark にそれぞれ 0.2 WAVE を送信します。
(注: 0.02 文字の間違いがあり、Neli XNUMX WAVES を送信してしまいました。注意してください。)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))
すべての参加者の残高を補充すると、次のようになります。

ステージ 2. dApp アカウントを作成する
私たちは、アリスが分散型アプリケーションの作成者および所有者になることに同意しました。
「アカウント」に移動し、「SEED」として設定し、env.SEED が「Alice」と一致することを確認します。
可能な限り単純なスクリプト (コントラクト) を、Alice のアカウントにインストールしてみましょう。
Waves のスマート コンタクトは、特定の条件下でのあらゆる種類の送信トランザクションの発生を禁止または許可する述語です。 この場合、この条件は ALWAYS です。 契約コードは true です。 デプロイ()を呼び出します。

setScript トランザクションあたりの料金 1400000/100000000 = 0.014 WAVES。 アリスの残高には 2.986 WAVE が残っています。
次に、Alice アカウントに、より複雑なスマート コントラクト ロジックをインストールしてみましょう。これについては、「」を参照してください。
Ride4Dapps 2 つの新しい注釈タイプが含まれるようになりました。
- @Callable(i) — パラメーター i として、どのアカウントがトランザクションを呼び出し/署名したかに関するデータを受け取ります。 dApp アカウントの状態の変化を決定するのは、この関数の結果です。 他のアカウントは、このアノテーションを使用してトランザクションを作成して機能を実行し、dApp アカウントの状態を変更できます。
- @検証者(tx) — トランザクション tx パラメータを備えたトランザクション検証機能。 RIDEの述語ロジックに対応します。 この式で、dApp アカウントのスマート コントラクトのロジックへのさらなる変更を許可または禁止できます。
やろう dApp 参加者全員の共通ウォレットとしてアカウントを作成します。

アカウントで現在アクティブなコントラクトを確認するには、ブロック エクスプローラーでスマート コントラクトの Base64 コードをコピーし、デコンパイラーを使用してそれを認識できます ()



スマート コントラクトのロジックが期待どおりであることを確認します。
アリスの残高には 2.972 WAVE が残っています。
この dApp は、メカニズムを通じて各参加者が共通基金にどれだけ寄付したかを追跡します。 データ トランザクション — DataEntry(currentKey, newAmount)ここで、currentKey はデポジット関数を呼び出すアカウント、newAmount は補充された残高の値です。
Boob と Cooper は 1 WAVES で dApp アカウントに入金します。

私たちがミスをしてしまい、取引が成立しません。 ボブに代わって取引を行っていると確信していたにもかかわらず、インデックスを間違えて、スマート コントラクトのない銀行口座を指定してしまいました。 ここで重要な点に注意してください。トランザクションの開始に失敗すると手数料がかかります。 削除できません! アリスの残高には 2.972 WAVE が残っています。 ボブには 3 つの WAVE があります。
ボブは 1 WAVES を dApp アカウントに送信しました。
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))

ボブには 1.99 WAVES が残っています。 つまり、ボブは 0.01 WAVES コミッションを支払いました

アリスの残高は 2.972 WAVE でしたが、現在は 3.972 です。 アリスアカウントにもトランザクションが登録されましたが、dAppアカウント(アリス)からは手数料は請求されませんでした。
クーパーもアカウントを補充した後、アリスの残高は 4.972 WAVES になりました。

[データ] タブのブロック エクスプローラーで、共通ウォレット内の WAVE の数を誰が所有しているかを確認できます。
クーパーは一般ウォレットに 1 WAVES の金額を残すことに考えを変え、アフィニティの半分を引き出すことにしました。 これを行うには、withdraw 関数を呼び出す必要があります。

しかし、またしても私たちは間違っていました。withdraw 関数にはまったく異なるパラメータと異なるシグネチャがあるからです。 RIDE4DAPPS でスマート コントラクトを設計するときは、この点に注意する必要があります。

クーパーの貸借対照表には現在 2.48 WAVES があります。 したがって、3 WAVES - 1 - 0.01、次に + 0.5 - 0.01 となります。 したがって、入金および出金の各呼び出しには 0.01 WAVE のコストがかかります。 その結果、dApps 所有者テーブルのエントリは次のように変更されました。

ボブも共有ウォレットからいくらかのお金を引き出すことにしましたが、間違えて 1.5 WAVES を引き出しようとしました。

ただし、スマートコントラクトにはこの状況をチェックする機能がありました。
Xena は詐欺師で、アカウント合計から 1 WAVES を引き出そうとしました。

彼女にとってもうまくいきませんでした。
次のパートでは、Alice dApp アカウントの不完全性に関連するより複雑な問題について見ていきます。
出所: habr.com
