Caver-js를 사용했을 때 스마트 컨트랙트에서의 msg.sender를 파악하는 프로세스

안녕하세요 현재 프론트엔드를 통해 개인키로 로그인한 후 자신의 기록을 조회하는 조회 비밀번호를 설정하고자 합니다. 이때 Solidity로 작성한 스마트 컨트랙트에서 require()를 통해 msg.sender일 경우에만 조회 비밀번호 설정을 가능케 설정하였습니다.

        // Klaytn IDE
    function set_InquiryPW(address _to, uint256 _Inquiry_PW) public returns(bool){
        require(msg.sender==_to,"Only Address Owner allowed to set Inquiry PW");
        Address_PW[_to] = _Inquiry_PW;
        return true;
    }

이후에 프론트의 caver-js를 통해 사용자가 자신의 조회 비밀번호를 설정하기 위해 해당 method를 사용할 때 스마트 컨트랙트 측에서 msg.sender를 사용자 자신이 아니라는 require()의 에러 메세지가 발송됩니다. 스마트 컨트랙트 측에서 동일한 사용자임을 인식하기 위해서 프론트엔드에서 사용자의 개인키를 이용해 해당 method를 보내는 transaction을 별도로 서명하거나 하는 작업이 필요한가요? 감사합니다.

    /// caver-js 프론트엔드
    const walletInstance = caver.klay.accounts.wallet && caver.klay.accounts.wallet[0]
    const set_InquiryPW_front = async () =>{
        // const test_address = wallet_session();
        console.log("Setting Inquiry PW from Frontend ");
        try{
            const set_request = await Example_Contract.methods.set_InquiryPW(walletInstance.address,9999).call()
            console.log("Setting Successful");
        } catch(err){
            console.error("set_InquiryPW_Front Error : ",err);
        }
        console.log("Setting Cycle Finished");
    }

안녕하세요, rabiit 님.

프론트엔드를 통해 개인키로 로그인하고, 자신의 기록을 조회할 수 있는 조회 비밀번호를 모두가 볼 수 있는 블록체인 네트워크 상에 올려서 설정하면 문제가 있을 것으로 생각되는데, 혹시 해당 로직을 구현해야만 이유를 알 수 있을까요?

감사합니다.

해당 기록을 사용자와 사용자 자신이 생성한 조회비밀번호를 통해 허가된 타인도 조회하게끔 로직을 구현하고자 합니다.
아래는 klaytn ide를 통해 작성한 솔리디티 코드의 일부분입니다.

  • 만약 사용자 자신이 아닌 타인이 사용자의 지갑 주소를 키로 생성한 테이블의 정보를 조회하려면 아래 function으로 라우팅됩니다
    function InquiryTo(address _to, uint256 _InquiryPW,uint256 _num ) public view returns(string memory get_name,string memory get_id,string memory get_bloodType, string memory get_home_address, string memory get_date){ // returns(Certificate[] memory)
        // 요청의 대상이 되는 사용자의 주소를 통해 valid한 certificate number가 입력됐는지 확인

        // InquiryPW가 설정됐는지 여부를 확인
        int64 exist = int64(uint64(Address_PW[_to]));
        require(Check_Existence3(exist),"Certificate Number for User's Address is not Set");
        // require(Address_Cert[to]>0,"Certificate Number for User's Address is not Set");
        
        // // 이를 위해 생성해놓은 Address_Cert table에 사용자의 주소를 key로 valid_Cert 할당
        uint256 valid_Cert = Address_PW[_to];
        
        // // 만약 입력된 cert num == valid_Cert면
        require(_InquiryPW == valid_Cert, "Invalid Certificate Number");
        //  해당 사용자가 정보 return
        return get_Cert_data(_to,_num,_InquiryPW);
    }

감사합니다

안녕하세요, rabiit 님.

caver-js를 통해서 스마트 컨트랙트를 호출했을 때, ‘address _to’ 값이 'msg.sender’와 일치하지 않는 문제가 발생한다고 말씀해주셨는데요. 해당 로직을 실행했을 때, _to 값과 msg.sender 값이 실제로 무슨 값으로 출력되고 있는지 확인해보시면 디버깅 하는데 도움이 되실 것 같습니다. 또한, wallet에 목적한 계정이 담겨있는지, 온체인 데이터를 변경하는 것이기 때문에 서명을 하여 트랜잭션을 일으켰는지 확인해보시면 좋을 것 같습니다. caver.wallet.keyring - Klaytn Docs 부분이 도움이 되실 수 있을 것 같습니다.

감사합니다.

네 알겠습니다. 친절한 답변에 감사합니다.