更新: 11/13/2018 リリースがリリースされました 。変更点の詳細な説明はこちらです 。 この記事では、5月(リリースの5か月前)のこのバージョンの状態について説明しています。
バージョン0.5.0で予想されるSolidity言語の変更についてお話したいと思います。 私はすぐに、言語、つまり文法とセマンティクスのみに制限することに注意します。
英語でさえこの主題に関する健全なテキストはありませんが、最近プロジェクトが Solidityリポジトリに登場しました。
その上で、バージョン0.5.0の準備の進行状況を追跡できます。
免責事項:この記事では、プロジェクトの現在の状態について説明していますが、リリースにより変更される可能性があります。 正確な情報は、公式の変更ログから取得できます。
廃止されたデザインの最終禁止
Solidityは、言語から削除したいかなり多くの古い構成要素を蓄積していますが、下位互換性のために失敗します。 このカテゴリの変更には次のものが含まれます。
revert()
を支持するthrow
拒否 revert()
/ assert(...)
/ require(...)
トランザクションのロールバックメカニズムは例外メカニズムとは異なるため、言語レベルでこの違いを強調したいと思います。- 型推論の規則が与えられた
var
からの失敗は、たとえば次のようなエラーにつながりやすくなります。
for(var i = 0; i < 100500; i++) { ... //
さらに、彼らは構造を置き換えるものについて議論します。
var (z, y, z) = foo();
そして、 不要な値をスキップするよりエレガントな方法。 - 関数に
constant
を使用するconstant
は禁じられています-どこでもビューまたは純粋でなければなりません。 gasleft()
代わりに組み込みの gasleft()
。 これはある種の定数ではなく、ガスの残量であることがより明確です。 はい、 gasleft()
はオーバーライドできます。block.blockhash
をblockhash
移動しblockhash
。 現在のブロックのブロックblockhash
利用できないため、論理的です( block.blockhash(block.number) == 0
)。- 16進定数と時間/エーテル係数を混在させることは禁じられています。 実際、
0xaf days
何であるかは明確ではありません。 - インラインアセンブリで
sha3
suicide
/ sha3
。 - 単項プラスの拒否。これは特別な役割を持たず、愚かな間違い(
x+=1;
代わりにx+=1;
x=+1;
など)に関与する可能性があるためx+=1;
。 - 現在は
365 days
と定義されており、通常のカレンダーと正確に一致しないため、 years
乗数を放棄する予定です。 これは議論の余地のある決定のように思えます-今のところ、警告に自分自身を制限することは可能だと思われます。
より強力な構文
Solidityでは、非常に異なる構造の構文が類似しています。 これにより、コードの読み取りが難しくなりますが、さらにソースコードを操作するツールの開発者の生活を台無しにします(これはコンパイラにも当てはまります)。 この方向でも作業が行われているのを見るのは素晴らしいことです。
可視性修飾子とABI
主にデフォルト値が存在するため、可視性修飾子の簡単な混乱がありました。 多くの小さな編集が蓄積されているため、言語がより厳密になり、この混乱が解消されます。
そして、これらの修飾子はABI契約に該当するため、変更は彼に影響を与えました。
- インターフェイス内のすべての関数は、明示的に外部としてマークする必要があります。
残念ながら、コンパイラの一部のバージョンでは、このような関数をパブリックとして再定義することはできません-エラーが発生します(たとえば、0.4.21で)。 これは、バージョン0.4.22以降で可能です。
また、 public
変数を使用してexternal view
関数の実装を許可することを約束します。 - 可視修飾子は機能に必須になりました 。
この変化は長い間待っていました。 githubの問題は、Parityによる最初のハックの直後に作成されました。
追加の制限は、フォールバックは外部のみであるということです。
任意の数の引数とデータパッキングを持つ関数
Solidityには、任意の数の引数を取り、それらを1つのバイナリソーセージに接着して操作するいくつかの関数があります。 このプロセスには多くの微妙な点と明らかでない瞬間がありますが、今ではそれらに対処することにしました。
- 新しいグローバル
abi
オブジェクトとそのメソッド
encode
、 encodePacked
、 encodeWithSelector
、およびencodeWithSignature
を使用すると、呼び出しまたはハッシュのためにデータのコレクションを制御できます。
それらを使用してkeccak256
/ sha256
/ ripemd160
およびcall
/ delegatecall
引数を収集することが提案されています。 これらのコマンドの構文を変更して 、任意の長さの引数のリストを受け入れられないようにする予定です。 - 引数を密に詰めた構造体の定数の自動型推論の変更 :
keccak256(1)
ようなkeccak256(1)
は、最小の十分な型ではなくuint256
が使用されuint8
。 この動作がkeccak256(uint8(1))
ない場合は、明示的な型keccak256(uint8(1))
)を使用する必要がありkeccak256(uint8(1))
。
この変更は、 var
の拒否と定数式の計算の( 有限ではありますが)精度の次に論理的に見えます。 - 配列のパッキングのルールを変更します。 それはすべて、ショートアドレス攻撃から身を守ろうとする契約のトランザクショントランザクションを実行できないマルチシグウォレットの問題から始まりました。 どうやら、現在の振る舞いは非常に自明ではないと考えられていた、またはおそらくこれはEVMレベルで
msg.data
長さmsg.data
を導入するための準備です。
「メモリを使用した作業」の改善
これは、主にアセンブリを使用しないストレージへの「予期しない」アクセスに関するものだからです。
- ストレージへの初期化されていない参照の禁止 。これは実際にストレージの先頭を指し、したがって他の状態変数と交差します。
<array>.length
を使用した直接作業は禁止されている<array>.length
があります。
アレイの長さを手動で変更することは、かなり低レベルの操作です。 その主な利点は、アレイの長さをわずかに変更するだけでガスを節約できることです。 ただし、この構文を使用すると、誤って(または意図的に)不十分なサイズの配列を作成することができ、重複攻撃につながる可能性があります。 配列をきれいにdelete
ために長い間delete
があり、サイズを小さくするためにpop()
推奨されます。さらに、 truncate()
やextend()
などの操作が説明されています。 本当に必要な場合は、まだアセンブリがあります。
疑わしいから
蜂蜜の樽はすべて、軟膏で独自のハエを持ちます。
- すべての機会にキーワードの束を追加します。 それらのいくつかは恐ろしいように見えますが、これまでのところ何も明確ではありません。 正直なところ、このリストに
revert
、 assert
require
が表示されるrevert
を望んでいましたが、文法的な観点から見ると、これらは単なる機能のままです(再定義できます)。
言語ではない
言語に直接影響を与えないが、同時に新しい契約のコードに大きな影響を与えるいくつかの非常に重要な変更があります。
- 最後に、 小数部分のある数字が表示されます。 誰もがそれらなしでやっていることに慣れているようです、そして今、私たちはそれらを正しく使うことを学びます。
- EVMレベルでは、ショートアドレス攻撃に対する保護が追加されます。 些細なことのように思えるかもしれませんが、もう考える必要はありません(そして、一般的にこの問題について知っている)。 おそらくもっと厳しくなりますが、困難があります。
いくつかの結論
リリースのリリース日はまだ不明ですが、多くの革新がすでに触れられています。
彼らはオンになります
pragma experimental "v0.5.0";
そして
pragma experimental "ABIEncoderV2";
もちろん、コンパイラは警告を発行します。
一般的に、0.5.0は肯定的に認識されます。 後方互換性のために何らかの形で排除できないものを削除し、いくつかの滑りやすいトピックをしっかりとリファクタリングし、いくつかの有用な変更を加えます。 その後、 継承リファクタリングを待ちます。そこに、 Vyperが間に合うかもしれません。