iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Web 3

鑄造加密貨幣系列 第 26

撰寫合約語言:Vyper Vs Solidity -26

  • 分享至 

  • xImage
  •  

在撰寫加密合約中,主要常用的程式語言有兩種—Vyper與Solidity。其中Vyper 為類似於Python的合約語言,主張以合約的安全性,簡單性與可讀性為考量。在這三個大前提下,Vyper禁止了以下幾種功能:

  1. 禁止modifier:modifier主要透過在程式中其他位置添加先決條件檢查此次執行此指令的合法性,但容易造成誤導性的代碼,影響可讀性。而Vyper建議利用inline去做檢查。

solidity利用modifier檢查範例
Untitled

Vyper推薦修改範例
Untitled

  1. 沒有繼承

solidity利用繼承方式完成VIP與非VIP的內扣費用範例
Untitled

在這個例子中由於我們先繼承notVIP再繼承VIP因此我們得到的cost會是VIP的3,然而如果我們把繼承順序對調,先繼承VIP再繼承notVIP則我們最後得到的cost會是3。
由上面的例子可以看出使用繼承會增加程式的複雜度進而降低可讀性。因此在Vyper中並不支援繼承。

  1. inline assembly
    在solidity中,為了降低gas的消耗與對於記憶體的更精確掌握,solidity允許使用較底層的inline assembly進行操作。然而由於inline assembly .Vyper為了安全性考量而禁止了利用inline assembly。

Untitled

  1. Function overloading
    在Vyper中因為function overloading可以通過定義不同參數的函式誤導使用者該函式的用途。由下圖可以發現原本PrintLog(”hello world”)是將日誌印出來,然而變成PrintLog(”hello”,”world”)卻在偷動使用者的錢。

Untitled

  1. Operator overloading
    基於類似的理由,避免誤導性的程式碼出現,因此Vyper不支援運算符改寫,在solidity中也沒有提到此功能(僅有function overloading),故在solidity中也不支援。

  2. Recursive calling
    由於遞迴容易造成gas的消耗量到達極值﹐因此Vyper中不能使用遞迴

Untitled

  1. Infinite-length loops
    與上述理由一樣,由於無線迴圈並沒有一個明確的迴圈終點,會讓gas使用量無上限增加,大大的增加被攻擊的可能性(gas 上限攻擊)

  2. Binary fixed point
    由於使用十進位的寫法較能明確的表示小數點的值,利用二進制小數點的數值需用近似的,然而這會造成不值觀的結果例如0.3(二進制)+0.3(二進制)+0.3(二進制)+0.1(二進制)不等於1(二進制)

總結

最後,粗淺的總結一下,Vyper不力求功能的強大性像solidity,其更追求使用者能夠好讀程式,並且能夠安全的使用合約,因此會禁止了許多Soilidity擁有的功能


上一篇
數位簽章 -25
下一篇
動手做加密貨幣 -27
系列文
鑄造加密貨幣31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言