本文へスキップ
BecomeCoder

Solidityコース · 第3章 値とデータ構造 ― address・mapping・struct · レッスン11

address型とether ― お金の宛先

ブラウザで完結

導入

Ethereum のすべての口座(人のウォレットも、コントラクト自身も)は アドレスで表されます。address 型は Solidity の主役のひとつで、送金の宛先・所有者の識別などに使います。

説明

アドレスは 0x で始まる42文字の16進数(20バイト)です。

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

contract Addresses {
    address public owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;

    // このコントラクト自身の残高(wei単位)を返す
    function myBalance() public view returns (uint256) {
        return address(this).balance;
    }

    // 送金を受け取れるアドレスは payable を付ける
    address payable public wallet;
}
  • address … 口座アドレス。.balance でそのアドレスの ETH 残高を読める。
  • address(this)this は「このコントラクト自身」。コントラクトも口座を持ち ETH を保有できる。
  • address payableETH を送金できるアドレス。ただの address には送金できず、payable を付けた版が必要(第4章の送金で使います)。

ETH の金額は、実は最小単位 wei(ウェイ) で扱われます。

単位wei換算イメージ
1 wei1最小単位
1 gwei1,000,000,000 (10⁹)ガス代の表示によく使う
1 ether1,000,000,000,000,000,000 (10¹⁸)1 ETH
uint256 oneEther = 1 ether;   // = 1000000000000000000 wei
uint256 gas      = 20 gwei;   // = 20000000000 wei

Solidity は ether / gwei / wei という単位サフィックスを用意しており、1 ether と書くと自動で wei に換算されます。内部の計算はすべて wei(整数) で行われる点を覚えておきましょう(Solidity に小数はありません)。

やってみよう

「1.5 ETH」を扱いたいとき、小数は使えないので 1500000000000000000 wei(= 1.5 * 10¹⁸)のように整数の wei で考えます。金額計算はすべて整数、という制約が後の割り算の注意点(切り捨て)につながります。

実際に動かしてみよう

下のエディタのコントラクトを「コンパイル & デプロイ」すると、ブラウザ内で本物のSolidityコンパイラ(solc)がコンパイルし、EVM(@ethereumjs)にデプロイされます。デプロイ後は public な関数がボタンになって並ぶので、引数を入れて呼び出すと戻り値・イベント・require のエラー(revert理由)まで確認できます。本文のコントラクトを書き換えて動きを試しながら進めましょう(コンパイラ本体は初回だけ読み込みに数秒かかります)。

Solidity — ブラウザ内でコンパイル & 実行

ブラウザ内で本物のSolidityコンパイラ(solc)とEVM(@ethereumjs)を動かす環境を読み込みます(コンパイラ本体は初回のコンパイル時に読み込むため、最初の実行だけ数秒かかります)。
スクロールして表示された時点でも自動で読み込まれます。