调用恢复异常[参见:https://links.ethers.org/v5-errors-CALL_EXCEPTION]

问题描述 投票:0回答:1

`添加评论时出错:调用恢复异常[请参阅: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);
    }
}
web ethereum blockchain smartcontracts metamask
1个回答
0
投票

需要可能触发恢复的语句或条件逻辑。 确保函数正确处理提供的 id 并返回预期的评论数据。

验证传递给contract.reviews(id)的id值是否有效并且与现有评论相对应。 记录 JavaScript 代码中的 id 值以确认其正确性。

修改您的智能合约以提供有意义的恢复原因

require(someCondition, "Specific revert reason");

这将在 JavaScript 控制台中为您提供更详细的错误消息 使用 Etherscan 或区块链浏览器等工具来检查失败的交易及其恢复原因。 确保合约的状态符合预期(例如,正确的 reviewCount)。 使用控制台日志或调试工具来检查合约变量。

© www.soinside.com 2019 - 2024. All rights reserved.