안녕하세요
이번에 인프런에서 강의를 보고 직접 프로젝트를 만들고 있습니다.
인프런에 사용된 caver의 버전이 너무 낮아 필요한 기능을 사용할 수 없을 것 같아 버전을 업데이트했는데, 이전 버전에서는 정상적으로 사용됐던 decrypt()가 오류가 발생하네요.
혹시 이전 버전과 다르게 사용해야 하거나 고쳐야 하는 부분이 있을까요?
안녕하세요
이번에 인프런에서 강의를 보고 직접 프로젝트를 만들고 있습니다.
인프런에 사용된 caver의 버전이 너무 낮아 필요한 기능을 사용할 수 없을 것 같아 버전을 업데이트했는데, 이전 버전에서는 정상적으로 사용됐던 decrypt()가 오류가 발생하네요.
혹시 이전 버전과 다르게 사용해야 하거나 고쳐야 하는 부분이 있을까요?
안녕하세요 질문해 주셔서 감사합니다.
caver-js v1.5.1 버전을 사용하셔서 코드를 돌린게 맞으실까요?
코드를 조금 같이 올려 주시면 좀 더 빠르게 원인을 파악할 수 있을 것 같습니다
깃에 올라와있는 코드에서 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] }
함수의 입력값으로 들어간 키스토어 파일 포맷을 한 번 체크 해봐야할 것 같은데, 공유가 힘드시다면 혹시 위에 출력되는 형태랑 비교 한 번 부탁드려도 될까요.
음 에러 재현이 안되고 있습니다. 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키를 통해 로그인하게 되는 스토리입니다.
네 안녕하세요, 설명 감사합니다. 제공해 주신 환경에서 에러를 재현해 볼 수 있었습니다.
에러의 원인은 파악 되었는데, 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버전이 릴리즈 되고 나면 바로 말씀 드리겠습니다
너무 감사드립니다!
제가 더 감사드립니다
방금 caver-js v1.5.2-rc.1이 배포되었습니다 ! 사용하시는 버전을 업데이트 하시고 사용해 주시면 감사하겠습니다~
또 다른 이슈 있으면 언제든 문의주세요