幾句話說清楚函數(shù)調(diào)用和轉(zhuǎn)賬的問題
????函數(shù)調(diào)用與轉(zhuǎn)賬是所有教程(可能夸大),也包括官方文檔,搞得極其混亂的地方。
????函數(shù)調(diào)用和轉(zhuǎn)賬關(guān)系密切,概念上轉(zhuǎn)賬是函數(shù)調(diào)用的附屬物,通過{value,gas}附著在函數(shù)調(diào)用上,無論是自定義函數(shù),合約部署,還是call方法。當(dāng)然是這樣,因為value和calldata都是transaction(message)的數(shù)據(jù)字段。
????下面這個圖是被廣泛使用的:

????但它既不準(zhǔn)確,也不清晰清晰,理解困難。下面我們給出另一種方式
????我們將問題分解成兩部:
????第一步是解析邏輯
????為調(diào)用解析出一個處理這個調(diào)用的合約函數(shù)。這個過程與轉(zhuǎn)賬無關(guān),即與value無關(guān),如下圖:

????這是一個過濾器模式。自定義函數(shù)使用selecor匹配,receive匹配calldata為空的情況,而fallback是最后兜底。receive和自定義的函數(shù)可以任意交換,但fallback必須在最后。當(dāng)然receive和fallback都可能缺席。當(dāng)calldata穿透這個鏈條沒有被攔截,調(diào)用失敗。
????這就是解析邏輯。
第二步是檢查邏輯
????如果被某一函數(shù)攔截了,檢查 是否有value>0而函數(shù)沒有被payble修飾的情況。如果有,調(diào)用被拒絕,否則,執(zhí)行解析出的函數(shù)的邏輯。
????以上邏輯清晰易懂,關(guān)鍵是一定將解析邏輯和檢查邏輯分離。只要混在一起講,一定是一團(tuán)亂麻。遺憾的是,這似乎是所有文章和課程的做法。起碼我看到的是這樣。