안녕하세요 현재 프론트엔드를 통해 개인키로 로그인한 후 자신의 기록을 조회하는 조회 비밀번호를 설정하고자 합니다. 이때 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을 별도로 서명하거나 하는 작업이 필요한가요? 감사합니다.
해당 기록을 사용자와 사용자 자신이 생성한 조회비밀번호를 통해 허가된 타인도 조회하게끔 로직을 구현하고자 합니다.
아래는 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);
}
caver-js를 통해서 스마트 컨트랙트를 호출했을 때, ‘address _to’ 값이 'msg.sender’와 일치하지 않는 문제가 발생한다고 말씀해주셨는데요. 해당 로직을 실행했을 때, _to 값과 msg.sender 값이 실제로 무슨 값으로 출력되고 있는지 확인해보시면 디버깅 하는데 도움이 되실 것 같습니다. 또한, wallet에 목적한 계정이 담겨있는지, 온체인 데이터를 변경하는 것이기 때문에 서명을 하여 트랜잭션을 일으켰는지 확인해보시면 좋을 것 같습니다. caver.wallet.keyring - Klaytn Docs 부분이 도움이 되실 수 있을 것 같습니다.