Photo by James Sutton on Unsplash
비밀키와 블록체인
블록체인에서는 비밀키와 쌍이 되는 공개키, 혹은 공개키를 해시한 값을 돈을 주고받을 수 있는 주소로 사용합니다. 즉 비밀키는 블록체인 내에서 자신을 증명하는 것이며, 자신의 이름입니다.
레귤러 키가 없을 때의 문제
하지만 비밀키를 사용하면, 사용하던 비밀키를 부득이하게 바꿔야 하는 상황 등에서 지금까지 사용하던 주소를 쓸 수 없게되는 문제가 있습니다. 서비스를 운영하는 입장에서 이는 큰 문제의 소지가 있습니다. 예를 들면, 이미 사용하지 않게 된 주소에 서비스 이용자를 비롯한 다른 사람들이 토큰을 보내는 경우 같은 경우 등이 있겠네요.
레귤러 키를 통한 문제 해결
이 문제는 자신을 증명하는 방법과 자신을 부르는 이름이 서로 결합되어 있는 게 원인입니다. 꼭 서명할 때 사용하는 비밀키로부터 주소를 만들어야 할까요?
레귤러 키를 써서 이 문제를 해결할 수 있습니다. 주소는 마스터 키로부터 생성됩니다. 마스터 키는 안전하게 네트워크가 연결이 되지 않은 콜드 스토리지에 저장하고, 서명할 때는 레귤러키를 사용하도록 합니다. 이렇게 관리할 경우 문제가 생겨 레귤러 키를 바꾸어야 하는 경우가 생겨도 마스터 키에 다른 레귤러 키를 등록하여 주소를 유지할 수 있습니다.
레귤러 키의 사용
지금부터는 직접 코드체인 SDK를 사용해서 레귤러 키를 사용하는 방법을 알아보겠습니다. 혹시 코드체인 SDK를 쓰는 게 처음이라면 김길영님이 쓰신 글을 읽어보시는 걸 추천드립니다.
앞으로 다룰 예제는 다음과 같습니다.
1) 랜덤으로 레귤러 비밀키/공개키 쌍을 생성 2) 미리 가지고 있던 마스터 키에 방금 생성한 레귤러 키를 등록 3) 레귤러 키로 서명한 파셀을 전송 4) 마스터 계정에서 차감된 수수료를 확인하여 레귤러 키가 제대로 저장되었는지 확인
이해를 돕기 위해 그린 마스터 키와 레귤러 키의 관계도입니다.
SDK를 사용해서 레귤러 키를 생성하는 코드는 아래와 같습니다.
이렇게 생성된 레귤러 키를 기존에 가지고 있던 마스터 계정에 등록합니다.
이 이후부터는 마스터 키 대신에 레귤러 키로 파셀에 서명할 수 있습니다.
아래 코드는 다른 사람에게 CCC를 보낼 때 마스터 계정의 비밀키 대신 레귤러 계정의 키를 사용하는 예시입니다.
코드를 보면 마스터 키를 사용할 때와의 차이점은 파셀을 사인할 때, 마스터 키의 비밀키 대신 레귤러 키의 비밀키를 사용하는 부분뿐입니다. 이렇게 약간의 변화를 통해 서명 용도의 키와 주소 용도의 키를 분리할 수 있습니다.
주의할 점
SetRegularKey 파셀이 블록에 마이닝된 이후에야 레귤러 키로 파셀을 사인할 수 있기 때문에 SetRegularKey 파셀과 레귤러 키를 사용하는 파셀을 연달아 보내면, 레귤러 키를 사용한 파셀이 처리가 안 될 수 있습니다. 이는 P2P 네트워크에서 통과될 수 없는 파셀들을 전달하는 낭비를 막기 위해, 현재 상태에서 처리할 수 없는 파셀을 코드체인이 전파하는 걸 막기 때문입니다. 따라서 차분히 레귤러 키가 등록되는 걸 확인 한 뒤에 레귤러 키를 사용하시길 바랍니다.
결론
코드체인은 레귤러 키를 지원함으로써 게임을 비롯한 임의로 일시 정지할 수 없는 서비스들이 주소가 변경되는 등의 상황을 맞았을 때 대처할 수 있도록 설계되어 있습니다. 이 글을 통해 레귤러 키가 무엇인지 알아보고, 코드체인 SDK를 사용하여 레귤러 키를 등록하고 사용하는 법을 알아보는 데에 도움이 되었기를 바랍니다.