[Ethereum]Solidity v0.7リリース (2)
はじめに
前回に引き続き、Solidity v0.7のBreaking Changesを見ていく。
今回はRemix IDEを使って、コンパイルして確認する。
答え合わせのようなものなので、さらっと見ていく。「 now
はなくなって block.timestamp
になった」のようにあからさまな内容はスルーだ。
Changes to the Syntax
gasとvalueの指定
// SPDX-License-Identifier: Apache-2.0
pragma solidity >= 0.7.0;contract Storage {
uint256 number;function store(uint256 num) public payable {
number = num;
}
}contract Storage2 {
Storage s;function gasCall() public {
s.store{gas: 10000, value: 10000}(1000);
}
}
コンパイルの確認だけなので、 s
に値を入れてないとか、そういうのは無視だ。
value
の指定がなければ payable
でなくてよい。
NatSpecコメント
// SPDX-License-Identifier: Apache-2.0
pragma solidity >= 0.7.0;contract Storage {/**
* @dev The number
*/
uint256 number;function store(uint256 num) public {
/**
* @dev Tom cat
*/
uint256 tom;number = num;
}
}
tom
のコメントがそれだが、コンパイルエラーは変数定義の行になった。
ParserError: Only state variables can have a docstring.
Unicode String literal
function store() public {
//str = unicode"こんばんは";
str = "こんばんは"
}
コメントアウトした方の書き方だとOKなのだが、 unicode
を付けていないとエラーになる。
ParserError: Invalid character in string.
State Mutability
例えば、これはv0.6でエラーになった。
// SPDX-License-Identifier: Apache-2.0
pragma solidity >= 0.6.0;contract Storage {
uint256 number;
string str;function store(uint256 num) public virtual returns(uint256) {
uint256 bak = number;
number = num;
return bak;
}
}contract Storage2 is Storage {
function store(uint256) public override view returns(uint256) {
return 256;
}
}
Storage2の store()
でエラーになる。
TypeError: Overriding function changes state mutability from “nonpayable” to “view”.
もちろん view
を pure
にしても同じ。
v0.7だとOKだ(pragmaも変更すること)。
Removal of Unused or Unsafe Features
Mappings outside Storage
これは mapping
しているのは storage
だからOKだ。
// SPDX-License-Identifier: Apache-2.0
pragma solidity >= 0.7.0;contract Storage {
struct Neko {
string name;
}
mapping(uint256 => Neko) nekos;function store(uint256 num) public {
nekos[num].name = "Tom";
}
}
memory
指定してローカル変数にしてみればよいのかと思ったのだが、これはv0.6でもエラーになる。
// SPDX-License-Identifier: Apache-2.0
pragma solidity >= 0.6.0;contract Storage {
struct Neko {
uint256 age;
}mapping(uint256 => Neko) nekos;function store(uint256 num) public {
mapping(uint256 => Neko) neko;
neko[num].age = nekos[num].age;
nekos[num].age = 126;
}
}
うーん、これは今回はあきらめよう。
わからん!