ETHS 顯然是金融炒作而非產品創新,提款流程依賴於第三方公證人 / 管理者,有被盜風險。撰文:霧月,極客 Web3。
(前情提要:Avalanche銘文癱瘓網路!Trader joe創辦人發新項目BEEG後秒致歉:正思考解決方案 )
(背景補充:比特幣「符文」接棒銘文暴富潮?簡析Runes協議、可能的Alpha )
目前的以太坊銘文字質還是 Ordinals 的新瓶裝舊酒,沒有真正意義的新正規化。ETHS 仍然存在安全風險,雖然它的確比 Rollup 去中心化,但其提款流程還是依賴於第三方公證人 / 管理者,有被盜風險。顯然 ETHS 當下還是以金融炒作居多,而不是說它能帶來以太坊 Layer2 帶不來的革新。
近期 BTC 生態銘文的火熱,帶動了其他鏈的開發者搭建類似的系統。不同鏈上的銘文系統的實現方式和可實現的功能略有不同,但有一些共同點:
銘文都利用了轉帳時附加的文字資訊來表達想要完成的操作, 如,在資訊內寫入「向 XXX 轉 1 個幣」。注意,這些資訊是純文字的,不會涉及鏈上的智慧合約執行等操作。
開發者會設計一系列規範和標準,來將所有的文字資訊規範化。
開發者提供一套 Indexer 索引器,用於將鏈上所有銘文的文字資訊歸集後,計算銘文系統的內的狀態。 Indexer 是個鏈下的開源元件,任何人都可以執行。
BTC 銘文 Ordinals 在 BTC 上建立了一套發行 NFT、代幣的機制,也引出了對 BTC L2 的大規模思考,在這個意義上我們可以認為 Ordinals 具有一定的前端和探索性質。不過,Ordinals 在技術和產品體驗上受到了 BTC 本身架構的限制,同時也因為粉塵汙染和資料佔用等原因,遭到了 BTC 社群 OG 的非議。
那麼,在以太坊上覆刻銘文,是否有意義呢?畢竟以太坊本身具有複雜的智慧合約,ERC20、NFT 也是以太坊上本身就有的內容;這些銘文專案又會對以太坊生態產生怎樣的影響,會出現在 BTC 上上的爭議和風波嗎?
Ethscriptions 的技術實現方式
我們先來看一下 Ethscriptions 的實現方式,它是以太坊上著名的銘文專案,主要利用 Calldata 來實現運轉。
Calldata 是以太坊交易中傳輸的原始輸入資料。 一般用於傳輸智慧合約互動時需要的引數,但也可以用於向 EOA 地址傳送文字訊息(留言,銘文刻字,轉帳備註等任何用途)。圖中 Input Data 即 calldata。
如果你想使用 Ethscriptions 在交易中銘刻「Hello world」,則需要構建一條包含如下 calldata 的交易:
鏈下的 Indexer 監聽到這筆交易後,就會更新資料庫並通知使用者: 一條新的銘文產生了,銘刻的內容是 Hello world。銘文裡也可以放更復雜的內容,如代表圖片資訊的 base64 等。
Ethscriptions 目前通過了 6 個 ESIP(Proposals for improvement to the Ethscriptions protocol),類似 EIP 的提案,來定義不同場景下銘文的使用。但這些僅僅是比較基礎的銘文規範,比如從 EOA 發起的銘文交易的格式,合約 emit 事件等等。
Ethscriptions 由於是在以太坊上的專案,也可以利用以太坊的智慧合約實現一定程度上的邏輯。需要注意的是,直接與智慧合約進行互動並不是 Ethscriptions 推薦的方式。
雖然官方的 NFT 市場等也是直接用智慧合約實現的。根據官方文件的說法, Ethscriptions 想要為使用者提供的是「去中心化且價格合理的運算服務」:將運算剝離至鏈下,將顯著降低以太坊的使用成本。
我們來具體探究一下呼叫智慧合約的成本,可以分為三部分:
基本交易成本 :任何以太坊交易都需要支付,目前為 21000 gas。
資料傳輸成本 (calldata):calldata 一般用於提交與智慧合約互動的資料和引數。EIP-2028 調整後,calldata 資料每個位元組一般消耗 16 gas(若是資料為 0 的位元組 消耗 4 gas)。
合約執行成本 :如果交易呼叫了智慧合約中的函式,那麼根據函式執行的複雜度,還需要支付計算成本。例如,如果涉及狀態更新(比如在 ERC-20 合約中更新餘額資訊),呼叫 SSTORE 會消耗高達 5000~20000 gas。
我們以一個非常簡單的 USDT 轉帳的交易為例,該交易總共耗費了 63197 gas,calldata 為:
我們解析下該 calldata,以及它會花費多少 gas:
以太坊 calldata 為十六進位制格式,也即每兩位為一個位元組 (16^2 = 2^8)。開頭的 0x 代表資料採用 16 進位制。
開頭 0x 後面的 a9059cbb 是函式選擇子,佔用 4 個非零位元組。
之後的 32 位元組為地址,前面有 12 位元組的零(因為以太坊地址是 20 位元組,這裡左補了零到 32 位元組),以及 20 位元組的非零地址資料。
最後 32 位元組代表金額,左補了大量的零,末尾有 3b9aca00 非零資料,4 位元組非零。
所以,非零位元組 28 個,零位元組 40 個
因此, calldataGas = 28 * 16 + 40 * 4 = 608 gas 。
而總 gas 為 63197,減去 calldata 成本和固定成本,則執行該交易的智慧合約計算成本為 41589 gas。 在這筆交易裡合約運算成本佔了大頭,而這僅僅是一筆簡單的交易,複雜的交易中合約運算的成本會進一步上升。
將運算過程放至鏈下確實會顯著地降低使用成本:不想在鏈上直接呼叫智慧合約的話,可以向一個約定好的 EOA 地址
0x00000000000000000000000000000000000face7 傳送交易資料
在交易的 calldata 中宣告原本想呼叫哪個合約,以及相應的輸入引數。由於上述地址是一個 EOA 帳戶,沒有合約程式碼,所以前面所說的操作不會在鏈上觸發計算任務, 只是釋出了一條訊息而已。
而在鏈下,Indexer 監聽到這條訊息後,就會進行解析,弄清楚這條訊息的發起者原本想呼叫 ETH 鏈上哪個合約,然後 Indexer 會在鏈下計算出合約呼叫的結果。
那麼線下的 Indexer 想要進行銘文和智慧合約的運算,就必須有一套 STF (狀態轉換函式) 規則和執行時,複雜點的可以叫虛擬機器 VM。Ethscriptions 在 ESIP-4 中推出了自己的 VM——Ethscriptions VM,後來改名為 Facet VM。
Facet—— 有點像協處理器
Facet 將自身定義為一個便宜好用,安全,去中心化的計算平臺。 監聽以太坊上 Ethscriptions 的 calldata,拉到 VM 中進行運算,最終給使用者返還結果。 Facet 包含幾個關鍵的組成部分:
Facet VM,用 ruby 編寫的一套 VM,負責監聽 ETHS 交易,解析 calldata,執行運算。
Rubidity,Facet 中的智慧合約程式語言,與 Ruby 有一定相似性,又保留了很多 solidity 的用法和概念,以期開發者能快速上手。
Dumb Contract,呆笨合約,一種在 Facet 上執行的合約。這個名字充滿了幽默感。有人稱其為啞合約也是對的,dumb 本身是雙關的,啞可以描述這種合約工作的靜默過程。但另一方面根據官方名言「So dumb, they’re smart」,大愚若智,一股濃濃的與 smart contract 叫板的意味,所以叫呆笨合約也沒問題。
呆笨合約本身不會真正部署在以太坊上,只是其程式碼會以 calldata 的形式釋出到 ETH 鏈上。 下面是一個 Facet 對呆笨合約的呼叫案例:
一筆鑄幣交易,向 EOA 黑洞地址
0x00000000000000000000000000000000000face7 提交下圖中的 calldata,宣告自己要 mint 的代幣和數量即可, 這其實和 Ordinals 或 BRC-20 如出一轍:
我們再來看一下 Rubidity 和 Solidity 的直觀對比,見下圖。
雖然官方說 Rubidity 具有類似 Solidity 的概念和結構,以便開發者快速上手。但我們知道其實這對開發者側的發展來說是有一定負面影響的。並且 目前 Facet VM 僅支援官方白名單中的呆笨合約,這說明官方對這套語言以及 VM 並沒有很十足的信心。 是否複用 EVM 對官方而言,在工程技術上比新開發一個 VM 和一個新的語言更難,我不得而知。但有一點可以肯定的是:全新的語言、全新的合約、全新的生態、全新的以太坊使用方式,確實有足夠的噱頭。
Facet 對智慧合約的抨擊
Facet 文件中對以太坊和智慧合約做出瞭如下的勁爆評論:「Smart Contracts are considered to be the feature above all others that makes Ethereum special, and yet Facet’s thesis is that Smart Contracts are Ethereum’s biggest design flaw.」
他們認為以太坊的智慧合約是最大的設計缺陷,因為合約本身只要給定輸入(calldata),其輸出就是確定的,因此不應該在鏈上進行運算,平白無故浪費錢。再結合 Ethscriptions 所說的「去中心化且價格合理的運算服務」, 顯然 Ethscriptions 和 Facet 非常想打造一種市場印象,「我們正在製造全新的以太坊擴容範式和使用方式」,但實際上 ETHS 自己的一些技術方案不是很靠譜。
從產品角度看,Facet 可以在鏈下間接呼叫智慧合約,又有自己的鏈下的呆笨合約體系,確實官方正在踐行其口號。
但從經濟角度講,天下沒有免費的午餐,儲存和運算當然是要錢的。那請問 Indexer 該如何解決這部分成本呢? 這官方就沒有什麼明確說明了,我們可以想像一下:
向用戶收費。比如 NFT 市場向買家收取的手續費,但我們不能以一個簡易的專案的收費模型看待一個類 L2 網路的長遠收費方式。
靠自身生態炒作關聯致富。這個當然可行,但只是一種短期的讓專案方一時爽的方案。Ethscriptions 如果想成為一種全新的以太坊正規化,Indexer 必須有長久的,從網路出發的經濟機制來保障運轉。
如果是不盈利的 Public goods,那麼會有哪些機構 donate 呢?我覺得至少以太坊基金會不會特別積極,因為本身以太坊有非常好的方案 ——Rollup。
Facet 和呆笨合約出現的根本原因
如果我們只是需要以太坊銘文的簡單形式,那麼只需要 Ethscriptions 一個專案就夠了。那為什麼其 ESIP-4 提案又催生出了 Facet 呢?
因為銘文體系沒法用於複雜的交易邏輯。我們可以考察下 Ethscriptions 官方的 NFT 市場合約的運作邏輯,它使用了掛單機制。
如果要將銘文 NFT 入金進合約,僅需要把 calldata 寫為銘文的 EthscriptionId 並呼叫市場合約。由於這種操作故意選擇無效的函式呼叫形式,預設會觸發 fallback ()。
最終會在以太坊鏈上丟擲一個名為 PotentialEthscriptionDeposited 的事件,Indexer 節點在鏈下監聽到這個事件後,便會在本地將 NFT 的歸屬權劃轉為市場合約。
為了節省 gas,ETHS 的交易市場沒有把賣家掛單的一些引數,如價格、截止時間等放在 ETH 合約裡儲存,而是以訊息的形式放在了線下,目測應該是儲存在了 dApp 的伺服器上。買家監測這個訊息後,就可以釋出 buyWithSignature () 指令提出購買。
對 NFT 而言使用掛單機制是正常的,因為 NFT 本身不具有同質性。那麼如果是均質化的代幣銘文,能否使用合約的 AMM 機制呢?答案是不行的。銘文 NFT 或代幣的狀態,都不在 L1 上,就和 Ordinals 和 BRC-20 差不多。 這和一些社群的宣傳是截然相反的,大家需要注意甄別,銘文並不是真正意義的 ETH 鏈上的資產。 我們並不能說生成資產的 calldata 在 L1 上,並且可以在 L1 上宣告操作指令,就叫 L1 上的原生資產,否則 Rollup 上的 L2 原生資產我們也可以稱為 L1 資產,因為 Rollup 的 calldata 都在 L1 上。 顯然,管這種資產叫 L1 原生資產非常荒謬。
你可能會疑惑,上面不就是利用智慧合約進行了買賣嗎?怎麼就說合約不能讀取和操作銘文呢?其實這個合約只負責收錢,轉錢,丟擲事件供鏈下的 Indexer 節點監聽並觸發對應的操作。 在以太坊 EVM 眼中,銘文這類東西的狀態,無法在以太坊專門儲存狀態的資料庫「世界狀態」中還原出來,合約也沒法引用它。
不論資產是什麼形態,代幣也好 NFT 也好或者任何稀奇古怪的東西, 我可以給出一個非常簡單的標準鑑別 L1 資產和 L2 資產:它的狀態能否在以太坊的「世界狀態」上還原出來,L1 的 EVM 能否引用、呼叫、查詢、修改該資產的狀態,如果不能,那它就不是 L1 的資產。
所以你也可以看到入金的事件名字叫 PotentialEthscriptionDeposit,即「可能的銘文入金」,而不是一個確定性的入金,因為合約沒法判定這個銘文是否存在,無法驗證其真偽。如果你掛單了一個不存在的銘文,或者別人的銘文,合約不會拒絕你,只是 Indexer 不會收錄你的行為而已。
因此銘文系統只能實現這種簡易的偽合約邏輯,掛單就是其中一種。 掛單的本質是交易雙方在一種規則下互相認同對方提供的資訊,其實不用智慧合約用純文字也可以表達,這和銘文的道理類似。
我們可以想像一下如何不使用智慧合約來完成上述過程:賣家在普通交易中刻一筆訊息,轉給我 1ETH 並附言 123 的人可以獲得我編號為 123 的銘文 NFT。這樣只需要 Indexer 支援這種邏輯,它監聽到了有人轉了 1ETH 給賣家並附言 ABC,就可以直接在鏈下的 Indexer 資料庫裡劃轉。
當然這個例子實際上會帶來一些問題,比如多人搶購一個 NFT 可能導致的重複交易等,賣家收了多筆轉帳,但最終 NFT 只能被 Indexer 劃給一個人。這也應該是官方明明抨擊智慧合約,卻使用合約實現 NFT 市場的原因之一,因此你也應該能明白官方所說的 通過 Facet 不進行計算而呼叫智慧合約是不靠譜的宣傳 。
當然,掛單理論上可以使用純文字,而不是非要用合約,但 AMM 這種相對比較複雜的邏輯就必須用智慧合約,因為它需要的不是雙方 p2p 式的認同,而是合約認同。充當了可靠審查者的合約,需要檢查餘額、流動性等基礎資訊,並進行運算,任何他所需的資產資料,合約都必須能夠獲取到。
而 AMM 僅僅是比較簡單的一種 DeFi 形式,其他任何複雜的邏輯在僅僅在 Ethscriptions 上都是無法實現的。這也是為什麼推出了 Facet 的原因 ——Facet 的第一要務是跨域!它其實就是個 L2,只是沒有區塊結構,所以我們不叫跨鏈而叫跨域。當所有的 L1 資產跨域到 Facet 後,就不存在跨域無法呼叫的問題,可以在鏈下對所有鏈下資產用呆笨合約進行操作,進而支援複雜的合約邏輯。
和 Rollup 的對比
通過上面的長篇大論,大家應該能發現,Ethscriptions 的方案有點類似於 Rollup。但這僅僅是「類似於」,如果嚴格的說的話,它只能實現 Rollup 核心功能的 子集 。而殘缺的功能則為其敘事帶來了致命傷,或者說將使用者置於嚴重的威脅之中。
Rollup 是一套複雜的體系,這裡我們不展開。它和 Ethscriptions 有些共同點:
都在以太坊上提交 L2 交易的資料 calldata。
都將運算放在鏈下處理。
共同點非常清晰,我們需要詳細論證一下不同點。
Rollup 批量提交 calldata
Rollup 中使用者大部分情況不會向 L1 直接提交交易,而是提交給鏈下的排序器,排序器會對所有交易排序後打包、壓縮,將 calldata 批量傳送至 L1。這樣多個使用者的 calldata 在一筆交易中提交,可以攤薄 21000 gas 的基礎成本。
在 Ethscriptions 中沒有這樣的機制,所有的使用者直接向 L1 提交 calldata。
我們用上面那個 USDT 的例子(608 gas for calldata),假設有 100 個使用者發起了 100 筆交易,非常不嚴謹地粗略計算下二者的成本差別:
銘文使用者每人都需要支付 21608 gas(608 + 21000)。其餘運算部分不支付,因為運算在鏈下。
Rollup 使用者每人支付 818 gas ((608*100+21000)/100)。運算部分同上。
當然,Rollup 使用者每個人還需要向排序器繳納 L2 的運算和儲存費用,但相對 L1 低廉很多,在本例中可以忽略不計。另外,rollup 還需要額外的一些特殊欄位增加了體積,但同時又有比較好的資料壓縮,這裡我們也不展開。
通過這種粗略的估算就可以發現,Ethscriptions 對比 Layer2,在成本方面沒任何優勢。另外,該專案的社群宣傳話術中我看到過類似「4000 個銘文可以批量轉帳,大概需要 0.11ETH,平均每筆轉帳只需要 0.05U」以此來證明 Ethscriptions 的使用很便宜,這其實都沒有理清 ETHS 的原理與互動細節。
鏈下預確認
由於具有鏈下的排序器,Rollup 的使用者請求可以在 1s 內得到預確認。這一點比銘文系統在 L1 上的 12 秒或更久,UX 要好很多。當然,銘文支援者也可以反駁說,在 calldata 提交到 ETH 鏈上前,這樣的交易結果最終性都是不可靠的。
抗審查性和去中心化
使用者在 Rollup 有可能被鏈下的排序器審查,而 Ethscriptions 無法審查使用者。但設計良好的 Rollup 會有強制歸集功能,以對抗排序器的審查,最終使排序器完全不具備審查使用者的權力。
所以使用者使用 Rollup 時,也是可以直接在 L1 上繞過排序器使用的。Rollup 給使用者不同的選擇,可以使用更快的排序器,也可以直接用 L1。但 Ethscriptions 只能使用 L1,並沒有給使用者自由選擇的餘地。
另外 Ethscriptions 詬病 Rollup 的排序器是中心化的。但 Indexer 本身也是高度中心化的元件。Ethscriptions 解釋說 Indexer 由於任何人都可以執行、驗證,所以不算中心化,但事實上絕大多數人都不會自己執行節點。 所以 ETHS 只是在極端情況下,會體現出它比 Rollup 去中心化的一面,畢竟 Rollup 排序器可能當機或者故障,但 ETHS 只要有社群成員執行多個 Indexer,就可以持續運轉。
盈利模式
任何專案都不可能用愛發電,長遠發展的專案必須認真考慮盈利模式的問題,不論是中心化實體還是去中心化實體的組合,都必須有盈利才能夠長期地守護網路安全。
Rollup 的排序器有明確的盈利模式:多收取 gas,榨取 MEV 等。排序器有動力保證網路的正常運轉。Ethscriptions 由於使用者直接向 L1 提交 calldata,Indexer 其實不好收費。
開發者友好程度
大多數 Rollup 的合約開發語言、工具鏈等都直接使用以太坊的即可,開發者可以無縫遷移至 Rollup。在 Ethscriptions 中這些都不存在,需要掌握新的 Rubidity,需要構建新的 scan,熟悉新的 VM 等等。當然,這些阻力反過來看也是一個新生態發展時可能帶來的拓荒的機會。
提現和狀態結算
這是 Facet 的致命問題。我們知道 Rollup 不僅僅會將 calldata(輸入)批量提交到 L1 上,也會定時將 N 個運算後的狀態結算(輸出)提交到 L1 上。ZKR 和 OPR 有不同的證明方式來確定輸入和輸出的關係是否正確,不論什麼證明方式,最終的裁判都是 L1 上的合約。在 Rollup 上輸出和輸入是有跡可循的,無法造假的。
那麼狀態結算有什麼用呢?用於提現,也即 L2 到 L1 的資金提取。當 L1 上的狀態釋出後,我們就可以根據狀態根,用 Merkle Proof 等手段,去證明我在 L2 上的提現請求包含在了該狀態根裡。合約驗證無誤後就可以在 L1 上放行資產。
Facet 沒有狀態結算機制,所以他無法實現 L2 到 L1 的無許可、去中心化的提現。 上面提到過,他又需要一個 L2 層,以執行更復雜的合約邏輯。如他的 AMM Swap FacetSwap。
我們可以看到在 FacetSwap(Facet 上用呆笨合約構建的 dex)中明確有入金和提現兩個動作。一般 Swap 是沒有入金和提現的,因為 Facet 需要你先跨域才能使用。
在 Facet 中,入金需要在 L1 橋合約上將 L1 的資金鎖定,並且發射出對應的事件 ethscriptions_protocol_CreateEthscription 讓 Indexer 進行索引。這和其他的 L2 的入金的手段是一致的。
而提現則有嚴重的安全問題。 由於在 Facet 上沒有任何的狀態結算機制,L2 到 L1 上無法用合約自動判定一筆提現是否有效。那 Facet 使用了什麼方法呢?管理員放行,或者叫見證人機制,類似於此前被盜的 Axie 橋。
我們直接來看一眼 Facet 的橋,地址為
0xD729345aA12c5Af2121D96f87B673987f354496B。
hashedMessage 是經過 signer 簽名的一個訊息,裡面即提現的一些內容。signer 是一個預設的管理員地址。因為沒有狀態結算沒法做任何校驗,比如該帳戶在 L2 上是否有這麼多幣。 所以完全憑 signer 簽名就可以將合約上的所有資金取走,不論是專案方作惡還是駭客攻擊獲取私鑰。
在 Rollup 中,根本不需要見證人放行資產;在側鏈中,見證人如果想做的去中心化一些,可以從本身的共識體系中選擇出一部分作為代理,用質押等方式進行一定的經濟威懾遏制作惡。
在 Ethscriptions 和 Facet 中,nothing。它簡單地、不加掩飾地就是一個管理員地址。這對於一個動輒喊著「智慧合約是設計缺陷」、「Rollup 是中心化的」、「我們是新一代計算平臺」的類 L2 專案而言,恐怕過於潦草了。 顯然,他的缺陷還有很多,但我們可以對此保持觀望,雖然這些缺陷不太好彌補,並且可能同樣在比特幣 Layer2 身上存在。
總結
目前的 Ethscriptions 存在一定的「虛假宣傳」,幾個要點:
Ethscriptions 和 Facet 上的資產,都不是發行在 L1 上的資產。
為了有複雜的合約能力,演化出了 Facet 這個 L2 實體,但有極大的資金安全隱患。
官方宣稱的在 L1 上去合約運算化,卻連自己的頭牌應用都不用。
Ethscriptions 類似一個基礎功能非常不全的 Rollup。既沒有 Rollup 的便宜和迅速,也沒有 Rollup 的安全。他能實現的,Rollup 都能實現,Rollup 能實現的很重要的功能它無法提供。
如果想解決上述問題,他需要發展出狀態結算機制,再加上排序器,L2 區塊,那麼它最終就變成了 Rollup。
Ethscriptions 趁著 BTC 銘文的風口,依靠概念炒作新瓶裝舊酒,但還沒有發掘出新的正規化。目前的 ETHS 還是以金融炒作為主,而不是說這種產品本身能帶來以太坊 Layer2 沒有的東西。這種東西的長期價值,顯然還有待人們去挖掘, 但就以目前的形式來看,ETHS 已經承擔了「生命不可承受之重」,他的宣傳口號與其實踐效果相差甚遠。
📍相關報導📍
如何輕鬆參與以太坊銘文?ETHS 創辦人打造的鏈上銘文交易所「Facet Swap」使用教學與重點代幣盤點