AccountKeyPublic 의 비밀번호 기능은 무엇이 하나요?

저희 서비스에서는 회원들에게 지갑을 생성하여 제공하는 기능이 있습니다.

AccountKeyLegacy 형식의 계정을 KAS API를 이용하여 migration을 수행했습니다.
그러면, AccountKeyPublic 형식으로 변경이 되네요.

AccountKeyLegacy에서는 privateKey가 있어서, 이것을 회원에게 제공하고 회원이 transaction을 수행할 때, 이것으로 인증을 하면 되는데요.

AccountKeyPublic인 경우에는 privateKey가 제공되지 않습니다. 그러면 그 역할은 무엇이 대체하나요?
publicKey를 이용하나요? 아니면 계정 속성에 keyId라는 것이 있던데, 이것을 이용하나요?
아니면, 저희 서비스에서 자체 비밀번호를 만들어 제공하고 그것이 일치하는 경우에 KAS API를 통해서 transaction을 수행하게 하나요?

자답입니다.

KAS의 계정은 privateKey를 제공하지 않네요. KAS API 에 모든 권한이 부여되어 있어서 transaction 요청을 수행할 수 있습니다.

이 경우, 서비스 자체에서 회원들의 권한을 제어하여 처리하면 됩니다.

1개의 좋아요

네, KAS에서는 HSM (Hardware security module)을 이용하여 private key를 관리하기 때문에, KAS 시스템에서도 해당 계정의 private key는 알 수 없습니다. 다만 private key 서명 허용 권한을 KAS 사용자에게 부과하기 때문에, KAS Wallet API를 이용하여 생성한 계정에는 해당 KAS 사용자만이 서명을 생성할 수 있습니다. 보다 자세한 내용은 Wallet API를 참고 부탁드립니다.

감사합니다.

KAS에 계정 key 보관을 200개만 무료로 한다는 내용을 늦게 확인했습니다.
저희는 사용자 계정이 30,000개가 넘는데요. 이 모두를 KAS에서 보관하게 하면 비용이 너무 많이 나오는 것 같습니다. 그런데 Wallet API에는 private Key를 서비스나 또는 사용자가 보관하는 기능이 존재하지 않는 것 같은데요.

어떻게 하면 KAS에서 privateKey를 사용자나 서비스가 보관하게 할 수 있나요?

@albizz 프라이빗키를 사용자가 보관하기 위해서는 계정 키 업데이트를 통해서 외부에서 관리되는 private key의 쌍으로 업데이트 해주시면 됩니다.

감사합니다.

답변감사합니다. 이제 전체 구조가 조금 이해가 되네요.
KAS API 에서 계정 키 업데이트를 private Key 방식으로 한 다음, KAS Wallet 의 계정은 disable 시켜야 하는 것인가요? 아니면 delete 해야 하나요?

다음에, private Key 방식으로 업데이트 된 후에 KAS Wallet API는 사용하지 못하는 거죠? 즉, requestSmartContractExecution 이나 requestFDSmartContractExecutionPaidByGlobalFeePayer같은 함수는 사용하지 못하는 거죠?

대신 기존 caver-js의 SDK에 있는 caver.rpc.klay.* 함수를 사용하면 되나요? 아니면 KAS의 NodeAPI만 사용할 수 있는 것인지요?

@albizz 안녕하십니까.
KAS Wallet API 를 통해서 공개키 계정으로 업데이트를 수행하면 자동으로 corruption 상태로 변해서 쓰지 못하게 됩니다.
그러면 해당 계정에 대해서는 caver-js-kas-ext 를 통해서 Node API(RPC 호출 등) 를 사용할 수 있습니다.

좀 이상합니다.
이 주소에 대하여 확인 부탁드립니다.
0xdE222CC162dA1A842dEe336B16a91fe2578DB26d

KAS의 public Key 방식에서

caver.kas.wallet.requestFDAccountUpdatePaidByGlobalFeePayer({
    from: address,
    accountKey: { keyType: 1 },
    gas: GAS_LIMIT,
    submit: true,
  });

위 명령으로 계정 업데이트를 수행했습니다.

그리고, caver.rpc.klay.getAccount()를 호출하면 다음과 같은 결과가 나옵니다.

account {
  accType: 1,
  account: {
    nonce: 2,
    balance: '0x0',
    humanReadable: false,
    key: { keyType: 1, key: {} }
  }
}

다음에, caver.kas.wallet.getAccount(address)를 호출하면

account Account {
  address: '0xdE222CC162dA1A842dEe336B16a91fe2578DB26d',
  chainId: 1001,
  createdAt: 1616992331,
  keyId: 'krn:1001:wallet:xxxxxx:key-pool:default:0x78...d5',
  krn: 'krn:1001:wallet:1a...',
  publicKey: '0x04...66',
  updatedAt: 1616992331

}

결과가 나옵니다.

caver.kas.wallet.requestFDSmartContractExecutionPaidByGlobalFeePayer 함수를 호출하면 transaction도 계속 되고 있습니다.

caver.kas.wallet.requestFDAccountUpdatePaidByGlobalFeePayer 함수를 다시 호출하면 오류가 발생합니다.

failed to send a raw transaction to klaytn node; -32000::invalid transaction v, r, s values of the sender", _requestId: "00...da"

이 상태면 업데이트가 된 것인가요? 안된 것인가요?

혹시 이부분이 어떻게 해결되셨나요? 후속 내용이 궁금합니다

@owenhwang 이 부분은 KAS 외부의 계정을 내부로 마이그레이션 한 이후에, 다시 legacy 로 계정을 업데이트 했을때 발생하는 내부 버그가 있었습니다.
해당 버그는 현재 내부 테스트 중에 있습니다.