Caver 0.0.1 -> 1.5.1 버전 업데이트 후 account.decrypt() 오류

안녕하세요
이번에 인프런에서 강의를 보고 직접 프로젝트를 만들고 있습니다.

인프런에 사용된 caver의 버전이 너무 낮아 필요한 기능을 사용할 수 없을 것 같아 버전을 업데이트했는데, 이전 버전에서는 정상적으로 사용됐던 decrypt()가 오류가 발생하네요.

혹시 이전 버전과 다르게 사용해야 하거나 고쳐야 하는 부분이 있을까요?
image

안녕하세요 질문해 주셔서 감사합니다.

caver-js v1.5.1 버전을 사용하셔서 코드를 돌린게 맞으실까요?
코드를 조금 같이 올려 주시면 좀 더 빠르게 원인을 파악할 수 있을 것 같습니다 :slight_smile:

깃에 올라와있는 코드에서 caver만 1.5.1 버전으로 업데이트하여 사용했습니다.

문제가 되는 부분이 아래가 맞을까요?

/**
   * << 로그인 >>
   * 키스토어와 비밀번호 확인 후 로그인 진행
   */
  handleLogin: async function () {
    if (this.auth.accessType === 'keystore') {
      try{ //caver instance 활용
        //키스토어와 비밀번호로 비밀키(privateKey)를 가져옴
        const privateKey = cav.klay.accounts.decrypt(this.auth.keystore, this.auth.password).privateKey;
        this.integrateWallet(privateKey);
      } catch (e) {
        $('#message').text('비밀번호가 일치하지 않습니다.');
      }
    }
  },

네 맞습니다. decrypt 하는 부분에서 진행이 안되더라구요

안녕하세요 에러 재현을 위해서 하나의 account를 생성하여 encryptV3 (keystore v3) 함수를 호출하여 keystore를 뺀 후에 decrypt를 했는데 에러가 재현이 되지 않습니다.

일단 실행한 코드는 아래와 같습니다

testDecrypt()
function testDecrypt() {
    const caver = new Caver('https://api.baobab.klaytn.net:8651/')

    const account = caver.klay.accounts.create()
    console.log(account)
    const encrypted = caver.klay.accounts.encryptV3(account, 'password')
    console.log(encrypted)
    const decrypted = caver.klay.accounts.decrypt(encrypted, 'password')
    console.log(decrypted)
}

출력값은 아래와 같습니다

  Account {
    address: [Getter/Setter],
    accountKey: [Getter/Setter],
    privateKey: [Getter/Setter],
    signTransaction: [Function: signTransaction],
    feePayerSignTransaction: [Function: feePayerSignTransaction],
    sign: [Function: sign],
    encrypt: [Function: encrypt],
    getKlaytnWalletKey: [Function: getKlaytnWalletKey] }

  { version: 3,
    id: 'f3d50e7e-cab1-4142-aa00-6c03fff0661e',
    address: '0x1d86bdaf9107b4e4edeb49a1999480d6a4af52f3',
    crypto:
     { ciphertext:
        'dcb16bc39261b2d7c5f6741d2b1c3f19c4e18e632c4daebede42ceb0e96c87c7',
       cipherparams: { iv: 'caabcb47db80d53c66dcd490d376860b' },
       cipher: 'aes-128-ctr',
       kdf: 'scrypt',
       kdfparams:
        { dklen: 32,
          salt:
           '036e1677a05c78d3bd6cf2122af27cf1c4ed2a75a260cf2f83097fc2ff78c3a5',
          n: 4096,
          r: 8,
          p: 1 },
       mac:
        '2e3b77bee95c7fc4d96334df25e4446bbf3acba95e2dd341bd7cd62b25f1cd46' } }

  Account {
    address: [Getter/Setter],
    accountKey: [Getter/Setter],
    privateKey: [Getter/Setter],
    signTransaction: [Function: signTransaction],
    feePayerSignTransaction: [Function: feePayerSignTransaction],
    sign: [Function: sign],
    encrypt: [Function: encrypt],
    getKlaytnWalletKey: [Function: getKlaytnWalletKey] }

함수의 입력값으로 들어간 키스토어 파일 포맷을 한 번 체크 해봐야할 것 같은데, 공유가 힘드시다면 혹시 위에 출력되는 형태랑 비교 한 번 부탁드려도 될까요.

같은 방법으로 만들었는데
이번엔 encrypt에서 오류가 발생하네요…

키스토어 파일은 klaytn wallet 에서 발급받은 파일을 사용했습니다.

해당 키스토어 파일입니다.

음 에러 재현이 안되고 있습니다. Klaytn Wallet에서 keystore를 받아서 아래와 같이 실행해도 decrypt에 문제 없이 잘 되고 있습니다.

const keystore = fs.readFileSync('./password1234star.json', 'utf8')
const decrypted = caver.klay.accounts.decrypt(keystore, 'password1234*')
console.log(decrypted)

참고로 touch test.js 해서 test.js파일을 만들고 테스트 코드를 작성 후 node ./test.js로 실행하여 확인하고 있습니다.

코드를 실행하는 프로젝트 구성이 달라서 에러 재현이 잘 되지 않는 것 같은데,
에러 재현을 위한 프로젝트 세팅 방법을 알려주시면 동일한 환경에서 재현해 볼 수 있을 것 같습니다.
위에 올려 주신 리포를 포크해서 에러를 재현할 수 있는 방법을 알려주실 수 있으실까요

포크 후 npm install 후
npm run dev로 브라우저에서 실행할 수 있습니다.

로그인 버튼 선택 후 키스토어파일 선택하고 비밀번호를 입력하면
decrypt()로 키스토어 파일을 private키로 변환하고
해당 private키를 통해 로그인하게 되는 스토리입니다.

네 안녕하세요, 설명 감사합니다. 제공해 주신 환경에서 에러를 재현해 볼 수 있었습니다. :slight_smile:

에러의 원인은 파악 되었는데, caver-js에서 수정이 필요할 것 같습니다.

일단 진행하시고 계신 프로젝트에서 해당 에러를 해결하기 위해서는
node_modules/caver-js/packages/caver-klay/caver-klay-accounts/src/index.js 파일의
1479 라인을 아래와 같이 변경하시면 됩니다.

기존 코드

const mac = utils.sha3(Buffer.concat([derivedKey.slice(16, 32), ciphertext])).replace('0x', '')

위의 코드 한 줄을 아래의 코드로 변경해 주세요.

const mac = utils.sha3(Buffer.from([...derivedKey.slice(16, 32), ...ciphertext])).replace('0x', '')

위의 코드 수정은 caver-js에서도 진행될 예정이며, caver-js v1.5.2-rc.1버전이 릴리즈 되고 나면 바로 말씀 드리겠습니다 :slight_smile:

너무 감사드립니다! :grinning:

1개의 좋아요

제가 더 감사드립니다 :pray:

방금 caver-js v1.5.2-rc.1이 배포되었습니다 ! 사용하시는 버전을 업데이트 하시고 사용해 주시면 감사하겠습니다~

또 다른 이슈 있으면 언제든 문의주세요 :blush:

3개의 좋아요