정식 답변은 아니지만,
답변하기가 상당히 브로드 해서, 몇글 남깁니다.
이 질문은 본인이 좀 검색및 ETH , BTC 에서 study를 하셔야 할내용입니다.
우선 passphrase 는 일반적인 개인 비번 이라 보면 됩니다.
그외에, privatekey 는 지갑의 근간이 되는 아주큰 숫자로서 hex 값으로 넣으면, 이를 역으로 hash 해서 지갑주소롤 표현됩니다.
privatekey → public Key (지갑주소와 비슷)
그래서 privatekey 는 random 으로 생성합니다.
이정도 정보를 기반으로 study 를 먼저 하면, 질문에 대부분이 답이 될것입니다.
Klaytn 지갑 키 형식: 0x{private key}0x{type}0x{address in hex} 이 지갑 키 형식은 KlaytnWalletKey라고 명명된 형식입니다. 이더리움과 다르게 클레이튼은 address와 private key의 강결합을 분리하여, address에 별도의 private key를 연결할 수 있도록 설계되었습니다. 이를 표현하기 위해 위와 같은 다른 표현을 정의했습니다. private key는 앞의 0x{private key} 이 부분만 private key라고 생각하시면 됩니다. 개인 키는 기존의 이더리움이나 비트코인에서 사용하는 개인 키와 동일한 secp256k1 커브를 사용하고 있습니다.
personal_importRawKey에서 passphrase는 원하시는 임의의 문자열입니다. 비밀번호라고 생각하시면 되고, 이 비밀번호를 알고 있어야 암호화된 private key를 풀 수 있습니다. importRawKey를 할 때, (plain private key, passphrase)를 입력하시되, 실제 시스템에는 plain private key가 아니고 passphrase로 암호화된 private key가 저장됩니다. 결과물은 '새로운 passphrase’가 아니고 private key로부터 도출된 Klaytn address입니다. passphrase의 입력 길이 제한은 없습니다. 참고로 "무작위의 수십개의 words"는 보통 mnemonic이라고 불립니다.
"'개인키’라는 것은 제가 임의로 ‘기억을 더 잘 할 수 있도록’ 만드는 문자열"은 아닙니다. '개인키’라는 것은 transaction을 서명할 때 사용하는 특별한 값입니다. 이 값이 노출될 경우 해당 Klaytn account에 있는 잔고를 탈취당할 수 있습니다. 개인키에 대해 좀 더 자세히 알고 싶으시다면 PKI(Public Key Infrastructure, 공개 키 기반 구조), ECDSA(Elliptic Curve Digital Signature Algorithm, 타원곡선 DSA) 등과 같은 검색어를 통해 내용을 찾아보실 수 있습니다.
klay_accounts에서 반환하는 계정 주소는 현재 연결된 엔드포인트 노드에서 관리하고 있는 계정 주소입니다. '클라이언트’란 현재 연결된 endpoint node라고 생각하시면 됩니다.
klay_sendTransaction에서 "발신자의 개인키로 서명"하는 부분은 endpoint node 내부에서 실행되는 기능입니다. transaction object의 from에 해당하는 Klaytn account의 private key가 endpoint node에 있어야 합니다. 이 말은, 위의 klay_account()를 통해 해당 주소를 확인할 수 있다는 말입니다.
klay_sendTransactionAsFeePayer에서는 fee payer의 주소를 통해 fee payer의 서명을 추가합니다. 대납 트랜잭션의 경우에는 fee payer의 주소와 서명이 정상적으로 저장되어야 합니다.
질문 내용이 너무 광범위하여 답변을 자세하게 드리기는 힘들 것 같습니다. 관련하여 추가 질문을 해 주시면 해당 부분에 대해 더 자세히 답변드릴 수 있도록 하겠습니다. 감사합니다.
설명 너무 너무 감사드립니다 ^^!!
딱 절절한 깊이에서, 관련 내용을 필요하면 더 찾아볼 수 있게 키워드들을 포함하여 답변을 잘 주신 것 같습니다!
지갑인 ‘Wallet’ 이라는 것은 'Account’과 또 어떻게 다른 것인지 머리가 아프네요 ㅜㅜ…
importRawKey(plain private key, passphrase) → Encrypted Private Key
이군요.
passphrase라는 것은 일종의 암호로, Encrypted Private Key를 Plain Private Key로 바꾸는 데에 필요한 것이군요. 감사합니다!
에서 말씀하신 노출될 경우 위험할 수 있는 '개인키’라는 것은 Plain을 말씀하시나요? Encrypted 를 말씀하시나요?
Encrypted는 PassPhrase로 1차로 암호화 되어 있으니 노출되어도 괜찮은건지… 아니면, 무작위 대입 공격에는 위험할 수 있으니 노출 되면 안되는 것인지…
Wallet은 Account를 포함합니다. 잔고를 관리하는 기본 단위가 Account라고 생각하시면 됩니다. 그 Account여러개를 관리하는 것이 지갑(Wallet)이라고 생각하시면 됩니다.
여기서 말씀드린 "개인키"는 plain private key, encrypted private key 모두를 말씀드린겁니다. plain private key가 노출되면 그대로 바로 계정이 탈취된다고 생각하시면 됩니다. encrypted private key도 물론 노출되면 위험합니다. 다만 plain private key 보다는 안전하다고 생각하시면 되겠죠. brute force attack은 가능할테니, 노출되지 않는 것도 중요하겠고, 얼마나 entropy가 높은 passphrase를 사용하냐도 중요하겠습니다.
질문이 정확히 무엇인지요? fee payer에 대한 서명 로직은 klaytn 코드에도 있고, Klaytn SDK인 caver-js/java에도 있습니다. 원하시는 기능과 어느 언어로 어떻게 사용하실 것인지에 따라 무엇을 써야 할 지가 달라질 것 같습니다.