이더리움의 소규모 거래소를 만들 때, 여러 계정 관리하는 팁

Park Juhyung
GoCryptobot
Published in
4 min readApr 23, 2018

저번 글에 이어서 소규모 거래소를 만드는 데 필요한 내용에 대해 다루겠습니다. 거래소에서 이더리움을 입금받기 위하여, 한 유저당 이더리움 입금용 주소를 하나씩 할당해주어야 합니다. 가장 간단히 구현한다면 다음과 같습니다. 유저가 새로 가입할 때마다 랜덤한 private key를 생성하여 저장합니다. 그 private로부터 주소를 만들어 유저에게 제공합니다.

이렇게 되면 디비에 유저 수 만큼의 private key가 저장됩니다. 이렇게 입금받은 ETH는 가끔 거래소 주소로 모아 보내게 됩니다.

하지만 이 구조에서는 단점이 있습니다. ETH의 입금을 확인하는 서버가 private key를 관리한다는 점입니다. 이더리움에서 private key는 매우 중요한 정보입니다. 노출되는 순간 ETH을 그대로 도난당하게 되는 정보입니다. 이러한 정보를 네트워크에 연결되어있는 서버에서 관리하는 건 위험합니다.

Cold wallet

인터넷과 연결되어 있지 않은 이더리움 지갑을 Cold wallet이라고 부릅니다. 이더리움을 송금할 일이 있으면 Cold wallet에서 transaction파일을 만든 뒤, 인터넷에 연결된 지갑에서 transaction을 실행시킬 수 있습니다.

ETH를 입금받는 과정에서도 Cold wallet을 사용할 수 있습니다. ETH 입금을 체크하는 코드에서는 public key정보만 가지고 입금을 체크합니다. 하루에 한번 정도, Cold wallet에서 입금받는 ETH를 관리용 주소로 보내는 transaction을 생성합니다. 그 뒤 transaction을 실행시킵니다.

하지만 새로운 계정을 생성하는 경우 문제가 생깁니다. 계정은 아무 때나 유저가 원하면 생성해주어야 합니다. 하지만 매번 cold wallet에서 계정을 생성할 수 없습니다. 인터넷이 연결 안 되어있기 때문에 사람이 직접 가서 생성해야 합니다. throughput이 엄청 낮은 방법이죠.

하지만 비트코인의 HD wallet을 사용하여 이 문제를 해결할 수 있습니다.

HD wallet

HD wallet은 한 private key로부터 다른 private key들을 생성하는 방법입니다. 비트코인에서는 보안을 위하여, 한 사람이 여러 계좌를 만드는 것을 권장합니다. 그래서 HD wallet같은 방법을 사용하여, 여러 계좌를 쉽게 관리할 수 있습니다.

HD wallet은 다음 특징들을 가지고 있습니다. 부모 private key로부터 무수히 많은 자식 key를 만들어낼 수 있습니다. 부모 public key로부터 무수히 많은 자식 public key를 만들어낼 수 있습니다. 이때 부모 private key에서 생성된 자식 private key와, 자식 public key에서 생성된 자식 public key는 한 쌍을 이룹니다.

다시 돌아와서, 새로운 유저에게 새로운 이더리움 주소를 할당해주는 문제를 생각해봅시다. HD wallet을 사용하면, 새로운 이더리움 주소를 할당해줄 때 root가 될 public key만들 가지고 있으면 됩니다. 그 root public key로부터 매번 새로운 public key를 만들 수 있습니다. 그리고 Cold wallet에 root private key를 저장해놓습니다. Cold wallet에서 돈을 송금하는 transaction을 만들 때는 root private key로부터 필요한 private key를 생성해서 쓸 수 있습니다.

코드

위의 코드는 ethereumjs-wallet이라는 자바스크립트 라이브러리를 사용한 코드입니다. root extended key로부터 17번째 주소를 생성하는 코드입니다.

정리

오늘은 cold wallet이 필요한 이유를 알아보았습니다. 또한, cold wallet에서 private key를 관리하게 되면서, private key 없이 새로운 public key를 만드는 방법에 대해서도 알아보았습니다.

--

--