Remix

通過一系列契約了解還原

  • January 15, 2022

我有以下可靠性文件:

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

error MustBeOwner();
error BookDoesNotExist();

// book contract
contract Book {
   bool public isRegistered = false;
   string public title;
   string public author;
}

// actual library
contract Library {

   address owner;

   // all books
   Book[10] books;


   // rented books
   mapping(address => uint) rentedBooks;


   constructor() {
       owner = msg.sender;
   }


   function rentBook(uint _bookId) public view {
       if(msg.sender != owner) {
           revert MustBeOwner();
       }

       if(_bookId > books.length || books[_bookId].isRegistered()) {
           revert BookDoesNotExist();
       }
   }

}

我將它插入Ethereum Remix。它編譯成功。我部署它,然後執行 function rentBook(6)。顯示了一條非常模糊的錯誤消息:

交易到 Library.rentBook 出錯:VM 錯誤:還原。

revert 事務已恢復到初始狀態。

注意:如果您發送值並且您發送的值應該小於您目前的餘額,則呼叫的函式應該是應付的。調試事務以獲取更多資訊。

它可能會失敗,因為書籍數組是空的,並且您正試圖books[_bookId].isRegistered()通過不存在的書籍進行訪問。首先使用 Library 建構子中的值初始化 books 數組。

或者,您可以在訪問變數之前引入檢查,例如

address(books[_bookId]) != address(0)

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