合約調(diào)用的邊界情況
????邊界情況總是較少受到關(guān)注,更容易被忽視,但又對理解問題很關(guān)鍵。solidity合約調(diào)用的問題也是如此,幾乎所有教程、文檔都不提及。這對學(xué)習(xí)者、開發(fā)者很不利。所以說一下。
一個(gè)非合約的地址能夠接受任何形式上正確的transaction。這實(shí)際上將沒有代碼的一個(gè)address當(dāng)成消極被動(dòng)的實(shí)體,一個(gè)白癡,它不懂如何拒絕。你去調(diào)用一個(gè)合約函數(shù),地址搞錯(cuò)了,用了一個(gè)非合約地址,不要指望交易會revert。它總是成功的。
上一條說得非合約地址,并不意味著它是來自于一個(gè)公司鑰對。它可能是任何一個(gè)160位的數(shù)據(jù)塊。向這種地址轉(zhuǎn)賬,錢就進(jìn)了黑洞。數(shù)量上這種黑洞地址遠(yuǎn)多于真實(shí)的外部賬號地址。黑洞占統(tǒng)治地位。
發(fā)送到有代碼的合約地址的交易,即合約調(diào)用,并不總是被接受(我們這里說的是被接受,并不一定成功執(zhí)行),取決于合約的函數(shù)安排。自定義的函數(shù)只接受對應(yīng)的selector的調(diào)用,receive用于攔截calldata為空的情況,fallback在receive之后兜底。如果value大于0,則要看上述鏈條解析出的接受者是否是payble。一個(gè)transaction在一個(gè)合約中可能找不到接受函數(shù),這時(shí)調(diào)用失敗。非合約地址就不會發(fā)生這種失敗。這個(gè)過程很多開發(fā)者并未徹底搞清楚。
上面幾條列一下,以為記