コンテンツへスキップ
0%

Solidityのcall関数とは?

Alchemy team headshot

執筆者 Alchemy

2022年10月4日 公開読了時間 1 分

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

Solidityのcall関数とは何か?

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

Solidityスマートコントラクトを構築する際、自分のコントラクトから別のコントラクトとやり取りしたい場合には常にcallメソッドを使用する必要があります。

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

calldataとは何か?

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

Solidityのcall関数はどのように動作するか?

Solidityのcall関数は、ネイティブETH送金の場合はゼロにもなり得るcalldataを受け取り、EVM opcode CALLという低レベルの仕組みに基づいて、そのcalldataを意図した受け取り先に対して実行することで動作します。

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

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

Solidity関数の一つとして、以下のコードをお好みのSolidity IDEに入力し、address payable _toを受け取り側のアドレスに置き換えて使用できます。

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

callとdelegatecallの違いは何か?

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

callとtransferの違いは何か?

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

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

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

Solidityのcallについてさらに学ぶには、Alchemy Universityの無料オンラインSolidity開発者クラッシュコースに参加登録してください。この7週間の非同期形式のEthereumブートキャンプは、Alchemyが大手Ethereum教育企業であるChainShotを買収したことを受けて再設計されたものです。

開発全般が初めての開発者にとっては、Ethereumブートキャンプを始める前の前提条件として、Alchemy Universityの3週間のJavaScriptクラッシュコースが良い選択肢となります。

Background gradient

ブロックチェーンで魔法を生み出す

Alchemyは、最も強力なweb3開発者向けプロダクトとツールを、豊富なリソース、コミュニティ、そして卓越したサポートと組み合わせて提供します。