Techhack for life

テクノロジー関連で学んだことを書いていきます。

Vyperプログラミング言語の概要

Vyperとは

2018年の7月に、Ethereumのsmart contractを開発できる新しいプログラミング言語Vyperがαテストを完了しました。 Vyperは、Pythonベースのプログラミング言語として、Solidityの欠点をできる限り排除し、簡潔さ・堅牢さを向上することを目標に開発されています。 本ブログでは、Vyperの特徴を簡単に説明します。

Vyperの面白さ

  1. セキュリティの高さ
  2. 言語仕様と、コンパイルの簡潔さ
  3. 監査能力の高さ
    • 読みやすさを向上
    • ミスコードをすることを防ぐ

Vyperの機能

  1. オーバーフローチェック
  2. 符号付き整数・符号小数点数をサポート
  3. 決定性
    • 関数呼び出し時のガスの消費量を正確に測定する
  4. 強い型付け
    • timestamp, second, weiなど
  5. 小さく理解しやすいコンパイルコード
  6. 純粋な関数の制限付きサポート

Vyperが制限する部分

Modifiers

Solidityでは、このModifierは関数を実行する前のチェックなどに使われていました。しかしこのチェックは、関数内に同様のチェックをする関数を用いれば代用できます。 1つの関数内に状態チェックをできる方法が2種類ある形になります。これは可読性の低下に繋がります。そのため、Vyperでは、このMidifierを削除する形にしました。

modifier onlyOwner() {
  require(msg.sender == owner);
  _;
}

function checkSomething() {
  bool flag = ...;
  return flag;
}
  
function someFuntion() public onlyOwner {
  bool flag = checkSomething()
  // 何かしら実行
}

Class inheritance

Solidityでは、クラスの継承が行えていました。しかしこれを採用したことで、複数のファイルを継承することができ、複雑さが向上してしまいます。 そのため、Vyperでは、このクラス継承を採用しませんでした。

Inline assembly

インラインアセンブリを用いると、どのコントラクトのインスタンスから取得した変数なのか、確認をすることが難しくなっています。そのため、Vyperでは、インラインアセンブリを採用しませんでした。

Function overloading

関数のオーバーロードを採用することで、どの関数が呼ばれるのかを追跡することを難しくしていました。そのため、Vyperでは、オーバーロードを採用しませんでした。

Operator overloading

Recursive calling

Solidityでは、再帰呼び出しにより、過去ハッキング事件が発生していました。Vyperでは、これを実現不可能にしています。

Infinite-length loops

Solidityでは、無限ループを許可することで、gas limitの最大まで関数を実行し、gas limit攻撃を可能にしていました。Vyperでは、これを実現不可能にしています。

Binary fixed point

まとめ

以上のように、VyperはSolidityとはまた違った形で、やれることをできる限り排除して、セキュリティを高めるアプローチをとっています。 Solidityのやれることの幅広さは、Smart Contractのように簡単に修正ができないものに関しては、時にバグ・ハッキングのリスクを高める可能性を向上させます。 Pythonを得意とするエンジニアだけでなく、ビギナーのエンジニアでもセキュアなコントラクトを記述できるという意味でも、とても有用であると思います。

興味のある方は、Vyperを一度勉強してみてはいかがでしょうか。

Reference

https://vyper.readthedocs.io/en/latest/

New Ethereum Language Vyper Will Make ETH Blockchain More Secure | NewsBTC