理解を深めよう
🦴 すべてのドメインを取得
現在、アプリは確実に形になってきていますね。 コントラクトをさらに改善し、フロントエンド用に最適化するためにできることはまだあります。たとえば、既にミントされたドメインを取得する非常に簡単な方法があります。すべてのドメインを確認できます。
重要なのは、スマートコントラクトからこのデータを簡単に返すことができることです。 ブロックチェーン上の読み取りトランザクションは無料です🤑 よって、ガス代を払うことを心配する必要はありません!
以下のロジックを見て、上記を行う方法を確認してください。
// コントラクトの最初に付け加えてください(他のマッピングに続けて)。
mapping(uint => string) public names;
// コントラクトのどこかに付け加えてください。
function getAllNames() public view returns (string[] memory) {
string[] memory allNames = new string[](_tokenIds.current());
for (uint i = 0; i < _tokenIds.current(); i++) {
allNames[i] = names[i];
}
return allNames;
}
とてもシンプルですね。 皆さん既にSolidityに習熟されているので理解しやすいはずです。
ドメイン名を持つミントIDを格納するためのマッピングと、それらを反復処理してリストに入れて送信するためのpure
関数を追加しました。 ただし、1つだけ欠けています。 マッピングデータを設定する必要があります。
これをregister
関数の最後の_tokenIds.increment()
の直前に追加します。
names[newRecordId] = name;
こうしてコントラクトで作成されたすべてのドメインを取得できます🤘
次のSectionでこの関数を実際に使用します。
さて、Section-3ではコントラクトを変更しています。
何をしなければならないかおわかりでしょうか。
復習です🔥
Section-2のLesson-2を参照くださいね👋
💔 コントラクトのドメインの有効性を確認
さて、おそらく「誰かが長いドメインを作成しようとするとどうなりますか? 👎」と考えられた方もいると思います。
素晴らしい疑問です。現在、フロントエンドはReactアプリでJavaScriptを使用して、ドメインが有効かどうかを確認しています。
ただ、誰かが私たちのコントラクトを直接使用して無効なドメインを作成する可能性があるため、これは最善のアイデアではありません。
下のように加えてみましょう。
function valid(string calldata name) public pure returns (bool) {
return StringUtils.strlen(name) >= 3 && StringUtils.strlen(name) <= 10;
}
Reactアプリで行っていたようにコントラクト側でドメイン名が3〜10文字であるかどうかを確認します。