Building blocks
Midnight의 트랜잭션 구조는 독특하며, 처음에는 직관적으로 이해하기 어려울 수 있습니다.
Transactions
Midnight에서 트랜잭션은 다음으로 구성됩니다:
- 'guaranteed' zswap offer
- 선택적 'fallible' zswap offer
- 선택적 컨트랙트 호출 섹션 (다음을 포함):
- 바인딩 무작위성 (참조: 트랜잭션 무결성).
Contract deployments
컨트랙트 배포는 해당 컨트랙트가 아직 존재하지 않으면 새로 생성하고, 이미 존재하면 실패합니다. 'fallible' 실행 단계의 일부로 전체적으로 실행됩니다.
컨트랙트 배포 트랜잭션 부분은 컨트랙트 상태와 nonce로 구성되며, 배포 부분의 해시를 주소로 하여 새 컨트랙트를 생성합니다.
Contract calls
컨트랙트 호출은 특정 컨트랙트 주소와 해당 주소의 entry point를 호출합니다. Entry point는 컨트랙트의 operation 맵에 대한 키입니다. 이 두 가지를 조합하여 컨트랙트 호출의 검증에 사용할 verifier key가 결정됩니다.
컨트랙트 호출은 guaranteed와 fallible transcript를 선언하여 이 호출의 가시적 효과를 명시합니다. 또한 교차 컨트랙트 상호작용에 사용할 수 있는 통신 commitment를 포함합니다.
교차 컨트랙트 상호작용은 아직 개발 중이며 현재 사용할 수 없습니다. 어떤 종류의 상호작용이 필요한지 팀에 의견을 보내주시면 감사하겠습니다.
마지막으로, 컨트랙트 호출에는 transcript가 해당 컨트랙트에 대해 유효하며 다른 트랜잭션 요소에 바인딩되어 있음을 증명하는 영지식 증명이 포함됩니다.
Merging
Zswap은 트랜잭션 병합을 가능하게 하여 원자적 교환을 지원합니다. 현재 컨트랙트 호출 섹션은 병합할 수 없지만, 두 트랜잭션 중 하나 이상이 빈 컨트랙트 호출 섹션을 가지면 병합이 가능합니다. 병합 결과는 두 입력 트랜잭션의 효과를 결합한 새로운 복합 트랜잭션입니다.
Transaction integrity
Midnight은 Zswap에서 기본 트랜잭션 무결성 메커니즘을 상속받으며, 병합 기능 때문에 트랜잭션 무결성에 Pedersen commitment를 사용합니다. 이 commitment는 트랜잭션의 각 input과 output 값에 커밋하며, 전체 트랜잭션이 복합 commitment를 열어 무결성을 확인하기 전에 동형적으로 합산됩니다. 트랜잭션의 개별 구성 요소를 생성한 당사자만이 합산에 사용되는 개방 무작위성을 알고 있어, 트랜잭션을 분해할 수 있습니다. 이로써 사용자의 자금이 원래 의도대로만 소비되도록 보장하는 바인딩이 성립합니다.
이 바인딩은 컨트랙트 호출 섹션이 전체 Pedersen commitment에 기여함으로써 컨트랙트 호출까지 확장됩니다. 이 기여는 Fiat-Shamir 변환된 Schnorr proof 형태로 생성자의 지수에 대한 지식을 요구하여, 가치 벡터가 없도록 추가 제한됩니다.