* 本文由Starcoin社區原創,點擊 查看原文,
為什么需要Oracle?
區塊鏈發展至今,遇到過很多困難,這些困難的背后往往催生出更多的創新,鏈上如何獲取真實世界的資料?合約如何捕捉市場的價格波動?鏈游如何保證不可預測性?類似的很多疑問困擾著我們,Oracle(預言機)應運而生,Oracle不僅打通了鏈上與鏈下,也在公鏈之間開了一扇門,極大的拓展了區塊鏈的應用場景,所以Oracle就像一座橋梁,讓不同地方的資料相互之間建立起聯系,
Oracle已成為公鏈生態中必備的一個基礎組件,Starcoin也定義了一套標準的Oracle協議,它就像衛星一樣,將星球上的資料收集起來,再通過Move合約分發到其他的地方,創造豐富的價值,

Starcoin的標準Oracle協議
Starcoin通過智能合約語言Move,在Stdlib中設計了一套標準的Oracle協議,擁有以下特點:
- 可擴展
- 開放的資料源
- 安全可靠
- 簡潔高效
該協議功能非常完備,設計上也很精煉和巧妙,我們通過原始碼來深入地了解一下:
1. 靈活的OracleInfo
struct OracleInfo<OracleT: copy+store+drop, Info: copy+store+drop> has key {
///The datasource counter
counter: u64,
///Ext info
info: Info,
}
public fun register_oracle<OracleT: copy+store+drop, Info: copy+store+drop>(_sender: &signer, info: Info) acquires GenesisSignerCapability
- OracleInfo是面向泛型編程的,通過泛型引數支持任意型別的Info,有非常良好的擴展性,
- OracleInfo只有key的ability,既不能copy產生重復型別的OracleInfo實體,也不能讓已有的OracleInfo實體憑空drop,安全可靠,
- 沒有使用陣列存盤,并且任何賬號都能夠通過register_oracle函式注冊OracleInfo,
2. 豐富的DataSource
struct DataSource<OracleT: copy+store+drop, ValueT: copy+store+drop> has key {
/// the id of data source of ValueT
id: u64,
/// the data version counter.
counter: u64,
update_events: Event::EventHandle<OracleUpdateEvent<OracleT, ValueT>>,
}
public fun init_data_source<OracleT: copy+store+drop, Info: copy+store+drop, ValueT: copy+store+drop>(sender: &signer, init_value: ValueT) acquires OracleInfo
- 任何賬號都可以呼叫init_data_source函式成為DataSource,
- 更新憑證UpdateCapability等資料存盤在當前賬號下,擁有明確的所有權,
3. 合理的權限管理
struct UpdateCapability<OracleT: copy+store+drop> has store, key {
account: address,
}
struct GenesisSignerCapability has key{
cap: Account::SignerCapability,
}
- 定義了兩種不同的權限:OracleInfo注冊的權限GenesisSignerCapability、OracleFeed更新的權限UpdateCapability,
- 只有GENESIS_ADDRESS擁有GenesisSignerCapability,通過外借的方式,讓所有人都能注冊OracleInfo,
- 任何賬號都可以有UpdateCapability,任何有UpdateCapability的賬號都能更新對應型別的OracleFeed資料,
4. 安全的OracleFeed
struct DataRecord<ValueT: copy+store+drop> has copy, store, drop {
///The data version
version: u64,
///The record value
value: ValueT,
///Update timestamp millisecond
updated_at: u64,
}
struct OracleFeed<OracleT: copy+store+drop, ValueT: copy+store+drop> has key {
record: DataRecord<ValueT>,
}
public fun update<OracleT: copy+store+drop, ValueT: copy+store+drop>(sender: &signer, value: ValueT) acquires UpdateCapability, DataSource, OracleFeed
public fun update_with_cap<OracleT: copy+store+drop, ValueT: copy+store+drop>(cap: &mut UpdateCapability<OracleT>, value: ValueT) acquires DataSource,OracleFeed
- DataRecord存盤真實資料,有嚴格的version版本控制和updated_at鏈上時間戳,
- OracleFeed只有key的ability,不能copy和drop,安全可靠,
- OracleFeed<OracleT: copy+store+drop, ValueT: copy+store+drop>的當前賬號下唯一,只保留最新的資料,避免讀到過期的資料,
- OracleFeed通過update函式和update_with_cap函式更新,不管是哪個函式,都需要UpdateCapability,避免被別人誤更新,保障資料安全,
Starcoin的標準Oracle協議在結構上保持簡潔高效,很好地應用了Move的優勢,擁有非常好的安全性和可擴展能力,
Starcoin的Oracle場景討論
前面我們重點介紹了標準Oracle協議的實作細節,接下來拋磚引玉,探討一下Starcoin的Oracle可能的應用場景,

1. 實時價格
用戶可以從不同的資料源采集加密貨幣的時間和價格資料,通過Oracle以接近實時的方式提交到鏈上,其他合約可以通過篩選資料源,直接使用這些資料,或者聚合處理之后使用這些資料,非常的方便和靈活,
2. 亂數和鏈游
我們都知道在輸入確定的情況下,智能合約必須保證所有人的執行結果是一致的,所以鏈上很難提供類似亂數的機制,而通過Oracle,用戶可以將 VRF 隨機資料提交到鏈上,這樣既能驗證亂數的正確性,又能讓合約擁有隨機的能力而增加更豐富的場景,
以游戲為例,不可預測性是游戲具有吸引力的重要的因素之一,游戲通過Oracle獲取亂數,可以保障游戲的不可預測性,
當然,亂數還有更多的應用場景,比如紅包、模擬不確定的環境等等,
3. 鏈下復雜計算
由于Gas、單執行緒等限制,智能合約中不能有復雜的計算邏輯,這會讓智能合約的場景非常受限,如果通過某種類似Proof的方案,讓復雜的計算在鏈下執行,然后把結果和Proof提交到鏈上的Oracle中,提供給其他合約使用,會大大降低智能合約的設計難度,同時,能夠豐富智能合約的應用場景,
4. 保險理賠
保險是一個重要的金融場景,但是也一直存在各種不規范的現象,比如騙保等等,智能合約即法律,如果使用Oracle將事件上鏈,再通過合約來鑒定和執行,將是一個很好的結合,例如,常見的航班延誤險、教育金保險等等,都能通過這種方式,規范市場,提升效率,
5. 預測市場
市場是瞬息萬變的,任何鏈下的事件產生,都可以通過Oracle快速映射到鏈上,智能合約通過獲取Oracle提供的資料,觸發預測市場執行結算等操作,例如,體育競技結果、黃金價格變化、電競等等,
Starcoin的PriceOracle實作
我們深入了解了Starcoin標準Oracle協議的設計,然后探討了其豐富的應用場景,接下來,我們以市場價格的場景為例,了解一下如何在標準的Oracle協議之上,將特定場景的業務邏輯添加進去,實作一個完整的Oracle應用,
Starcoin在標準的Oracle協議之上封裝了一個PriceOracle模塊,針對價格場景做了官方的實作,PriceOracle也是一個通用的合約,能夠注冊任意型別的數字資產,然后,Starcoin在PriceOracle之上,實作了一個STCUSDOracle合約,注冊了一對貨幣組合STC和USDT,再通過PriceOracleScript合約,將STC對應USD的價格注冊到鏈上的Oracle中,最后,任何人可以通過PriceOracleAggregator聚合器對價格進行篩選、過濾,將聚合得到的價格應用到自己的產品中,接下來,我們來深入的分析一下PriceOracle、STCUSDOracle以及PriceOracleAggregator的原始碼,

1. PriceOracle
PriceOracle建立在標準的Oracle協議之上,是針對價格場景實作的一個通用合約,也就是說,任何Price形態的資料,都可以通過PriceOracle上鏈,
struct PriceOracleInfo has copy,store,drop{
scaling_factor: u128,
}
在標準的Oracle協議中,OracleInfo有一個泛型引數是Info: copy+store+drop,在PriceOracle中,Info對應的具體實作是PriceOracleInfo,里面只包含了計算因子scaling_factor,所以PriceOracleInfo必須有copy、store、drop這3種ability,這是Info這個泛型引數的要求,
在明確了PriceOracleInfo的資料定義之后,可以呼叫Oracle合約的register_oracle函式注冊PriceOracleInfo,還可以呼叫Oracle的init_data_source和update將資料上鏈,
PriceOracle是標準Oracle協議上面的一個應用,所以繼承了Oracle協議所有的特性,使用非常便捷,
2. STCUSDTOracle
如果說PriceOracle是價格的通用合約,那么STCUSDTOracle合約是價格場景具體實作的一個產品,
struct STCUSD has copy,store,drop {}
我們看到,在標準的Oracle協議中,OracleInfo除了Info,還有另外一個泛型引數OracleT: copy+store+drop,OracleT表示一對貨幣組合,Info表示資訊,PriceOracle只實作了PriceOracleInfo,OracleT在PriceOracle也是泛型引數,而STCUSDTOracle合約的最大作用就是確定OracleT的型別為STCUSD,當然,任何人可以實作屬于自己的一對貨幣組合合約,定義自己的產品,
3. PriceOracleScript
PriceOracleScript是為交易定義的一些腳本,這是一個重要的用戶入口,主要用于更新Oracle資料,包括:
- 注冊任意一對貨幣組合OracleT的PriceOracleInfo
- 更新任意一對貨幣組合OracleT的最新資料
4. PriceOracleAggregator
PriceOracleAggregator合約是一個聚合器,對Oracle中的資料進行篩選、過濾,然后將聚合之后的價格回傳給用戶,將鏈上實時價格應用到任何需要的地方,
總結
Starcoin不僅僅實作了一個標準的Oracle協議,而是實作了一套非常完整的Oracle工具鏈,
- 從技術的角度分析,從最基礎的標準Oracle協議,到針對價格場景設計的PriceOracle,最后到用戶的交易入口,任何環節都做到了可快速擴展,并且安全可靠,
- 從應用場景的角度分析,Starcoin的Oracle擁有廣闊的應用場景,例如實時價格、比賽結果、游戲、保險理賠、復雜鏈下計算結果等等,包括任何場景的有價值的資料,
- 從產品落地的角度分析,協議上簡潔高效,資料源和資料都完全開放,任何人都可以提交自己的資料,任何人只需要通過聚合器就能得到實時的鏈上資料,使用非常的方便,
我們有理由相信Starcoin的Oracle非常的想象力和競爭力,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/336295.html
標籤:區塊鏈
上一篇:十大交易規則,期貨界公認圣經
