Contract-Development
合約執行過程中遇到的錯誤巴德__jumpdestination乙一種dj在米pd和s噸一世n一種噸一世這nBad jump destination
start()
在智能合約中呼叫函式時,交易失敗並顯示以下消息:警告!合約執行過程中遇到的錯誤
$$ Bad jump destination $$
根據令牌合約執行期間的錯誤…無效的數組索引肯定會生成此消息。所以我一直在想,想弄清楚我的程式碼什麼時候使用了無效的索引,但是我找不到。
這是請求的方法:
function start(address seller, address thirdParty) returns (uint escrowId) { escrowId = numEscrows; numEscrows++; escrow e; e.thirdParty = thirdParty; e.seller = seller; e.buyer = msg.sender; e.amount = msg.value; e.recipient = seller; e.status = 1; // started escrows[escrowId] = e; return escrowId; }
那裡唯一的數組被
escrows[]
聲明為mapping (uint => escrow) escrows;
在嘗試了不同的事情之後,我得出結論,問題肯定位於最後一行:
escrows[escrowId] = e;
是不是不可能做這樣的任務
escrows[0] = e;
?為什麼不?我究竟做錯了什麼?我該如何調試它?
start(...)
並且start1(...)
有兩種方法可以重寫您的函式以按預期工作:pragma solidity ^0.4.0; contract Ballot { struct Escrow { address thirdParty; address seller; address buyer; uint amount; address recipient; uint status; } uint numEscrows; mapping (uint => Escrow) escrows; function start(address seller, address thirdParty) returns (uint escrowId) { escrowId = numEscrows; numEscrows++; Escrow memory e; e.thirdParty = thirdParty; e.seller = seller; e.buyer = msg.sender; e.amount = msg.value; e.recipient = seller; e.status = 1; // started escrows[escrowId] = e; return escrowId; } function start1(address seller, address thirdParty) returns (uint escrowId) { escrows[numEscrows].thirdParty = thirdParty; escrows[numEscrows].seller = seller; escrows[numEscrows].buyer = msg.sender; escrows[numEscrows].amount = msg.value; escrows[numEscrows].recipient = seller; escrows[numEscrows].status = 1; // started numEscrows++; return numEscrows; } }
這是 Solidity 實時編譯器和執行時螢幕,顯示兩者
start(...)
並start1(...)
在不引發異常的情況下執行:請注意,
start1(...)
成本低於start(...)
.在
start(...)
中,我添加了memory關鍵字 - 請參閱什麼是 memory 關鍵字?它有什麼作用?,記憶體和儲存的區別?以及關鍵字“記憶”究竟做了什麼?了解更多資訊。在您的問題中,您提到“唯一的數組是託管
$$ $$聲明為
mapping (uint => escrow) escrows
;"。請注意,數組與映射不同 - 請參閱Arrays vs Mappings和Store data in mapping vs. array。