View함수를 단순히 call을 하는데 Json-rpc에러가 발생을 하고 있습니다

Caver-js를 통해서 React에서 Bapp작업을 진행중에 있습니다.

다름이 아니라 Json_Rpc에러가 발생을 해서 질문을 남기게 됩니다.

바쁘신 와중에 혹시라도 가능하시다면 답변 부탁드리겠습니다.

------ Contract ------

 function Mypage_MyMap(address _address)
        public
        view
        returns (string[] memory)
    {
        string[] memory MyMap = new string[](Total_Owner);
        uint256 index = 0;

        for (uint256 i = 0; i < Total_MapAmount; i++) {
            if (Map_Owner[i].Owner == _address) {
                MyMap[index] = Map_Owner[i].Map_name;
                index++;
            }
        }

        return MyMap;
    }

사용하고자 하는 Solidity함수 입니다.
보이시는 바와 같이 view함수로써 Remix에서는 정상적으로 작동을 하고 있습니다.

이후 React에서 컨트랙트를 만들고 해당 컨트랙트를 사용하려고 합니다.

---- React -----

export const Map_Contract = async () => {
  return await Get_Map_Data().then(async (result) => {
    return await new caver.klay.Contract(result[1], result[0]).methods;
  });
};
  • 일단 abi와 CA값을 받아와서 컨트랙트를 만들어 주고 있고
 Map_Contract().then(async (result) => {
      console.log(result);
      const My_Map_List = await result.Mypage_MyMap(Player).call();
      // console.log(My_Map_List);
    });
  • 해당 함수를 불러와서 활용을 하고자 합니다.

이떄 사용 가능한 함수들을 보기위해서 result를 찍어보았을떄에는 컨트랙트에 작성한 함수들이 정상적으로 콘솔에 보이는 상태 입니다.

하지만 call()을 통해서 view함수를 실행을 시키면 json-rpc error가 발생을 합니다.
스크린샷 2022-02-15 오후 1.07.30

다른 컨트랙트의 view함수를 실행시켰을떄에는 정상적으로 표현이 되지만 유독 저 컨트랙트의 view함수만이 작동을 하고 있지 않습니다.

  • 에러가 발생하는 컨트랙트의 view함수가 아닌 부분은 정상적으로 작동을 하고 있습니다.
  • 또한 Remix에서는 View함수도 정상적으로 출력이 되고 있고요

사실 이런 일부분의 사진만을 보고 오류를 잡는 행위가 어렵다고 생각을 하지만

caver-js의 버전을 최신버전으로 변경을 하여도 오류가 발생을 하여서 다운그레이드 해보았지만 마찬가지로 오류가 발생을 하고 있습니다.

const caver = new Caver(window.Klaytn)을 사용하고 있습니다.

----- 버전 ----
caver-js : 1.5.0
react-scripts : 4.0.3

긴글 읽어 주셔서 감사합니다.

1 Like

안녕하세요

new Caver(window.klaytn)으로 생성하셨기때문에

컨트랙트를 배포하신 네트워크와

카이카스 확장프로그램에서 선택된 네트워크가 동일한지 확인 해보시겠습니까?

그리고

contract.methods.myMethod(payload).call()

이런식으로 실행할수있습니다.

2 Likes

안녕하세요, 저도 동일한 현상을 겪고 있습니다.

케이버1-2
케이버1-1

일단 컨트랙트는 위 사진처럼 바오밥 네트워크로 caver를 연결한 뒤 배포했고,

케이버2

브라우저에서 klaytn 객체를 가져와서 사용했습니다.

케이버4

카이카스 역시 바오밥 네트워크임을 확인했고,

위와 같이 메소드를 호출했습니다.

아래 contract.methods.메소드().call();을 호출했을 때는 Json-rpc에러가 뜨고, 위에 코멘트처리한 방식으로 호출하면 revert가 발생합니다. 단순히 저장된 값을 리턴해주는 view함수이고, view함수가 아닌 함수를 sendTransaction으로 호출하면 역시 revert가 발생하고 있습니다.

케이버1

동일한 컨트랙트를 위처럼 rpcURL을 직접 바오밥 네트워크로 선택하고 호출하면 정상적으로 호출이 되고 문제가 없는 것으로 보입니다. 다만, 브라우저에서 사용자의 주소와 서명을 받아 호출해야하는 메소드들이 있기에 카이카스와 연결하고 싶은데, 방법이 없을까요?