Nobiq
Nobiq

関数

読み書きのボタン=関数を付ける

前回、自動販売機に「値段」などの記録(変数)を持たせました。今回はそれを読み書きするボタン=関数を付けます。

関数 = 名前をつけた手順のまとまり

関数とは、「名前をつけた手順のまとまり」です。自動販売機のボタンだと思ってください。ボタンを押す(関数を呼ぶ)と、決められた手順が実行されます。

書き方の骨格はこうです。

function 名前(受け取るもの) public 種類 returns (返すもの) {
    手順
}

言葉で埋めた例: 「setPrice という名前の、新しい値段を受け取って、記録を書き換えるボタン」。

読むボタンと書くボタン

値段を「読む」関数と「書き換える」関数を付けてみます。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract VendingMachine {
    uint256 public price = 120;
    address public owner;

    constructor() {
        owner = msg.sender;
    }

    function getPrice() public view returns (uint256) {
        return price;
    }

    function setPrice(uint256 newPrice) public {
        price = newPrice;
    }
}

読むボタン: getPrice

function getPrice() public view returns (uint256) {
    return price;
}
  • () の中が空 = なにも受け取りません
  • view = 「読むだけで、記録は変えません」という宣言。読むだけの関数には必ず付けます
  • returns (uint256) = 「整数をひとつ返します」という宣言。return price; で実際に返しています

似た仲間に pure があります。view は「記録を読むだけ」、pure は「記録を読みもしない(計算だけする)」です。まずは view を覚えれば十分です。

書くボタン: setPrice

function setPrice(uint256 newPrice) public {
    price = newPrice;
}
  • (uint256 newPrice) = 「整数をひとつ受け取り、この中では newPrice と呼びます」。この受け取り口を引数(ひきすう)と呼びます
  • price = newPrice; = 記録場所 price の中身を、受け取った値で上書きします。= は「等しい」ではなく「右のものを左に入れる」という意味です
  • 記録を変えるので view は付けません

:::note 読むのは無料、書くのは本来有料 ブロックチェーンでは、読むだけ(view)はすぐ終わりますが、記録を書き換えるのは世界中の記録を更新する作業なので、本来は手数料(ガス代)がかかり、数秒待ちます。Lab では手数料を運営が負担しているので、気にせず何度でも試せます。くわしくは コンパイルとデプロイ の「しくみの話」へ。 :::

constructor と msg.sender

コードの中に、見慣れないブロックがありましたね。

constructor() {
    owner = msg.sender;
}
  • constructor は、デプロイ(設置)の瞬間に 1 回だけ実行される特別な手順です。あとから呼ぶことはできません。「工場出荷時の初期設定」です
  • msg.sender は、「いまこの操作をしている人の住所」が自動で入っている特別な変数です。デプロイの瞬間の msg.sender は設置した本人なので、この 1 行で「持ち主 = 設置した人」を記録できます

この msg.sender、次回「持ち主だけが値段を変えられる自販機」を作るときの主役になります。

今回覚えたこと

  • 関数 = 名前をつけた手順のまとまり(自販機のボタン)。引数で受け取り、returns で返す
  • view = 読むだけの関数に付ける印(pure は計算だけ)
  • constructor = デプロイの瞬間に 1 回だけ動く初期設定。msg.sender = いま操作している人の住所

:::tip Lab でやってみる 上のコードをデプロイして、実行画面で試しましょう。①price() を呼ぶ → 120 ②setPrice に 150 を入れて実行 ③もう一度 price() → 150 に変わっています。さらに owner() を呼ぶと、あなた(正確には Lab の代行送信者)の住所が返ってきます。操作方法: コントラクトを動かす :::