플라즈마 체인
플라즈마 체인은 이더리움 메인넷에 고정되어 있지만, 자체적인 블록 검증 메커니즘을 통해 오프체인에서 트랜잭션을 실행하는 별도의 블록체인입니다. 플라즈마 체인은 때때로 "하위(child)" 체인이라고도 불리며, 본질적으로 이더리움 메인넷의 축소판입니다. 플라즈마 체인은 분쟁을 중재하기 위해 (옵티미스틱 롤업과 같이) 을 사용합니다.
머클 트리는 부모 체인(이더리움 메인넷 포함)의 대역폭 부담을 덜어줄 수 있는 이러한 체인들의 무한한 스택 생성을 가능하게 합니다. 그러나 이러한 체인들은 (사기 증명을 통해) 이더리움으로부터 어느 정도의 보안을 파생받지만, 그 보안과 효율성은 몇 가지 설계상의 한계에 의해 영향을 받습니다.
전제 조건
모든 기초적인 주제에 대해 잘 이해하고 있어야 하며, 이더리움 확장성에 대한 높은 수준의 이해가 필요합니다.
플라즈마란 무엇인가요?
플라즈마는 이더리움과 같은 퍼블릭 블록체인의 확장성을 향상시키기 위한 프레임워크입니다. 원본 플라즈마 백서 (opens in a new tab)에 설명된 바와 같이, 플라즈마 체인은 다른 블록체인("루트 체인"이라고 함) 위에 구축됩니다. 각 "하위 체인"은 루트 체인에서 확장되며, 일반적으로 부모 체인에 배포된 스마트 컨트랙트에 의해 관리됩니다.
플라즈마 컨트랙트는 무엇보다도 사용자가 이더리움 메인넷과 플라즈마 체인 간에 자산을 이동할 수 있게 해주는 브릿지 역할을 합니다. 이로 인해 사이드체인과 유사해 보이지만, 플라즈마 체인은 적어도 어느 정도는 이더리움 메인넷의 보안 이점을 누립니다. 이는 전적으로 자체 보안을 책임져야 하는 사이드체인과는 다릅니다.
플라즈마는 어떻게 작동하나요?
플라즈마 프레임워크의 기본 구성 요소는 다음과 같습니다.
오프체인 연산
이더리움의 현재 처리 속도는 초당 약 15~20개의 트랜잭션으로 제한되어 있어, 단기적으로 더 많은 사용자를 수용하기 위한 확장 가능성이 낮습니다. 이 문제는 주로 이더리움의 합의 메커니즘이 블록체인의 상태에 대한 모든 업데이트를 검증하기 위해 많은 피어 투 피어 노드를 필요로 하기 때문에 발생합니다.
이더리움의 합의 메커니즘은 보안을 위해 필수적이지만, 모든 사용 사례에 적용할 필요는 없을 수 있습니다. 예를 들어, 앨리스가 밥에게 커피 한 잔 값을 매일 지불하는 경우, 두 당사자 간에 어느 정도의 신뢰가 존재하므로 전체 이더리움 네트워크가 이를 검증할 필요는 없습니다.
플라즈마는 이더리움 메인넷이 모든 트랜잭션을 검증할 필요가 없다고 가정합니다. 대신 메인넷 외부에서 트랜잭션을 처리하여 노드가 모든 트랜잭션을 검증해야 하는 부담을 덜어줄 수 있습니다.
플라즈마 체인은 속도와 비용을 최적화할 수 있으므로 오프체인 연산이 필요합니다. 예를 들어, 플라즈마 체인은 트랜잭션의 순서 지정 및 실행을 관리하기 위해 단일 "운영자(operator)"를 사용할 수 있으며, 실제로 대부분 그렇게 합니다. 단일 주체만이 트랜잭션을 검증하므로 플라즈마 체인의 처리 시간은 이더리움 메인넷보다 빠릅니다.
상태 커밋먼트
플라즈마는 오프체인에서 트랜잭션을 실행하지만, 메인 이더리움 실행 계층에서 정산됩니다. 그렇지 않으면 플라즈마 체인은 이더리움의 보안 보장을 누릴 수 없습니다. 그러나 플라즈마 체인의 상태를 모른 채 오프체인 트랜잭션을 확정하면 보안 모델이 무너지고 유효하지 않은 트랜잭션이 확산될 수 있습니다. 이것이 플라즈마 체인에서 블록 생성을 담당하는 주체인 운영자가 주기적으로 이더리움에 "상태 커밋먼트"를 게시해야 하는 이유입니다.
커밋먼트 체계(commitment scheme) (opens in a new tab)는 다른 당사자에게 공개하지 않고 값이나 진술에 커밋하는 암호화 기술입니다. 커밋먼트는 한 번 커밋한 값이나 진술을 변경할 수 없다는 점에서 "구속력(binding)"을 갖습니다. 플라즈마의 상태 커밋먼트는 운영자가 이더리움 체인의 플라즈마 컨트랙트에 주기적으로 전송하는 "머클 루트"(머클 트리에서 파생됨)의 형태를 취합니다.
머클 루트는 대량의 정보를 압축할 수 있게 해주는 암호화 기본 요소입니다. 머클 루트(이 경우 "블록 루트"라고도 함)는 블록 내의 모든 트랜잭션을 나타낼 수 있습니다. 또한 머클 루트는 작은 데이터 조각이 더 큰 데이터 세트의 일부인지 쉽게 검증할 수 있게 해줍니다. 예를 들어, 사용자는 특정 블록에 트랜잭션이 포함되어 있음을 증명하기 위해 머클 증명을 생성할 수 있습니다.
머클 루트는 오프체인의 상태에 대한 정보를 이더리움에 제공하는 데 중요합니다. 머클 루트를 "저장 지점(save points)"으로 생각할 수 있습니다. 운영자는 "이것이 특정 시점 x에서의 플라즈마 체인 상태이며, 이것이 그 증거인 머클 루트입니다"라고 말하는 것과 같습니다. 운영자는 머클 루트를 사용하여 플라즈마 체인의 현재 상태에 커밋하므로 이를 "상태 커밋먼트"라고 부릅니다.
진입 및 종료
이더리움 사용자가 플라즈마의 이점을 누리려면 메인넷과 플라즈마 체인 간에 자금을 이동할 수 있는 메커니즘이 필요합니다. 하지만 플라즈마 체인의 주소로 이더를 임의로 보낼 수는 없습니다. 이 체인들은 호환되지 않으므로 트랜잭션이 실패하거나 자금 손실로 이어질 수 있습니다.
플라즈마는 사용자의 진입 및 종료를 처리하기 위해 이더리움에서 실행되는 마스터 컨트랙트를 사용합니다. 이 마스터 컨트랙트는 (앞서 설명한) 상태 커밋먼트를 추적하고 사기 증명을 통해 부정직한 행동을 처벌하는 역할도 담당합니다(자세한 내용은 나중에 설명).
플라즈마 체인 진입
플라즈마 체인에 진입하려면 앨리스(사용자)는 플라즈마 컨트랙트에 ETH 또는 ERC-20 토큰을 예치해야 합니다. 컨트랙트 예치를 모니터링하는 플라즈마 운영자는 앨리스의 초기 예치금과 동일한 금액을 재생성하여 플라즈마 체인에 있는 그녀의 주소로 지급합니다. 앨리스는 하위 체인에서 자금을 수령했음을 증명해야 하며, 그 후 이 자금을 트랜잭션에 사용할 수 있습니다.
플라즈마 체인 종료
플라즈마 체인을 종료하는 것은 여러 가지 이유로 진입하는 것보다 더 복잡합니다. 가장 큰 이유는 이더리움이 플라즈마 체인의 상태에 대한 정보를 가지고 있지만, 그 정보가 사실인지 아닌지 검증할 수 없기 때문입니다. 악의적인 사용자가 잘못된 주장("나는 1000 ETH를 가지고 있다")을 하고, 그 주장을 뒷받침하는 가짜 증명을 제공하여 무사히 넘어갈 수 있습니다.
악의적인 인출을 방지하기 위해 "이의 제기 기간"이 도입되었습니다. 이의 제기 기간(일반적으로 1주일) 동안 누구나 사기 증명을 사용하여 인출 요청에 이의를 제기할 수 있습니다. 이의 제기가 성공하면 인출 요청이 거부됩니다.
그러나 일반적으로 사용자는 정직하며 자신이 소유한 자금에 대해 올바른 청구를 합니다. 이 시나리오에서 앨리스는 플라즈마 컨트랙트에 트랜잭션을 제출하여 루트 체인(이더리움)에서 인출 요청을 시작합니다.
그녀는 또한 플라즈마 체인에서 자신의 자금을 생성한 트랜잭션이 블록에 포함되었음을 검증하는 머클 증명을 제공해야 합니다. 이는 UTXO(Unspent Transaction Output) (opens in a new tab) 모델을 사용하는 플라즈마 MVP와 같은 플라즈마 버전에 필요합니다.
플라즈마 캐시(Plasma Cash)와 같은 다른 버전은 자금을 UTXO 대신 대체 불가능한 토큰으로 나타냅니다. 이 경우 인출하려면 플라즈마 체인에 있는 토큰의 소유권 증명이 필요합니다. 이는 해당 토큰과 관련된 가장 최근의 두 트랜잭션을 제출하고, 해당 트랜잭션이 블록에 포함되었음을 검증하는 머클 증명을 제공함으로써 수행됩니다.
사용자는 또한 정직한 행동의 보증으로 인출 요청에 보증금(bond)을 추가해야 합니다. 이의 제기자가 앨리스의 인출 요청이 유효하지 않음을 증명하면, 그녀의 보증금은 슬래싱되고 그 중 일부는 이의 제기자에게 보상으로 지급됩니다.
누구도 사기 증명을 제공하지 않고 이의 제기 기간이 경과하면 앨리스의 인출 요청은 유효한 것으로 간주되어 이더리움의 플라즈마 컨트랙트에서 예치금을 회수할 수 있습니다.
분쟁 중재
다른 블록체인과 마찬가지로 플라즈마 체인도 참가자가 악의적으로 행동할 경우(예: 자금 이중 지불) 트랜잭션의 무결성을 강제할 메커니즘이 필요합니다. 이를 위해 플라즈마 체인은 사기 증명을 사용하여 상태 전환의 유효성에 관한 분쟁을 중재하고 나쁜 행동에 페널티를 부과합니다. 사기 증명은 플라즈마 하위 체인이 부모 체인이나 루트 체인에 불만을 제기하는 메커니즘으로 사용됩니다.
사기 증명은 단순히 특정 상태 전환이 유효하지 않다는 주장입니다. 예를 들어 사용자(앨리스)가 동일한 자금을 두 번 지불하려고 시도하는 경우가 있습니다. 그녀가 밥과의 트랜잭션에서 UTXO를 지불한 후, (이제 밥의 소유가 된) 동일한 UTXO를 다른 트랜잭션에서 지불하려고 할 수 있습니다.
인출을 방지하기 위해 밥은 앨리스가 이전 트랜잭션에서 해당 UTXO를 지불했다는 증거와 해당 트랜잭션이 블록에 포함되었다는 머클 증명을 제공하여 사기 증명을 구성합니다. 플라즈마 캐시에서도 동일한 프로세스가 작동합니다. 밥은 앨리스가 인출하려는 토큰을 이전에 전송했다는 증명을 제공해야 합니다.
밥의 이의 제기가 성공하면 앨리스의 인출 요청은 취소됩니다. 그러나 이 접근 방식은 인출 요청을 위해 체인을 모니터링하는 밥의 능력에 의존합니다. 밥이 오프라인 상태라면 앨리스는 이의 제기 기간이 경과한 후 악의적인 인출을 처리할 수 있습니다.
플라즈마의 대규모 종료 문제
대규모 종료(mass exit) 문제는 많은 수의 사용자가 동시에 플라즈마 체인에서 인출하려고 할 때 발생합니다. 이 문제가 존재하는 이유는 플라즈마의 가장 큰 문제 중 하나인 데이터 비가용성(data unavailability)과 관련이 있습니다.
데이터 가용성은 제안된 블록에 대한 정보가 실제로 블록체인 네트워크에 게시되었는지 검증할 수 있는 능력입니다. 생성자가 블록 자체는 게시하지만 블록을 생성하는 데 사용된 데이터를 숨기는 경우 블록은 "사용할 수 없는(unavailable)" 상태가 됩니다.
노드가 블록을 다운로드하고 트랜잭션의 유효성을 검증하려면 블록을 사용할 수 있어야 합니다. 블록체인은 블록 생성자가 모든 트랜잭션 데이터를 온체인에 게시하도록 강제함으로써 데이터 가용성을 보장합니다.
데이터 가용성은 이더리움의 기본 계층 위에 구축된 오프체인 확장성 프로토콜을 보호하는 데에도 도움이 됩니다. 이러한 체인의 운영자가 이더리움에 트랜잭션 데이터를 게시하도록 강제함으로써, 누구나 체인의 올바른 상태를 참조하는 사기 증명을 구성하여 유효하지 않은 블록에 이의 제기를 할 수 있습니다.
플라즈마 체인은 주로 운영자와 함께 트랜잭션 데이터를 저장하며 메인넷에 어떠한 데이터도 게시하지 않습니다(즉, 주기적인 상태 커밋먼트 제외). 이는 사용자가 유효하지 않은 트랜잭션에 이의를 제기하는 사기 증명을 생성해야 할 경우 운영자가 제공하는 블록 데이터에 의존해야 함을 의미합니다. 이 시스템이 작동한다면 사용자는 항상 사기 증명을 사용하여 자금을 보호할 수 있습니다.
문제는 일반 사용자가 아닌 운영자가 악의적으로 행동하는 주체일 때 시작됩니다. 운영자는 블록체인을 단독으로 통제하기 때문에 플라즈마 체인에 있는 사용자의 자금을 훔치는 등 더 큰 규모로 유효하지 않은 상태 전환을 진행할 동기가 더 많습니다.
이 경우 기존의 사기 증명 시스템을 사용하는 것은 효과가 없습니다. 운영자는 앨리스와 밥의 자금을 자신의 지갑으로 이체하는 유효하지 않은 트랜잭션을 쉽게 만들고 사기 증명을 생성하는 데 필요한 데이터를 숨길 수 있습니다. 이는 운영자가 사용자나 메인넷에 데이터를 제공할 의무가 없기 때문에 가능합니다.
따라서 가장 낙관적인 해결책은 플라즈마 체인에서 사용자의 "대규모 종료"를 시도하는 것입니다. 대규모 종료는 자금을 훔치려는 악의적인 운영자의 계획을 지연시키고 사용자에게 어느 정도의 보호를 제공합니다. 인출 요청은 각 UTXO(또는 토큰)가 생성된 시점을 기준으로 정렬되어 악의적인 운영자가 정직한 사용자를 프론트러닝하는 것을 방지합니다.
그럼에도 불구하고 대규모 종료 중에 인출 요청의 유효성을 검증할 방법이 여전히 필요합니다. 기회주의적인 개인이 혼란을 틈타 유효하지 않은 종료를 처리하여 이익을 챙기는 것을 방지하기 위해서입니다. 해결책은 간단합니다. 사용자가 자금을 종료하려면 체인의 마지막 유효한 상태를 게시하도록 요구하는 것입니다.
하지만 이 접근 방식에도 여전히 문제가 있습니다. 예를 들어 플라즈마 체인의 모든 사용자가 종료해야 하는 경우(악의적인 운영자의 경우 가능함), 플라즈마 체인의 전체 유효한 상태를 이더리움의 기본 계층에 한 번에 덤프해야 합니다. 플라즈마 체인의 임의적인 크기(높은 처리량 = 더 많은 데이터)와 이더리움의 처리 속도 제약을 고려할 때 이는 이상적인 해결책이 아닙니다.
종료 게임(exit games)은 이론적으로는 좋아 보이지만, 실제 대규모 종료는 이더리움 자체에 네트워크 전체의 혼잡을 유발할 가능성이 높습니다. 이더리움의 기능을 손상시키는 것 외에도, 제대로 조정되지 않은 대규모 종료는 운영자가 플라즈마 체인의 모든 계정을 비우기 전에 사용자가 자금을 인출하지 못할 수 있음을 의미합니다.
플라즈마의 장단점
| 장점 | 단점 |
|---|---|
| 높은 처리량과 트랜잭션당 낮은 비용을 제공합니다. | 일반적인 연산을 지원하지 않습니다(스마트 컨트랙트를 실행할 수 없음). 기본 토큰 전송, 스왑 및 기타 몇 가지 트랜잭션 유형만 조건 논리(predicate logic)를 통해 지원됩니다. |
| 임의의 사용자 간 트랜잭션에 적합합니다(두 사용자가 모두 플라즈마 체인에 설정된 경우 사용자 쌍당 오버헤드 없음). | 자금의 보안을 보장하기 위해 주기적으로 네트워크를 모니터링하거나(활성도 요구 사항) 이 책임을 다른 사람에게 위임해야 합니다. |
| 플라즈마 체인은 메인 체인과 무관한 특정 사용 사례에 맞게 조정될 수 있습니다. 기업을 포함한 누구나 플라즈마 스마트 컨트랙트를 커스터마이징하여 다양한 컨텍스트에서 작동하는 확장 가능한 인프라를 제공할 수 있습니다. | 데이터를 저장하고 요청 시 제공하기 위해 하나 이상의 운영자에게 의존합니다. |
| 연산 및 스토리지를 오프체인으로 이동하여 이더리움 메인넷의 부하를 줄입니다. | 이의 제기를 허용하기 위해 인출이 며칠 지연됩니다. 대체 가능한 자산의 경우 유동성 공급자를 통해 이를 완화할 수 있지만 관련 자본 비용이 발생합니다. |
| 너무 많은 사용자가 동시에 종료하려고 하면 이더리움 메인넷이 혼잡해질 수 있습니다. |
플라즈마 대 레이어 2 확장성 프로토콜
플라즈마는 한때 이더리움의 유용한 확장성 솔루션으로 여겨졌지만, 이후 레이어 2 (l2) 확장성 프로토콜이 선호되면서 중단되었습니다. L2 확장성 솔루션은 플라즈마의 몇 가지 문제를 해결합니다.
효율성
영지식 롤업은 오프체인에서 처리된 각 트랜잭션 배치의 유효성에 대한 암호화 증명을 생성합니다. 이는 사용자(및 운영자)가 유효하지 않은 상태 전환을 진행하는 것을 방지하여 이의 제기 기간과 종료 게임의 필요성을 없앱니다. 또한 사용자가 자금을 보호하기 위해 주기적으로 체인을 모니터링할 필요가 없음을 의미합니다.
스마트 컨트랙트 지원
플라즈마 프레임워크의 또 다른 문제는 이더리움 스마트 컨트랙트의 실행을 지원할 수 없다는 점 (opens in a new tab)이었습니다. 그 결과 대부분의 플라즈마 구현은 주로 단순한 결제나 ERC-20 토큰 교환을 위해 구축되었습니다.
반대로 옵티미스틱 롤업은 이더리움 가상 머신(EVM)과 호환되며 이더리움 네이티브 스마트 컨트랙트를 실행할 수 있어 탈중앙화 애플리케이션 (dapp)을 확장하기 위한 유용하고 안전한 솔루션이 됩니다. 마찬가지로 ZK 롤업이 임의의 로직을 처리하고 스마트 컨트랙트를 실행할 수 있도록 하는 EVM의 영지식 구현(zkEVM)을 생성 (opens in a new tab)하려는 계획이 진행 중입니다.
데이터 비가용성
앞서 설명했듯이 플라즈마는 데이터 가용성 문제를 겪고 있습니다. 악의적인 운영자가 플라즈마 체인에서 유효하지 않은 전환을 진행하더라도, 운영자가 사기 증명을 생성하는 데 필요한 데이터를 숨길 수 있기 때문에 사용자는 이에 이의를 제기할 수 없습니다. 롤업은 운영자가 이더리움에 트랜잭션 데이터를 게시하도록 강제함으로써 이 문제를 해결하여, 누구나 체인의 상태를 검증하고 필요한 경우 사기 증명을 생성할 수 있게 합니다.
대규모 종료 문제
ZK 롤업과 옵티미스틱 롤업은 모두 다양한 방식으로 플라즈마의 대규모 종료 문제를 해결합니다. 예를 들어 ZK 롤업은 어떤 시나리오에서도 운영자가 사용자 자금을 훔칠 수 없도록 보장하는 암호화 메커니즘에 의존합니다.
마찬가지로 옵티미스틱 롤업은 인출에 지연 기간을 부과하여 이 기간 동안 누구나 이의 제기를 시작하고 악의적인 인출 요청을 방지할 수 있도록 합니다. 이는 플라즈마와 유사하지만, 검증자가 사기 증명을 생성하는 데 필요한 데이터에 접근할 수 있다는 점이 다릅니다. 따라서 롤업 사용자는 이더리움 메인넷으로 "먼저 빠져나가기" 위한 광란의 마이그레이션에 참여할 필요가 없습니다.
플라즈마는 사이드체인 및 샤딩과 어떻게 다른가요?
플라즈마, 사이드체인, 샤딩은 모두 어떤 방식으로든 이더리움 메인넷에 연결된다는 점에서 상당히 유사합니다. 그러나 이러한 연결의 수준과 강도는 다양하며, 이는 각 확장성 솔루션의 보안 속성에 영향을 미칩니다.
플라즈마 대 사이드체인
사이드체인은 양방향 브릿지를 통해 이더리움 메인넷에 연결된 독립적으로 운영되는 블록체인입니다. 브릿지를 통해 사용자는 두 블록체인 간에 토큰을 교환하여 사이드체인에서 트랜잭션을 수행할 수 있으며, 이는 이더리움 메인넷의 혼잡을 줄이고 확장성을 향상시킵니다. 사이드체인은 별도의 합의 메커니즘을 사용하며 일반적으로 이더리움 메인넷보다 훨씬 작습니다. 결과적으로 이러한 체인으로 자산을 브릿징하는 데는 증가된 위험이 수반됩니다. 사이드체인 모델에서는 이더리움 메인넷으로부터 상속받는 보안 보장이 부족하기 때문에 사용자는 사이드체인에 대한 공격 시 자금 손실의 위험을 감수해야 합니다.
반대로 플라즈마 체인은 메인넷에서 보안을 파생받습니다. 이로 인해 사이드체인보다 측정 가능할 정도로 더 안전합니다. 사이드체인과 플라즈마 체인 모두 다른 합의 프로토콜을 가질 수 있지만, 차이점은 플라즈마 체인이 이더리움 메인넷에 각 블록의 머클 루트를 게시한다는 것입니다. 블록 루트는 플라즈마 체인에서 발생하는 트랜잭션에 대한 정보를 검증하는 데 사용할 수 있는 작은 정보 조각입니다. 플라즈마 체인에서 공격이 발생하면 사용자는 적절한 증명을 사용하여 자금을 메인넷으로 안전하게 인출할 수 있습니다.
플라즈마 대 샤딩
플라즈마 체인과 샤드 체인 모두 주기적으로 이더리움 메인넷에 암호화 증명을 게시합니다. 그러나 두 체인은 서로 다른 보안 속성을 가지고 있습니다.
샤드 체인은 각 데이터 샤드에 대한 자세한 정보가 포함된 "콜레이션 헤더(collation headers)"를 메인넷에 커밋합니다. 메인넷의 노드는 데이터 샤드의 유효성을 검증하고 강제하여 유효하지 않은 샤드 전환 가능성을 줄이고 악의적인 활동으로부터 네트워크를 보호합니다.
플라즈마는 메인넷이 하위 체인의 상태에 대한 최소한의 정보만 수신하기 때문에 다릅니다. 이는 메인넷이 하위 체인에서 수행된 트랜잭션을 효과적으로 검증할 수 없음을 의미하며, 이로 인해 보안성이 떨어집니다.
참고: 이더리움 블록체인의 샤딩은 더 이상 로드맵에 없습니다. 이는 롤업 및 댕크샤딩을 통한 확장으로 대체되었습니다.
플라즈마 사용
여러 프로젝트에서 dapp에 통합할 수 있는 플라즈마 구현을 제공합니다.
- 폴리곤 (opens in a new tab) (이전 매틱 네트워크)
더 읽어보기
- "공유 보안"의 의미와 이것이 중요한 이유에 대한 간단한 알림 (opens in a new tab)
- 사이드체인 대 플라즈마 대 샤딩 (opens in a new tab)
- 플라즈마의 이해, 1부: 기본 사항 (opens in a new tab)
- 플라즈마의 삶과 죽음 (opens in a new tab)
도움이 된 커뮤니티 리소스를 알고 계신가요? 이 페이지를 편집하고 추가해 주세요!
튜토리얼: 이더리움의 플라즈마 체인
- 프라이버시를 보존하는 앱 전용 플라즈마 작성하기 – 영지식 증명 및 오프체인 구성 요소를 사용하여 프라이버시를 보존하는 플라즈마 애플리케이션을 구축합니다.