Remix
通過一系列契約了解還原
我有以下可靠性文件:
// 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)