pragma solidity 0.7.1; pragma experimental ABIEncoderV2; contract ShinonomeContract { // Genderは列挙型で定義する. リーダビリティに寄与する他、booleanではisFemale等のkeyになるのはよろしくないため。 enum Gender { Female, Male } /*** * structの命名はPascalCase. * ageは2^16-1 = 65535もあれば十分. * 今回は最適化されないが、常に必要なだけのbit数のIntegerを用いるよう気をつける. * structの最適化については、https://mudit.blog/solidity-gas-optimization-tips/ */ struct Member { string name; uint16 age; Gender gender; } /*** * 変数は基本的にprivateにする。 * publicであると自動でgetterメソッドが生えてしまう。 * プログラムの責任範囲を明確にするために、自前でgetterを用意する. */ mapping(address => Member) private addressToMember; /*** * 関数は問題がない限りexternalにする。gasコストが抑えられるため。 * gasコストが抑えられる理由は、publicでは引数を内部で一度コピーを生成するのに対し、externalではコピーを作らないため実行コストが低い。 * 配列などの大きなデータを扱う際は、その効果が大きく出てくる. */ function setMember(address _memberAddress, string calldata _name, uint16 _age, Gender _gender) external { addressToMember[_memberAddress] = Member(_name, _age, _gender); } /*** * l3. のABIEncoderV2を使うことで返り値にStructを使用可能になる。 * ABIEncoderV2を使わない場合は、returns (string memory, uint16, Gender)とすればOK. * ストレージに変更を加えないため、view関数. */ function getMember(address _memberAddress) external view returns (Member memory) { return addressToMember[_memberAddress]; } }
0.7.1