一、Seaport簡介
近期,NFT市場OpenSea宣布推出全新Web3市場協議Seaport協議,用于安全高效地買賣NFT。本文將深度分析其關鍵業務實現和接口實現。SeaPort官方文檔https://docs.opensea.io/v2.0/reference/seaport-overview,可配合查閱,進一步加深理解。
Uniswap用開源去中心化交易改變了加密貨幣交易的游戲規則,這是我們現在所知的2020年DeFiSummer的開始,也帶來了DEX和DeFi的大規模增長和創新。OpenSea的新協議Seaport或許也有改變NFT交易游戲規則的潛力,這也是我們分析Seaport協議的原因。
Seaport是一個市場合約,用于安全有效地創建和執行ERC721和ERC1155代幣的訂單。每個訂單包含任意數量的供應商愿意提供的物品以及任意數量的必須連同其各自的接收者一起接收的物品。Seaport協議的6大關鍵點,以及它對NFT領域的意義:開源代碼:有了Seaport協議,任何人都可以使用該協議構建一個NFT市場,因為它是去中心化和開源的。在未來幾年,我們應該會看到更多的NFT市場建立起來。更多的競爭=更好+更快的創新去中心化:OpenSea說這個協議沒有合約所有者,任何人都可以更新或生成代碼。交易新范式:與一些平臺只能用加密貨幣換取NFT不同,Seaport協議允許用戶以一系列新方式獲取NFT,投標人可以捆綁不同的資產以換取NFT。交易特定的NFT:當交易NFT時,你也可以設置NFT必須具備的特定“條件”。荷蘭式拍賣列表:在Seaport協議中,你可以設置一個開始和結束價格,表明你希望拍賣持續多長時間。該列表將降低價格,直到找到買家。更高的安全性:OpenSea正在進行為期兩周的協議審計競賽,獎金總額為100萬美元。任何開發人員都可以審核代碼,提交他們發現的評審和錯誤,并獲得獎勵。
二、關鍵業務實現
1、NFT訂單
每一個訂單都包含11個關鍵組件:
offerer訂單的報價者提供了所有的供應代幣并且必須親自執行訂單或者通過簽名或列舉鏈上訂單來批準訂單。
zone訂單的區域是附加到訂單的可選輔助帳戶,具有兩個額外的權限:
該區域可以通過調用cancel來取消命名為該區域的訂單。。
“受限”訂單必須由區域或報價者執行,或者必須通過調用區域上的isValidOrder或isvalidOrderIncludingExtraData視圖函數來獲得批準。
offer報價包含可以從報價者帳戶轉移的一系列代幣,其中每個代幣由以下組件組成:
itemType指定代幣類型,有效類型包括Ether、ERC20、ERC721、ERC1155、ERC721、有“條件(criteria)”的ERC721以及有“條件(criteria)”的ERC1155。
token指定代幣合約的賬戶地址。
identifierOrCriteria表示ERC721或ERC1155代幣標識符,或者在基于條件的代幣類型的情況下,表示由代幣的有效代幣標識符集合組成的merkle根。對于Ether和ERC20類型,該值會被忽略,并且對于基于條件的代幣類型,可以將值設置為0以允許任何標識符。
美股開盤上漲 納指漲0.94%:金色財經報道,美股開盤上漲,道指漲0.82%,納指漲0.94%,標普500指數漲0.88%。此前美國4月非農就業人數和時薪數據均強于預期,美聯儲6月維持利率不變的概率為96.1%。[2023/5/5 14:45:30]
startAmount表示如果在訂單激活時完成訂單所需要的相關代幣的數量。
endAmount表示如果在訂單到期時執行訂單所需要的相關代幣的數量。如果此值與startAmount不同,則根據訂單激活后經歷的時間線性計算出實際的數量。
consideration包含為完成訂單而必須接收的代幣數組。它包含所有與所提供代幣相同的組件,并且還包括一個用于接收每個代幣的recipient組件。該數組可以由執行者在訂單執行時進行擴展,以支持“小費”。
orderType訂單類型,根據兩個不同的偏好,指定訂單的四種類型之一,:
FULL表示不支持部分填充,而PARTIAL允許填充訂單中的一部分,注意每個代幣必須被提供的分數完全整除。
OPEN表示任意賬戶都可以提交執行訂單的調用,而RESTRICTED則需要訂單必須由報價者或訂單所在區域執行,或者在區域上調用isValidOrder或isValidOrderIncludingExtraData視圖函數時返回表示訂單被批準的神奇的值。
startTime表示訂單激活時的區塊鏈時間。
endTime表示訂單到期的區塊鏈時間。該值與startTime與每個代幣的startAmount和endAmount一起使用以得出它們的當前數量。
zoneHash表示一個任意的32字節值,當執行受限訂單時,該值將提供給區域,該區域在確定是否是授權訂單時可以使用該值。
salt表示訂單的任意熵源。
conduitKey是一個bytes32類型的值,表示在執行轉移時應將哪個渠道(conduit)用作代幣批準的來源。默認情況下,報價方將直接向Seaport授予ERC20、ERC721和ERC1155代幣批準,以便它可以在執行期間執行訂單指定的任何轉移。相反,選擇使用渠道的報價者將授予與提供的渠道密鑰相對應的渠道合約的代幣批準,然后Seaport指示該渠道轉移相應的代幣。
nonce表示必須與給定報價者的當前隨機數匹配的值。
2、訂單執行
訂單通過以下4種方式中的一種來執行:
調用兩個“標準”函數fulfillOrder和fulfillAdvancedOrder中的一個,并且構造第二個隱含訂單,同時其調用者作為報價者(offerer),已執行訂單的對價(consideration)作為報價(offer),已執行訂單的報價作為對價。所有報價代幣將從訂單報價者轉移到執行者,然后所有對價代幣將從執行者轉移到指定的接收者。
調用"基本"函數fulfillBasicOrder,并提供六種基本路線類型中的一種,將從組件子集派生要執行的訂單,假設相關訂單符合以下條件:
Faruqi & Faruqi正調查Coinbase因韋爾斯通知造成投資者損失達5萬美元的潛在索賠人:金色財經報道,美國國家證券律師事務所 Faruqi & Faruqi 正在調查Coinbase因韋爾斯通知造成投資者損失達5萬美元的潛在索爾名單,其合伙人James Wilson鼓勵在投資Coinbase的股票或期權而蒙受損失超過5萬美元的投資者直接聯系他。2023年3月22日,Coinbase 在一份監管文件中表示已收到美國證券交易委員會的韋爾斯通知(Wells Notice),其中稱美國證券交易委員會工作人員已做出“初步決定”,建議對其采取執法行動違反聯邦證券法。(prnewswire)[2023/4/30 14:36:05]
該訂單僅包含一個報價代幣,并且包含至少一個對價(consideration)代幣。
該訂單僅包含一個ERC721或ERC1155代幣,并且該代幣不是基于條件的。
訂單的報價者是第一個對價代幣的接收者。
所有其他代幣都具有相同的以太幣或ERC20項目類型和代幣。
該訂單不提供以以太幣作為其項目類型的項目。
每個項目上的startAmount必須與該項目的endAmount匹配。
所有“忽略”的項目字段都設置為空地址或零。
如果訂單中有ERC721項目,則該項目的數量為.1
如果訂單有多個對價(consideration)項目,且除了第一個對價項目以外的所有對價項目與報價項目的項目類型相同,報價項目數量不小于除了第一個對價項目數量外的所有對價項目數量之和。
調用兩個“可用執行”函數中的一個,并且提供一組訂單與一組執行聲明,其中的執行聲明指定哪些報價項目可以聚合到不同的轉移中,相應地哪些對價項目可以聚合在一起,以及其中已經取消的訂單是因為時間無效,或者已經完全成交的訂單將被跳過,而不會導致其余可用訂單回滾。此外,一旦鎖定maximumFulfilled可用訂單,剩余的所有訂單都將被跳過。與標準執行函數類似,所有報價項目將從各自的報價者轉移到執行者,然后所有對價項目將從執行者轉移到指定的接收者。
調用兩個“匹配”函數中的一個,并且提供一組明確的訂單以及一組執行,該執行指定了哪些報價項目應用于哪些對價項目。請注意,以這種方式執行的訂單沒有明確的執行者;相反,Seaport將簡單地確保每個訂單的需求一致。
雖然標準方法在技術上可用于執行任何訂單,但在某些情況下存在關鍵的效率限制:
與簡單的“熱路徑(hotpath)”的基本方法相比,它需要額外的調用數據。
它要求執行者批準每個對價項目,即使對價項目可以使用報價項目來執行。
它可能導致不必要的轉移,而在“匹配”情況下,這些轉移可以減少到更小的集合。
3、檢查余額和批準交易
創建報價時,應檢查以下要求以確保訂單可以執行:
報價者應在所有報價項目中有足夠的余額。
Coinbase Prime與Talos合作推動機構用戶的訪問:金色財經報道,Coinbase Prime 與 Talos 達成合作協議,Coinbase Prime 將為 Talos 客戶提供現貨流動性和托管服務,Coinbase Prime 客戶能夠訪問 Talos 的交易產品。
此前報道,Talos 于 2022 年 5 月宣布以 12.5 億美元估值完成 1.05 億美元 B 輪融資,General Atlantic 領投,花旗集團、富國銀行、a16z 等參投。[2023/4/26 14:28:29]
如果訂單未指明使用渠道,則報價者應為所有提供的ERC20、ERC721和ERC1155項目的Seaport合約設置足夠的批準。
如果訂單確實指明了使用渠道,則報價者應為所有提供的ERC20、ERC721和ERC1155項目的相應渠道合約設置足夠的批準。
執行基本訂單時,需要檢查以下要求以確保訂單可以執行:
需要執行上述檢查以確保報價者仍有足夠的余額和批準。
執行者應該對所有對價項目有足夠的余額,除了那些項目類型與訂單提供的項目類型相匹配的項目——例如,如果執行的訂單提供ERC20項目,并且要求向報價者提供ERC721項目并且向另一個接受者提供相同的ERC20項目,那么執行者需要擁有ERC721項目,但不需要擁有ERC20項目,因為它將來自報價者。
如果執行者不選擇使用渠道,他們需要為已執行訂單上所有的ERC20、ERC721和ERC1155對價項目設置足夠的Seaport合約批準,項目類型與訂單提供的項目類型匹配的ERC20項目除外。
如果執行者確實選擇使用渠道,則他們需要為已執行訂單上的所有ERC20、ERC721和ERC1155對價項目為其各自的渠道設置足夠的批準,項目類型與訂單提供的項目類型匹配的ERC20項目除外.
如果已執行的訂單將以太幣指定為對價項目,則執行者必須能夠將這些項目的總金額提供為msg.value
執行標準訂單時,需要檢查以下要求以確保訂單可以執行:
需要執行上述檢查以確保報價者有足夠的余額和批準。
在收到所有的報價項目后,執行者應該對所有的報價項目有足夠的余額——例如,如果執行的訂單提供了ERC20項目,并且需要向報價者提供ERC721項目,并且向另一個接收者提供相同的ERC20項目,其數量小于或等于提供的數量,執行者不需要擁有ERC20項目,因為它將最先從報價者處接收到。
如果執行者不選擇使用渠道,他們需要為已執行訂單上的所有ERC20、ERC721和ERC1155對價項目的Seaport合約設置足夠的批準。
如果執行者確實選擇使用渠道,則他們需要為已執行訂單上的所有ERC20、ERC721和ERC1155對價項目其各自的渠道設置足夠的批準。
如果已執行的訂單將以太幣指定為對價項目,則執行者必須能夠將這些項目的總數量提供為msg.value
美聯儲:向銀行、儲蓄協會、信用合作社和其他合格的存款機構提供最長一年的貸款:金色財經報道,美聯儲表示,新的融資計劃將通過創建新的銀行期限融資計劃(BTFP)提供,向銀行、儲蓄協會、信用合作社和其他合格的存款機構提供最長一年的貸款,以美國國債、機構債務和抵押貸款支持證券以及其他合格資產為抵押。這些資產將按面值計價。BTFP將成為高質量證券的額外流動性來源,消除了機構在壓力時期迅速出售這些證券的需要。
此外,美國財政部稱,美國財長耶倫和其他官員將繼續密切關注局勢,以及更廣泛的銀行體系的健康狀況,我們的經濟持續強勁,經濟狀況良好。一些機構存在與硅谷銀行類似的問題,目前聯邦存款保險公司的存款保險基金超過1000億美元,足以覆蓋所有硅谷銀行和Signature Bank的存款金額。[2023/3/13 12:59:23]
在執行一組匹配訂單時,需要檢查以下要求以確保訂單可以執行:
作為執行的一部分執行,執行采購ERC20、ERC721或ERC1155項目的每個帳戶必須在觸發執行時在Seaport或指定的渠道上具有足夠的余額和批準。請注意,先前的執行可能會為后續執行提供必要的余衡。
涉及以太幣的所有執行的總和必須以msg.value的形式提供.請注意,提供者和接收者是同一帳戶的執行將從最終執行集中被過濾掉。
部分成交
在構建訂單時,報價者可以選擇通過設置適當的訂單類型來啟用部分成交。然后,支持部分執行的訂單可以在相應訂單的某一部分中執行,從而允許后續執行繞過簽名驗證。總結一下部分填充的幾個關鍵點:
當創建支持部分成交的訂單或確定這些訂單要成交的部分時,訂單上的所有項目數量必須能被提供的部分項目數量完全整除。
如果要填寫的所需部分會導致要填寫的訂單數量超過全部訂單金額,則該部分將減少為剩余要填寫的數量。這適用于部分填充嘗試和完全填充嘗試。如果不需要這種行為,則執行者可以使用“基本”訂單方法,或使用“匹配”訂單方法,并明確提供一個要求收到全部所需金額的訂單。
舉例來說:如果一個執行者嘗試執行訂單的1/2,但另一個執行者首先執行訂單的3/4,則原始執行者最終將執行訂單的1/4。
如果部分可成交訂單上的任一項目指定了不同的startAmount和endAmount,則在確定當前價格之前,該分數將應用于這兩個數量。這確保了在構建訂單時可以選擇完全可分的金額,而不依賴于最終完成訂單的時間。
部分成交可以與基于條件的項目進行組合,以支持構建提供或接收多個項目的訂單,否則這些項目將無法部分成交。
舉個例子:報價者可以創建一個部分可成交的訂單,為給定集合中最多10個ERC721項目提供最多10個ETH;然后,任何執行者都可以執行該訂單的一部分,直到它被完全執行。
5、業務關鍵步驟
5.1執行訂單
當通過fulfillOrder或fulfillAdvancedOrder來執行訂單時:
計算訂單哈希值
Binance已拒絕投資Genesis,因擔心部分業務會產生利益沖突:金色財經報道,Watcher.Guru發推特透露,“Binance拒絕投資Genesis。”
知情人士透露,Genesis已與加密交易所幣安接觸,希望獲得投資,并競購其貸款賬目。幣安決定不投資,因為擔心Genesis的一些業務可能會在未來產生利益沖突。[2022/11/22 7:55:00]
計算報價項目和對價項目的哈希值
檢索報價者的當前計數器
計算訂單哈希值
執行初始化校驗
確保當前時間在訂單有效時間內
確保調用者對于當前訂單類型是有效的;如果訂單類型收到限制且調用者不是offerer或者zone,調用zone判斷訂單是否有效
檢索并更新訂單狀態
確保訂單未被取消
確保訂單沒有被全部執行
如果訂單是部分執行的,如有必要,減少提供的執行數量,以免訂單被過度執行
若訂單簽名尚未驗證,則驗證訂單簽名
根據偏好+可用金額(preference+availableamount)確定要執行的分數
更新訂單狀態
確定每個項目的金額
比較初始金額startAmount和結束金額endAmount
若相等,將執行分數應用于該金額,確保結果是整數,然后使用該結果
若不等,對這兩個金額都應用執行分數,確保兩個結果都是整數,然后根據當前時間找到這兩個結果的現行擬合值
應用條件解析器
確保每一個條件解析器都應用于一個基于條件的訂單項目
如果項目具有一個非零的條件根值(anon-zerocriteriaroot),確保為每個項目提供的標識符是有效的
更新每個項目的類型和標識符
確保所有剩余的項目都不是基于條件的項目
觸發OrderFulfilled事件
包括更新的項目
將報價項目由報價者轉移到調用者
使用渠道或Seaport直接獲得批準,具體取決于訂單的類型
將對價項目有調用者轉移到對應的接受者
使用渠道或Seaport直接獲得批準,具體取決于執行者聲明的偏好
5.2匹配訂單
當通過matchOrders或者matchAdvancedOrders來匹配一組訂單時,步驟1到6幾乎完全相同,但針對每個提供的訂單執行。從這里開始,執行與上面的標準執行不同:
應用執行
確保每次執行都涉及一個或多個報價項目和一個或多個對價項目,所有這些項目都具有相同的類型和代幣,并且每個報價項目具有相同的批準源以及每個對價項目具有相同接受者
將每個報價項目和對價項目的金額減少到零,并跟蹤其總減少金額
比較每個項目的總金額,并將剩余金額加回相應訂單一側的第一個項目
為每個成交返回一個執行
掃描每個對價項目并確保沒有一個對價項目仍然有非零的剩余金額
作為每次執行的一部分進行轉賬
根據原始訂單類型,直接使用渠道或Seaport獲得批準
忽略to==from或amount==0時的每次執行
三、關鍵接口
Seaport是一個通用的ETH/ERC20/ERC721/ERC1155市場。它最大限度地減少了外部調用,并為普通路由提供了輕量級的方法,以及更靈活的方法來組合高級訂單。
ConsiderationInterface包含Seaport的所有外部函數接口。
fulfillBasicOrder
執行基本訂單,僅支持Ether與ERC721之間的交易。
實現邏輯
提取訂單類型和基本訂單路由,并且對其進行校驗
準備執行基本訂單添加重入鎖校驗時間正確檢驗參數正確計算并校驗訂單的哈希值更新訂單狀態
若使用了渠道,則根據訂單路由導出渠道
根據訂單路由,執行原生代幣以及ERC721代幣的轉賬,完成訂單
刪除重入鎖
fulfillOrder&fulfillAdvancedOrder
fulfillOrder執行普通訂單,不支持訂單部分執行,不支持條件解析器;普通訂單作為特殊的高級訂單進行執行。
fulfillAdvancedOrder執行高級訂單。
實現邏輯
添加重入鎖
_validateOrderAndUpdateStatus:根據參數,驗證訂單,更新狀態并計算訂單哈希值orderHash、需要執行訂單的分子numerator和分母denominator時間校驗:startTime<=block.time<=endTime分子與分母校驗:
numerator<=denominator&&denominator!=0;
若numerator==denominator,需要支持部分執行(SupportPartialFills)
對價項目長度校驗以及計算訂單哈希值orderHash:
訂單長度校驗:orderParameters.consideration.length>=orderParameters.totalOriginalConsiderationItems,即參數中consideration數組實際長度要大于或等于參數中直接傳遞的原始對價項目總數
計算訂單哈希值orderHash
校驗高級訂單的有效性:訂單類型為2或3要求zone或offerer是caller或者zone批準。校驗訂單狀態orderStauts=_orderStatus,保證訂單沒有被取消并且是可執行的
訂單未取消,即:保證orderStauts.isCancelled==false
訂單可執行,即:若orderStatus.numerator!=0,保證orderStatus.numerator<orderStatus.denominator。
校驗訂單簽名,即若orderStatus.isValidated==false,則調用_verifySignature函數計算需要執行訂單的分子fillNumerator和分母fillDenominator更新狀態變量orderStatus
_applyCriteriaResolvers:用條件解析器,對每個生成的訂單類型以及條件解析器的綁定進行校驗,確保提交的待執行訂單是有效的
_applyFractionsAndTransferEach:以指定的分數值執行每個項目的轉賬
_emitOrderFulfilledEvent:發出一個表明訂單已完成的事件。
刪除重入鎖
fulfillAvailableOrders&fulfillAvailableAdvancedOrders
fulfillAvailableOrders執行可用普通訂單,不支持訂單部分執行,不支持條件解析器;可用普通訂單作為特殊的可用高級訂單進行執行
fulfillAvailableAdvancedOrders執行可用的高級訂單
實現邏輯
_validateOrdersAndPrepareToFulfill:校驗訂單、更新其狀態、通過先前填充的分數減少金額、應用條件解析器并觸發OrderFulfilled事件。添加重入鎖聲明并設置一個錯誤緩沖區變量,指明任何本地報價項目的狀態。循環遍歷每一個訂單,校驗訂單,更新每一個訂單中的參數:
_validateOrderAndUpdateStatus:根據參數,驗證訂單,更新狀態并計算訂單哈希值orderHash、需要執行訂單的分子numerator和分母denominator
循環遍歷訂單中的每一個報價項目,更新報價項目中的startAmount和endAmount
循環遍歷訂單中的每一個對價項目,更新對價項目中的startAmount和endAmount
校驗錯誤緩沖區變量_applyCriteriaResolvers:應用條件解析器,對每個生成的訂單類型以及條件解析器的綁定進行校驗,確保提交的待執行訂單是有效的聚合已使用的報價和對價項目并執行轉賬觸發OrderFulfilled事件
_executeAvailableFulfillments:完全或部分執行通過了校驗的訂單,每個訂單具有任意數量的要約和考慮項目,并執行轉移。任何當前未激活、已完全成交或已取消的訂單都將被忽略。然后,剩余的報價和考慮項目將在可能的情況下聚合,如所提供的報價和考慮組件數組所示,并且聚合的項目將分別轉移到履行者或每個預期的接收者。請注意,失敗的項目轉移或訂單格式問題將導致整個批次失敗。為每一個訂單的報價和對價項目的執行分配一個Execution結構,構造為一個Execution結構數組executions,任何當前未激活、已完全成交或已取消的無效訂單都將被忽略。校驗executions的長度對executions中的每一個Execution結構對象進行校驗,過濾掉當前未激活、已完全成交或已取消的所有訂單。_performFinalChecksAndExecuteOrders:對高級訂單以及executions進行最后的校驗,然后執行訂單,完成執行轉賬,刪除重入鎖。
matchOrders&matchAdvancedOrders
matchOrders:對普通訂單中的報價和對價項目按參數fulfillments提供的報價組件分配給對價組件的條件求進行匹配然后執行,不支持訂單部分執行,不支持條件解析器;普通訂單作為特殊的高級訂單進行處理
matchAdvancedOrders:對高級訂單中的報價和對價項目按參數fulfillments提供的報價組件分配給對價組件的要求進行匹配然后執行
實現邏輯
_validateOrdersAndPrepareToFulfill:校驗訂單、更新其狀態、通過先前填充的分數減少金額、應用條件解析器并觸發OrderFulfilled事件。若有無效訂單,則回滾。
_fulfillAdvancedOrders:在驗證、調整金額和應用條件解析器之后,執行高級訂單為每一個訂單的報價和對價項目的執行分配一個Execution結構,構造為一個Execution結構數組executions循環遍歷參數fulfillments,將executions中的每一個元素對應到fulfillments的每一個元素,若報價人者和接受者是相同的,則跳過。_performFinalChecksAndExecuteOrders:對高級訂單以及executions進行最后的校驗,然后執行訂單,完成執行轉賬,刪除重入鎖。
來源:金色財經
Tags:ORDFILLFISEANORD幣hfil幣最新消息spellfire幣為什么跌起來沒完Search Engine
BTC向上突破震蕩區間,來到20000附近壓力,關注是否能突破且站穩20000上方,本周能否順利開啟反彈?BTC周線級別,KDJ值13附近粘合,MACD低位死叉,K線觸及18600附近反彈.
1900/1/1 0:00:00SAFEIS數據顯示,受TERRA生態崩塌和行情持續暴跌極端行情等多種因素影響,六月份,機構暴雷、流動性危機,資產清算等事件頻發,損失之大,難以估量,僅僅攻擊事件損失就超過1億2千萬美元.
1900/1/1 0:00:007月3日行情解析: 周末行情一如既往的震蕩運行,行情走勢十分糾結,但不難看出,大趨勢還是偏弱,行情隨時都有再次探底的可能!???????日線級別來看,最近一直在強調中軌強壓.
1900/1/1 0:00:00???今年的幣圈,是真的不好過。???甚至連交易所都開始撐不住了。???近期有幾家交易所的裁員,引起了不小的關注。前段時間火幣裁員,據說幅度高達30%,甚至有消息說超過40%.
1900/1/1 0:00:00大名鼎鼎的紅杉資本一口氣投資了20+家WEB3.0公司,一批大廠程序員正在以裸辭的方式奔上WEB.3.0創業.
1900/1/1 0:00:00DAOrayaki上線了新的bounty版本,新版本中,整個過程將不再使用GitHub,讓大家能更方便地參與進來。所以,我們在此為大家介紹調整之后的新bounty參與流程.
1900/1/1 0:00:00