Caver-java view 함수 call시에 return 데이터

안녕하세요.

view 함수 call 시에 리턴되는 Type 의 클래스에 값들을 보고 파싱하기가 힘들어서 질문 남깁니다.

컨트렉트상에서 리턴되는 값은

struct TokenList {
        uint256 tokenId;
        bool staked;
    }

저 스트럭쳐구요.

자바단에서 콜하고나서 받은 Type 의 디버깅해보면

해당 이미지 처럼 나와서 값과 벨류의 매칭이 힘든 상태입니다.
다른 파싱 방법이 있는건지 궁금합니다.

어떤점이 어려우신가요? 제가 볼때는 type과 value가 잘 매칭되어 있는거같은데요?

안녕하세요.

js 등으로 호출을 해보면 json 형태로 키벨류로 데이터가 받아지는걸 확인 할수있습니다.

그런데 자바 버전에서는 인자값들이 많은 데이터를 호출해보면 스트럭처의 네이밍과 리턴된 데이터의 매칭이 어렵다는점입니다…

0번째는 뭐다 1번째는 뭐다… 라는걸 일일히 매칭을 해줘야 해서요.

아니면 0번째는 뭐다 1번째는 뭐다 라고 매칭해둔다 하더라도…
나중에 그 순서가 보장이 될지도 의문입니다…

자바버전 내부 구조를 보면 컨트렉트의 함수 정보에서 name 이 있긴하나 getTypeAsString 함수로 타입정보만 가져다가 조합해서 리턴값을 만들어줍니다…
각 배열 인덱스의 네이밍도 포함이 되어야 한다고 생각합니다.ㅠㅜ

아직 caver-java 를 공부중이라 더 이쁘게 코드가 나올수 있을지 모르겠지만…
아는 영역으로만 만들어 봤을때…
아래처럼 매칭이 가능한것 같습니다…

            List<Type> types = contract.getMethod("").call(arguments);
            List<ContractIOType> outputs = contract.getMethod("").getOutputs();
            List<ContractIOType>  contractIOTypes = outputs.get(0).getComponents();
            List<Type> dynamicStruct = (List) types.get(0).getValue();
            for (int i = 0; i < dynamicStruct.size(); i++) {
                ContractIOType contractIOType = contractIOTypes.get(i);
                resultMap.put(contractIOType.getName(), dynamicStruct.get(i).getValue());
            }

github에 PR올려보시는건 어떠신가요?

해당 순서는 abi의 outputs 필드에 정의되어 있는 순서이기 때문에 abi가 바뀌지 않는 한, 순서는 바뀌지 않습니다.

현재 제공되는 기능에는 이름이 포함되지 않으며, 제안해주신 내용은 추후에 변경사항으로 고려해 보도록 하겠습니다.
감사합니다

ㅠㅜ 내부 개발도 바쁜데요 ㅠㅜ
나중에 시간이 된다면 정말 PR 해보고싶네요…
리턴 되는 값들을 가져다 쓰기 편하게 작업해보고싶네요.
우선은 내부 개발하는 프로젝트에 List 로 리턴값을 넘겨서 재가공해서 쓰고있습니다 .ㅠㅜ

aib 가 변경되지 않는 한 outputs 로 가져다 쓰면 변경될일 없다는거군요.
답변 감사합니다.