클레이튼 엔드노드 api 질문 드립니다

안녕하세요

클레이 엔드노드를 만들고, 직접 API 콜을 해서, 계정 생성/트랜잭션 수행 등을 진행해보려고 문서들을 읽고 있습니다

KLAY가 담기고 트랜잭션을 수행할 계정을 만들어야 하는데, 문서를 읽고도 이해가 잘 되질 않아서 질문드립니다.
(읽은 문서 https://ko.docs.klaytn.com/bapp/json-rpc/api-references/personal)

//// 질문이 많아서 미리 사과드립니다 ㅎㅎ

  1. Klaytn 지갑 키 형식
    0x{private key}0x{type}0x{address in hex}

'private key’는 아래 문서의 개인키를 말하는 것이 맞나요?
https://ko.docs.klaytn.com/bapp/developer-tools/klaytn-wallet

개인키는 매우 중요한 것이긴 한데, 기억을 더 잘 할 수 있도록
제가 계정을 생성할 때 개인키 문자열을 임의로 설정하면 된다고 이해하면 될까요?

  1. personal_importRawKey

입력에 있는 ‘passphrase’ 가 무엇인지 궁금합니다.

  • 그리고 결과물로 나오는 '새로운 passphrase’는 무엇을 말하는 것인지요?

기존에 이더리움 등의 wallet을 생성할 때, 보면 무작위의 수십개의 words 가 생성되고
그것을 ‘passphrase’ 라고 불렀던 것 같습니다.

이 API에서의 입력 'passphrase’가 무엇인가요? 길이 제한은 없는지 궁금합니다.

  1. personal_newAccount
  • 위에서 이해한 바에 따르면, '개인키’라는 것은 제가 임의로 ‘기억을 더 잘 할 수 있도록’ 만드는 문자열입니다
  • 그런데 본 API의 설명에 보면, ‘새 개인키를 생성하여 키스토어 디렉토리에 저장합니다’ 라고 되어 있습니다.

즉, Passphrase만 넣으면 개인키가 생성 되어서 나온다는 것인데…
위의 다른 API 에서는 개인키가 입력이었는데, 여기서는 출력이고…
어떻게 이 API들을 써야 계정을 생성할 수 있는지 이해가 잘 안됩니다.

  1. klay_accounts
    클라이언트가 소요한 계정들의 주소 목록을 반환한다고 되어 있습니다.
    여기서 '클라이언트’는 누구를 말하는 것인지 궁금합니다

  2. klay_sendTransaction

  • “… 트랜잭션을 구성한 다음, 트랜잭션 발신자의 개인키로 트랜잭션에 서명하고 … 전송합니다.” 라고 되어 있습니다.
  • ‘발신자의 개인키로 서명’ 을 어떻게 하면 되는지, 예시에 있는 Request 명령어에서는 보이지 않아서 질문드립니다.
  1. klay_sendTransactionAsFeePayer
  • params에 보면, signatures가 있습니다. FeePayer의 서명 객체인 것으로 아는데,
    이 서명은 어떻게 생성하면 되는지 궁금합니다!

감사합니다!!

정식 답변은 아니지만,
답변하기가 상당히 브로드 해서, 몇글 남깁니다.
이 질문은 본인이 좀 검색및 ETH , BTC 에서 study를 하셔야 할내용입니다.
우선 passphrase 는 일반적인 개인 비번 이라 보면 됩니다.
그외에, privatekey 는 지갑의 근간이 되는 아주큰 숫자로서 hex 값으로 넣으면, 이를 역으로 hash 해서 지갑주소롤 표현됩니다.
privatekey → public Key (지갑주소와 비슷)
그래서 privatekey 는 random 으로 생성합니다.
이정도 정보를 기반으로 study 를 먼저 하면, 질문에 대부분이 답이 될것입니다.

위의 두개 passphrase 만 기억하세요.

답변 감사드립니다.

그런데, 마지막에 말씀하신 '위의 두개 passphrase’가 무엇을 가리키신 것인지 여쭤봐도 될까요?
passphrase는 왜 종류가 2가지 인지요?

안녕하세요, 클레이튼 포럼에 질문을 올려주셔서 감사드립니다.

답변드리도록 하겠습니다.

  1. 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 커브를 사용하고 있습니다.

  2. personal_importRawKey에서 passphrase는 원하시는 임의의 문자열입니다. 비밀번호라고 생각하시면 되고, 이 비밀번호를 알고 있어야 암호화된 private key를 풀 수 있습니다. importRawKey를 할 때, (plain private key, passphrase)를 입력하시되, 실제 시스템에는 plain private key가 아니고 passphrase로 암호화된 private key가 저장됩니다. 결과물은 '새로운 passphrase’가 아니고 private key로부터 도출된 Klaytn address입니다. passphrase의 입력 길이 제한은 없습니다. 참고로 "무작위의 수십개의 words"는 보통 mnemonic이라고 불립니다.

  3. "'개인키’라는 것은 제가 임의로 ‘기억을 더 잘 할 수 있도록’ 만드는 문자열"은 아닙니다. '개인키’라는 것은 transaction을 서명할 때 사용하는 특별한 값입니다. 이 값이 노출될 경우 해당 Klaytn account에 있는 잔고를 탈취당할 수 있습니다. 개인키에 대해 좀 더 자세히 알고 싶으시다면 PKI(Public Key Infrastructure, 공개 키 기반 구조), ECDSA(Elliptic Curve Digital Signature Algorithm, 타원곡선 DSA) 등과 같은 검색어를 통해 내용을 찾아보실 수 있습니다.

  4. klay_accounts에서 반환하는 계정 주소는 현재 연결된 엔드포인트 노드에서 관리하고 있는 계정 주소입니다. '클라이언트’란 현재 연결된 endpoint node라고 생각하시면 됩니다.

  5. klay_sendTransaction에서 "발신자의 개인키로 서명"하는 부분은 endpoint node 내부에서 실행되는 기능입니다. transaction object의 from에 해당하는 Klaytn account의 private key가 endpoint node에 있어야 합니다. 이 말은, 위의 klay_account()를 통해 해당 주소를 확인할 수 있다는 말입니다.

  6. klay_sendTransactionAsFeePayer에서는 fee payer의 주소를 통해 fee payer의 서명을 추가합니다. 대납 트랜잭션의 경우에는 fee payer의 주소와 서명이 정상적으로 저장되어야 합니다.

질문 내용이 너무 광범위하여 답변을 자세하게 드리기는 힘들 것 같습니다. 관련하여 추가 질문을 해 주시면 해당 부분에 대해 더 자세히 답변드릴 수 있도록 하겠습니다. 감사합니다.

1개의 좋아요

설명 너무 너무 감사드립니다 ^^!!
딱 절절한 깊이에서, 관련 내용을 필요하면 더 찾아볼 수 있게 키워드들을 포함하여 답변을 잘 주신 것 같습니다!

  1. 지갑인 ‘Wallet’ 이라는 것은 'Account’과 또 어떻게 다른 것인지 머리가 아프네요 ㅜㅜ…

  2. importRawKey(plain private key, passphrase) → Encrypted Private Key
    이군요.
    passphrase라는 것은 일종의 암호로, Encrypted Private Key를 Plain Private Key로 바꾸는 데에 필요한 것이군요. 감사합니다!

  3. 에서 말씀하신 노출될 경우 위험할 수 있는 '개인키’라는 것은 Plain을 말씀하시나요? Encrypted 를 말씀하시나요?
    Encrypted는 PassPhrase로 1차로 암호화 되어 있으니 노출되어도 괜찮은건지… 아니면, 무작위 대입 공격에는 위험할 수 있으니 노출 되면 안되는 것인지…

알려주신 문서들도 한 번 읽어보겠습니다 감사합니다 ^^

4,5 이해했습니다~

  1. 이 부분에서 제가 최근에 이슈가 있는데요. Fee Delegated Contract 에 대한 서명을 endpoint node 내부에서 수행할 수 있는지에 대한 이슈입니다.
    이에 대한 관련 질문 글을 링크합니다
    Python (or HTTP RPC) / Fee Delegated Contract Execution 사용 방법 - sytech님의 글 #4

감사합니다 ^^

  1. Wallet은 Account를 포함합니다. 잔고를 관리하는 기본 단위가 Account라고 생각하시면 됩니다. 그 Account여러개를 관리하는 것이 지갑(Wallet)이라고 생각하시면 됩니다.

  2. 여기서 말씀드린 "개인키"는 plain private key, encrypted private key 모두를 말씀드린겁니다. plain private key가 노출되면 그대로 바로 계정이 탈취된다고 생각하시면 됩니다. encrypted private key도 물론 노출되면 위험합니다. 다만 plain private key 보다는 안전하다고 생각하시면 되겠죠. brute force attack은 가능할테니, 노출되지 않는 것도 중요하겠고, 얼마나 entropy가 높은 passphrase를 사용하냐도 중요하겠습니다.

  3. 질문이 정확히 무엇인지요? fee payer에 대한 서명 로직은 klaytn 코드에도 있고, Klaytn SDK인 caver-js/java에도 있습니다. 원하시는 기능과 어느 언어로 어떻게 사용하실 것인지에 따라 무엇을 써야 할 지가 달라질 것 같습니다.

답변이 되셨다니 다행이네요. 추가 질문이 있으면 편하게 이어서 질문 주시기 바랍니다.

감사합니다. :slight_smile: