lesson-4_スマートコントラクトにデータを保存しよう
📦 データを保存しよう
このレッスンでは、ユーザーがあなたに送った「👋(wave)」の数をデータとして保存する方法を学びます。
ブロックチェーンは、AWSのようなクラウド上にデータを保存できるサーバーのようなものです。
しかし、誰もそのデータを所有していません。
世界中に、ブロックチェーン上にデータを保存する作業を行う「マイナー」と呼ばれる人々が存在します。この作業に対して、私たちは代金を支払います。
その代金は、通称ガス代と呼ばれます。
イーサリアムのブロックチェーン上にデータを書き込む場合、私たちは代金として$ETH
を「マイナー」に支払います。
それでは、「👋(wave)」を保存するために、WavePortal.sol
を更新していきましょう。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "hardhat/console.sol";
contract WavePortal {
uint256 private _totalWaves;
constructor() {
console.log("Here is my first smart contract!");
}
function wave() public {
_totalWaves += 1;
console.log("%s has waved!", msg.sender);
}
function getTotalWaves() public view returns (uint256) {
console.log("We have %d total waves!", _totalWaves);
return _totalWaves;
}
}
新しく追加されたコードの理解を深めましょう。
uint256 private _totalWaves;
自動的に0
に初期化される_totalWaves
変数が追加されました。この変数は「状態変数」と呼ばれ、WavePortal
コントラクトのストレージに永続的に保存されます。
- uint256 は、非常に大きな数を扱うことができる「符号なし整数のデータ型」を意味します。
🎁 Solidity のアクセス修飾子について
function wave() public {
_totalWaves += 1;
console.log("%s has waved!", msg.sender);
}
ここで、「👋(wave)」の回数を記録するwave()
関数が追加されました。まず、public
について見ていきます。
これは、Solidityのアクセス修飾子の1つです。
Solidity含めさまざまな言語において、各関数のアクセス権限について指定する必要があります。その指定を行うのが、アクセス修飾子です。
Solidityには、4つの アクセス修飾子が存在します。
-
public
:public
で定義された関数や変数は、それらが定義されているコントラクト、そのコントラクトが継承された別のコントラクト、それらコントラクトの外部と、基本的にどこからでも呼び出すことができます。Solidityでは、アクセス修飾子がついてない関数を、自動的にpublic
として扱います。 -
private
:private
で定義された関数や変数は、それらが定義されたコントラクトでのみ呼び出すことができます。 -
internal
:internal
で定義された関数や変数は、それらが定義されたコントラクトと、そのコントラクトが継承された別のコントラクトの両方から呼び出すことができます。Solidityでは、アクセス修飾子がついてない変数を、自動的にinternal
として扱います。 -
external
:external
で定義された関数や変数は、外部からのみ呼び出すことができます。
以下に、Solidityのアクセス修飾子とアクセス権限についてまとめています。
これからSolidityのアクセス修飾子は頻繁に登場するので、まずは大まかな理解ができれば大丈夫です。
🔍 msg.sender
について
function wave() public {
_totalWaves += 1;
console.log("%s has waved!", msg.sender);
}
wave()
関数の中にmsg.sender
が登場するのをお気付きでしょうか?
msg.sender
に入る値は、ずばり、関数を呼び出した人(=あなたに「👋(wave)」を送った人)のウォレットアドレスです。
これは、ユーザー認証のようなものです。
- スマートコントラクトに含まれる関数を呼び出すには、ユーザーは有効なウォレットを接続する必要があります。
msg.sender
では、誰が関数を呼び出したかを正確に把握し、ユーザー認証を行っています。
🖋 Solidity の関数修飾子について
Solidityには、関数(function)に対してのみ使用される修飾子(=関数修飾子)が存在します。
Solidity開発では関数修飾子を意識しておかないとデータを記録する際のコスト(=ガス代)が跳ね上がってしまうので注意が必要です。
ここでポイントとなるのは、ブロックチェーンに値を書き込むにはガス代を払う必要があること、そしてブロックチェーンから値を参照するだけなら、ガス代を払う必要がないことです。
ここでは、主要な2つの関数修飾子を紹介します。
view
:view