이더리움 계정, address/private-key/public-key의 관계
이더리움 계정과 익명성 보장
- 이더리움 계정은 한번 쓰고 버리는 것
- 트랜잭션마다 새로운 계정을 생성/사용하는 것이 권장사항 (이더리움 계정은 이메일 계정처럼 오래 유지하는 것이 아님)
- 트랜잭션마다 새로운 계정을 사용함으로써 익명성을 보장할 수 있음
이더리움 계정 생성 방법 (account address/private-key/public-key의 관계)
계정주소 생성 절차
- private-key 생성 (32byte, hex 인코딩할 경우 64byte)
- Elliptic-Curve 암호 체계 사용 (secp256k1 커브가 이더리움 표준)
- 생성된 private-key로부터 public-key 유도 (64byte, hex 인코딩할 경우 128byte)
- 유도한 public-key로부터 계정주소 유도 (20byte, hex 인코딩할 경우 40byte)
- public-key에 keccak-256 hash 적용
- 계산된 hash 값의 하위 20byte를 이더리움 계정주소로 사용
- 참고자료: https://kobl.one/blog/create-full-ethereum-keypair-and-address/
# Generate the private and public keys > openssl ecparam -name secp256k1 -genkey -noout | openssl ec -text -noout > Key # Extract the public key and remove the EC prefix 0x04 > cat Key | grep pub -A 5 | tail -n +2 | tr -d '\n[:space:]:' | sed 's/^04//' > pub # Extract the private key and remove the leading zero byte > cat Key | grep priv -A 3 | tail -n +2 | tr -d '\n[:space:]:' | sed 's/^00//' > priv # Generate the hash and take the address part > cat pub | keccak-256sum -x -l | tr -d ' -' | tail -c 41 > address # (Optional) import the private key to geth > geth account import priv
시사점
- 누구나 쉽게 계정주소를 만들 수 있다 (계정주소를 만들고 검증하는 center authority가 없다)
Q&A
TX 검증을 위한 public-key 확보 방법?
- Q: 트랜잭션을 검증할 때, 해당 계정의 public-key는 어떻게 알아내는가?
- A: 어떤 계정에서 보내진 TX가 있을 경우, signature에 포함된 v,r,s 값으로부터 해당 계정의 public-key를 얻을 수 있다 (https://ethereum.stackexchange.com/questions/13778/get-public-key-of-any-ethereum-account/13892#13892)
TX 변조 가능성?
- Q: 윗 질문에서 signature로부터 public-key를 얻을 수 있다면, 제 3자가 TX를 가로채서 자기 TX인 것처럼 위장할 수 있다 (자기 private-key로 서명하고, 자기 public-key와 함께 TX를 배포). 보안측면에서 문제 없는가?
- A: 제 3자가 TX 송신자인 척하는 것은 가능.
- 하지만, TX는 송신자의 ETH를 수신자에게 이체하는 것
- 그리고 TX 송신자는 이더리움 gas fee도 지불해야 함
- 제 3자가 TX 송신자인 것처럼 위장해서 얻을 수 있는 이득이 없음 (반론 환영)
ref
- https://kobl.one/blog/create-full-ethereum-keypair-and-address/
- https://ethereum.stackexchange.com/questions/3542/how-are-ethereum-addresses-generated
- https://ethereum.stackexchange.com/questions/13778/get-public-key-of-any-ethereum-account/13892#13892
- https://ethereum.stackexchange.com/questions/15494/location-of-public-and-private-keys-of-ethereum-account?noredirect=1&lq=1
- https://crypto.stackexchange.com/questions/18105/how-does-recovering-the-public-key-from-an-ecdsa-signature-work
(이상)
요점정리네요!! 리스팀 해놓고 공부해야겠네요 :)
'geth 소스 읽기' 연재 잘 보고 있습니다. 항상 감사드립니다. ^^