Wyvern是1階去中心化交換協議。對比其他協議,例如Etherdelta、0x和Dexy是0階的,也就是每個訂單指定兩個去中心化資產的交易。
而Wyvern將訂單改為指定狀態轉換的謂詞,也就是將訂單定義為一個函數,將製造商的調用、交易對手的調用以及訂單元數據映射為布爾值。以太坊上可表示的任何資產或資產的任何組合都可以通過Wyvern訂單進行交換。
這樣設計,可以表達任何更簡單協議可以表達的命令,也可以優化gas,減少無用的調用,因組成協議組件被隔離,也有利於安全。
但也因為定義過細,對開發人員不友好,並且難以支持用戶級工具。
因此,Wyvern後期發布了v3版本,重組了協議的幾個核心組件,使部署Wyvern 的分佈式賬本的用戶能夠自由交易。
以下是Wyvern的協議功能:
斷言註冊表
訂單生成者可以檢查他們和他們的交易對手是否使用有效的註冊表。
斷言calldata
訂單中的大部分邏輯是在調用和反向調用上構造謂詞。每個訂單的靜態回調(謂詞函數)接收調用、交易對手調用和訂單元數據(以太幣值、時間戳、匹配地址)的所有參數,並且必須決定是否允許訂單匹配,如果允許,填寫多少。
Call
第一次調用由訂單製造者通過他們的代理合約執行。靜態回調接收所有參數,調用目標、調用類型和調用數據等,並且必須驗證調用是製造商願意執行的調用(例如轉移特定資產或一組資產)。
Countercall
第二次調用由交易對手執行,為方便起見,在源代碼中將其稱為“countercall”。靜態回調接收所有參數,有countercall 目標、countercall 類型和countercall 數據,並且必須驗證調用是製造商願意接受以換取他們自己的調用(例如轉移特定資產或資產集)。
斷言狀態
靜態調用在調用之後執行(如果靜態調用失敗,整個事務將被恢復),因此可以斷言特定狀態已更改,而不是斷言調用數據的屬性。
元數據
元數據包含掛單時間、掛單到期時間、反掛單掛單時間、調用中轉入的ETH、當前訂單成交值和匹配地址。
廣義部分填充
訂單簽署最大成交,靜態調用返回一個uint,如果訂單匹配,它指定更新的成交值。訂單的當前執行也可以由訂單的製造者通過交易手動設置(這也允許訂單取消)。將訂單的成交設置為非零值也會隱式授權訂單,因為部分成交訂單的授權被緩存以避免不必要的簽名檢查。
授權訂單
訂單必須始終由地址授權,該地址擁有將執行調用的代理合約。授權可以通過三種方式完成:簽名消息、預先批准和比賽時間批准。
簽名消息
授權訂單的最常見方法是在鏈下對訂單哈希進行簽名。這是無成本的,任何數量的訂單都可以被簽名、存儲、索引,也許還可以在網站或自動訂單簿上列出。為了避免取消不再需要的訂單的必要性,製造商可以在不久的將來簽署到期時間的訂單,並且只要他們希望繼續徵求交易,就可以重新簽署新訂單。
預先批准
可以通過向合約發送交易來授權訂單。這種方法可能對由智能合約構建的訂單特別感興趣,智能合約本身不能在鏈下簽署消息。鏈上授權會發出一個事件,該事件可以很容易地被將訂單包含在其數據庫中的訂單簿索引。
當有即時構建訂單(可能匹配現有的先前簽署或批准的訂單)匹配時,通過從訂單地址發送匹配交易進行授權。如果製造者打算自己發送與訂單匹配的交易,會很方便,且可以節省一點gas(因為發送交易隱含了calldata 驗證)。
構造匹配的調用數據
匹配的調用數據可以以任何方式鏈下構建。協議並不關心最終的calldata 是如何獲得的,只關心它完成了訂單的謂詞功能。在實踐中,訂單簿維護者(中繼者)可能會存儲額外的元數據以及訂單,這些訂單可用於構建可能的匹配調用數據。
不對稱
在可能的範圍內,該協議被設計為對稱的,這樣訂單不需要在任何特定的“邊”上,並限制自己與另一“邊”上的訂單匹配。
第一個不對稱是排序。必須首先執行一個調用,執行該調用可能會更改第二個調用的結果。傳入的第一個調用首先執行。
第二個不對稱是特殊情況下的以太幣。由於以太坊的設計限制,以太幣與ERC20 代幣不同,只能通過來自該賬戶的交易從一個賬戶發送。為了便於使用,Wyvern 盡可能支持特殊情況的ETH:訂單的匹配者可以選擇將值與匹配交易一起傳遞,然後將其傳遞給交易對手並作為參數傳遞給謂詞函數(可以斷言例如已發送特定數量)。
Wyvern v3的更改
訂單不能自行匹配。但來自同一製造商的兩個單獨的訂單可以相互匹配。
利用雙向調用匹配提供的額外表達能力,Wyvern v3 將協議的幾乎所有輔助方面“推出”到訂單上,而不是在交換合約中實現它們,以降低了協議的複雜性,為用戶和中繼者提供靈活性,並降低gas成本。