크롬 Kaikas 지갑의 sign 메서드 서명자 복원 방법문의

안녕하세요.

크롬 Kaikas 지갑을 통해 임의의 message에 서명 한 뒤, 이 서명으로부터 다시 서명자 정보를 복원하고 싶은데 잘되지 않습니다. 테스트한 코드는 아래와 같습니다(Metamask + web3 로는 잘 동작하는 코드).

const signature = await caver.klay.sign(message, address);
console.log(‘서명:’, signature);

const signer = await caver.klay.ecRecover(message, signature);
console.log(‘서명자:’, signer);

상기 코드 실행 후 signer의 값이 address와 상이합니다.
서명으로부터 서명자 주소를 복원하는 방법이 따로 있을까요?

답변 부탁드리겠습니다.
고맙습니다.

안녕하세요.

Klaytn은 키 업데이트를 지원하기 때문에 서명에서 주소를 추출한 값이 서명자의 주소와 다를 수 있습니다.
계정의 키가 업데이트되면 (private-public) 키쌍과 계정의 주소인 address의 연결관계가 끊기게 되고 Klaytn은 계정에서 새롭게 사용하는 키 정보를 public key 형태로 저장하게 됩니다.
그러므로 업데이트 된 이후로는 address 계정에서는 public key B를 쓸거라는 정보가 저장되므로 서명이 기대하는 서명자가 한 것이 맞는지 검증하기 위해서는 public key를 확인해야 합니다.

caver.utils.recoverPublicKey 를 호출하여 서명으로부터 서명자의 public key를 뽑고, caver.klay.getAccountKey를 사용해서 Klaytn에 저장되어 있는 address 계정의 public key를 받아 비교해야 합니다.

코드를 보니 예전 버전의 기능들을 사용하고 계신 것 같은데요, 위의 과정을 수행해주는 함수가 제공되고 있습니다.
caver.validator.validateSignedMessage 함수는 위에 설명된 과정을 수행하여 해당 서명값이 기대하는 서명자가 서명한 것이 맞는지 검증하고 결과를 리턴합니다. 이 기능을 사용하기 위해서는 최신 버전을 사용해 주시기 바랍니다.

1개의 좋아요

자세한 설명 감사드립니다. 잘 해결되었습니다.
고맙습니다.