`添加评论时出错:调用恢复异常[请参阅:https://links.ethers.org/v5-errors-CALL_EXCEPTION](method =“reviews(uint256)”,data =“0x”,errorArgs = null,errorName = null,errorSignature=null,原因=null,代码=CALL_EXCEPTION,版本=abi/5.7.0)
我尝试调用审核时失败,下面是代码
// src/ReviewComponent.js
import React, { useState, useEffect } from "react";
import { ethers } from "ethers";
import Web3Modal from "web3modal";
import { Address, ABI } from "./constants";
const ReviewComponent = () => {
const [reviews, setReviews] = useState([]);
const [rating, setRating] = useState(0);
const [content, setContent] = useState("");
const id = 3
const init = async () => {
try {
const web3Modal = new Web3Modal();
const connection = await web3Modal.connect();
const provider = new ethers.providers.Web3Provider(window.ethereum);
const contract = new ethers.Contract(Address, ABI, provider);
// Gọi hàm reviewCount trong smart contract để lấy số lượng đánh giá
const total = await contract.reviewCount();
console.log("Total reviews:", total.toNumber());
// Gọi hàm reviews trong smart contract để lấy danh sách đánh giá
const reviews = [];
for (let i = 1; i <= total; i++) {
const review = await contract.reviews(i);
reviews.push(review);
}
console.log("Reviews:", reviews);
setReviews(reviews);
} catch (error) {
console.error("Error fetching reviews:", error.message);
}
};
const handleAddReview = async () => {
try {
const web3Modal = new Web3Modal();
const connection = await web3Modal.connect();
const provider = new ethers.providers.Web3Provider(connection);
const signer = provider.getSigner();
const contract = new ethers.Contract(Address, ABI, signer);
console.log(contract);
await contract.addReview(id, rating, content); //
const updatedReviews = await contract.reviews(id);
setReviews(updatedReviews);
setRating(0);
setContent("");
} catch (error) {
console.error("Error adding review:", error.message);
}
};
console.log(reviews);
return (
<div>
<h2>Product Reviews</h2>
<div>
<label>Rating:</label>
<input type="number" min="1" max="5" value={rating} onChange={(e) => setRating(e.target.value)} />
</div>
<div>
<label>Review:</label>
<textarea value={content} onChange={(e) => setContent(e.target.value)} />
</div>
<button onClick={handleAddReview}>Add Review</button>
<button onClick={init}>sdsad Review</button>
{reviews?.map((review, index) => (
<div key={index}>
<p>Rating: {review.rating}</p>
<p>Content: {review.content}</p>
</div>
))}
</div>
);
};
export default ReviewComponent;
智能合约
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
contract ReviewContract {
address public owner;
uint256 public reviewCount;
event ReviewAdded(uint256 indexed reviewId, address indexed reviewer, uint256 indexed productId, uint256 rating, string content);
struct Review {
address reviewer;
uint256 productId;
uint256 rating;
string content;
}
mapping(uint256 => Review) public reviews;
modifier onlyOwner() {
require(msg.sender == owner, "Only the owner can call this function");
_;
}
constructor() {
owner = msg.sender;
}
function addReview(uint256 _productId, uint256 _rating, string memory _content) external {
require(bytes(_content).length > 0, "Review content cannot be empty");
require(_rating >= 1 && _rating <= 5, "Rating must be between 1 and 5");
reviewCount++;
reviews[reviewCount] = Review(msg.sender, _productId, _rating, _content);
emit ReviewAdded(reviewCount, msg.sender, _productId, _rating, _content);
}
}
需要可能触发恢复的语句或条件逻辑。 确保函数正确处理提供的 id 并返回预期的评论数据。
验证传递给contract.reviews(id)的id值是否有效并且与现有评论相对应。 记录 JavaScript 代码中的 id 值以确认其正确性。
修改您的智能合约以提供有意义的恢复原因
require(someCondition, "Specific revert reason");
这将在 JavaScript 控制台中为您提供更详细的错误消息 使用 Etherscan 或区块链浏览器等工具来检查失败的交易及其恢复原因。 确保合约的状态符合预期(例如,正确的 reviewCount)。 使用控制台日志或调试工具来检查合约变量。