執筆者:スイネットワーク

Sui は、第一原則に基づいて再設計および構築された L1 パブリック チェーンであり、Web3 で次の 10 億人のユーザーをホストできる開発プラットフォームをクリエイターと開発者に提供することを目的としています。 Sui のアプリケーションは Move スマート コントラクト言語に基づいており、水平方向にスケーラブルであるため、開発者は幅広いアプリケーション開発を迅速かつ低コストでサポートできます。 Sui メインネットは、2023 年 5 月 3 日に正式に開始されました。

この記事は、Sui Network のベスト プラクティスに関する開発者向けのクイック リファレンスとして役立ちます。

一般知識を移動する

パッケージのアップグレードについて詳しく読んで、アップグレードしやすいコードを作成してください。

パッケージは不変であり、脆弱なパッケージ コードは永久に呼び出すことができます。解決策は、オブジェクト レベルで保護を追加することです。パッケージを P から P' にアップグレードすると、P に依存する他のパッケージおよびクライアントは、自動的に P' に更新されるのではなく、引き続き P を使用します。したがって、パッケージとクライアントの両方に依存するコードは、明示的に P' を指すように更新する必要があります。依存パッケージによって拡張されることが期待されるパッケージは、すべてのバージョンにわたる標準に準拠する (不変の) インターフェイスを提供することで、アップグレードのたびに以前の拡張機能が壊れるのを避けることができます。ワームホール クロスチェーン ブリッジを例に挙げると、メッセージはワームホールを介してブリッジとして送信されます。メッセージ送信用の拡張パッケージを生成するには、ワームホール パッケージの任意のバージョンで prepare_message 命令を使用して、MessageTicket とクライアントを生成できます。メッセージを送信するコードは、最新バージョンのパッケージのpublish_messageにMessageTicketを渡す必要があります。パブリック関数は削除または変更できませんが、パブリック(フレンド)関数は削除または変更できます。現在のライブラリ関数を永久に公開したくない場合を除き、パブリック (友人) または自分にのみ表示される関数のみを自由に使用できます。構造体型の削除、新しいフィールドの追加 (動的フィールドの追加は可能ですが)、新機能のアップグレードはできません。新しいタイプを追加するときは、一度追加すると永久に存在するため、慎重に検討してください。

最大 1000 個のデータ項目を持つ、ベクトルがサポートするコレクション (vector、VecSet、VecMap、PriorityQueue など) を使用します。

動的フィールド サポートを使用するコレクション (Table、Bag、ObjectBag、ObjectTable、LinkedTable など) は、サードパーティが追加できるコレクション、より大きなコレクション、およびサイズが不明なコレクションに使用されます。 Sui Move オブジェクトの最大サイズは 250KB です。これより大きなオブジェクトを作成しようとすると、トランザクションが中止されます。オブジェクトがベクターでサポートされているコレクションよりも大きくならないようにしてください。

関数 f が呼び出し元からの支払いを必要とする場合 (たとえば SUI を使用する場合)、 fun f(payment: &mut Coin, amount: u64) 関数の代わりに fun f(payment: Coin) 関数を使用します。これは、呼び出し側にとっては、支払額を正確に知っており、正しい金額を抽出するために関数 f に依存する必要がないため、より安全です。

ガス消費量の多少の最適化は必要ありません。 Sui でコストを計算する場合、最も近いバケットに四捨五入されるため、非常に急激な変動のみがガス変化を引き起こします。特に、取引がすでに最低価格帯にある場合は、これ以上安くすることはできません。詳細は下の画像をご参照ください。

一貫したスタイルを実現するには、Move コーディング規約に従ってください。

構成可能性 表示標準を使用して、ウォレット、アプリケーション、ブラウザでのオブジェクトの表示方法をカスタマイズします。 「自己転送」関数の使用を避けてください。transfer::transfer(obj, tx_context::sender(ctx)) を記述する代わりに、いつでも現在の関数から obj を返すことができます。これにより、呼び出し元またはプログラム可能なトランザクション ブロックが許可されます。 (プログラム可能なトランザクション ブロック) obj を使用します。テスト sui::test_scenario` を使用して、複数のトランザクションと複数の送信者を含むテスト シナリオをシミュレートします。 sui::test_utilsmodule を使用すると、assert_eq テストによるエラー修正メッセージの改善、 print によるデバッグ印刷、 destroy によるテストのみの破棄が可能になります。テスト時にコード カバレッジ情報を計算するには、 ui move test --coverage を使用し、赤で強調表示された未カバーの行を表示するには、 ui move cover source --module を使用します。可能であれば、カバレッジを 100% に設定することをお勧めします。アプリケーション 最適なパフォーマンスとデータの一貫性を実現するには、アプリケーションは同じフル ノード上で書き込みリクエストと読み取りリクエストを送信する必要があります。 TS SDKでは、これは、アプリケーションがウォレットのsignTransactionBlock APIを使用し、その後、ウォレットのsignAndExecuteTransactionBlock APIを使用するのではなく、アプリケーションのフルノードでexecute_transactionBlockを呼び出してトランザクションを送信する必要があることを意味します。これにより、書き込み前の読み取りの一貫性が保証されます。アプリケーションのフル ノードからの読み取りは、チェックポイントを待つのではなく、トランザクションの書き込みを即座に反映します。待ち時間を短縮するために、アプリケーションがトランザクションが確認されたことを知る必要があるが、トランザクションの効果をすぐに確認したり、トランザクションによって書き込まれたオブジェクト/イベントを読み取る必要がない場合は、「showEffects」: false および「」を指定してexecuteTransactionBlockを使用します。 showEvents": false 。アプリケーションは、頻繁に読み取られるデータをノード全体から頻繁に取得するのではなく、ローカルにキャッシュする必要があります。可能な限り、新しいスマート コントラクト コードをリリースするのではなく、プログラム可能なトランザクション ブロックを使用して既存のオンチェーン機能を組み合わせます。プログラム可能なトランザクション ブロックにより、大規模なバッチ処理と異種混合構成が可能になり、すでに低いガス料金がさらに削減されます。アプリケーションは、ガスの予算、ガス価格、コインの選択をウォレットに任せる必要があります。これにより、ウォレットの柔軟性が高まり、トランザクションをテスト実行してトランザクションが失敗しないことを確認するのはウォレットの責任です。 署名 排他的オブジェクトを個別に使用するか、1 つのトランザクションが完了するのを待ってから次のトランザクションを送信することにより、同じ排他的オブジェクトにアクセスする 2 つの同時トランザクションに署名しないでください。このルールに違反すると、クライアントが曖昧になり、現在のエポックが終了するまで両方のトランザクションに関与する排他的オブジェクトがロックされる可能性があります。トランザクションを開始する sui クライアント コマンド (例: sui クライアント パブリッシュ、sui クライアント コール) は、--serialize-output フラグを受け入れて、署名される Base64 トランザクションを出力できます。 Sui は、ネイティブのマルチ署名を含む、トランザクション署名のための複数の署名スキームをサポートしています。