區塊鏈中基於數位簽章的隨機預言機

從想法到實現:我們修改現有的橢圓曲線數位簽章方案,使其具有確定性,並在此基礎上提供獲取區塊鏈內可驗證的偽隨機數的函數。

區塊鏈中基於數位簽章的隨機預言機

想法

2018 年秋季,Waves 區塊鏈包括 第一個智能合約激活,立即出現了關於獲得的可能性的問題 偽隨機數您可以信賴。

困惑這個問題,我最終得出結論:任何區塊鏈都是一個細胞,在封閉的系統中不可能獲得可信的熵源。

但我仍然喜歡一個想法:如果 隨機預言 將使用確定性演算法對使用者資料進行簽名,然後使用者將始終能夠使用公鑰驗證此類簽名,並確保結果值是唯一的。 預言機無論多麼努力,都無法改變任何事情;演算法會產生明確的結果。 本質上,使用者記錄了結果,但在預言機發布之前並不知道。 事實證明,你根本不能信任預言機,而是檢視其工作結果。 然後,如果驗證成功,這樣的簽名可以被視為偽隨機數的熵來源。

Waves區塊鏈平台使用簽名方案 埃德DSA 選項 Ed25519。 在這個方案中,簽章由值R和S組成,其中R取決於隨機值,S是根據被簽署的訊息、私鑰和與R相同的隨機數計算出來的。事實證明對於同一用戶訊息,沒有唯一的依賴關係。用戶訊息有許多有效簽名。

顯然,以其純粹的形式,這樣的簽名不能用作偽隨機數的來源,因為它是不確定的,因此很容易被預言機操縱。

但是,事實證明,實際上可以使其具有確定性。

我曾經抱有很大的希望 可驗證隨機函數 (VRF),但是在研究了硬體之後,我不得不放棄這個選擇。 儘管 VRF 提供了簽名及其證明的確定性版本,但演算法中有一個奇怪的地方,為操縱預言打開了一個黑洞。 即,在計算k值時(第5.1節)使用私鑰,用戶不知道該私鑰,這意味著用戶無法驗證 k 計算的正確性,這意味著 oracle 可以使用它需要的任何 k 值,同時維護一個對應關係的資料庫k 和簽名數據,以便始終能夠從VRF 的角度重新計算正確的結果。 如果您看到基於VRF 的繪圖而沒有公開私鑰,那麼您可以很聰明:指示需要公開金鑰,或將其排除在k 的計算之外,然後當第一個簽章出現時,私鑰將自動顯示自己。 一般來說,正如已經提到的,這是一個奇怪的隨機預言方案。

經過一番思考並爭取當地分析師的支持後,VECRO 工作計畫就誕生了。

VECRO 是可驗證橢圓曲線隨機預言機的縮寫,俄語意思是橢圓曲線上可驗證的隨機預言機。

一切都變得非常簡單;為了實現確定性,您需要在要簽署的訊息出現之前固定 R 的值。 如果 R 已提交並且是正在簽署的訊息的一部分,這進一步確保 R 在正在簽署的訊息中提交,則 S 的值由使用者的訊息唯一確定,因此可以用作偽隨機數的來源。

在這樣的方案中,R 如何固定並不重要;這仍然是預言機的責任。 重要的是,S 由使用者唯一確定,但其值在預言機發布之前是未知的。 我們想要的一切!

說到固定 R,請注意 重複使用的R 在簽署各種訊息時,它唯一地揭示了 EdDSA 方案中的私鑰。 對於預言機擁有者來說,消除重複使用 R 來簽署不同使用者訊息的可能性變得極為重要。 也就是說,如果有任何操縱或串通,預言機將始終面臨遺失私鑰的風險。

總的來說,預言機必須為使用者提供兩個功能:初始化(固定值R)和簽名(傳回值S)。在這種情況下,R、S 對是包含固定值的使用者訊息的通常可驗證簽章。值 R 和任意使用者資料。

可以說,區塊鏈的這個方案只不過是普通的方案 提交-擴展方案。 本質上,是的,就是她。 但有幾個細微差別。 首先,預言機在所有操作中始終使用相同的密鑰,例如,這在合約中使用起來很方便。 其次,如果預言機行為不當,就有丟失私鑰的風險,例如預言機允許你對結果進行採樣,那麼只需要進行兩次測試就可以找出私鑰並獲得完整的結果。訪問錢包。 第三,在區塊鏈上可本地驗證並且是隨機性來源的簽名是美麗的。

六個月來,實施的想法在我的腦海中醞釀,直到最終動力以形式出現 Waves 實驗室資助。 大筆資助意味著重大責任,這意味著該計畫將在那裡!

履行

那麼,在這個專案中 實施VECRO 在 Waves 區塊鏈上以請求-回應模式使用用戶和預言機之間的傳輸交易。 同時,在oracle帳戶上安裝了一個腳本,該腳本嚴格按照上述邏輯控制工作。 Oracle 事務得到驗證並恢復整個使用者互動鏈。 所有四筆交易都涉及驗證最終值;智能合約將它們用嚴格的驗證線程串在一起,一步步檢查所有值,不留任何操縱的空間。

再次,把它放在一邊並使其更清晰。 預言機不僅僅按照提議的方案工作。 其工作完全由已建立的區塊鏈層級控制 與智能合約緊密結合。 向左邁出一步,交易根本無法完成。 因此,如果一筆交易包含在區塊鏈中,用戶甚至不需要檢查任何東西;數百個網路節點已經為他檢查了一切。

目前,Waves 主網上有一個 VECRO 運行(你可以運行自己的,並不難,只是 看一下設定範例)。 當前程式碼在 PHP 中運行(在 波浪工具包,關於哪個 我之前告訴過你).

為了使用預言機服務,您必須:

  • 修復R;
    • 向 oracle alias init@vecr 發送至少 0.005 Waves;
    • 從預言機向用戶傳輸 1 個 R-vecr 代幣時,接收附件欄位中的 R 代碼;
  • 獲得簽名;
    • 發送至少 0.005 Waves 到 oracle 別名 random@vecr,並且還必須在附件欄位中指示先前收到的 R 代碼和附加使用者資料;
    • 從預言機向用戶傳輸 1 個 S-vecr 代幣時,接收附件欄位中的 S 代碼;
  • 使用S程式碼作為偽隨機數的來源。

目前實施的細微差別:

  • 發送到預言機的Wave作為向用戶返回交易的佣金,最多1個Wave;
  • R 代碼是「R」字元位元組和 32 位元組 base58 編碼的 R 值的串聯;
  • 附件中的R代碼在前,用戶資料在R代碼之後;
  • S 代碼是字元「S」的一個位元組和 S 的 32 位元組 Base58 編碼值的串聯;
  • S是模除的結果,因此不能將S用作完整的256位偽隨機數(這個數字可以認為是最大的252位偽隨機數);
  • 最簡單的選擇是使用 S 程式碼雜湊作為偽隨機數。

接收S程式碼範例:

從技術角度來看,預言機已經完全準備好工作,您可以放心使用它。 從一般使用者使用的角度來看,缺乏方便的圖形介面,這個還得等待。

我很樂意回答問題並接受評論,謝謝。

來源: www.habr.com

添加評論