오프체인 작업
오프체인 소스에서 데이터를 가져와 온체인 상태에 통합하는 방법을 강조합니다.
Last updated
오프체인 소스에서 데이터를 가져와 온체인 상태에 통합하는 방법을 강조합니다.
Last updated
온체인 리소스를 사용하지 않고 오프체인 소스에서 데이터를 쿼리하거나 데이터를 처리해야 하는 경우 다양한 사용 사례가 있습니다. 기존의 오프체인 데이터 통합 방법은 전통적인 소스에서 데이터를 제공하기 위해 오라클에 연결하는 것입니다. 오라클을 사용하는 것은 오프체인 데이터 소스와 작업하는 한 가지 방법이지만, 오라클이 제공할 수 있는 보안성, 확장성 및 인프라 효율성에는 제한이 있습니다.
오프체인 데이터 통합을 보다 안전하고 효율적으로 만들기 위해 Substrate는 다음과 같은 기능을 통해 오프체인 작업을 지원합니다:
오프체인 워커는 다음과 같은 장기 실행 및 비결정적 작업을 수행할 수 있는 구성 요소의 하위 시스템입니다:
웹 사이트 서비스 요청
데이터의 암호화, 복호화 및 서명
난수 생성
CPU 집약적인 계산
온체인 데이터의 열거 또는 집계
오프체인 워커를 사용하면 블록 처리 파이프라인에서 허용된 실행 시간보다 더 오래 걸릴 수 있는 작업을 이동시킬 수 있습니다. 최대 블록 실행 시간보다 더 오래 걸릴 수 있는 작업은 오프체인 처리의 합리적인 후보입니다.
오프체인 스토리지는 Substrate 노드에 로컬로 저장되며 오프체인 워커와 온체인 로직 모두에서 액세스할 수 있습니다:
오프체인 워커는 오프체인 스토리지에 대한 읽기 및 쓰기 액세스 권한을 가지고 있습니다.
온체인 로직은 오프체인 인덱싱을 통해 쓰기 액세스 권한을 가지고 있지만 읽기 액세스 권한은 없습니다. 오프체인 스토리지는 서로 다른 워커 스레드 간의 통신 및 전체 네트워크에 대한 합의가 필요하지 않은 사용자별 또는 노드별 데이터를 저장하는 데 사용됩니다.
오프체인 인덱싱은 런타임이 오프체인 워커 스레드와 독립적으로 오프체인 스토리지에 직접 쓸 수 있는 선택적 서비스입니다. 오프체인 인덱스는 온체인 로직을 위한 임시 스토리지를 제공하며 온체인 상태를 보완합니다.
오프체인 워커는 Substrate 런타임 외부의 자체 Wasm 실행 환경에서 실행됩니다. 이러한 관심사의 분리는 블록 생성이 장기 실행되는 오프체인 작업에 영향을 주지 않도록 합니다. 그러나 오프체인 워커는 런타임과 동일한 코드에서 선언되므로 계산에 온체인 상태에 쉽게 액세스할 수 있습니다.
오프체인 워커는 외부 세계와 통신하기 위한 확장된 API에 액세스할 수 있습니다:
연산 결과를 게시하기 위해 체인에 서명된 또는 서명되지 않은 트랜잭션을 제출할 수 있는 기능.
외부 서비스에서 데이터를 액세스하고 가져오기 위한 완전한 기능을 갖춘 HTTP 클라이언트.
문장이나 트랜잭션에 서명하고 검증하기 위한 로컬 키스토어에 액세스.
모든 오프체인 워커 간에 공유되는 추가적인 로컬 Key-Value 데이터베이스.
난수 생성을 위한 안전한 로컬 엔트로피 소스.
노드의 정확한 로컬 시간에 대한 액세스.
작업을 일시 중지하고 재개할 수 있는 기능.
오프체인 워커의 결과는 일반적인 트랜잭션 검증의 대상이 아닙니다. 따라서 오프체인 작업에는 체인에 어떤 정보가 들어가는지 결정하기 위한 검증 방법을 포함해야 합니다. 예를 들어, 투표, 평균 계산 또는 발신자 서명 확인을 위한 메커니즘을 구현하여 오프체인 트랜잭션을 검증할 수 있습니다.
또한, 오프체인 워커는 기본적으로 특정 권한이나 허가를 갖지 않으므로 악의적인 사용자가 악용할 수 있는 잠재적인 공격 경로를 나타냅니다. 네트워크를 보호하기 위해 저장소에 쓰기 전에 트랜잭션이 오프체인 워커에 의해 제출되었는지 확인하는 것만으로는 충분하지 않습니다. 오프체인 워커를 신뢰할 수 있다고 가정하는 대신, 프로세스에 대한 액세스 및 수행 가능한 작업을 제한하는 제한적인 권한을 명시적으로 설정해야 합니다.
오프체인 워커는 각 블록 가져오기 중에 생성됩니다. 그러나 초기 블록체인 동기화 중에는 실행되지 않습니다.
오프체인 스토리지는 항상 Substrate 노드에 로컬로 저장되며 다른 블록체인 노드와 공유되거나 합의의 대상이 되지 않습니다. 오프체인 워커 스레드가 읽기 및 쓰기 액세스 권한을 갖거나 온체인 로직을 통해 오프체인 인덱싱을 사용하여 저장된 데이터에 액세스할 수 있습니다.
오프체인 워커 스레드는 각 블록 가져오기 중에 생성되므로 언제든지 여러 개의 오프체인 워커 스레드가 동시에 실행될 수 있습니다. 다중 스레드 프로그래밍 환경과 마찬가지로, 오프체인 워커 스레드가 액세스할 때 오프체인 스토리지의 데이터 일관성을 보장하기 위해 뮤텍스 잠금을 사용하는 유틸리티가 있습니다.
오프체인 스토리지는 오프체인 워커 스레드 간의 통신 및 오프체인과 온체인 로직 간의 통신을 위한 다리 역할을 합니다. 또한, 오프체인 스토리지는 온체인 스토리지를 과도하게 사용하지 않고 지속적으로 증가하는 데이터를 저장하는 사용 사례에 적합하도록 원격 프로시저 호출 (RPC)을 사용하여 읽을 수 있습니다.
블록체인의 맥락에서 저장소는 주로 온체인 상태와 관련이 있습니다. 그러나 온체인 상태는 여러 노드에 합의되고 전파되어야 하기 때문에 비용이 많이 듭니다. 따라서 역사적인 데이터나 사용자 생성 데이터(시간이 지남에 따라 무한히 증가하는 데이터)를 온체인 스토리지에 저장해서는 안 됩니다.
역사적인 데이터나 사용자 생성 데이터에 액세스해야 하는 요구를 충족하기 위해 Substrate는 오프체인 인덱싱을 사용하여 오프체인 스토리지에 액세스할 수 있도록 제공합니다. 오프체인 인덱싱을 사용하여 데이터를 오프체인 스토리지에 지속적으로 저장하려면 --enable-offchain-indexing
커맨드 라인 옵션을 사용하여 Substrate 노드를 시작하면 됩니다.
오프체인 워커와 달리 오프체인 인덱싱은 매번 블록 처리 시 오프체인 스토리지를 채웁니다. 블록마다 데이터를 채움으로써 오프체인 인덱싱은 데이터가 항상 일관되며 인덱싱이 활성화된 모든 노드에서 정확히 동일하다는 것을 보장합니다.
오프체인 워커, 오프체인 스토리지 및 오프체인 인덱싱을 사용하여 온체인에 저장되지 않은 데이터를 처리할 수 있는 방법에 대해 알게 되었으므로 다음 예제와 런타임 개발에서 이를 사용하는 방법을 살펴볼 수 있습니다: