ネームサービスを作成して登録してみよう
前回、hardhatを用いて簡単なスマートコントラクトをデプロイするこ とができました。
ここから、ネームサービスの中身を作成していきましょう。
💽 ドメインデータをブロックチェーンに保存する
ネームサービスのポイントは、人々がインターネット上のあなた固有の名前に便利にアクセスすることができるということです。
google.comと入力してGoogleにアクセスするのと同じように、ユーザーはあなたのドメインネームを頼りにあなたの情報にアクセスすることができます。
したがって、最初に必要なのは、ドメインを登録するための関数と、登録したドメインを格納する場所になります。
Domains.solに向かいます。
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;
import "hardhat/console.sol";
contract Domains {
// "mapping"でstring型の各keyとaddress型の各データを紐付けにして格納します。そのmappingをここでは"domains"として定義しています。
mapping(string => address) public domains;
constructor() {
console.log("THIS IS MY DOMAIN CONTRACT. NICE.");
}
// register関数はnameとアドレスを紐付けます。
function register(string calldata name) public {
domains[name] = msg.sender;
console.log("%s has registered a domain!", msg.sender);
}
// nameに対応するaddressを返すゲッター関数を定義しておきます。
function getAddress(string calldata name) public view returns (address) {
return domains[name];
}
}
上のコードではいくつかの関数を追加し、domains mapping変数も追加しました。
マッピングは、2つの値を「マッピング」する単純なデータ型です。 この例では、文字列(ドメイン名)をウォレットアドレスと紐付けしています。
この変数は「状態変数」と呼ばれるため特別であり、スマートコントラクトのストレージに永続的に保存されます。
ここではregister関数を実行すると、ドメインに関連するデータが永続的に保存されます。
また、ここではmsg.senderを使用しています。
これは、関数を呼び出した人のウォレットアドレスです。
いわゆる認証のようなものです。
スマートコントラクトを呼び出すには、有効なウォレットを使用してトランザクションに署名する必要があるため、誰が関数を呼び出したかを正確に把握する必要があります。
msg.sender