LoginSignup
6
3

More than 5 years have passed since last update.

Solidityでstructをreturnする

Posted at

privateとinternalはそのまま返せる

privateかinternalの修飾詞がついた関数の場合は、特に注意しなくてもstructをreturnできる。

struct UserInfo {
  ...
}

mapping(uint256 => UserInfo) internal _userIdToUserInfo;

function getUserInfo(uint256 _userId) internal view returns (UserInfo memory) {
  return _userIdToUserInfo[_userId];
}

注意:
solidity 0.5.4でのコードです。
0.4.xの場合は、returnする値にストレージ領域を指定しません。
returns (UserInfo memory) -> returns (UserInfo)

externaとpublicは、ABIEncoderV2を指定する

solidity外部にstructを返す場合は、ABIEncoderV2を指定する必要がある。

pragma experimental ABIEncoderV2;

こうすることでstructを外部にも返せるようになり、web3からも参照できるようになる。

ABIEncoderV2 を使うことによるWarning

ABIEncoderV2を指定することで、以下の「実験的なやつだからlive deploymentでは使わないで」というWarningが出てしまう。
Experimental features are turned on. Do not use experimental features on live deployments.

この注意は何を指しているのか。

twitterに書いたので引用しますが、これはセキュリティに対するwarningではなく、gasの使用量が増加することに対するwarningだそうです。
そのため、「本番環境では使えないから結局structは要素ごとにreturnするしかないのか」となる必要はなく、「gasかかるっぽいから、どのくらいかかるか試してから使うかどうか決めよう」と考えれば良さそうです。

まとめ

Solidityでstructをreturnするときは、以下のようにABIEncoderV2を指定しましょう。

pragma experimental ABIEncoderV2;
6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3