17:33:05.702 [main] DEBUG org.web3j.protocol.http.HttpService - {“jsonrpc”:“2.0”,“id”:1,“error”:{“code”:-32000,“message”:“invalid transaction v, r, s values of the sender”}}
아, 그렇군요 !
그럼 트랜잭션에 서명할 때에 사용하신 private key는 어떤 private key인가요?
업데이트한 private key인가요? 아니면 업데이트하기 전 계정의 private key인가요?
만약 계정을 업데이트 하셨다면, 기존의 original private key - original public key - address 에서 new private key - new public key - address로 변경된 것입니다.
네트워크에는 address 계정은 앞으로 new public key를 사용한다고 저장되게 됩니다.
트랜잭션을 네트워크에 전송하게 되면 검증 과정을 거치는데요, 검증할 때 트랜잭션의 signatures에서 sender의 public key를 추출해서 네트워크에 저장된 계정의 AccountKey와 비교하게 됩니다.
계정을 업데이트했기 때문에 new public key가 서명에서 추출되어야 하는데, 실제로 추출된 것은 original public key라면 위와 같은 에러가 날 수 있습니다.
계정을 업데이트 했다면 아래와 같이 KlaytnWalletKey 포맷을 사용하여 credential을 생성하셔야 합니다. KlayCredentials credentials = KlayCredentials.createWithKlaytnWalletKey("KlaytnWalletKeyFormat");
계정을 업데이트 하지 않았다면 계정의 키와 주소의 관계는 아래와 같습니다. (original private key -> original public key) -> address
위의 같이 privat key에서 public key가 파생되고, 이 public key에서 address가 도출됩니다.
계정을 업데이트 한다는 것은 위의 강결합 관계를 끊어버리고 address를 주소로 가지는 계정에서 사용하는 private key, public key쌍을 변경하는 것입니다.
만약 새롭게 사용할 키를 new private key , new public key라고 가정한다면 업데이트 이후에는 (new private key -> new public key) - address
위와 같은 관계를 가지게 되는 것입니다.
그렇기 때문에 계정 업데이트 이후에는 new private key를 사용해야 합니다.
KlaytnWalletKey는 "0x{private key}0x000x{address in hex}"의 형태로 업데이트된 계정의 키와 주소를 나타낼 수 있는 형태입니다.
KlaytCredential.create의 파라미터는 private key string 형태입니다.
그렇기 때문에 new private key를 파라미터로 전달하게 되면 new private key -> new public key -> new address로 도출하여 new address를 주소로 가지는 아예 다른 credential이 생성되게 됩니다.
만약 original private key를 파라미터로 전달한다면 original private key -> original public key -> address로 도출되어 address를 주소로 가지는 credential이 생성되지만, 서명할 때에 original private key가 사용되게 됩니다.
이미 Klaytn 네트워크에는 address 계정은 새로운 키(new private key, new public key)를 사용할 것이라고 업데이트가 된 상태이기 때문에 만약 original private key로 서명한 트랜잭션이 전송되면 검증 과정에서 실패하게 됩니다.
그래서 KlaytnWalletKey를 사용해야 하는 것입니다
KlayCredentials.createWithKlaytnWalletKey(“0x{new private key}0x000x{address}”)를 사용하면 address를 주소로 가지고 서명할 때에 new private key를 사용하는 credential이 생성되게 됩니다.