스마트 컨트랙트를 활용하여 개봉일 이후에만 데이터를 복호화할 수 있도록 하는 탈중앙화된 디지털 타임캡슐입니다. 타임캡슐을 업로드한 사용자조차 개봉일 이전에는 데이터를 복호화할 수 없습니다.
pnpm install- 컨트랙트 컴파일
# build contracts
pnpm contracts:build- 컨트랙트 배포
# run local hardhat node & dapp
pnpm run dev
# in another terminal
# deploy contracts to local hardhat network
pnpm contracts:deploy:local
- 스마트 컨트랙트의 결정론적이고 투명한 특성을 우회하기 위해 참여자 시스템을 도입하여 개봉일 이전에 데이터를 복호화할 수 없도록 합니다.
- 타임캡슐을 생성하고 싶은 사용자는 스마트 컨트랙트에 타임캡슐을 등록합니다.
- 이 때 개봉일과 참여자 모집을 위한 보상 금액을 설정합니다.
- 참여자는 타임캡슐의 개봉일과 보상 금액을 확인하고 원하는 타임캡슐 보관에 참여할 수 있습니다.
- 이 때 참여자는 새로운 ECDH 키 쌍을 생성하여 공개키를 스마트 컨트랙트에 제출합니다.
- 참여자가 생기면 타임캡슐 소유자는 참여자 모집을 마감하고 타임캡슐에 저장될 데이터를 암호화할 수 있습니다.
- 암호화는 서버에서 진행되며, 이 때 사용되는 대칭키는 암호화되어 타임캡슐에 저장됩니다.
- 개봉일이 지나면 참여자들은 스마트 컨트랙트에 자신의 개인키를 제출할 수 있습니다.
- 타임캡슐에서는 공개키에 대한 개인키가 맞는지 확인하고, 맞다면 해당 참여자를 보상 목록에 추가합니다.
- 개인키 검증은 컨트랙트 상에서 해당 개인키로 공개키를 생성해 기존에 저장된 공개키와 비교하는 방식으로 진행됩니다.
- 개인키가 제출되면 타임캡슐 소유자는 타임캡슐을 개봉할 수 있습니다.
- 이후 개인키를 제출한 참여자들은 보상 금액을 나누어 받습니다.
- 클라이언트에서 ECC 키 쌍을 생성하여 개인키는 참여자가 보관하고, 공개키는 스마트 컨트랙트에 저장됩니다.
- 서버에서 ECC 키 쌍을 생성하여 공개키는 스마트 컨트랙트에 저장됩니다.
- 비밀키는 참여자 각각의 공개키와 ECDH 키 교환을 통해 각 참여자별 공유키를 생성할 때 사용되며, 이후 따로 저장되지 않고 사라집니다.
- 이 대칭키는 서버에서 생성되며, 데이터 암호화에 사용됩니다.
- 이후 각 참여자 n명의 공개키와 타임캡슐 개인키의 키 교환으로 생성한 공유 키 n개로 대칭키를 암호화하여 총 n개의 암호화된 대칭키가 컨트랙트에 저장됩니다.
- 타임캡슐 개봉시에는 참여자의 개인키와 타임캡슐 공개키를 이용해 공유키를 생성할 수 있으며, 이 공유키로 대칭키를 복호화하여 데이터를 복호화할 수 있습니다.
- 따라서 참여자는 개봉일 이전에 개인키를 받을 수 없어 복호화가 불가능합니다.
- 참여자의 개인키를 제출하지 않으려면 복호화 단계에서 참여자가 복호화된 대칭키를 제출해야 합니다.
- 이 경우 참여자가 여러명일 때 개인키를 잃어버린 참여자가 다른 참여자가 업로드한 복호화된 대칭키를 그대로 제출할 수 있기 때문에 부정 참여가 발생할 수 있습니다.
- 개인키의 경우 모든 참여자의 개인키가 다르기 때문에 이러한 부정 참여를 막을 수 있습니다.
- 컨트랙트에 저장되는 데이터 크기를 줄이기 위해 타임캡슐에 저장될 데이터는 암호화되어 사용자 각자가 보관합니다.