포럼 번역

DAML 오라클

socl 2020. 9. 21. 09:43

"Oracle"은 분산 원장 플랫폼에서 가격, 날씨 또는 시간과 같은 외부 정보를 제공하는 모든 종류의 서비스에 대한 매우 광범위한 용어입니다. 여기서 "사용 가능하게 만든다"는 것은 정보를 다른 계약에서 사용할 수 있도록 스마트 계약에 저장하는 것을 의미합니다.

가장 간단한 형태의 Oracle은 원장에서 데이터 유형을 사용할 수 있는 단일 (신뢰할 수 있는) 당사자 일뿐입니다.

template WeatherReport
  with
    weatherService : Party
    location : Location
    time : Time
    weather : Weather
    subscribers : [Party]
  where
    signatory weatherService
    observer subscribers

완전한 오라클은 외부 소스에서 날씨 데이터를 읽고 주기적으로 Weather계약을 생성하는 작은 서비스를 추가합니다. 이러한 Oracle 데이터를 사용하려면 발급자를 신뢰하기로 결정해야 합니다. 즉, 해당 참조 데이터를 사용하는 모든 계약은 신뢰할 수 있는 오라클을 지정해야 합니다.

template RainyDayFund
  with
     amount : Decimal
     owner : Party
     trustedService : Party
     location : Location
  where
    signatory owner

    controller owner can
      Raid : ()
        with
          weatherCid : ContractId WeatherReport
        do
          weather <- fetch weatherCid
          -- 날씨가 하루 미만인지 확인
          assertBefore (addRelTime weather.time (days 1))
          assert (location == weather.location)
         ...

위에서 코드에서 볼 수 있듯이 DAML에서 Oracle 서비스 모델링은 간단하며 특별한 기능이 없습니다.

대부분의 Oracle 서비스는 전체 당사자 그룹이 정보를 보증하도록 하여 신뢰를 구축하려고 합니다. 동일한 날씨에서 여러 서명을 수집하거나 다른 여러 날씨 서비스에서 계약을 상호 연결하여 이를 수행할 수 있습니다.

template RainyDayFund
  with
    amount : Decimal
    owner : Party
    trustedServices : [Party]
    neededServices : Int
    location : Location
  where
    signatory owner

    controller owner can
      Raid : ()
        with
          weatherCids : [ContractId WeatherReport]
        do
         weathers <-mapA fetch weatherCids
         forA weathers (\weather -> do
           -- 날씨가 하루 미만인지 확인
           assertBefore (addRelTime weather.time (days 1))
           assert (location == weather.location)
           assert (weather.weatherService `elem` trustedServices))
         -- 최소한 필요한 서비스가 있는지 확인하십시오.
         let services = dedup $ map (\w -> w.weatherService) weathers
         assert (length services >= neededServices)

데이터 검사를 추상화하거나 참조 데이터를 전달하는 대신 계약 키 조회를 사용하여이 모든 것을 좀 더 멋지게 만들 수 있지만 이것은 Oracle 서비스가 DAML 측에서 취하는 것을 보여줍니다.

하지만 DAML이 특별히 처리하고 위에서 실제로 사용한 Oracle이 하나 있습니다.

Time

time이 특별한 이유는 무엇입니까?

  1. 빠르게 동작합니다.
  2. 실제로 분산 시스템에는 단 한번만 수행하는것은 없습니다.(분산환경 각 개별로 수행)
  3. 대부분의 개발자는 시스템 시간으로 작업하는 데 익숙합니다.

이런 항목을 조정하기 위해 DAML 원장은 합의의 일부로 커밋에 대한 타임스탬프를 설정해야 합니다. 커밋의 순서(ordered)를 보장할 수 없으므로 (DAML 원장은 결국 블록체인이 아님) 타임스탬프순으로 쌓인다고 보장할 수 없습니다. 따라서 커밋 타임스탬프 (레코드 시간이라고 함)는 합리적으로 단조로운 원장 유효 시간으로 정규화됩니다. 단일성 (예 : exercises 전에 발생하는 생성)은 원장에 의해 시행됩니다.

경우에 따라 Oracle을 직접 구현하는 것이 여전히 유리할 수 있습니다. 예를 들어, 계약 시간을 되돌리기 위해 상호 합의할 수 있는 기능을 원한다면 내장 Oracle이 아닌 사용자 지정 Oracle을 가져야 한다. 그것은 위의 패턴을 이용해서 쉽게 할 수 있다.

원문 : DAML Oracles
https://discuss.daml.com/t/daml-oracles/822