Github: https://github.com/ethereum/vyper
原則と目標
Vyperは以下の目標のいくつかを目指す実験的プログラミング言語です:
- セキュリティ – Vyperで安全なスマートな契約を構築することは可能であり、自然でなければなりません。
- 言語とコンパイラの簡潔さ – 言語とコンパイラの実装は簡単になるように努力すべきです。
- Auditability – Vyperコードは人間が読めるように最大限にすべきである。 さらに、 誤解を招くようなコードを書くのは最大限に難しいはずです 。 読者のためのシンプルさは作家のための単純さよりも重要であり、Vyperの以前の経験が少ない読者(そして一般的なプログラミング経験が少ない読者)にとってはシンプルさが特に重要です。
Vyperにはないものの例とその理由:
- モディファイア – 例えば、Solinityでは、
function foo() mod1 { ... }
を実行function foo() mod1 { ... }
ことができfunction foo() mod1 { ... }
ここで、mod1
は、実行前に行われるチェック、実行後に行われるチェック、おそらく他のものであってもよい。 Vyperにはこれがありません。誤解を招くようなコードを書くのが簡単すぎるからです。mod1
は、任意の事前条件、事後条件または状態変更を追加する可能性のあるものに対してはあまりにも無害です。 また、実行がファイルの周りでジャンプするコードを記述することを奨励し、監査性を損なう。 モディファイアの通常の使用例は、プログラムの実行前に単一のチェックを実行するものです。 単にこれらのチェックをアサーションとしてインライン化することをお勧めします。 - クラス継承 – プログラムが何をしているのかを理解するために複数のファイルにジャンプする必要があり、競合が発生した場合に優先順位のルールを理解する必要があります(クラスXの関数は実際に使用されています)。 したがって、コードを理解することが難しくなります。
- インラインアセンブリー – インラインアセンブリーを追加すると、変数名を読み取ったり変更したすべてのインスタンスを見つけるために、Ctrl + Fキーで変数名を使用できなくなります。
- 演算子のオーバーロード – 誤ったコードを書くのが簡単すぎる( “+”は “私のお金をすべて開発者に送る”という意味ですか?
- 再帰的呼び出し – ガス制限の上限を設定できず、ガス制限攻撃の扉を開くことができません。
- 無限長ループ – ガス制限の上限を設定できず、ガス制限攻撃の扉を開けません。
- バイナリの固定小数点 – 小数点固定小数点の方が優れています。小数点の固定小数点値はリテラルとしてコードに記述されているため、正確な表現ができますが、バイナリ固定小数点近似が必要な場合があります(0.2 – > 0.001100110011 …切り捨て)、例えばpython
0.3 + 0.3 + 0.3 + 0.1 != 1
ような直感的な結果につながります。
STATICCALLが利用可能になったときにメトロポリスの後に考えられるいくつかの変更点は次のとおりです。
- 静的に呼び出されていないアドレスが明示的に「信頼できる」とマークされていない場合を除き、非静的な呼び出し後の状態の変更を禁止します。 これは、再突入攻撃のリスクを低減する。
- 例えば、
send(some_address, contract.do_something_and_return_a_weivalue())
、 “応答を得るための呼び出し”と “何かをするための呼び出し”との明確な分離を強制する、 “インライン”非静的呼び出しをsend(some_address, contract.do_something_and_return_a_weivalue())
。
Vyperは、Solidityで実行可能なすべてのものを100%置き換えようとはしません。 セキュリティを強化するという目標のために意図的に行うことを拒否したり、物事をより困難にしたりします。
注:Vyperはアルファソフトウェアであり、注意して使用する
インストール
ビルドの手順については、 Vyperのドキュメントを参照してください。
契約書の作成
コントラクトをコンパイルするには、以下を使用します。
vyper your_file_name.v.py
注:.vyは構文のハイライトやlinterでサポートされている公式言語ではないので、vyperファイルを.v.py
してPythonを強調表示することをお勧めします。
GitHubシンタックスの強調表示の代替方法: .gitattributes
ファイルに*.vy linguist-language=Python
という.gitattributes
追加する*.vy linguist-language=Python
また、 オンラインコンパイラを使用して、言語を試してbytecode
やLLL
コンパイルすることもできます。
注:オンラインコンパイラーのvyperバージョンは定期的に更新されますが、このリポジトリーのマスターブランチにある最新バージョンよりも少し遅れている可能性があります。
テスト(pytestを使用)
python setup.py test