在撰寫加密合約中,主要常用的程式語言有兩種—Vyper與Solidity。其中Vyper 為類似於Python的合約語言,主張以合約的安全性,簡單性與可讀性為考量。在這三個大前提下,Vyper禁止了以下幾種功能:
禁止modifier:modifier主要透過在程式中其他位置添加先決條件檢查此次執行此指令的合法性,但容易造成誤導性的代碼,影響可讀性。而Vyper建議利用inline去做檢查。
solidity利用modifier檢查範例
Vyper推薦修改範例
沒有繼承
solidity利用繼承方式完成VIP與非VIP的內扣費用範例
在這個例子中由於我們先繼承notVIP再繼承VIP因此我們得到的cost會是VIP的3,然而如果我們把繼承順序對調,先繼承VIP再繼承notVIP則我們最後得到的cost會是3。
由上面的例子可以看出使用繼承會增加程式的複雜度進而降低可讀性。因此在Vyper中並不支援繼承。
inline assembly
Function overloading
Operator overloading
基於類似的理由,避免誤導性的程式碼出現,因此Vyper不支援運算符改寫,在solidity中也沒有提到此功能(僅有function overloading),故在solidity中也不支援。
Recursive calling
由於遞迴容易造成gas的消耗量到達極值﹐因此Vyper中不能使用遞迴
Infinite-length loops
與上述理由一樣,由於無線迴圈並沒有一個明確的迴圈終點,會讓gas使用量無上限增加,大大的增加被攻擊的可能性(gas 上限攻擊)
Binary fixed point
由於使用十進位的寫法較能明確的表示小數點的值,利用二進制小數點的數值需用近似的,然而這會造成不值觀的結果例如0.3(二進制)+0.3(二進制)+0.3(二進制)+0.1(二進制)不等於1(二進制)
最後,粗淺的總結一下,Vyper不力求功能的強大性像solidity,其更追求使用者能夠好讀程式,並且能夠安全的使用合約,因此會禁止了許多Soilidity擁有的功能