안녕하세요, 블록체인 좋아하는 sigmoid입니다. 얼마전 백서를 분석했던 Enigma 프로젝트의 샘플을 구동해보고 파악한 부분을 간략히 정리해봅니다.
# Enigma란? (quick)
Multi party computation
선택된 몇개의 노드가 연산을 처리하는 형태입니다. 퍼블릭체인에서 몇개의 노드만 일을 시키는 방식의 구현은 굉장히 어려운 문제인데요, Enigma 프로토콜은 principal node가 random seed를 전파하고, random seed로 Lottery를 돌려 당첨된 노드들이 참여하도록 구성되어 있습니다.Off-chain computing
Ethereum의 계약 코드를 EVM에서만 실행하는 것이 아니라, 계약 코드의 일부를 TEE(Trusted Execution Environment)에서구동하는 형태입니다. Privacy에 민감한 처리를 intel sgx같은 컨테이너화 된 안전한 연산장치에서 돌리겠다는 뜻인데요. 따라서 sgx를 지원하는 intel cpu가 필요합니다만, 테스트넷에서는 emulation도 가능하도록 되어 있네요.Trustness
연산이 실행된 후 TEE의 개인키로 서명된 데이터들이 온체인으로 커밋되고, 다른 노드들에 의해 유효성을 검증받도록 되어 있습니다. TEE가 실행했다고 한들, 해당 TEE를 구동하는 노드가 악의적으로 다른 연산결과를 제출할 수도 있기 때문입니다.
검증 부분이 제가 생각하는 블록체인의 가장 큰 장점 중 하나인데, Enigma가 MPC와 Privacy를 잘 비벼놨다고 느꼈습니다. .영리한 사람들이 참 많네요.
참고한 문서는 Enigma official blog의 Getting Started with the Enigma Protocol: A Complete Developer’s Guide 입니다. (https://blog.enigma.co/getting-started-with-the-enigma-protocol-a-complete-developers-guide-170b7dfa5c0f)
# 설치 및 빌드
블로그에 나온대로 깃헙에서 2개의 코드를 다운 받습니다. 하나는 dapp이고, 하나는 enigma network인데요. 받아서 빌드하는건 워낙 자세히 블로그에 쓰여있으니 그대로 따라해보시면 됩니다. darq-truffle 설치하라고 나오는데 저는 그냥 ubuntu 기본패키지인 truffle사용했네요. (문제없이 샘플동작합니다)
- dapp
- node.js로 구현된 dapp과 dapp과 통신할 smart contract코드를 포함하고 있습니다. Contract코드는 이더리움과 마찬가지로 solidity로 구현되어 있으며 callable과 callback이라는 keyword를 사용하여 TEE에서 구동할 코드를 나타내고 있습니다. (Enigma식 표현으로 Secret Contract 라고 합니다.)
- dapp은 secret contract를 배포하고, 이미 테스트 넷에 배포된 enigma contract에게 배포한 secret contract의 정보를 넘기는 부분까지 구현이 되어 있네요
- 이런 건 구현 노하우 같은것으로 보이는데, dapp의 contract를 네트워크에 배포하여 테스트하기 편하도록 갱신가능한(immigration?)스마트 컨트렉트를 구현해 놓은것 같습니다. (이렇게 되면 테스트 넷에서 새로 배포된 컨트렉트 주소를 고려하지 않게 할수 있으니 그렇지 않을까...생각되네요)
- network
- docker방식으로 구현된 테스트 넷입니다. Enigma는 Ganache라는 이더리움 smart contract 테스트용 네트워크를 사용하는데, 이 네트워크가 docker로 배포되고 있더군요. 그리고 이 네트워크에서 스마트 컨트렉트를 컴파일하기 위해서 truffle이라는 명령어를 사용합니다. (그래서 설치하라 그랬구나).
- enigma contract 코드가 포함되어 있지 않습니다. enigma github에 가시면 enigma-contract라는 레포지토리에서 enigma 코드를 볼수 있더군요. secret contract의 callable과 callback함수를 worker들에게 배포하도록 task를 생성하는 부분이 구현 되어 있었습니다. (docker에서 땡겨가는 로직이 있을것으로 보임)
- Surface와 Core코드도 포함되어 있지 않습니다. 우선 저는 TEE쪽으로 어떻게 함수를 전달하는지가 궁금했기 때문에 enigma-core만 받아서 살짝 열어봤습니다. (core는 rust로 구현되어 있고 함수는 string으로 전달됨을 확인하였습니다.)
#Dapp의 동작방식과 구동화면
샘플로 제공된 댑은 백만장자의 주소와 잔액을 몇개 추가한 뒤, 최고 부자를 조회하게 되면 결과가 반환되도록 구현되어 있습니다.
- dapp이 배포한 컨트렉트는 백만장자의 정보를 저장하고 최고부자를 조회하는데 쓰이며, 댑이 최고 부자의 결과를 얻기 위해서는 배포한 컨트렉트의 저장소값을 읽어 enigma 컨트렉트로 넘기는 함수를 호출한 후 전달한 callback에 의한 이벤트를 기다리게 됩니다.
- enigma 컨트렉트를 통해 전달된 부자리스트와 최고부자계산함수 문자열(callable)은 core쪽으로 전달되어 연산되게 됩니다. 그리고 core에서 callback함수가 호출되게 되면 event가 emit됩니다.
- 기다림이 끝난 dapp은 최고부자조회 함수를 이용하여 최종 결과를 얻습니다.
# 정리
그동안 이더리움 코어쪽만 보다보니 dapp이나 layer2프로토콜에 대한 지식이 많이 부족했는데요, Enigma를 통해 댑의 기본 동작원리도 조금은 이해하는 경험을 하게 되어 개인적으로 참 좋은 시간을 보냈습니다.(node js와 rust는 완전 첫경험이네요)
public 체인에서 그룹을 구성하는 방법을 enigma는 신뢰가능한 principal노드 + 로터리로 풀었고, ekiden은 DKMS로 풀었는데 탈중앙화 측면에서는 ekiden이 좋아보이는데, 더좋은 방법은 없을지 재미있게 고민해볼만한 포인트인것 같습니다.
(크게보면 플라즈마도...)
TEE 연산 결과를 블록체인에 올릴 때 골치아픈 것이
"TEE 환경에서 연산된 결과임"을 증명하는 것 같습니다.
Ekiden의 경우, Intel Attestation Service에 의존하는데, Enigma의 경우에는 어떻게 증명하는건가요?
이 부분이 아직 모호하네요.