KAS계정 & keyring & 대납이 관련이 있나요

안녕하세요.

baobab, caver-js-ext-kas를 이용중인데요

  1. KAS로 만든 계정과 klaytnwallet으로 만든 계정에 차이가 있다는데 무슨 차이가 있는건가요?

  2. caver-js-ext-kas를 사용하면 차이 없이 사용이 가능한가요?
    그때 이용하는게 keyring인건가요?

  3. 대납을 해야 되는 이유도 KAS로 만든 계정에는 Klay를 KlaytnWallet처럼 Run Faucet을 할 수 없어서 그런건가요?

안녕하세요.

  1. KlaytnWallet으로 account를 생성하면 private key, public key쌍이 다같이 나옵니다.
    KAS Wallet API를 사용하면 이 링크를 참고하시면 좋을 것 같은데, KAS Wallet API를 사용하시면 HSM이라는 장비를 통해 키 쌍이 생성되며 private key는 HSM에 관리되며 사용자에게 노출되지 않는다는 부분에서 차이점이 있습니다.

  2. caver-js-ext-kas를 사용하면 차이 없이 사용한다는 말이 어떤 내용인지 모르겠습니다. 질문을 좀 더 상세하게 해주시면 감사하겠습니다. Keyring은 address와 private key를 관리하는 Caver SDK에서 정의한 키를 저장하는 자료구조입니다.

  3. 1번 질문에 대한 답변에 이어서 해보자면, KlatytnWallet에서 제공하는 Faucet을 사용하려면 Account의 private key가 필요합니다만, KAS로 만든 계정은 private key를 HSM에서 관리하고 사용자에게 노출이 되지않기 때문에 Faucet을 사용 할 수 없습니다.

1개의 좋아요

답변 감사합니다.

caver-js-ext-kas를 사용중입니다.

1. createAccount로 받은 결과에 privateKey가 없이 아래 기능을 할 수 있는지??
앱 서비스를 만든다는 가정하에 생각해보면, 사용자가 회원가입 버튼을 눌렀을 때 createAccount()에 대한 결과값을 유저에게 전송해주고 서버에서는 계정 주소값만 저장하려고 합니다. 근데 유저가 갖을수 있는 정보에 private Key가 없다면 이후에 유저가 토큰 보유량을 확인하거나 송금을 하는 행위를 할 수 있나요?

KAS Wallet API를 사용하신다면, 앱 서비스의 송금 요청을 서버단에서 받아서 서버에서 KAS Wallet API를 사용하여 처리하시면 될 것 같습니다.

아래 문서는 kip7 contract를 KAS Wallet API를 활용하여 배포하고 호출하는 튜토리얼입니다.
https://docs.klaytnapi.com/v/ko/sdk#kas-sdk-using-kip7-with-kaswallet

도움이 되시길 바랍니다. 감사합니다.

1. 대납

말씀하신대로 진행하면 createAccount()로 만든 계정에는 KLAY가 없기 때문에

gas required exceeds allowance or always failing transaction

문제가 생깁니다. 근데 KAS 로 만든 계정에는 KLAY를 따로 Run Faucet하듯 할 수 없기 때문에 대납을 해야 되는거죠? 그때 사용하는 API가 뭔가요?

2. 스마트 컨트랙을 배포할 때 연결했던 계정이 필요한가요?
createAccount로 만든 계정들을 이용해서 kip7.transfer()가 되는지 확인하던 중 gas error가 나길래,
이전에 sender와 receiver 둘다 caver.wallet.keyring.generate()로 만든 계정을 써봤는데요. 이 계정들에는 klay 도 있습니다.

근데 kip7.transfer( receiver.address, 10000, { from: sender.address } )를 하면

Please check that the corresponding account or keyring exists.

라고 나옵니다.

그래서 Contract을 배포할 때 사용했던 계정(owner라고 지칭)을 keyring에 추가하면 정상적으로 작동하는데… 왜그런걸까요? owner를 sender, receiver로 입력한것도 아닌데도 말이죠.

const keyringContainer = new caver.keyringContainer()
const keyring = keyringContainer.keyring.createFromPrivateKey('onwer의 PrivateKey')
keyringContainer.add(keyring)
const kip7 = new caver.kct.kip7('smartContract 주소')
kip7.setWallet(keyringContainer)
  1. KAS에서 생성한 계정이 아닌 것을 사용한다면?
const receipt = await kip7.transfer(createAccount로만든계정.address, 100000, { from: 'KlaytnWallet으로 만든 계정.address' })

이렇게 했을 땐 잘 되거든요

근데

const receipt = await kip7.transfer('KlaytnWallet으로 만든 계정.address', 100000, { from: 'createAccount()로만든계정.address' })

로는 안되는 이유가 뭘까요?
에러 메시지는 아래와 같습니다.

  1. 수수료 대납은 Faucet이랑 관계가 없습니다. 수수료 대납은 현재 수수료 대납 이벤트를 통해 무료로 Transaction을 발생시킬 때 사용되는 Gas 수수료를 KAS 서비스에서 대납해주는 것입니다.(추후에는 무료가 아닐 수 있습니다.) 기본적으로 Transaction을 발생시키기 위해서는 Transaction을 발생시키는 주체가 되는 Account에 충분한 Klay가 있어야 합니다.

  2. 아래 코드를 보면 kip7 instnace에 keyringContainer를 등록하고 있습니다.

  • KIP7의 함수를 실행 시 Transaction이 생성이 필요할 때 KeyringContainer는 KeyringContainer에 저장되어있는 Keyring을 가져와서 sign을 하는 과정을 거치게 됩니다.
    예를 들면 kip7.transfer()를 실행하면 from에 해당하는 keyring을 가져와 transaction에 sign하게 됩니다.
  • 그러므로 KeyringContainer를 통해 kip7을 사용하시려면 sender의 address와 private key를 담고있는 Keyring을 KeyringContainer에 넣어서 사용하셔야 합니다.
  • 또한, createAccount()를 통해 만들어진 account는 KAS Wallet API를 통해 만들어진 account이고 Private key가 노출되지 않기때문에 KeyringContainer에 Keyring 형태로 사용하실 수 없습니다.
  • KAS Account를 활용해서 contract를 다룰려면 KAS Wallet을 통한 Smart contract 배포, 다루는 튜토리얼을 확인 부탁드리겠습니다.
  1. 여러가지 이유가 있을 것 같습니다.
  • createAccount()로 만든 account에 전송할 충분한 Klay가 없는경우
  • createAccount()로 만든 account에 전송할 토큰이 없는 경우
1개의 좋아요

@Kale

  1. transaction의 주체
    klaytn wallet api를 사용하는데 아래와 같은 에러가 아래 코드 중 kip7.transfer()에서 계속 발행합니다.
    언급하신대로 transaction을 발생시키는 주체가 저 함수를 콜할 때는 sender가 되는건가요?
    createAccount()를 하면 Klay가 없기 때문에 대납을 해야 되는거 아니냐고 여쭤본거였습니다.

gas required exceeds allowance or always failing transaction

const kip7 = new caver.kct.kip7(‘smartcontract 주소’)
const receiver = await caver.kas.wallet.createAccount()
const sender = await caver.kas.wallet.createAccount()
const receipt = await kip7.transfer(receiver.address, 10000, { from : sender.address} )

  1. kip7 instance를 쓰려면 keyring이 필요하다는 말씀이시군요.
    그렇다면 caver.kas.wallet.createAccount()를 하지 말고, caver.wallet.keyring.generate()를 해서 쓰면 privateKey도 사용할 수 있고 계정도 생성할 수 있으니 이걸 쓰면 되는건가요?
    (왜 createAccount와 keyring.generate()를 나눈건지 모르겠네요)

  2. createAccount()로 만든 account에 전송할 Klay가 없어서 생긴 문제 같습니다.
    이때는 대납을 사용해야 되는거죠?

  3. caver.kas.wallet.createAccount()
    를 하면 keyringContainner에 privateKey가 자동으로 등록이 된다는건가요?