関数
読み書きのボタン=関数を付ける
前回、自動販売機に「値段」などの記録(変数)を持たせました。今回はそれを読み書きするボタン=関数を付けます。
関数 = 名前をつけた手順のまとまり
関数とは、「名前をつけた手順のまとまり」です。自動販売機のボタンだと思ってください。ボタンを押す(関数を呼ぶ)と、決められた手順が実行されます。
書き方の骨格はこうです。
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 の代行送信者)の住所が返ってきます。操作方法: コントラクトを動かす
:::