For the complete documentation index, see llms.txt
Private data
이 문서에서는 Midnight 컨트랙트에서 데이터를 비공개로 유지 하기 위한 몇 가지 전략을 소개합니다. 완전한 목록은 아니지만 시작점으로 활용할 수 있습니다.
가장 중요한 점은, [Historic]MerkleTree 데이터 유형을 제외하면, Compact에서 ledger 연산에 인수로 전달되는 모든 것과 ledger의 모든 읽기/쓰기가 공개적으로 노출된다는 것입니다. 이에 따라 적절히 다루어야 합니다. 공개되는 것은 인수 또는 ledger 값 자체이며, 이를 조작하는 코드가 아닙니다. 예를 들어:
export ledger items: Set<Field>;
export ledger others: MerkleTree<10, Field>;
// `item1`을 공개함
items.insert(item1);
// `f(x)`의 *값*을 공개하지만, `x` 자체를 직접 공개하지는 않음
items.member(f(x));
// 예외: `item2`를 공개하지 *않음*, 하지만 `item2`의 값을 추측하는 사람은
// 이를 확인할 수 있음!
others.insert(item2);
그러나 때로는 공개 상태에서 차폐된 데이터를 참조해야 할 때가 있습니다. 이런 경우 아래 패턴 중 하나가 도움이 됩니다.
Hashes and commitments
데이터를 공개적으로 저장하면서도 차폐 상태를 유지하는 가장 기본적인 방법은 데이터 전체 대신 해시 또는 commitment만 저장하는 것입니다.
Compact의 표준 라이브러리는 이를 위한 두 가지 주요 원시형을 제공합니다:
persistentHash: 이진 데이터 해싱을 위한 기본 구성 요소persistentCommit: 모든 Compact 유형에서 commitment를 생성하기 위한 원시형.
둘 다 입력의 해시를 생성하는데, persistentHash는 Bytes<32> 데이터 유형에 한정되고, persistentCommit은 Bytes<32> 무작위 값과 함께 임의의 데이터를 해싱합니다. 해시는 출력으로부터 입력을 역산할 수 없고, 입력 전체를 추측하지 않는 한 입력에 대한 정보도 알아낼 수 없음을 보장합니다. persistentCommit에 추가 무작위성 입력이 있는 이유가 바로 이것입니다. 값 자체를 추측하여 해시 일치 여부를 확인하는 공격을 방지합니다. 이는 선거의 개별 투표처럼 가능한 값의 수가 적을 때 특히 중요합니다.
무작위성의 또 다른 이점은 동일한 값 간의 상관관계를 차단한다는 것입니다. 예를 들어 누군가의 비밀번호를 추측할 수 없더라도, 동일한 해시 값이 두 번 나타나면 같은 값이라는 사실을 알 수 있으며, 이는 누가 상태를 변경했는지에 대한 정보를 의도치 않게 유출할 수 있습니다.
충분한 무작위성을 사용하면 값의 commitment를 실제 값을 드러내지 않고 ledger에 저장할 수 있습니다.
Randomness and rounds in commitments
각 commitment마다 새로운 무작위성을 사용하는 것이 이상적이지만, 동일한 무작위성에 대해 데이터가 절대 같지 않도록 보장할 수 있다면 기존 무작위성을 재사용할 수도 있습니다. 일부 예시 애플리케이션에서 이 방식을 사용하는데, 라운드 카운터와 함께 비밀 키를 무작위성 소스로 재활용하여 라운드 간 연결 불가능성을 보장합니다.
무작위성을 다룰 때는 주의가 필요합니다! 실수하기 쉬우므로, 가능하면 안전한 쪽을 선택하는 것이 좋습니다.
Authenticating with hashes
영지식 증명의 가장 유용한 기능 중 하나는 circuit 내에서 해시만으로 서명을 흉내 낼 수 있다는 것입니다. 비밀 키를 해싱하여 알려진 '공개 키'