Charli3 預言機運作機制

了解Charli3的Oracle:瞭解生成可靠數據的架構和機制。

本文假設讀者熟悉(E)UTXO模型,並介紹Charli3的預言機合約及其與Vasil硬分岔特色整合,包括內聯datum、參考UTXO和參考腳本。

首先,我們將檢查最基本的預言機合約之一,包括其UTXO、內聯datum、代幣和NFT,以及激勵個人積極參與數據收集的機制。然後,我們將查看一個更高級的Oracle合約,它使用多個可信數據源,並檢查其UTXO如何協同工作,提供準確、去中心化和可信賴的數據。

預言機合約的UTXOs

– 最簡單的預言機合約由4個基本UTXOs組成:

  1. 節點UTXO是負責傳輸外部區塊鏈數據。
  2. 聚合(器)UTXO儲存了合約的配置以及 Charli3 Oracle Tokens (C3)。
  3. Feed UTXO作為存儲從所有節點UTXO獲取的綜合和處理過的數據庫。
  4. 參考腳本UTXO,存儲合約的腳本。
    image
    Figure.1 最簡單的預言機合約在初始階段創建4個UTXOs

節點UTXO

現在讓我們專注於節點UTXO上。當執行開始預言機交易時,內嵌資料只包含授權更新該資料的錢包的相關資訊。持有該錢包存取權的個人或實體可以修改存儲在該資料中的信息。如圖2所示,「更新節點」交易將資料 A 更新為 B。
image
Figure 2. 「更新節點」交易調整了UTXO內嵌資料

值得注意的是,節點非同質化代幣(Node-NFT)是 UTXO 值中的唯一識別符。每個預言機合約 UTXO 都包含一個唯一識別符,可將其與可能位於相同腳本地址的其他輸出區分開來。

聚合(器)UTXO

聚合UTXO中的內聯數據包含了稱為預言機設置的協議,這些協議指定了從節點UTXO中提取和處理信息的方式和時間。例如,該合約可能要求節點按每日、每小時甚至每分鐘提供更新的數據。

UTXO的價值由聚合NFT(Aggregate-NFT)和指定數量的C3代幣組成。C3代幣作為一種信託價值,為節點 UTXO的所有者提供了獲得獎勵的機會,前提是他們能夠持續且精確地更新UTXO的信息。負責確定獎勵接收者的算法被稱為共識算法。
image
Figure 3. 聚合UTXO的資料和價值

Feed UTXO

Feed UTXO儲存共識演算法產生的資訊在其數據中。其他合約可以使用Vasil的只讀UTXO功能同時訪問此資訊,而不會遇到任何競態條件。此功能可在Oracles PlutusV2中使用。
image
Figure 4. Feed UTXO的資料和價值

參考腳本UTXO

為了降低用戶費用並防止區塊鏈膨脹,腳本可以使用參考輸入和內嵌資料在區塊鏈中存儲。每次在交易中使用時,花費交易可以引用腳本的位置並重複使用它以驗證當前的UTXO。這樣就無需在交易中攜帶腳本內容,從而實現腳本代碼的重複使用。

僅使用單個節點 UTXO 的共識演算法

透過執行簡單 Oracle 範例中的 Aggregate 交易,該合約接收一個唯一的節點UTXO,並且共識演算法會在 Feed UTXO 中反映其信息。提供信息的節點UTXO 會獲得預定的 C3 token 奬勵。

Feed UTXO 的資料現在包含最終的預言機信息,也稱為 Oracle Feed。請參考圖 5 進行視覺化呈現。第三方合約可以透過搜索包含Feed NFT(Figure 5 中稱為「Feed NFT」)的 UTXO 來訪問它。
儘管此範例合約僅涉及從節點複製並貼上信息到 Feed,但有效地展示了每個 UTXO 的合約功能。

註:為了確保去中心化和安全性,Charli3 不提供單一數據來源的合約。本小節僅為教育目的介紹 Aggregate 交易。
image
Figure 5. 該筆總和交易使用了預言機所有UTXOs並透過共識演算法計算出一個全新的Feed資料。

使用多節點的共識演算法

對於涉及多個節點UTXO 的合約(也稱為節點池),例如兩個資產之間的匯率,共識演算法通過計算所有節點的匯率的中位數來計算最終餵養。那些輸入值不超過預言機設置中定義的 MAD 和 DIV 百分比的節點將獲得獎勵。

專門的功能將用於實現對於使用中位數公式無法計算的數據類型的最高精度和準確性。
共識演算法的最終餵養,或稱為 Oracle Feed,存儲在 Feed UTXO 的資料中。如前所述,第三方合約可以通過在合約地址中尋找正確的 NFT(見圖 5)來訪問 Oracle Feed。

預言機設定

Oracle Settings儲存可以調整以符合資訊提供的重點和目標使用者需求的變數,包括:

– 相關錢包的列表,授權更新每個節點的UTXO的ID。
– 匯總交易中需要的 Node 的數據量的最小百分比。
– 一個決定 Node 的數據信息新鮮度的時間框架。
– 一個聚合交易的頻率周期。
– 一個饋送數據的百分比變化。
– 支付給每個節點操作員參與共識算法的 C3 代幣的數量。
– 一個衡量節點的基準信息與中位數的平均偏差(MAD)。
– 每個 Node 的基準信息與 MAD 之間的分歧百分比(DIV)。

設置 4 和 5 決定了聚合交易的執行方式:設置 4 是透過固定頻率,而設置 5 則是當共識算法值超過一定百分比變化時執行。

異常處理

  1. 節點停頓時間
    對於一些UTXO節點沒有定期更新其信息的情況,Oracle設置第三個設置會評估和丟棄不活躍的節點。設置第二個讓Oracle所有者指定必須具有最新信息的節點的最小百分比以觸發聚合交易。例如,如果Oracle合約開始具有10個節點UTXO,所有者可以將要求設置為至少50%的節點具有活動信息。

Charli3的Oracle和節點遍布全球,以確保不間斷的數據訪問。Charli3團隊還為每個節點和Feed設置了監控系統,在任何情況下立即發送通知。
2. 偏差值偵測
嘗試提供虛假節點信息以作弊的行為可以通過兩種機制防止。首先,提交更新節點交易到Cardano區塊鏈需要支付費用,以此減少虛假提交的動機。其次,Oracle設置7和8允許設置異常值閾值並選擇最接近中位數的值。因此,只有選定的節點數量,例如10個中的5個,才能獲得C3代幣的獎勵,進而激勵提供準確信息的節點。

Oracle合約的所有者可以通過執行“Del-nodes”交易來消除表現不佳的節點UTXO。這是一種只有合約所有者才能執行的交易,以確保合約的輸出質量。

上鏈程式

Charli3鏈上合約程式透過儲存他們的錢包ID以及代幣獎勵資訊(C3)和Oracle合約啟動交易期間產生的NFT,安全地識別合約所有者。這些細節被保存在一個Oracle資料類型中,作為驗證器的參數,以防止任何外部各方未經授權的篡改。

一個合約驗證器的有效參數可以是:

Validators' argument
oracle :: Oracle
oracle =  Oracle
      { oracleCreator = PaymentPubKeyHash
            "1a550d5f572584e1add125b5712f709ac3b9828ad86581a475902ffa"
      , oracleNFT =
          AssetClass
            ( "e36cd9189099d7bedae87e8702e86e38122a62141743e1a64a5349ff"
            , "OracleFeed")
      , aggStateNFT =
          AssetClass
            ( "e36cd9189099d7bedae87e8702e86e38122a62141743e1a64a5349ff"
            , "AggState")
      , feeToken =
          AssetClass
            ( "436941ead56c61dbf9b92b5f566f7d5b9cac08f8c957f28f0bd60d4a"
            , "C3")
      , nodeToken =
          AssetClass
            ( "e36cd9189099d7bedae87e8702e86e38122a62141743e1a64a5349ff"
            , "NodeFeed")
      }

請注意,驗證器參數存儲了NFT和代幣的代幣名稱和鑄幣策略,包括Feed UTXO(OracleNFT)和聚合UTXO(aggStateNFT)的NFT,以及各種節點UTXO(nodeToken)的N代幣。

讓我們來看看合約驗證器的簽名:

Validator signature
mkOracleValidator :: Oracle -> OracleDatum -> OracleRedeemer -> BDScriptContext -> Bool

在審查了Oracle和Datum類型後,我們為各種鏈外操作創建了不同的Redeemers類型,概述如下。

鏈下程式

預言機持有者交易

預言機的創建者可以執行以下操作,這些操作在Haskell和Python合約版本中都被實現為鏈外代碼:

– 聚合:執行 "聚合 "交易。
– 增加資金:消耗聚合UTXO來產生一個新的,增加C3代幣的數量。
– 修改預言機設定:通過改變預言機的設置值來編輯聚合UTXO的基準點。
– 添加節點:通過接收錢包ID的列表來生成新的節點UTXO,並鑄造額外的節點代幣來分配給新的UTXO。
– 刪除節點:通過燒毀屬於指定錢包ID的節點代幣來消除節點UTXO。
– 關閉預言機:合約UTXO,以及所有相關的NFT、ADA和C3代幣,被收集和消耗。在節點UTXO持有C3代幣的情況下,這些代幣被支付給其相應的節點錢包運營商。這一操作標志著合同的結束,因為沒有可用的UTXO被創建。

節點運營者交易

– 更新節點:節點操作員可以通過Update-node交易修改節點UTXO中的數據,但不能修改錢包ID或NFT信息。
– 節點獎勵:操作節點UTXO的所有者可以將收到的C3代幣作為獎勵提取到他的個人錢包。
– 聚合:執行聚合交易。
– 更新與聚合:該交易結合了Update-node和Aggregate交易,當達到執行Aggregate交易所需的UTXO比例時,可以減少卡槽時間。