Contract-Development

合約執行過程中遇到的錯誤巴德__jumpdestination乙一種dj在米pd和s噸一世n一種噸一世這nBad jump destination

  • October 2, 2016

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 MappingsStore data in mapping vs. array

引用自:https://ethereum.stackexchange.com/questions/8938