Solidity
“錯誤的 JUMPDEST”錯誤是什麼意思?
當我發送交易來呼叫我的合約時,它會導致錯誤的 JUMPDEST 錯誤。乙太坊 wiki 表示,當 JUMP 指令跳轉到未標記為跳轉目標的位置時,會導致此錯誤。既然我是用 Solidity 寫合約的,難道不應該生成不好的程式碼嗎?
格式錯誤的指令只是導致 JUMPDEST 錯誤的原因之一。更可能的原因是呼叫另一個合約時出現異常。當您在 Solidity 中呼叫另一個合約時,它會編譯檢查以查看呼叫中是否發生錯誤。如果發生錯誤,則需要通過引發另一個錯誤來回滾事務。當合約呼叫失敗時,Solidity 編譯器會故意強制出現錯誤的 JUMPDEST 錯誤。
失敗呼叫中的特定錯誤可能是任何 VM 異常。最常見的例外是汽油耗盡。(當您遇到交易錯誤時,您應該始終使用最大量的氣體重試。在您準備讓人們用真錢使用您的程式碼之前不要使用更少的氣體。)其他可能的可能性是堆棧溢出和堆棧下溢。在極少數情況下,它可能是無效指令或實際錯誤的 JUMPDEST,但如果您使用 Solidity 生成字節碼,則不會發生這些情況。
有關在合約呼叫失敗時 Solidity 為何以及如何強制執行錯誤的 JUMPDEST 的更多詳細資訊,Martin Swende 的解釋是我的資訊來源。
除了耗盡氣體之外,從Solidity 0.4 開始,一個常見的原因是將乙太幣發送到缺少
payable
修飾符的合約:想要接收 Ether 的函式必須指定新的應付修飾符(否則它們會拋出)。
指定範例
payable
:
function() payable {...}
.function foo() payable returns (uint) {...}
.