"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
이 특별한 이유는 무엇입니까?
- 빠르게 동작합니다.
- 실제로 분산 시스템에는 단 한번만 수행하는것은 없습니다.(분산환경 각 개별로 수행)
- 대부분의 개발자는 시스템 시간으로 작업하는 데 익숙합니다.
이런 항목을 조정하기 위해 DAML 원장은 합의의 일부로 커밋에 대한 타임스탬프를 설정해야 합니다. 커밋의 순서(ordered)를 보장할 수 없으므로 (DAML 원장은 결국 블록체인이 아님) 타임스탬프순으로 쌓인다고 보장할 수 없습니다. 따라서 커밋 타임스탬프 (레코드 시간이라고 함)는 합리적으로 단조로운 원장 유효 시간으로 정규화됩니다. 단일성 (예 : exercises 전에 발생하는 생성)은 원장에 의해 시행됩니다.
경우에 따라 Oracle을 직접 구현하는 것이 여전히 유리할 수 있습니다. 예를 들어, 계약 시간을 되돌리기 위해 상호 합의할 수 있는 기능을 원한다면 내장 Oracle이 아닌 사용자 지정 Oracle을 가져야 한다. 그것은 위의 패턴을 이용해서 쉽게 할 수 있다.
원문 : DAML Oracles
https://discuss.daml.com/t/daml-oracles/822
'포럼 번역' 카테고리의 다른 글
플랫 트랜잭션 스트림(flat transaction stream)에서 트랜잭션 내 이벤트 순서 지정 (0) | 2020.09.21 |
---|---|
DABL은 다른 배포 플랫폼과 어떻게 다릅니까? (0) | 2020.09.21 |
DAML에는 자체 상호 운용성 계층이 있습니까? 아니면 Canton DAML이 상호 운용성 계층입니까? (0) | 2020.09.21 |
명령 완료(completion service) 스트림에서 OK 해석 (0) | 2020.09.21 |
복수의 명령을 단일 submission로 제출했을때 트랜잭션 결과 (0) | 2020.09.21 |