---
title: "Solidityのcall関数とは?"
description: "Solidityのcall関数の仕組みを解説"
---

# Solidityのcall関数とは?

[Solidity](https://www.alchemy.com/overviews/solidity)プログラミング言語は、主にEthereumブロックチェーン上でスマートコントラクトを作成するために使用されます。この記事では、Solidityのcall関数について知っておくべき詳細をすべて解説します。

## **Solidityのcall関数とは何か？**

Solidityにおける `call`** 関数は、開発者が他のコントラクトとやり取りする際に使用する低レベル関数です。**

[Solidityスマートコントラクト](https://www.alchemy.com/overviews/solidity-smart-contract)を構築する際、自分のコントラクトから[別のコントラクトとやり取り](https://www.alchemy.com/overviews/solidity-call-another-contract)したい場合には常に`call`メソッドを使用する必要があります。

callは、呼び出し元が提供するEtherを使ってトランザクションの支払いを行いながら、受け取り側のスマートコントラクト内の他の関数を実行するためにも使用できます。`call`関数にはさらに、トランザクションのステータスを真偽値として返し、その戻り値を変数として送信できるという利点もあります。

### **calldataとは何か？**

`Calldata`は一時的なストレージの一種で、関数の引数に指定されたデータを保持します。もう一つの一時的なストレージであるmemoryとの違いは、_calldata_の不変性にあります。`calldata`内に格納されているものは変更できません。

## **Solidityのcall関数はどのように動作するか？**

Solidityのcall関数は、ネイティブETH送金の場合はゼロにもなり得る`calldata`を受け取り、[EVM opcode CALL](https://ethereum.org/en/developers/docs/evm/opcodes/)という低レベルの仕組みに基づいて、その`calldata`を意図した受け取り先に対して実行することで動作します。

データ（すなわち、受け取り側のスマートコントラクト内で呼び出される関数）とgasが指定されると、`call`メソッドはこの2つを使ってスマートコントラクト内の関数を実行できます。

### **call methodを使ってetherを送るにはどうすればよいか？**

[Solidity関数](https://www.alchemy.com/overviews/solidity-functions)の一つとして、以下のコードをお好みの[Solidity IDE](https://www.alchemy.com/overviews/solidity-ide)に入力し、`address payable _to`を受け取り側のアドレスに置き換えて使用できます。

以下は、callを通じてEtherを受け取ることができるコントラクトを作成するコードです。

### callとdelegatecallの違いは何か？

`call`と`delegatecall`の違いは、`delegatecall`は呼び出された関数のコードを、呼び出し元のスマートコントラクトの一部であるかのように実行する点です。一方、`call`メソッドは、その関数を別のスマートコントラクトの一部としてそのまま呼び出します。実際には、これは呼び出された関数が呼び出し元のstorage、`msg.sender`、`msg.value`を使用することを意味します。

### callとtransferの違いは何か？

transferは変更不可能なgas limitを持ち、失敗した場合は取り消されます。callは、通常のcallの代わりに`someAddress.call.value(ethAmount).gas(gasAmount)()`を使用することでgas limitをカスタマイズでき、トランザクションが失敗した場合にはfalseを返します。

`transfer`メソッドの使用は、もはや推奨されていません。しかし、これまでは`transfer`が好まれてきました。これはgasに組み込みの制限を使用しており、[reentrancy攻撃を防ぐ](https://www.alchemy.com/overviews/reentrancy-attack-solidity)のに役立っていたためです。transferメソッドの不変のgas limitはまた、2300 gasという上限を設定したい計算処理において、より良い選択肢とされていました。

## **Solidityのcall methodについてさらに学ぶには**

[Solidityのcallについてさらに学ぶ](https://www.alchemy.com/overviews/learn-solidity)には、Alchemy Universityの無料オンラインSolidity開発者クラッシュコースに参加登録してください。この7週間の[非同期形式のEthereumブートキャンプ](https://university.alchemy.com/?a=5f566a8c97)は、Alchemyが大手Ethereum教育企業であるChainShotを買収したことを受けて再設計されたものです。

開発全般が初めての開発者にとっては、Ethereumブートキャンプを始める前の前提条件として、Alchemy Universityの[**3週間のJavaScriptクラッシュコース**](https://www.alchemy.com/university/courses/js)が良い選択肢となります。
