이 페이지는 영어로 된 기계 번역을 사용하므로 오류나 불명확한 언어가 포함될 수 있습니다. 가장 정확한 정보는 영어 원문을 참조하시기 바랍니다. 잦은 업데이트로 인해 일부 콘텐츠는 원래 영어로 되어 있을 수 있습니다. Crowdin에서 이 페이지의 번역을 개선하는 데 동참하여 도움을 주세요. (Crowdin translation page, Contributing guide)
V4 keystore multi
This example demonstrates how to encrypt and decrypt keystore V4 multi.
Import the Wallet class from the @kaiachain/ethers-ext package.
Define an encrypted multi keystore version 4
Specify the current password of the keystore and a new password.
Decrypt the keystore with its current password
After decryped, you can access the public and private key.
You can generate a new keystore using the descrypted key and a new password. Note that the new encrypted key will be keystore v3.
Check the new keystore public and private key, it will differ from original one since keystore v3 does not support klaytn account system.
keystoreV4-multi.js
const { Wallet} = require("@kaiachain/ethers-ext/v6");// Klaytn V4 with multiple role-based keys. https://toolkit.klaytn.foundation/misc/generateKeystoreconst encryptedKey = `{ "version": 4, "id":"2d7ad5c1-880f-4920-9b8e-51f852c4802c", "address":"0x17226c9b4e130551c258eb7b1cdc927c13998cd6", "keyring":[ [ { "ciphertext":"eb9bd884ac3cc8bf92e6b0082e9d07198bfc4c1223ccc6e5edf7452ad612b2b5", "cipherparams":{"iv":"47faf7b0991a051eef698c73fc246f78"}, "cipher":"aes-128-ctr", "kdf":"scrypt", "kdfparams":{"dklen":32,"salt":"ba0a3e8dc49a04f8e590f8df5a590bc6e134b031ce10f46d73d4c459aa4c08f8","n":4096,"r":8,"p":1}, "mac":"4978d7325e1b9b3ec9fdfd1ec709a5a86fdfade0297ea9ddeeb8c3a7a62ae898" } ], [ { "ciphertext":"1a80c8666bea1a8dfa3082b001ff64c818fb14cf4e02017785e0edcc7a277af4", "cipherparams":{"iv":"eafbecc65ccc177a5579bf56d5f4ed31"}, "cipher":"aes-128-ctr", "kdf":"scrypt", "kdfparams":{"dklen":32,"salt":"6472845219e11e4de094cac8c32a6a4d13e69cd4507780a7a37f5e411e1d895d","n":4096,"r":8,"p":1}, "mac":"86379236d2fd6e9bb3f99f7eebaa3325b51e9fa5ec150ade7a461555c0a14ca3" }, { "ciphertext":"0071c41d2956b12be5ebc08a9a5b3a9684b9e410fe2de91d614be977fb2a0bdb", "cipherparams":{"iv":"1492dfb771030d3d9c9d996c193c03e5"}, "cipher":"aes-128-ctr", "kdf":"scrypt", "kdfparams":{"dklen":32,"salt":"f8145aa907a649866e0fbff86011244584ddc86559cf4901f8f69b670c234fd7","n":4096,"r":8,"p":1}, "mac":"eacc58c1ad717ca375697c9fcc80f463a26600f5da1b21327715bf3efa047be5" } ], [ { "ciphertext":"68ffc1e2800a7288ba7baba0f0f8049daeed05379fabfdd3bc017fa85c49ab50", "cipherparams":{"iv":"17f22d7b8aa1a8a2948fd3629f0b89ed"}, "cipher":"aes-128-ctr", "kdf":"scrypt", "kdfparams":{"dklen":32,"salt":"ff5e577ec8294320cfe59ef7b1b01ee44d4c9f19c8fbc31f333059c74eb8c6d2","n":4096,"r":8,"p":1}, "mac":"de65d669be044df5e39e678b099424a8692a2da6f3746832862cf2e5d6ada612" }, { "ciphertext":"fd4810ee850f0aa5f61a2eafbfc5ca36cfebb42df5c2465cc8ae5188029b188b", "cipherparams":{"iv":"b00ead13b38e449c268d09fced80ce49"}, "cipher":"aes-128-ctr", "kdf":"scrypt", "kdfparams":{"dklen":32,"salt":"af5dbbfb7383045dc7f8a3bfc56cccfc22a5150a1f87e454d40893a4b6fea9a1","n":4096,"r":8,"p":1}, "mac":"6234352852eb18246b94f28f3c3454103289ecf2faaa91115927c53729bb0805" }, { "ciphertext":"03b758de6372aa6bedde513ccb282bf8af32bca227c258f3e0fc85ce454d72a4", "cipherparams":{"iv":"5c20f3e96d0802eaf56670e57fbe3e98"}, "cipher":"aes-128-ctr", "kdf":"scrypt", "kdfparams":{"dklen":32,"salt":"b5ec4e40f5a09a59e90317ce45eb7bcd73a2a9afe70f6f2e32548fd38ed2da3b","n":4096,"r":8,"p":1}, "mac":"99b7f59855f0aa04531cc4a24c7923f75ed8052084de9ec49a2794e3899c3274" } ] ]}`;const password = "password";const newPassword = "newPassword";// Be sure that decrypted Keystore v4 object is not supported to encrypt keystore v4 again. // so this example shows only decrypting Keystore v4 and encrypting it as keysotre v3.// Be sure that klaytn address is lost when each account of keystore v4 is encrypted as keysotre v3,// because keystore v3 does not support klaytn account system.async function main() { const accounts = Wallet.fromEncryptedJsonListSync(encryptedKey, password); console.log("decrypted (address, privateKey)"); for (const account of accounts) { console.log(account.klaytnAddr, ", ", account.privateKey); } console.log("\ndecrypted (address, privateKey) with new password"); for (const account of accounts) { const v3encryptedKey = await account.encrypt(newPassword); const newAccount = Wallet.fromEncryptedJsonSync(v3encryptedKey, newPassword); console.log(newAccount.address, ", ", newAccount.privateKey); }}main();
output
❯ node keystoreV4-multi.jsdecrypted (address, privateKey)0x17226c9b4e130551c258eb7b1cdc927c13998cd6 , 0x278c3d035328daf04ab2597da96dd2d8868fd61a8837030f7d8a85f27b7f1bad0x17226c9b4e130551c258eb7b1cdc927c13998cd6 , 0xa06d13800719307ea7e2503ea441c2ea49279d0d600a2eec2887b509288696760x17226c9b4e130551c258eb7b1cdc927c13998cd6 , 0xc32f4007ffad303db99dee0d79a720e1d70c4b2babf8e33cb28170a16bac467d0x17226c9b4e130551c258eb7b1cdc927c13998cd6 , 0xc274d13302891d0d91a60891a48fde8c2860018f8dcb6293dcc0b28a238590b00x17226c9b4e130551c258eb7b1cdc927c13998cd6 , 0x83c127e5207b70086a702c93f1c9a041f15ce49ee5183ce848f35c64de196eff0x17226c9b4e130551c258eb7b1cdc927c13998cd6 , 0x48f97204ac4886dfbd819ada04ea31a730c6fc43fcb08900566360ee7402f93bdecrypted (address, privateKey) with new password0x0cc57a3c4E276A37AB0A98ba6899CAf6037996fB , 0x278c3d035328daf04ab2597da96dd2d8868fd61a8837030f7d8a85f27b7f1bad0x1F2f81B67d1A718c09221eBeb3F12a7192389663 , 0xa06d13800719307ea7e2503ea441c2ea49279d0d600a2eec2887b509288696760xF5D27139C99621859e8D1b0f6Be8BF3b8dAca609 , 0xc32f4007ffad303db99dee0d79a720e1d70c4b2babf8e33cb28170a16bac467d0x7E39a9097C975E6A63f1e0ade4b7312cF2854F9c , 0xc274d13302891d0d91a60891a48fde8c2860018f8dcb6293dcc0b28a238590b00x09859661f2574E80C5a51EA3e0E29cA19D21f513 , 0x83c127e5207b70086a702c93f1c9a041f15ce49ee5183ce848f35c64de196eff0x3AcFe8529FD4C2028f8A26805F9Bf9bAB2cc41eF , 0x48f97204ac4886dfbd819ada04ea31a730c6fc43fcb08900566360ee7402f93b